diff options
419 files changed, 38283 insertions, 9835 deletions
@@ -162,8 +162,6 @@ LOCAL_SRC_FILES += \ core/java/android/os/IVibratorService.aidl \ core/java/android/service/notification/INotificationListener.aidl \ core/java/android/print/ILayoutResultCallback.aidl \ - core/java/android/print/IPrinterDiscoverySessionController.aidl \ - core/java/android/print/IPrinterDiscoverySessionObserver.aidl \ core/java/android/print/IPrintDocumentAdapter.aidl \ core/java/android/print/IPrintClient.aidl \ core/java/android/print/IPrintManager.aidl \ @@ -264,7 +262,7 @@ LOCAL_SRC_FILES += \ telephony/java/com/android/internal/telephony/IWapPushManager.aidl \ wifi/java/android/net/wifi/IWifiManager.aidl \ wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \ - packages/services/Proxy/com/android/net/IProxyService.aidl \ + packages/services/PacProcessor/com/android/net/IProxyService.aidl \ # FRAMEWORKS_BASE_JAVA_SRC_DIRS comes from build/core/pathmap.mk LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS) @@ -355,6 +353,7 @@ aidl_files := \ frameworks/base/core/java/android/content/SyncStats.aidl \ frameworks/base/core/java/android/content/res/Configuration.aidl \ frameworks/base/core/java/android/database/CursorWindow.aidl \ + frameworks/base/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.aidl \ frameworks/base/core/java/android/net/Uri.aidl \ frameworks/base/core/java/android/nfc/NdefMessage.aidl \ frameworks/base/core/java/android/nfc/NdefRecord.aidl \ @@ -391,6 +390,8 @@ aidl_files := \ frameworks/base/telephony/java/android/telephony/ServiceState.aidl \ frameworks/base/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl \ frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl \ + frameworks/base/wifi/java/android/net/wifi/BatchedScanSettings.aidl \ + frameworks/base/wifi/java/android/net/wifi/BatchedScanResult.aidl \ gen := $(TARGET_OUT_COMMON_INTERMEDIATES)/framework.aidl $(gen): PRIVATE_SRC_FILES := $(aidl_files) @@ -535,100 +536,100 @@ sample_dir := development/samples # the list here should match the list of samples included in the sdk samples package # (see development/build/sdk.atree) # remove htmlified samples for now -- samples are still available through the SDK -# web_docs_sample_code_flags := \ +web_docs_sample_code_flags := \ -hdf android.hasSamples 1 \ -samplecode $(sample_dir)/AccelerometerPlay \ - resources/samples/AccelerometerPlay "Accelerometer Play" \ + samples/AccelerometerPlay "Accelerometer Play" \ -samplecode $(sample_dir)/ActionBarCompat \ - resources/samples/ActionBarCompat "Action Bar Compatibility" \ - -samplecode $(sample_dir)/AndroidBeamDemo \ - resources/samples/AndroidBeamDemo "Android Beam Demo" \ - -samplecode $(sample_dir)/ApiDemos \ - resources/samples/ApiDemos "API Demos" \ - -samplecode $(sample_dir)/Support4Demos \ - resources/samples/Support4Demos "API 4+ Support Demos" \ - -samplecode $(sample_dir)/Support13Demos \ - resources/samples/Support13Demos "API 13+ Support Demos" \ - -samplecode $(sample_dir)/BackupRestore \ - resources/samples/BackupRestore "Backup and Restore" \ - -samplecode $(sample_dir)/BluetoothChat \ - resources/samples/BluetoothChat "Bluetooth Chat" \ - -samplecode $(sample_dir)/BluetoothHDP \ - resources/samples/BluetoothHDP "Bluetooth HDP Demo" \ - -samplecode $(sample_dir)/BusinessCard \ - resources/samples/BusinessCard "Business Card" \ - -samplecode $(sample_dir)/ContactManager \ - resources/samples/ContactManager "Contact Manager" \ - -samplecode $(sample_dir)/CubeLiveWallpaper \ - resources/samples/CubeLiveWallpaper "Cube Live Wallpaper" \ - -samplecode $(sample_dir)/Home \ - resources/samples/Home "Home" \ - -samplecode $(sample_dir)/HoneycombGallery \ - resources/samples/HoneycombGallery "Honeycomb Gallery" \ - -samplecode $(sample_dir)/JetBoy \ - resources/samples/JetBoy "JetBoy" \ - -samplecode $(sample_dir)/KeyChainDemo \ - resources/samples/KeyChainDemo "KeyChain Demo" \ - -samplecode $(sample_dir)/LunarLander \ - resources/samples/LunarLander "Lunar Lander" \ - -samplecode $(sample_dir)/training/ads-and-ux \ - resources/samples/training/ads-and-ux "Mobile Advertisement Integration" \ - -samplecode $(sample_dir)/MultiResolution \ - resources/samples/MultiResolution "Multiple Resolutions" \ - -samplecode $(sample_dir)/training/multiscreen/newsreader \ - resources/samples/newsreader "News Reader" \ - -samplecode $(sample_dir)/NotePad \ - resources/samples/NotePad "Note Pad" \ - -samplecode $(sample_dir)/SpellChecker/SampleSpellCheckerService \ - resources/samples/SpellChecker/SampleSpellCheckerService "Spell Checker Service" \ - -samplecode $(sample_dir)/SpellChecker/HelloSpellChecker \ - resources/samples/SpellChecker/HelloSpellChecker "Spell Checker Client" \ - -samplecode $(sample_dir)/SampleSyncAdapter \ - resources/samples/SampleSyncAdapter "Sample Sync Adapter" \ - -samplecode $(sample_dir)/RandomMusicPlayer \ - resources/samples/RandomMusicPlayer "Random Music Player" \ - -samplecode $(sample_dir)/RenderScript \ - resources/samples/RenderScript "RenderScript" \ - -samplecode $(sample_dir)/SearchableDictionary \ - resources/samples/SearchableDictionary "Searchable Dictionary v2" \ - -samplecode $(sample_dir)/SipDemo \ - resources/samples/SipDemo "SIP Demo" \ - -samplecode $(sample_dir)/Snake \ - resources/samples/Snake "Snake" \ - -samplecode $(sample_dir)/SoftKeyboard \ - resources/samples/SoftKeyboard "Soft Keyboard" \ - -samplecode $(sample_dir)/Spinner \ - resources/samples/Spinner "Spinner" \ - -samplecode $(sample_dir)/SpinnerTest \ - resources/samples/SpinnerTest "SpinnerTest" \ - -samplecode $(sample_dir)/StackWidget \ - resources/samples/StackWidget "StackView Widget" \ - -samplecode $(sample_dir)/TicTacToeLib \ - resources/samples/TicTacToeLib "TicTacToeLib" \ - -samplecode $(sample_dir)/TicTacToeMain \ - resources/samples/TicTacToeMain "TicTacToeMain" \ - -samplecode $(sample_dir)/ToyVpn \ - resources/samples/ToyVpn "Toy VPN Client" \ - -samplecode $(sample_dir)/USB \ - resources/samples/USB "USB" \ - -samplecode $(sample_dir)/WeatherListWidget \ - resources/samples/WeatherListWidget "Weather List Widget" \ - -samplecode $(sample_dir)/WiFiDirectDemo \ - resources/samples/WiFiDirectDemo "Wi-Fi Direct Demo" \ - -samplecode $(sample_dir)/Wiktionary \ - resources/samples/Wiktionary "Wiktionary" \ - -samplecode $(sample_dir)/WiktionarySimple \ - resources/samples/WiktionarySimple "Wiktionary (Simplified)" \ - -samplecode $(sample_dir)/VoiceRecognitionService \ - resources/samples/VoiceRecognitionService "Voice Recognition Service" \ - -samplecode $(sample_dir)/VoicemailProviderDemo \ - resources/samples/VoicemailProviderDemo "Voicemail Provider Demo" \ - -samplecode $(sample_dir)/XmlAdapters \ - resources/samples/XmlAdapters "XML Adapters" \ - -samplecode $(sample_dir)/TtsEngine \ - resources/samples/TtsEngine "Text To Speech Engine" \ - -samplecode $(sample_dir)/training/device-management-policy \ - resources/samples/training/device-management-policy "Device Management Policy" + samples/ActionBarCompat "Action Bar Compatibility" +# -samplecode $(sample_dir)/AndroidBeamDemo \ +# samples/AndroidBeamDemo "Android Beam Demo" \ +# -samplecode $(sample_dir)/ApiDemos \ +# samples/ApiDemos "API Demos" \ +# -samplecode $(sample_dir)/Support4Demos \ +# samples/Support4Demos "API 4+ Support Demos" \ +# -samplecode $(sample_dir)/Support13Demos \ +# samples/Support13Demos "API 13+ Support Demos" \ +# -samplecode $(sample_dir)/BackupRestore \ +# samples/BackupRestore "Backup and Restore" \ +# -samplecode $(sample_dir)/BluetoothChat \ +# samples/BluetoothChat "Bluetooth Chat" \ +# -samplecode $(sample_dir)/BluetoothHDP \ +# samples/BluetoothHDP "Bluetooth HDP Demo" \ +# -samplecode $(sample_dir)/BusinessCard \ +# samples/BusinessCard "Business Card" \ +# -samplecode $(sample_dir)/ContactManager \ +# samples/ContactManager "Contact Manager" \ +# -samplecode $(sample_dir)/CubeLiveWallpaper \ +# samples/CubeLiveWallpaper "Cube Live Wallpaper" \ +# -samplecode $(sample_dir)/Home \ +# samples/Home "Home" \ +# -samplecode $(sample_dir)/HoneycombGallery \ +# samples/HoneycombGallery "Honeycomb Gallery" \ +# -samplecode $(sample_dir)/JetBoy \ +# samples/JetBoy "JetBoy" \ +# -samplecode $(sample_dir)/KeyChainDemo \ +# samples/KeyChainDemo "KeyChain Demo" \ +# -samplecode $(sample_dir)/LunarLander \ +# samples/LunarLander "Lunar Lander" \ +# -samplecode $(sample_dir)/training/ads-and-ux \ +# samples/training/ads-and-ux "Mobile Advertisement Integration" \ +# -samplecode $(sample_dir)/MultiResolution \ +# samples/MultiResolution "Multiple Resolutions" \ +# -samplecode $(sample_dir)/training/multiscreen/newsreader \ +# samples/newsreader "News Reader" \ +# -samplecode $(sample_dir)/NotePad \ +# samples/NotePad "Note Pad" \ +# -samplecode $(sample_dir)/SpellChecker/SampleSpellCheckerService \ +# samples/SpellChecker/SampleSpellCheckerService "Spell Checker Service" \ +# -samplecode $(sample_dir)/SpellChecker/HelloSpellChecker \ +# samples/SpellChecker/HelloSpellChecker "Spell Checker Client" \ +# -samplecode $(sample_dir)/SampleSyncAdapter \ +# samples/SampleSyncAdapter "Sample Sync Adapter" \ +# -samplecode $(sample_dir)/RandomMusicPlayer \ +# samples/RandomMusicPlayer "Random Music Player" \ +# -samplecode $(sample_dir)/RenderScript \ +# samples/RenderScript "RenderScript" \ +# -samplecode $(sample_dir)/SearchableDictionary \ +# samples/SearchableDictionary "Searchable Dictionary v2" \ +# -samplecode $(sample_dir)/SipDemo \ +# samples/SipDemo "SIP Demo" \ +# -samplecode $(sample_dir)/Snake \ +# samples/Snake "Snake" \ +# -samplecode $(sample_dir)/SoftKeyboard \ +# samples/SoftKeyboard "Soft Keyboard" \ +# -samplecode $(sample_dir)/Spinner \ +# samples/Spinner "Spinner" \ +# -samplecode $(sample_dir)/SpinnerTest \ +# samples/SpinnerTest "SpinnerTest" \ +# -samplecode $(sample_dir)/StackWidget \ +# samples/StackWidget "StackView Widget" \ +# -samplecode $(sample_dir)/TicTacToeLib \ +# samples/TicTacToeLib "TicTacToeLib" \ +# -samplecode $(sample_dir)/TicTacToeMain \ +# samples/TicTacToeMain "TicTacToeMain" \ +# -samplecode $(sample_dir)/ToyVpn \ +# samples/ToyVpn "Toy VPN Client" \ +# -samplecode $(sample_dir)/USB \ +# samples/USB "USB" \ +# -samplecode $(sample_dir)/WeatherListWidget \ +# samples/WeatherListWidget "Weather List Widget" \ +# -samplecode $(sample_dir)/WiFiDirectDemo \ +# samples/WiFiDirectDemo "Wi-Fi Direct Demo" \ +# -samplecode $(sample_dir)/Wiktionary \ +# samples/Wiktionary "Wiktionary" \ +# -samplecode $(sample_dir)/WiktionarySimple \ +# samples/WiktionarySimple "Wiktionary (Simplified)" \ +# -samplecode $(sample_dir)/VoiceRecognitionService \ +# samples/VoiceRecognitionService "Voice Recognition Service" \ +# -samplecode $(sample_dir)/VoicemailProviderDemo \ +# samples/VoicemailProviderDemo "Voicemail Provider Demo" \ +# -samplecode $(sample_dir)/XmlAdapters \ +# samples/XmlAdapters "XML Adapters" \ +# -samplecode $(sample_dir)/TtsEngine \ +# samples/TtsEngine "Text To Speech Engine" \ +# -samplecode $(sample_dir)/training/device-management-policy \ +# samples/training/device-management-policy "Device Management Policy" ## SDK version identifiers used in the published docs @@ -760,10 +761,9 @@ LOCAL_MODULE := online-sdk LOCAL_DROIDDOC_OPTIONS:= \ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ - $(web_docs_sample_code_flags) \ -toroot / \ - -hdf android.whichdoc online \ - -hdf template.showLanguageMenu true + -hdf android.whichdoc online +# $(web_docs_sample_code_flags) LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk diff --git a/CleanSpec.mk b/CleanSpec.mk index 8fd5186..a94252d 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -170,6 +170,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/IPrinterDiscoveryObserver.*) $(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/) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/api/current.txt b/api/current.txt index 002b8d7..5918417 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1015,6 +1015,7 @@ package android { field public static final int summaryOff = 16843248; // 0x10101f0 field public static final int summaryOn = 16843247; // 0x10101ef field public static final int supportsRtl = 16843695; // 0x10103af + field public static final int supportsSwitchingToNextInputMethod = 16843753; // 0x10103e9 field public static final int supportsUploading = 16843419; // 0x101029b field public static final int switchMinWidth = 16843632; // 0x1010370 field public static final int switchPadding = 16843633; // 0x1010371 @@ -5013,7 +5014,8 @@ package android.bluetooth { } public final class BluetoothGatt implements android.bluetooth.BluetoothProfile { - method public void abortReliableWrite(android.bluetooth.BluetoothDevice); + method public void abortReliableWrite(); + method public deprecated void abortReliableWrite(android.bluetooth.BluetoothDevice); method public boolean beginReliableWrite(); method public void close(); method public boolean connect(); @@ -8051,6 +8053,7 @@ package android.database { public class MatrixCursor.RowBuilder { method public android.database.MatrixCursor.RowBuilder add(java.lang.Object); + method public android.database.MatrixCursor.RowBuilder offer(java.lang.String, java.lang.Object); } public class MergeCursor extends android.database.AbstractCursor { @@ -10757,7 +10760,119 @@ package android.hardware.camera2 { method public void readFromParcel(android.os.Parcel); method public void set(android.hardware.camera2.CameraMetadata.Key<T>, T); method public void writeToParcel(android.os.Parcel, int); + 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_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 android.os.Parcelable.Creator CREATOR; + 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_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_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 { @@ -10769,38 +10884,151 @@ package android.hardware.camera2 { public final class CameraProperties extends android.hardware.camera2.CameraMetadata { ctor public CameraProperties(); - field public static final android.hardware.camera2.CameraMetadata.Key INFO_IDENTIFIER; - field public static final android.hardware.camera2.CameraMetadata.Key INFO_MODEL; - field public static final android.hardware.camera2.CameraMetadata.Key INFO_REMOVABLE; + 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 int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; // 0x1 - field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; // 0x0 + 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 SCALER_AVAILABLE_RAW_SIZES; - field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_ACTIVE_ARRAY_SIZE; - field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_PIXEL_ARRAY_SIZE; + 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 final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public void addTarget(android.view.Surface); + method public java.lang.Object getTag(); method public void removeTarget(android.view.Surface); + method public void setTag(java.lang.Object); + 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 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 CaptureResult extends android.hardware.camera2.CameraMetadata { + 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 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 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_TIMESTAMP; - field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_DETECTED_FACES; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_DETECT_MODE; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_IDS; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_LANDMARKS; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_RECTANGLES; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_SCORES; + 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 static class CaptureResult.Face { @@ -11582,6 +11810,18 @@ package android.location { field public static final int TEMPORARILY_UNAVAILABLE = 1; // 0x1 } + public abstract class SettingInjectorService extends android.app.IntentService { + ctor public SettingInjectorService(java.lang.String); + method protected abstract android.location.SettingInjectorService.Status getStatus(); + method protected final void onHandleIntent(android.content.Intent); + } + + public static final class SettingInjectorService.Status { + ctor public SettingInjectorService.Status(java.lang.String, boolean); + field public final boolean enabled; + field public final java.lang.String summary; + } + } package android.media { @@ -12059,6 +12299,7 @@ package android.media { method public final void queueSecureInputBuffer(int, int, android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException; method public final void release(); method public final void releaseOutputBuffer(int, boolean); + method public final void setParameters(java.util.Map<java.lang.String, java.lang.Object>); method public final void setVideoScalingMode(int); method public final void signalEndOfInputStream(); method public final void start(); @@ -12072,6 +12313,9 @@ package android.media { field public static final int INFO_OUTPUT_BUFFERS_CHANGED = -3; // 0xfffffffd field public static final int INFO_OUTPUT_FORMAT_CHANGED = -2; // 0xfffffffe field public static final int INFO_TRY_AGAIN_LATER = -1; // 0xffffffff + field public static final java.lang.String PARAMETER_KEY_REQUEST_SYNC_FRAME = "request-sync"; + field public static final java.lang.String PARAMETER_KEY_SUSPEND = "drop-input-frames"; + field public static final java.lang.String PARAMETER_KEY_VIDEO_BITRATE = "videoBitrate"; field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1 field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = 2; // 0x2 } @@ -12113,6 +12357,7 @@ package android.media { public static final class MediaCodecInfo.CodecCapabilities { ctor public MediaCodecInfo.CodecCapabilities(); + method public final boolean isFeatureSupported(java.lang.String); field public static final int COLOR_Format12bitRGB444 = 3; // 0x3 field public static final int COLOR_Format16bitARGB1555 = 5; // 0x5 field public static final int COLOR_Format16bitARGB4444 = 4; // 0x4 @@ -12159,6 +12404,7 @@ package android.media { field public static final int COLOR_FormatYUV444Interleaved = 29; // 0x1d field public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00 field public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100 + field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback"; field public int[] colorFormats; field public android.media.MediaCodecInfo.CodecProfileLevel[] profileLevels; } @@ -12357,6 +12603,7 @@ package android.media { ctor public MediaFormat(); method public final boolean containsKey(java.lang.String); method public static final android.media.MediaFormat createAudioFormat(java.lang.String, int, int); + method public static final android.media.MediaFormat createSubtitleFormat(java.lang.String, java.lang.String); method public static final android.media.MediaFormat createVideoFormat(java.lang.String, int, int); method public final java.nio.ByteBuffer getByteBuffer(java.lang.String); method public final float getFloat(java.lang.String); @@ -12379,8 +12626,11 @@ package android.media { field public static final java.lang.String KEY_HEIGHT = "height"; field public static final java.lang.String KEY_IS_ADTS = "is-adts"; field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval"; + field public static final java.lang.String KEY_LANGUAGE = "language"; field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size"; field public static final java.lang.String KEY_MIME = "mime"; + field public static final java.lang.String KEY_PUSH_BLANK_BUFFERS_ON_STOP = "push-blank-buffers-on-shutdown"; + field public static final java.lang.String KEY_REPEAT_PREVIOUS_FRAME_AFTER = "repeat-previous-frame-after"; field public static final java.lang.String KEY_SAMPLE_RATE = "sample-rate"; field public static final java.lang.String KEY_WIDTH = "width"; } @@ -12547,6 +12797,7 @@ package android.media { public static class MediaPlayer.TrackInfo implements android.os.Parcelable { method public int describeContents(); + method public android.media.MediaFormat getFormat(); method public java.lang.String getLanguage(); method public int getTrackType(); method public void writeToParcel(android.os.Parcel, int); @@ -12608,6 +12859,7 @@ package android.media { field public static final int CAMCORDER = 5; // 0x5 field public static final int DEFAULT = 0; // 0x0 field public static final int MIC = 1; // 0x1 + field public static final int REMOTE_SUBMIX = 8; // 0x8 field public static final int VOICE_CALL = 4; // 0x4 field public static final int VOICE_COMMUNICATION = 7; // 0x7 field public static final int VOICE_DOWNLINK = 3; // 0x3 @@ -14474,6 +14726,8 @@ package android.net.wifi { method public boolean reconnect(); method public boolean removeNetwork(int); method public boolean saveConfiguration(); + method public void setTdlsEnabled(java.net.InetAddress, boolean); + method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean); method public boolean setWifiEnabled(boolean); method public boolean startScan(); method public int updateNetwork(android.net.wifi.WifiConfiguration); @@ -14864,9 +15118,11 @@ package android.nfc.cardemulation { public abstract class HostApduService extends android.app.Service { ctor public HostApduService(); + method public final void notifyUnhandled(); method public final android.os.IBinder onBind(android.content.Intent); method public abstract void onDeactivated(int); - method public abstract byte[] processCommandApdu(byte[], int); + method public byte[] processCommandApdu(byte[], android.os.Bundle); + method public abstract deprecated byte[] processCommandApdu(byte[], int); method public final void sendResponseApdu(byte[]); field public static final int DEACTIVATION_DESELECTED = 1; // 0x1 field public static final int DEACTIVATION_LINK_LOSS = 0; // 0x0 @@ -17867,8 +18123,14 @@ package android.os { public class ParcelFileDescriptor implements java.io.Closeable android.os.Parcelable { ctor public ParcelFileDescriptor(android.os.ParcelFileDescriptor); method public static android.os.ParcelFileDescriptor adoptFd(int); + method public boolean canDetectErrors(); + method public void checkError(boolean) throws java.io.IOException; method public void close() throws java.io.IOException; + method public void closeWithError(java.lang.String) throws java.io.IOException; method public static android.os.ParcelFileDescriptor[] createPipe() throws java.io.IOException; + method public static android.os.ParcelFileDescriptor[] createReliablePipe() throws java.io.IOException; + method public static android.os.ParcelFileDescriptor[] createReliableSocketPair() throws java.io.IOException; + method public static android.os.ParcelFileDescriptor[] createSocketPair() throws java.io.IOException; method public int describeContents(); method public int detachFd(); method public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor) throws java.io.IOException; @@ -17880,6 +18142,7 @@ package android.os { method public java.io.FileDescriptor getFileDescriptor(); method public long getStatSize(); method public static android.os.ParcelFileDescriptor open(java.io.File, int) throws java.io.FileNotFoundException; + method public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor.OnCloseListener) throws java.io.IOException; method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; field public static final int MODE_APPEND = 33554432; // 0x2000000 @@ -17887,8 +18150,8 @@ package android.os { field public static final int MODE_READ_ONLY = 268435456; // 0x10000000 field public static final int MODE_READ_WRITE = 805306368; // 0x30000000 field public static final int MODE_TRUNCATE = 67108864; // 0x4000000 - field public static final int MODE_WORLD_READABLE = 1; // 0x1 - field public static final int MODE_WORLD_WRITEABLE = 2; // 0x2 + field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1 + field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2 field public static final int MODE_WRITE_ONLY = 536870912; // 0x20000000 } @@ -17900,6 +18163,10 @@ package android.os { ctor public ParcelFileDescriptor.AutoCloseOutputStream(android.os.ParcelFileDescriptor); } + public static abstract interface ParcelFileDescriptor.OnCloseListener { + method public abstract void onClose(java.io.IOException, boolean); + } + public class ParcelFormatException extends java.lang.RuntimeException { ctor public ParcelFormatException(); ctor public ParcelFormatException(java.lang.String); @@ -18354,6 +18621,7 @@ package android.preference { method protected android.view.View onCreateView(android.view.ViewGroup); method public void onDependencyChanged(android.preference.Preference, boolean); method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int); + method public void onParentChanged(android.preference.Preference, boolean); method protected void onPrepareForRemoval(); method protected void onRestoreInstanceState(android.os.Parcelable); method protected android.os.Parcelable onSaveInstanceState(); @@ -18771,7 +19039,7 @@ package android.print { method public android.print.PrintAttributes getAttributes(); method public int getCopies(); method public int getId(); - method public java.lang.CharSequence getLabel(); + method public java.lang.String getLabel(); method public android.print.PageRange[] getPages(); method public android.print.PrinterId getPrinterId(); method public int getState(); @@ -18895,7 +19163,7 @@ package android.printservice { public final class PrintJob { method public boolean cancel(); method public boolean complete(); - method public boolean fail(java.lang.CharSequence); + method public boolean fail(java.lang.String); method public android.printservice.PrintDocument getDocument(); method public int getId(); method public android.print.PrintJobInfo getInfo(); @@ -18924,11 +19192,15 @@ package android.printservice { } public abstract class PrinterDiscoverySession { - ctor public PrinterDiscoverySession(android.content.Context); + ctor public PrinterDiscoverySession(); method public final void addPrinters(java.util.List<android.print.PrinterInfo>); - method public abstract void onClose(); - method public abstract void onOpen(java.util.List<android.print.PrinterId>); + method public final java.util.List<android.print.PrinterInfo> getPrinters(); + method public final boolean isDestroyed(); + method public final boolean isPrinterDiscoveryStarted(); + method public abstract void onDestroy(); method public abstract void onRequestPrinterUpdate(android.print.PrinterId); + method public abstract void onStartPrinterDiscovery(java.util.List<android.print.PrinterId>); + method public abstract void onStopPrinterDiscovery(); method public final void removePrinters(java.util.List<android.print.PrinterId>); method public final void updatePrinters(java.util.List<android.print.PrinterInfo>); } @@ -20366,27 +20638,19 @@ package android.provider { method public static android.net.Uri buildRootsUri(java.lang.String); method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String); + method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String); method public static java.lang.String getDocId(android.net.Uri); method public static android.net.Uri[] getOpenDocuments(android.content.Context); method public static java.lang.String getRootId(android.net.Uri); method public static java.lang.String getSearchQuery(android.net.Uri); method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point); + method public static boolean isLocalOnly(android.net.Uri); + method public static void notifyRootsChanged(android.content.Context, java.lang.String); method public static boolean renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String); + method public static android.net.Uri setLocalOnly(android.net.Uri); field public static final java.lang.String EXTRA_HAS_MORE = "has_more"; field public static final java.lang.String EXTRA_REQUEST_MORE = "request_more"; field public static final java.lang.String EXTRA_THUMBNAIL_SIZE = "thumbnail_size"; - field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1 - field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 - field public static final int FLAG_SUPPORTS_RENAME = 2; // 0x2 - field public static final int FLAG_SUPPORTS_SEARCH = 16; // 0x10 - field public static final int FLAG_SUPPORTS_THUMBNAIL = 8; // 0x8 - field public static final java.lang.String MIME_TYPE_DIRECTORY = "vnd.android.cursor.dir/doc"; - field public static final java.lang.String PARAM_QUERY = "query"; - field public static final java.lang.String ROOT_DOC_ID = "0"; - field public static final int ROOT_TYPE_DEVICE = 3; // 0x3 - field public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; // 0x4 - field public static final int ROOT_TYPE_SERVICE = 1; // 0x1 - field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2 } public static abstract interface DocumentsContract.DocumentColumns implements android.provider.OpenableColumns { @@ -20397,6 +20661,18 @@ package android.provider { field public static final java.lang.String SUMMARY = "summary"; } + public static class DocumentsContract.Documents { + field public static final java.lang.String DOC_ID_ROOT = "0"; + field public static final int FLAG_PREFERS_GRID = 64; // 0x40 + field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1 + field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 + field public static final int FLAG_SUPPORTS_RENAME = 2; // 0x2 + field public static final int FLAG_SUPPORTS_SEARCH = 16; // 0x10 + field public static final int FLAG_SUPPORTS_THUMBNAIL = 8; // 0x8 + field public static final int FLAG_SUPPORTS_WRITE = 32; // 0x20 + field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.cursor.dir/doc"; + } + public static abstract interface DocumentsContract.RootColumns { field public static final java.lang.String AVAILABLE_BYTES = "available_bytes"; field public static final java.lang.String ICON = "icon"; @@ -20406,6 +20682,15 @@ package android.provider { field public static final java.lang.String TITLE = "title"; } + public static class DocumentsContract.Roots { + field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.cursor.dir/root"; + field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.cursor.item/root"; + field public static final int ROOT_TYPE_DEVICE = 3; // 0x3 + field public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; // 0x4 + field public static final int ROOT_TYPE_SERVICE = 1; // 0x1 + field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2 + } + public final deprecated class LiveFolders implements android.provider.BaseColumns { field public static final java.lang.String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER"; field public static final java.lang.String DESCRIPTION = "description"; @@ -20861,16 +21146,20 @@ package android.provider { method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException; method public static int getInt(android.content.ContentResolver, java.lang.String, int); method public static int getInt(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException; + method public static final int getLocationMode(android.content.ContentResolver); + method public static final int getLocationModeForUser(android.content.ContentResolver, int); method public static long getLong(android.content.ContentResolver, java.lang.String, long); method public static long getLong(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException; method public static java.lang.String getString(android.content.ContentResolver, java.lang.String); method public static android.net.Uri getUriFor(java.lang.String); - method public static final boolean isLocationProviderEnabled(android.content.ContentResolver, java.lang.String); + method public static final deprecated boolean isLocationProviderEnabled(android.content.ContentResolver, java.lang.String); method public static boolean putFloat(android.content.ContentResolver, java.lang.String, float); method public static boolean putInt(android.content.ContentResolver, java.lang.String, int); method public static boolean putLong(android.content.ContentResolver, java.lang.String, long); method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String); - method public static final void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean); + method public static final void setLocationMode(android.content.ContentResolver, int); + method public static final void setLocationModeForUser(android.content.ContentResolver, int, int); + method public static final deprecated void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean); field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled"; field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password"; field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled"; @@ -20889,6 +21178,10 @@ package android.provider { field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy"; field public static final java.lang.String INPUT_METHOD_SELECTOR_VISIBILITY = "input_method_selector_visibility"; field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps"; + field public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2 + field public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3 + field public static final int LOCATION_MODE_OFF = 0; // 0x0 + field public static final int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1 field public static final java.lang.String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; field public static final java.lang.String LOCK_PATTERN_ENABLED = "lock_pattern_autolock"; field public static final deprecated java.lang.String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled"; @@ -29237,19 +29530,18 @@ package android.view.transition { public abstract class Transition implements java.lang.Cloneable { ctor public Transition(); method public void addListener(android.view.transition.Transition.TransitionListener); - method protected void cancelTransition(); + method protected void cancel(); method protected abstract void captureValues(android.view.transition.TransitionValues, boolean); method public android.view.transition.Transition clone(); method public long getDuration(); method public android.animation.TimeInterpolator getInterpolator(); method public java.util.ArrayList<android.view.transition.Transition.TransitionListener> getListeners(); + method public java.lang.String getName(); method public long getStartDelay(); method public int[] getTargetIds(); method public android.view.View[] getTargets(); + method public java.lang.String[] getTransitionProperties(); method protected android.view.transition.TransitionValues getTransitionValues(android.view.View, boolean); - method protected void onTransitionCancel(); - method protected void onTransitionEnd(); - method protected void onTransitionStart(); method protected android.animation.Animator play(android.view.ViewGroup, android.view.transition.TransitionValues, android.view.transition.TransitionValues); method public void removeListener(android.view.transition.Transition.TransitionListener); method public android.view.transition.Transition setDuration(long); @@ -29262,6 +29554,8 @@ package android.view.transition { public static abstract interface Transition.TransitionListener { method public abstract void onTransitionCancel(android.view.transition.Transition); method public abstract void onTransitionEnd(android.view.transition.Transition); + method public abstract void onTransitionPause(android.view.transition.Transition); + method public abstract void onTransitionResume(android.view.transition.Transition); method public abstract void onTransitionStart(android.view.transition.Transition); } @@ -29308,6 +29602,7 @@ package android.view.transition { method protected android.animation.Animator appear(android.view.ViewGroup, android.view.transition.TransitionValues, int, android.view.transition.TransitionValues, int); method protected void captureValues(android.view.transition.TransitionValues, boolean); method protected android.animation.Animator disappear(android.view.ViewGroup, android.view.transition.TransitionValues, int, android.view.transition.TransitionValues, int); + method public boolean isVisible(android.view.transition.TransitionValues); } } diff --git a/core/java/android/animation/TypeEvaluator.java b/core/java/android/animation/TypeEvaluator.java index e738da1..2640457 100644 --- a/core/java/android/animation/TypeEvaluator.java +++ b/core/java/android/animation/TypeEvaluator.java @@ -19,7 +19,7 @@ package android.animation; /** * Interface for use with the {@link ValueAnimator#setEvaluator(TypeEvaluator)} function. Evaluators * allow developers to create animations on arbitrary property types, by allowing them to supply - * custom evaulators for types that are not automatically understood and used by the animation + * custom evaluators for types that are not automatically understood and used by the animation * system. * * @see ValueAnimator#setEvaluator(TypeEvaluator) @@ -41,4 +41,4 @@ public interface TypeEvaluator<T> { */ public T evaluate(float fraction, T startValue, T endValue); -}
\ No newline at end of file +} diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 8f2f9ca..e02410a 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -747,6 +747,7 @@ public class Activity extends ContextThemeWrapper int mResultCode = RESULT_CANCELED; Intent mResultData = null; private TranslucentConversionListener mTranslucentCallback; + private boolean mChangeCanvasToTranslucent; private boolean mTitleReady = false; @@ -4903,7 +4904,9 @@ public class Activity extends ContextThemeWrapper public void convertFromTranslucent() { try { mTranslucentCallback = null; - ActivityManagerNative.getDefault().convertFromTranslucent(mToken); + if (ActivityManagerNative.getDefault().convertFromTranslucent(mToken)) { + WindowManagerGlobal.getInstance().changeCanvasOpacity(mToken, true); + } } catch (RemoteException e) { // pass } @@ -4931,7 +4934,8 @@ public class Activity extends ContextThemeWrapper public void convertToTranslucent(TranslucentConversionListener callback) { try { mTranslucentCallback = callback; - ActivityManagerNative.getDefault().convertToTranslucent(mToken); + mChangeCanvasToTranslucent = + ActivityManagerNative.getDefault().convertToTranslucent(mToken); } catch (RemoteException e) { // pass } @@ -4943,6 +4947,9 @@ public class Activity extends ContextThemeWrapper mTranslucentCallback.onTranslucentConversionComplete(drawComplete); mTranslucentCallback = null; } + if (mChangeCanvasToTranslucent) { + WindowManagerGlobal.getInstance().changeCanvasOpacity(mToken, false); + } } /** diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index c65f17e..6ac2e80 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -438,7 +438,7 @@ public class ActivityManager { /** @hide */ public static boolean isLowRamDeviceStatic() { - return Resources.getSystem().getBoolean(com.android.internal.R.bool.config_lowRamDevice); + return "true".equals(SystemProperties.get("ro.config.low_ram", "false")); } /** diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 6a29552..6d72114 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1502,16 +1502,18 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM case CONVERT_FROM_TRANSLUCENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); - convertFromTranslucent(token); + boolean converted = convertFromTranslucent(token); reply.writeNoException(); + reply.writeInt(converted ? 1 : 0); return true; } case CONVERT_TO_TRANSLUCENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); - convertToTranslucent(token); + boolean converted = convertToTranslucent(token); reply.writeNoException(); + reply.writeInt(converted ? 1 : 0); return true; } @@ -3876,7 +3878,7 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } - public void convertFromTranslucent(IBinder token) + public boolean convertFromTranslucent(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -3884,11 +3886,13 @@ class ActivityManagerProxy implements IActivityManager data.writeStrongBinder(token); mRemote.transact(CONVERT_FROM_TRANSLUCENT_TRANSACTION, data, reply, 0); reply.readException(); + boolean res = reply.readInt() != 0; data.recycle(); reply.recycle(); + return res; } - public void convertToTranslucent(IBinder token) + public boolean convertToTranslucent(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -3896,8 +3900,10 @@ class ActivityManagerProxy implements IActivityManager data.writeStrongBinder(token); mRemote.transact(CONVERT_TO_TRANSLUCENT_TRANSACTION, data, reply, 0); reply.readException(); + boolean res = reply.readInt() != 0; data.recycle(); reply.recycle(); + return res; } public void setImmersive(IBinder token, boolean immersive) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2a28b76..e6960b3 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3865,7 +3865,7 @@ public final class ActivityThread { } } - final void freeTextLayoutCachesIfNeeded(int configDiff) { + static void freeTextLayoutCachesIfNeeded(int configDiff) { if (configDiff != 0) { // Ask text layout engine to free its caches if there is a locale change boolean hasLocaleConfigChange = ((configDiff & ActivityInfo.CONFIG_LOCALE) != 0); diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 7358f73..a7789d6 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1328,12 +1328,19 @@ final class FragmentManagerImpl extends FragmentManager { } } + /** + * Adds an action to the queue of pending actions. + * + * @param action the action to add + * @param allowStateLoss whether to allow loss of state information + * @throws IllegalStateException if the activity has been destroyed + */ public void enqueueAction(Runnable action, boolean allowStateLoss) { if (!allowStateLoss) { checkStateLoss(); } synchronized (this) { - if (mActivity == null) { + if (mDestroyed || mActivity == null) { throw new IllegalStateException("Activity has been destroyed"); } if (mPendingActions == null) { diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 6d1b6fc..af9a245 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -301,8 +301,8 @@ public interface IActivityManager extends IInterface { public void finishHeavyWeightApp() throws RemoteException; - public void convertFromTranslucent(IBinder token) throws RemoteException; - public void convertToTranslucent(IBinder token) throws RemoteException; + public boolean convertFromTranslucent(IBinder token) throws RemoteException; + public boolean convertToTranslucent(IBinder token) throws RemoteException; public void notifyActivityDrawn(IBinder token) throws RemoteException; public void setImmersive(IBinder token, boolean immersive) throws RemoteException; diff --git a/core/java/android/app/NativeActivity.java b/core/java/android/app/NativeActivity.java index b84889f..4ca3747 100644 --- a/core/java/android/app/NativeActivity.java +++ b/core/java/android/app/NativeActivity.java @@ -175,16 +175,20 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(), - getFilesDir().getAbsolutePath(), getObbDir().getAbsolutePath(), - getExternalFilesDir(null).getAbsolutePath(), - Build.VERSION.SDK_INT, getAssets(), nativeSavedState); - + getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()), + getAbsolutePath(getExternalFilesDir(null)), + Build.VERSION.SDK_INT, getAssets(), nativeSavedState); + if (mNativeHandle == 0) { throw new IllegalArgumentException("Unable to load native library: " + path); } super.onCreate(savedInstanceState); } + private static String getAbsolutePath(File file) { + return (file != null) ? file.getAbsolutePath() : null; + } + @Override protected void onDestroy() { mDestroyed = true; diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index be831d7..e0b1c00 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -32,10 +32,17 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.util.Log; +import com.android.org.conscrypt.TrustedCertificateStore; + +import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.util.List; +import java.util.Set; /** * Public interface for managing policies enforced on a device. Most clients @@ -1328,6 +1335,70 @@ public class DevicePolicyManager { } /** + * Installs the given certificate as a User CA. + * + * @return false if the certBuffer cannot be parsed or installation is + * interrupted, otherwise true + * @hide + */ + public boolean installCaCert(byte[] certBuffer) { + if (mService != null) { + try { + return mService.installCaCert(certBuffer); + } catch (RemoteException e) { + Log.w(TAG, "Failed talking with device policy service", e); + } + } + return false; + } + + /** + * Uninstalls the given certificate from the list of User CAs, if present. + * + * @hide + */ + public void uninstallCaCert(byte[] certBuffer) { + if (mService != null) { + try { + mService.uninstallCaCert(certBuffer); + } catch (RemoteException e) { + Log.w(TAG, "Failed talking with device policy service", e); + } + } + } + + /** + * Returns whether there are any user-installed CA certificates. + * + * @hide + */ + public boolean hasAnyCaCertsInstalled() { + TrustedCertificateStore certStore = new TrustedCertificateStore(); + Set<String> aliases = certStore.userAliases(); + return aliases != null && !aliases.isEmpty(); + } + + /** + * Returns whether this certificate has been installed as a User CA. + * + * @hide + */ + public boolean hasCaCertInstalled(byte[] certBuffer) { + TrustedCertificateStore certStore = new TrustedCertificateStore(); + String alias; + byte[] pemCert; + try { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate) certFactory.generateCertificate( + new ByteArrayInputStream(certBuffer)); + return certStore.getCertificateAlias(cert) != null; + } catch (CertificateException ce) { + Log.w(TAG, "Could not parse certificate", ce); + } + return false; + } + + /** * Called by an application that is administering the device to disable all cameras * on the device. After setting this, no applications will be able to access any cameras * on the device. diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 9659a91..172c47c 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -102,4 +102,7 @@ interface IDevicePolicyManager { boolean isDeviceOwner(String packageName); String getDeviceOwner(); String getDeviceOwnerName(); + + boolean installCaCert(in byte[] certBuffer); + void uninstallCaCert(in byte[] certBuffer); } diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java index d7d8cdb..e7e4a0f 100644 --- a/core/java/android/bluetooth/BluetoothA2dp.java +++ b/core/java/android/bluetooth/BluetoothA2dp.java @@ -388,6 +388,66 @@ public final class BluetoothA2dp implements BluetoothProfile { } /** + * Checks if Avrcp device supports the absolute volume feature. + * + * @return true if device supports absolute volume + * @hide + */ + public boolean isAvrcpAbsoluteVolumeSupported() { + if (DBG) Log.d(TAG, "isAvrcpAbsoluteVolumeSupported"); + if (mService != null && isEnabled()) { + try { + return mService.isAvrcpAbsoluteVolumeSupported(); + } catch (RemoteException e) { + Log.e(TAG, "Error talking to BT service in isAvrcpAbsoluteVolumeSupported()", e); + return false; + } + } + if (mService == null) Log.w(TAG, "Proxy not attached to service"); + return false; + } + + /** + * Tells remote device to adjust volume. Only if absolute volume is supported. + * + * @param direction 1 to increase volume, or -1 to decrease volume + * @hide + */ + public void adjustAvrcpAbsoluteVolume(int direction) { + if (DBG) Log.d(TAG, "adjustAvrcpAbsoluteVolume"); + if (mService != null && isEnabled()) { + try { + mService.adjustAvrcpAbsoluteVolume(direction); + return; + } catch (RemoteException e) { + Log.e(TAG, "Error talking to BT service in adjustAvrcpAbsoluteVolume()", e); + return; + } + } + if (mService == null) Log.w(TAG, "Proxy not attached to service"); + } + + /** + * Tells remote device to set an absolute volume. Only if absolute volume is supported + * + * @param volume Absolute volume to be set on AVRCP side + * @hide + */ + public void setAvrcpAbsoluteVolume(int volume) { + if (DBG) Log.d(TAG, "setAvrcpAbsoluteVolume"); + if (mService != null && isEnabled()) { + try { + mService.setAvrcpAbsoluteVolume(volume); + return; + } catch (RemoteException e) { + Log.e(TAG, "Error talking to BT service in setAvrcpAbsoluteVolume()", e); + return; + } + } + if (mService == null) Log.w(TAG, "Proxy not attached to service"); + } + + /** * Check if A2DP profile is streaming music. * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 1ea13e1..e062fa8 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1704,7 +1704,7 @@ public final class BluetoothAdapter { public void onGetDescriptor(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descUuid) { + int descInstId, ParcelUuid descUuid) { // no op } @@ -1734,14 +1734,14 @@ public final class BluetoothAdapter { public void onDescriptorRead(String address, int status, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descrUuid, byte[] value) { + int descInstId, ParcelUuid descrUuid, byte[] value) { // no op } public void onDescriptorWrite(String address, int status, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descrUuid) { + int descInstId, ParcelUuid descrUuid) { // no op } @@ -1752,6 +1752,10 @@ public final class BluetoothAdapter { public void onReadRemoteRssi(String address, int rssi, int status) { // no op } + + public void onListen(int status) { + // no op + } } } diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index df3ec1a..b390aa1 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -261,7 +261,7 @@ public final class BluetoothGatt implements BluetoothProfile { public void onGetDescriptor(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descUuid) { + int descrInstId, ParcelUuid descUuid) { if (DBG) Log.d(TAG, "onGetDescriptor() - Device=" + address + " UUID=" + descUuid); if (!address.equals(mDevice.getAddress())) { @@ -276,7 +276,7 @@ public final class BluetoothGatt implements BluetoothProfile { if (characteristic == null) return; characteristic.addDescriptor(new BluetoothGattDescriptor( - characteristic, descUuid.getUuid(), 0)); + characteristic, descUuid.getUuid(), descrInstId, 0)); } /** @@ -429,7 +429,8 @@ public final class BluetoothGatt implements BluetoothProfile { public void onDescriptorRead(String address, int status, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descrUuid, byte[] value) { + int descrInstId, ParcelUuid descrUuid, + byte[] value) { if (DBG) Log.d(TAG, "onDescriptorRead() - Device=" + address + " UUID=" + charUuid); if (!address.equals(mDevice.getAddress())) { @@ -444,7 +445,7 @@ public final class BluetoothGatt implements BluetoothProfile { if (characteristic == null) return; BluetoothGattDescriptor descriptor = characteristic.getDescriptor( - descrUuid.getUuid()); + descrUuid.getUuid(), descrInstId); if (descriptor == null) return; if (status == 0) descriptor.setValue(value); @@ -456,7 +457,7 @@ public final class BluetoothGatt implements BluetoothProfile { mAuthRetry = true; mService.readDescriptor(mClientIf, address, srvcType, srvcInstId, srvcUuid, charInstId, charUuid, - descrUuid, AUTHENTICATION_MITM); + descrInstId, descrUuid, AUTHENTICATION_MITM); } catch (RemoteException e) { Log.e(TAG,"",e); } @@ -478,7 +479,7 @@ public final class BluetoothGatt implements BluetoothProfile { public void onDescriptorWrite(String address, int status, int srvcType, int srvcInstId, ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, - ParcelUuid descrUuid) { + int descrInstId, ParcelUuid descrUuid) { if (DBG) Log.d(TAG, "onDescriptorWrite() - Device=" + address + " UUID=" + charUuid); if (!address.equals(mDevice.getAddress())) { @@ -493,7 +494,7 @@ public final class BluetoothGatt implements BluetoothProfile { if (characteristic == null) return; BluetoothGattDescriptor descriptor = characteristic.getDescriptor( - descrUuid.getUuid()); + descrUuid.getUuid(), descrInstId); if (descriptor == null) return; if ((status == GATT_INSUFFICIENT_AUTHENTICATION @@ -503,7 +504,7 @@ public final class BluetoothGatt implements BluetoothProfile { mAuthRetry = true; mService.writeDescriptor(mClientIf, address, srvcType, srvcInstId, srvcUuid, charInstId, charUuid, - descrUuid, characteristic.getWriteType(), + descrInstId, descrUuid, characteristic.getWriteType(), AUTHENTICATION_MITM, descriptor.getValue()); } catch (RemoteException e) { Log.e(TAG,"",e); @@ -552,6 +553,14 @@ public final class BluetoothGatt implements BluetoothProfile { Log.w(TAG, "Unhandled exception in callback", ex); } } + + /** + * Listen command status callback + * @hide + */ + public void onListen(int status) { + if (DBG) Log.d(TAG, "onListen() - status=" + status); + } }; /*package*/ BluetoothGatt(Context context, IBluetoothGatt iGatt, BluetoothDevice device) { @@ -684,6 +693,63 @@ public final class BluetoothGatt implements BluetoothProfile { return true; } + /** + * Starts or stops sending of advertisement packages to listen for connection + * requests from a central devices. + * + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. + * + * @param start Start or stop advertising + */ + /*package*/ void listen(boolean start) { + if (DBG) Log.d(TAG, "listen() - start: " + start); + if (mService == null || mClientIf == 0) return; + + try { + mService.clientListen(mClientIf, start); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + + /** + * Sets the advertising data contained in the adv. response packet. + * + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. + * + * @param advData true to set adv. data, false to set scan response + * @param includeName Inlucde the name in the adv. response + * @param includeTxPower Include TX power value + * @param minInterval Minimum desired scan interval (optional) + * @param maxInterval Maximum desired scan interval (optional) + * @param appearance The appearance flags for the device (optional) + * @param manufacturerData Manufacturer specific data including company ID (optional) + */ + /*package*/ void setAdvData(boolean advData, boolean includeName, boolean includeTxPower, + Integer minInterval, Integer maxInterval, + Integer appearance, Byte[] manufacturerData) { + if (DBG) Log.d(TAG, "setAdvData()"); + if (mService == null || mClientIf == 0) return; + + byte[] data = new byte[0]; + if (manufacturerData != null) { + data = new byte[manufacturerData.length]; + for(int i = 0; i != manufacturerData.length; ++i) { + data[i] = manufacturerData[i]; + } + } + + try { + mService.setAdvData(mClientIf, !advData, + includeName, includeTxPower, + minInterval != null ? minInterval : 0, + maxInterval != null ? maxInterval : 0, + appearance != null ? appearance : 0, data); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + /** * Disconnects an established connection, or cancels a connection attempt * currently in progress. @@ -915,11 +981,11 @@ public final class BluetoothGatt implements BluetoothProfile { if (device == null) return false; try { - mService.readDescriptor(mClientIf, device.getAddress(), - service.getType(), service.getInstanceId(), - new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), - new ParcelUuid(characteristic.getUuid()), - new ParcelUuid(descriptor.getUuid()), AUTHENTICATION_NONE); + mService.readDescriptor(mClientIf, device.getAddress(), service.getType(), + service.getInstanceId(), new ParcelUuid(service.getUuid()), + characteristic.getInstanceId(), new ParcelUuid(characteristic.getUuid()), + descriptor.getInstanceId(), new ParcelUuid(descriptor.getUuid()), + AUTHENTICATION_NONE); } catch (RemoteException e) { Log.e(TAG,"",e); return false; @@ -953,11 +1019,10 @@ public final class BluetoothGatt implements BluetoothProfile { if (device == null) return false; try { - mService.writeDescriptor(mClientIf, device.getAddress(), - service.getType(), service.getInstanceId(), - new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), - new ParcelUuid(characteristic.getUuid()), - new ParcelUuid(descriptor.getUuid()), + mService.writeDescriptor(mClientIf, device.getAddress(), service.getType(), + service.getInstanceId(), new ParcelUuid(service.getUuid()), + characteristic.getInstanceId(), new ParcelUuid(characteristic.getUuid()), + descriptor.getInstanceId(), new ParcelUuid(descriptor.getUuid()), characteristic.getWriteType(), AUTHENTICATION_NONE, descriptor.getValue()); } catch (RemoteException e) { @@ -1037,7 +1102,7 @@ public final class BluetoothGatt implements BluetoothProfile { * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. */ - public void abortReliableWrite(BluetoothDevice mDevice) { + public void abortReliableWrite() { if (DBG) Log.d(TAG, "abortReliableWrite() - device: " + mDevice.getAddress()); if (mService == null || mClientIf == 0) return; @@ -1049,6 +1114,13 @@ public final class BluetoothGatt implements BluetoothProfile { } /** + * @deprecated Use {@link #abortReliableWrite()} + */ + public void abortReliableWrite(BluetoothDevice mDevice) { + abortReliableWrite(); + } + + /** * Enable or disable notifications/indications for a given characteristic. * * <p>Once notifications are enabled for a characteristic, a diff --git a/core/java/android/bluetooth/BluetoothGattCharacteristic.java b/core/java/android/bluetooth/BluetoothGattCharacteristic.java index 033f079..f0ecbb4 100644 --- a/core/java/android/bluetooth/BluetoothGattCharacteristic.java +++ b/core/java/android/bluetooth/BluetoothGattCharacteristic.java @@ -283,6 +283,20 @@ public class BluetoothGattCharacteristic { } /** + * Get a descriptor by UUID and isntance id. + * @hide + */ + /*package*/ BluetoothGattDescriptor getDescriptor(UUID uuid, int instanceId) { + for(BluetoothGattDescriptor descriptor : mDescriptors) { + if (descriptor.getUuid().equals(uuid) + && descriptor.getInstanceId() == instanceId) { + return descriptor; + } + } + return null; + } + + /** * Returns the service this characteristic belongs to. * @return The asscociated service */ diff --git a/core/java/android/bluetooth/BluetoothGattDescriptor.java b/core/java/android/bluetooth/BluetoothGattDescriptor.java index 1cd6878..5f525dc 100644 --- a/core/java/android/bluetooth/BluetoothGattDescriptor.java +++ b/core/java/android/bluetooth/BluetoothGattDescriptor.java @@ -91,6 +91,12 @@ public class BluetoothGattDescriptor { protected UUID mUuid; /** + * Instance ID for this descriptor. + * @hide + */ + protected int mInstance; + + /** * Permissions for this descriptor * @hide */ @@ -116,7 +122,7 @@ public class BluetoothGattDescriptor { * @param permissions Permissions for this descriptor */ public BluetoothGattDescriptor(UUID uuid, int permissions) { - initDescriptor(null, uuid, permissions); + initDescriptor(null, uuid, 0, permissions); } /** @@ -128,14 +134,15 @@ public class BluetoothGattDescriptor { * @param permissions Permissions for this descriptor */ /*package*/ BluetoothGattDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, - int permissions) { - initDescriptor(characteristic, uuid, permissions); + int instance, int permissions) { + initDescriptor(characteristic, uuid, instance, permissions); } private void initDescriptor(BluetoothGattCharacteristic characteristic, UUID uuid, - int permissions) { + int instance, int permissions) { mCharacteristic = characteristic; mUuid = uuid; + mInstance = instance; mPermissions = permissions; } @@ -165,6 +172,21 @@ public class BluetoothGattDescriptor { } /** + * Returns the instance ID for this descriptor. + * + * <p>If a remote device offers multiple descriptors with the same UUID, + * the instance ID is used to distuinguish between descriptors. + * + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. + * + * @return Instance ID of this descriptor + * @hide + */ + public int getInstanceId() { + return mInstance; + } + + /** * Returns the permissions for this descriptor. * * @return Permissions of this descriptor diff --git a/core/java/android/bluetooth/BluetoothGattService.java b/core/java/android/bluetooth/BluetoothGattService.java index 39a435b..1e66369 100644 --- a/core/java/android/bluetooth/BluetoothGattService.java +++ b/core/java/android/bluetooth/BluetoothGattService.java @@ -152,8 +152,8 @@ public class BluetoothGattService { */ /*package*/ BluetoothGattCharacteristic getCharacteristic(UUID uuid, int instanceId) { for(BluetoothGattCharacteristic characteristic : mCharacteristics) { - if (uuid.equals(characteristic.getUuid()) && - mInstanceId == instanceId) + if (uuid.equals(characteristic.getUuid()) + && characteristic.getInstanceId() == instanceId) return characteristic; } return null; diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java index fe66fbd..6609b98 100644 --- a/core/java/android/bluetooth/BluetoothUuid.java +++ b/core/java/android/bluetooth/BluetoothUuid.java @@ -56,6 +56,8 @@ public final class BluetoothUuid { ParcelUuid.fromString("00001105-0000-1000-8000-00805f9b34fb"); public static final ParcelUuid Hid = ParcelUuid.fromString("00001124-0000-1000-8000-00805f9b34fb"); + public static final ParcelUuid Hogp = + ParcelUuid.fromString("00001812-0000-1000-8000-00805f9b34fb"); public static final ParcelUuid PANU = ParcelUuid.fromString("00001115-0000-1000-8000-00805F9B34FB"); public static final ParcelUuid NAP = diff --git a/core/java/android/bluetooth/IBluetoothA2dp.aidl b/core/java/android/bluetooth/IBluetoothA2dp.aidl index 1f10998..26ff9e2 100644 --- a/core/java/android/bluetooth/IBluetoothA2dp.aidl +++ b/core/java/android/bluetooth/IBluetoothA2dp.aidl @@ -32,5 +32,8 @@ interface IBluetoothA2dp { int getConnectionState(in BluetoothDevice device); boolean setPriority(in BluetoothDevice device, int priority); int getPriority(in BluetoothDevice device); + boolean isAvrcpAbsoluteVolumeSupported(); + oneway void adjustAvrcpAbsoluteVolume(int direction); + oneway void setAvrcpAbsoluteVolume(int volume); boolean isA2dpPlaying(in BluetoothDevice device); } diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index c89d132..df393db 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -37,6 +37,10 @@ interface IBluetoothGatt { void unregisterClient(in int clientIf); void clientConnect(in int clientIf, in String address, in boolean isDirect); void clientDisconnect(in int clientIf, in String address); + void clientListen(in int clientIf, in boolean start); + void setAdvData(in int clientIf, in boolean setScanRsp, in boolean inclName, + in boolean inclTxPower, in int minInterval, in int maxInterval, + in int appearance, in byte[] manufacturerData); void refreshDevice(in int clientIf, in String address); void discoverServices(in int clientIf, in String address); void readCharacteristic(in int clientIf, in String address, in int srvcType, @@ -50,12 +54,13 @@ interface IBluetoothGatt { void readDescriptor(in int clientIf, in String address, in int srvcType, in int srvcInstanceId, in ParcelUuid srvcId, in int charInstanceId, in ParcelUuid charId, - in ParcelUuid descrUuid, in int authReq); + in int descrInstanceId, in ParcelUuid descrUuid, + in int authReq); void writeDescriptor(in int clientIf, in String address, in int srvcType, in int srvcInstanceId, in ParcelUuid srvcId, in int charInstanceId, in ParcelUuid charId, - in ParcelUuid descrId, in int writeType, - in int authReq, in byte[] value); + in int descrInstanceId, in ParcelUuid descrId, + in int writeType, in int authReq, in byte[] value); void registerForNotification(in int clientIf, in String address, in int srvcType, in int srvcInstanceId, in ParcelUuid srvcId, in int charInstanceId, in ParcelUuid charId, diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallback.aidl index fc52172..60c297b 100644 --- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothGattCallback.aidl @@ -39,7 +39,7 @@ interface IBluetoothGattCallback { void onGetDescriptor(in String address, in int srvcType, in int srvcInstId, in ParcelUuid srvcUuid, in int charInstId, in ParcelUuid charUuid, - in ParcelUuid descrUuid); + in int descrInstId, in ParcelUuid descrUuid); void onSearchComplete(in String address, in int status); void onCharacteristicRead(in String address, in int status, in int srvcType, in int srvcInstId, in ParcelUuid srvcUuid, @@ -52,14 +52,16 @@ interface IBluetoothGattCallback { void onDescriptorRead(in String address, in int status, in int srvcType, in int srvcInstId, in ParcelUuid srvcUuid, in int charInstId, in ParcelUuid charUuid, - in ParcelUuid descrUuid, in byte[] value); + in int descrInstId, in ParcelUuid descrUuid, + in byte[] value); void onDescriptorWrite(in String address, in int status, in int srvcType, in int srvcInstId, in ParcelUuid srvcUuid, in int charInstId, in ParcelUuid charUuid, - in ParcelUuid descrUuid); + in int descrInstId, in ParcelUuid descrUuid); void onNotify(in String address, in int srvcType, in int srvcInstId, in ParcelUuid srvcUuid, in int charInstId, in ParcelUuid charUuid, in byte[] value); void onReadRemoteRssi(in String address, in int rssi, in int status); + void onListen(in int status); } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 45fed2d..5cabfee 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -2060,7 +2060,7 @@ public abstract class ContentResolver { private final class ParcelFileDescriptorInner extends ParcelFileDescriptor { private final IContentProvider mContentProvider; - private boolean mReleaseProviderFlag = false; + private boolean mProviderReleased; ParcelFileDescriptorInner(ParcelFileDescriptor pfd, IContentProvider icp) { super(pfd); @@ -2069,17 +2069,10 @@ public abstract class ContentResolver { @Override public void close() throws IOException { - if(!mReleaseProviderFlag) { - super.close(); + super.close(); + if (!mProviderReleased) { ContentResolver.this.releaseProvider(mContentProvider); - mReleaseProviderFlag = true; - } - } - - @Override - protected void finalize() throws Throwable { - if (!mReleaseProviderFlag) { - close(); + mProviderReleased = true; } } } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index ff350b9..017ad98 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2678,6 +2678,10 @@ public class Intent implements Parcelable, Cloneable { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT"; + /** {@hide} */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_MANAGE_DOCUMENT = "android.intent.action.MANAGE_DOCUMENT"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Standard intent categories (see addCategory()). diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 1c28138..0402eeb 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -786,9 +786,11 @@ public final class Configuration implements Parcelable, Comparable<Configuration // 2 most significant bits in screenLayout). setLayoutDirection(locale); } - if (delta.screenLayout != 0 && screenLayout != delta.screenLayout) { + final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK; + if (deltaScreenLayoutDir != SCREENLAYOUT_LAYOUTDIR_UNDEFINED && + deltaScreenLayoutDir != (screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK)) { + screenLayout = (screenLayout & ~SCREENLAYOUT_LAYOUTDIR_MASK) | deltaScreenLayoutDir; changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; - setLayoutDirection(locale); } if (delta.userSetLocale && (!userSetLocale || ((changed & ActivityInfo.CONFIG_LOCALE) != 0))) { @@ -937,7 +939,9 @@ public final class Configuration implements Parcelable, Comparable<Configuration changed |= ActivityInfo.CONFIG_LOCALE; changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; } - if (delta.screenLayout != 0 && screenLayout != delta.screenLayout) { + final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK; + if (deltaScreenLayoutDir != SCREENLAYOUT_LAYOUTDIR_UNDEFINED && + deltaScreenLayoutDir != (screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK)) { changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; } if (delta.touchscreen != TOUCHSCREEN_UNDEFINED diff --git a/core/java/android/database/MatrixCursor.java b/core/java/android/database/MatrixCursor.java index 6e68b6b..2a0d9b9 100644 --- a/core/java/android/database/MatrixCursor.java +++ b/core/java/android/database/MatrixCursor.java @@ -83,11 +83,10 @@ public class MatrixCursor extends AbstractCursor { * row */ public RowBuilder newRow() { - rowCount++; - int endIndex = rowCount * columnCount; + final int row = rowCount++; + final int endIndex = rowCount * columnCount; ensureCapacity(endIndex); - int start = endIndex - columnCount; - return new RowBuilder(start, endIndex); + return new RowBuilder(row); } /** @@ -180,18 +179,29 @@ public class MatrixCursor extends AbstractCursor { } /** - * Builds a row, starting from the left-most column and adding one column - * value at a time. Follows the same ordering as the column names specified - * at cursor construction time. + * Builds a row of values using either of these approaches: + * <ul> + * <li>Values can be added with explicit column ordering using + * {@link #add(Object)}, which starts from the left-most column and adds one + * column value at a time. This follows the same ordering as the column + * names specified at cursor construction time. + * <li>Column and value pairs can be offered for possible inclusion using + * {@link #offer(String, Object)}. If the cursor includes the given column, + * the value will be set for that column, otherwise the value is ignored. + * This approach is useful when matching data to a custom projection. + * </ul> + * Undefined values are left as {@code null}. */ public class RowBuilder { + private final int row; + private final int endIndex; private int index; - private final int endIndex; - RowBuilder(int index, int endIndex) { - this.index = index; - this.endIndex = endIndex; + RowBuilder(int row) { + this.row = row; + this.index = row * columnCount; + this.endIndex = index + columnCount; } /** @@ -210,6 +220,21 @@ public class MatrixCursor extends AbstractCursor { data[index++] = columnValue; return this; } + + /** + * Offer value for possible inclusion if this cursor defines the given + * column. Columns not defined by the cursor are silently ignored. + * + * @return this builder to support chaining + */ + public RowBuilder offer(String columnName, Object value) { + for (int i = 0; i < columnNames.length; i++) { + if (columnName.equals(columnNames[i])) { + data[(row * columnCount) + i] = value; + } + } + return this; + } } // AbstractCursor implementation. diff --git a/core/java/android/gesture/GestureOverlayView.java b/core/java/android/gesture/GestureOverlayView.java index b6c260f..2d47f28 100644 --- a/core/java/android/gesture/GestureOverlayView.java +++ b/core/java/android/gesture/GestureOverlayView.java @@ -486,6 +486,7 @@ public class GestureOverlayView extends FrameLayout { @Override protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); cancelClearAnimation(); } diff --git a/core/java/android/hardware/ICameraService.aidl b/core/java/android/hardware/ICameraService.aidl index 81e564e..fc54828 100644 --- a/core/java/android/hardware/ICameraService.aidl +++ b/core/java/android/hardware/ICameraService.aidl @@ -22,6 +22,7 @@ import android.hardware.IProCameraUser; import android.hardware.IProCameraCallbacks; import android.hardware.camera2.ICameraDeviceUser; import android.hardware.camera2.ICameraDeviceCallbacks; +import android.hardware.camera2.utils.BinderHolder; import android.hardware.ICameraServiceListener; import android.hardware.CameraInfo; @@ -37,17 +38,23 @@ interface ICameraService int getCameraInfo(int cameraId, out CameraInfo info); - ICamera connect(ICameraClient client, int cameraId, + int connect(ICameraClient client, int cameraId, String clientPackageName, - int clientUid); + int clientUid, + // Container for an ICamera object + out BinderHolder device); - IProCameraUser connectPro(IProCameraCallbacks callbacks, int cameraId, + int connectPro(IProCameraCallbacks callbacks, int cameraId, String clientPackageName, - int clientUid); + int clientUid, + // Container for an IProCameraUser object + out BinderHolder device); - ICameraDeviceUser connectDevice(ICameraDeviceCallbacks callbacks, int cameraId, + int connectDevice(ICameraDeviceCallbacks callbacks, int cameraId, String clientPackageName, - int clientUid); + int clientUid, + // Container for an ICameraDeviceUser object + out BinderHolder device); int addListener(ICameraServiceListener listener); int removeListener(ICameraServiceListener listener); diff --git a/core/java/android/hardware/camera2/CameraAccessException.java b/core/java/android/hardware/camera2/CameraAccessException.java index 0089f26..e08d1e6 100644 --- a/core/java/android/hardware/camera2/CameraAccessException.java +++ b/core/java/android/hardware/camera2/CameraAccessException.java @@ -48,11 +48,18 @@ public class CameraAccessException extends AndroidException { /** * The camera device is removable and has been disconnected from the Android - * device, or the camera service has shut down the connection due to a + * device, or the camera id used with {@link android.hardware.camera2.CameraManager#openCamera} + * is no longer valid, or the camera service has shut down the connection due to a * higher-priority access request for the camera device. */ public static final int CAMERA_DISCONNECTED = 4; + /** + * A deprecated HAL version is in use. + * @hide + */ + public static final int CAMERA_DEPRECATED_HAL = 1000; + // Make the eclipse warning about serializable exceptions go away private static final long serialVersionUID = 5630338637471475675L; // randomly generated diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 422d827..848d7bc 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -102,7 +102,7 @@ public interface CameraDevice extends AutoCloseable { * Get the static properties for this camera. These are identical to the * properties returned by {@link CameraManager#getCameraProperties}. * - * @return the static properties of the camera. + * @return the static properties of the camera * * @throws CameraAccessException if the camera device is no longer connected * @@ -157,14 +157,13 @@ public interface CameraDevice extends AutoCloseable { * obtain the Surface with * {@link android.renderscript.Allocation#getSurface}.</li> * - * <li>For access to uncompressed, JPEG, or raw sensor data in the - * application: Create a {@link android.media.ImageReader} object with the - * desired {@link CameraProperties#SCALER_AVAILABLE_FORMATS image format}, - * and a size from the matching + * <li>For access to uncompressed or JPEG data in the application: Create a + * {@link android.media.ImageReader} object with the desired + * {@link CameraProperties#SCALER_AVAILABLE_FORMATS image format}, and a + * size from the matching * {@link CameraProperties#SCALER_AVAILABLE_PROCESSED_SIZES processed}, - * {@link CameraProperties#SCALER_AVAILABLE_JPEG_SIZES jpeg}, or - * {@link CameraProperties#SCALER_AVAILABLE_RAW_SIZES raw} sizes. Then - * obtain a Surface from it.</li> + * {@link CameraProperties#SCALER_AVAILABLE_JPEG_SIZES jpeg}. Then obtain + * a Surface from it.</li> * * </ul> * @@ -173,6 +172,11 @@ public interface CameraDevice extends AutoCloseable { * <p>This function can take several hundred milliseconds to execute, since * camera hardware may need to be powered on or reconfigured.</p> * + * <p>The camera device will query each Surface's size and formats upon this + * call, so they must be set to a valid setting at this time (in particular: + * if the format is user-visible, it must be one of android.scaler.availableFormats; + * and the size must be one of android.scaler.available[Processed|Jpeg]Sizes).</p> + * * <p>To change the configuration after requests have been submitted to the * device, the camera device must be idle. To idle the device, stop any * repeating requests with {@link #stopRepeating stopRepeating}, and then @@ -181,7 +185,7 @@ public interface CameraDevice extends AutoCloseable { * <p>Using larger resolution outputs, or more outputs, can result in slower * output rate from the device.</p> * - * @param outputs the new set of Surfaces that should be made available as + * @param outputs The new set of Surfaces that should be made available as * targets for captured image data. * * @throws IllegalArgumentException if the set of output Surfaces do not @@ -201,7 +205,7 @@ public interface CameraDevice extends AutoCloseable { * * @param templateType An enumeration selecting the use case for this * request; one of the CameraDevice.TEMPLATE_ values. - * @return a filled-in CaptureRequest, except for output streams. + * @return a filled-in CaptureRequest, except for output streams * * @throws IllegalArgumentException if the templateType is not in the list * of supported templates. @@ -234,8 +238,8 @@ public interface CameraDevice extends AutoCloseable { * {@link #setRepeatingBurst}, and will be processed as soon as the current * repeat/repeatBurst processing completes.</p> * - * @param request the settings for this capture. - * @param listener the callback object to notify once this request has been + * @param request the settings for this capture + * @param listener The callback object to notify once this request has been * processed. If null, no metadata will be produced for this capture, * although image data will still be produced. * @@ -264,8 +268,8 @@ public interface CameraDevice extends AutoCloseable { * {@link #capture} repeatedly is that this method guarantees that no * other requests will be interspersed with the burst.</p> * - * @param requests the list of settings for this burst capture. - * @param listener the callback object to notify each time one of the + * @param requests the list of settings for this burst capture + * @param listener The callback object to notify each time one of the * requests in the burst has been processed. If null, no metadata will be * produced for any requests in this burst, although image data will still * be produced. @@ -306,7 +310,7 @@ public interface CameraDevice extends AutoCloseable { * completed before the new repeat request will be used.</p> * * @param request the request to repeat indefinitely - * @param listener the callback object to notify every time the + * @param listener The callback object to notify every time the * request finishes processing. If null, no metadata will be * produced for this stream of requests, although image data will * still be produced. @@ -350,8 +354,8 @@ public interface CameraDevice extends AutoCloseable { * {@link #setRepeatingRequest}, although any in-progress capture will be completed * before the new repeat burst will be used.</p> * - * @param requests the list of requests to cycle through indefinitely. - * @param listener the callback object to notify each time one of the + * @param requests the list of requests to cycle through indefinitely + * @param listener The callback object to notify each time one of the * requests in the repeating bursts has finished processing. If null, no * metadata will be produced for this stream of requests, although image * data will still be produced. diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 1370654..8903b4a 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -22,6 +22,7 @@ import android.hardware.ICameraServiceListener; import android.hardware.IProCameraUser; import android.hardware.camera2.utils.CameraBinderDecorator; import android.hardware.camera2.utils.CameraRuntimeException; +import android.hardware.camera2.utils.BinderHolder; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -54,7 +55,7 @@ public final class CameraManager { private final ICameraService mCameraService; private ArrayList<String> mDeviceIdList; - private HashSet<CameraListener> mListenerSet; + private HashSet<CameraListener> mListenerSet = new HashSet<CameraListener>(); private final Context mContext; private final Object mLock = new Object(); @@ -108,7 +109,7 @@ public final class CameraManager { * * Registering a listener more than once has no effect. * - * @param listener the new listener to send camera availability notices to. + * @param listener The new listener to send camera availability notices to */ public void registerCameraListener(CameraListener listener) { synchronized (mLock) { @@ -122,7 +123,7 @@ public final class CameraManager { * * Removing a listener that isn't registered has no effect. * - * @param listener the listener to remove from the notification list + * @param listener The listener to remove from the notification list */ public void unregisterCameraListener(CameraListener listener) { synchronized (mLock) { @@ -171,10 +172,10 @@ public final class CameraManager { * * @param cameraId The unique identifier of the camera device to open * - * @throws IllegalArgumentException if the cameraId does not match any - * currently connected camera device. * @throws CameraAccessException if the camera is disabled by device policy, - * or too many camera devices are already open. + * or too many camera devices are already open, or the cameraId does not match + * any currently available camera device. + * * @throws SecurityException if the application does not have permission to * access the camera * @@ -192,16 +193,11 @@ public final class CameraManager { android.hardware.camera2.impl.CameraDevice device = new android.hardware.camera2.impl.CameraDevice(cameraId); - cameraUser = mCameraService.connectDevice(device.getCallbacks(), + BinderHolder holder = new BinderHolder(); + mCameraService.connectDevice(device.getCallbacks(), Integer.parseInt(cameraId), - mContext.getPackageName(), USE_CALLING_UID); - - // TODO: change ICameraService#connectDevice to return status_t - if (cameraUser == null) { - // TEMPORARY CODE. - // catch-all exception since we aren't yet getting the actual error code - throw new IllegalStateException("Failed to open camera device"); - } + mContext.getPackageName(), USE_CALLING_UID, holder); + cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); // TODO: factor out listener to be non-nested, then move setter to constructor device.setRemoteDevice(cameraUser); @@ -214,12 +210,7 @@ public final class CameraManager { throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: " + cameraId); } catch (CameraRuntimeException e) { - if (e.getReason() == CameraAccessException.CAMERA_DISCONNECTED) { - throw new IllegalArgumentException("Invalid camera ID specified -- " + - "perhaps the camera was physically disconnected", e); - } else { - throw e.asChecked(); - } + throw e.asChecked(); } catch (RemoteException e) { // impossible return null; diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index e7f34d8..10ca9be 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -25,11 +25,6 @@ import android.os.Parcel; import android.util.Log; import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; @@ -82,8 +77,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * found in {@link CameraProperties}, {@link CaptureResult}, and * {@link CaptureRequest}. * - * @param key the metadata field to write. - * @param value the value to set the field to, which must be of a matching + * @param key The metadata field to write. + * @param value The value to set the field to, which must be of a matching * type to the key. */ public <T> void set(Key<T> key, T value) { @@ -114,8 +109,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * * @throws IllegalArgumentException if the key was not valid * - * @param key the metadata field to read. - * @return the value of that key, or {@code null} if the field is not set. + * @param key The metadata field to read. + * @return The value of that key, or {@code null} if the field is not set. */ @SuppressWarnings("unchecked") public <T> T get(Key<T> key) { @@ -275,110 +270,11 @@ public class CameraMetadata implements Parcelable, AutoCloseable { boolean sizeOnly) { MetadataMarshalClass<T> marshaler = getMarshaler(type, nativeType); - if (marshaler != null) { - return marshaler.marshal(value, buffer, nativeType, sizeOnly); - } - - /** - * FIXME: This doesn't actually work because getFields() returns fields in an unordered - * manner. Although we could sort and get the data to come out correctly on the *java* side, - * it would not be data-compatible with our strict XML definitions. - * - * Rewrite this code to use Parcelables instead, they are most likely compatible with - * what we are trying to do in general. - */ - List<Field> instanceFields = findInstanceFields(type); - if (instanceFields.size() == 0) { - throw new UnsupportedOperationException("Class has no instance fields: " + type); - } - - int fieldCount = instanceFields.size(); - int bufferSize = 0; - - HashSet<Class<?>> fieldTypes = new HashSet<Class<?>>(); - for (Field f : instanceFields) { - fieldTypes.add(f.getType()); - } - - /** - * Pack arguments one field at a time. If we can't access field, look for its accessor - * method instead. - */ - for (int i = 0; i < fieldCount; ++i) { - Object arg; - - Field f = instanceFields.get(i); - - if ((f.getModifiers() & Modifier.PUBLIC) != 0) { - try { - arg = f.get(value); - } catch (IllegalAccessException e) { - throw new UnsupportedOperationException( - "Failed to access field " + f + " of type " + type, e); - } catch (IllegalArgumentException e) { - throw new UnsupportedOperationException( - "Illegal arguments when accessing field " + f + " of type " + type, e); - } - } else { - Method accessor = null; - // try to find a public accessor method - for(Method m : type.getMethods()) { - Log.v(TAG, String.format("Looking for getter in method %s for field %s", m, f)); - - // Must have 0 arguments - if (m.getParameterTypes().length != 0) { - continue; - } - - // Return type must be same as field type - if (m.getReturnType() != f.getType()) { - continue; - } - - // Strip 'm' from variable prefix if the next letter is capitalized - String fieldName = f.getName(); - char[] nameChars = f.getName().toCharArray(); - if (nameChars.length >= 2 && nameChars[0] == 'm' - && Character.isUpperCase(nameChars[1])) { - fieldName = String.valueOf(nameChars, /*start*/1, nameChars.length - 1); - } - - Log.v(TAG, String.format("Normalized field name: %s", fieldName)); - - // #getFoo() , getfoo(), foo(), all match. - if (m.getName().toLowerCase().equals(fieldName.toLowerCase()) || - m.getName().toLowerCase().equals("get" + fieldName.toLowerCase())) { - accessor = m; - break; - } - } - - if (accessor == null) { - throw new UnsupportedOperationException( - "Failed to find getter method for field " + f + " in type " + type); - } - - try { - arg = accessor.invoke(value); - } catch (IllegalAccessException e) { - // Impossible - throw new UnsupportedOperationException("Failed to access method + " + accessor - + " in type " + type, e); - } catch (IllegalArgumentException e) { - // Impossible - throw new UnsupportedOperationException("Bad arguments for method + " + accessor - + " in type " + type, e); - } catch (InvocationTargetException e) { - // Possibly but extremely unlikely - throw new UnsupportedOperationException("Failed to invoke method + " + accessor - + " in type " + type, e); - } - } - - bufferSize += packSingle(arg, buffer, (Class<Object>)f.getType(), nativeType, sizeOnly); + if (marshaler == null) { + throw new IllegalArgumentException(String.format("Unknown Key type: %s", type)); } - return bufferSize; + return marshaler.marshal(value, buffer, nativeType, sizeOnly); } private static <T> int packArray(T value, ByteBuffer buffer, Class<T> type, int nativeType, @@ -442,30 +338,6 @@ public class CameraMetadata implements Parcelable, AutoCloseable { return val; } - private static <T> List<Field> findInstanceFields(Class<T> type) { - List<Field> fields = new ArrayList<Field>(); - - for (Field f : type.getDeclaredFields()) { - if (f.isSynthetic()) { - throw new UnsupportedOperationException( - "Marshalling synthetic fields not supported in type " + type); - } - - // Skip static fields - int modifiers = f.getModifiers(); - if ((modifiers & Modifier.STATIC) == 0) { - fields.add(f); - } - - Log.v(TAG, String.format("Field %s has modifiers %d", f, modifiers)); - } - - if (type.getDeclaredFields().length == 0) { - Log.w(TAG, String.format("Type %s had 0 fields of any kind", type)); - } - return fields; - } - @SuppressWarnings({"unchecked", "rawtypes"}) private static <T> T unpackSingle(ByteBuffer buffer, Class<T> type, int nativeType) { @@ -486,84 +358,6 @@ public class CameraMetadata implements Parcelable, AutoCloseable { return instance; } - private static <T> Constructor<T> findApplicableConstructor(Class<T> type) { - - List<Field> instanceFields = findInstanceFields(type); - if (instanceFields.size() == 0) { - throw new UnsupportedOperationException("Class has no instance fields: " + type); - } - - Constructor<T> constructor = null; - int fieldCount = instanceFields.size(); - - HashSet<Class<?>> fieldTypes = new HashSet<Class<?>>(); - for (Field f : instanceFields) { - fieldTypes.add(f.getType()); - } - - /** - * Find which constructor to use: - * - must be public - * - same amount of arguments as there are instance fields - * - each argument is same type as each field (in any order) - */ - @SuppressWarnings("unchecked") - Constructor<T>[] constructors = (Constructor<T>[]) type.getConstructors(); - for (Constructor<T> ctor : constructors) { - Log.v(TAG, String.format("Inspecting constructor '%s'", ctor)); - - Class<?>[] parameterTypes = ctor.getParameterTypes(); - if (parameterTypes.length == fieldCount) { - boolean match = true; - - HashSet<Class<?>> argTypes = new HashSet<Class<?>>(); - for (Class<?> t : parameterTypes) { - argTypes.add(t); - } - - // Order does not matter - match = argTypes.equals(fieldTypes); - - /* - // check if the types are the same - for (int i = 0; i < fieldCount; ++i) { - if (parameterTypes[i] != instanceFields.get(i).getType()) { - - Log.v(TAG, String.format( - "Constructor arg (%d) type %s did not match field type %s", i, - parameterTypes[i], instanceFields.get(i).getType())); - - match = false; - break; - } - } - */ - - if (match) { - constructor = ctor; - break; - } else { - Log.w(TAG, String.format("Constructor args did not have matching types")); - } - } else { - Log.v(TAG, String.format( - "Constructor did not have expected amount of fields (had %d, expected %d)", - parameterTypes.length, fieldCount)); - } - } - - if (constructors.length == 0) { - Log.w(TAG, String.format("Type %s had no public constructors", type)); - } - - if (constructor == null) { - throw new UnsupportedOperationException( - "Failed to find any applicable constructors for type " + type); - } - - return constructor; - } - private static <T extends Enum<T>> T unpackEnum(ByteBuffer buffer, Class<T> type, int nativeType) { int ordinal = unpackSingleNative(buffer, Integer.TYPE, nativeType); @@ -573,55 +367,11 @@ public class CameraMetadata implements Parcelable, AutoCloseable { private static <T> T unpackClass(ByteBuffer buffer, Class<T> type, int nativeType) { MetadataMarshalClass<T> marshaler = getMarshaler(type, nativeType); - if (marshaler != null) { - return marshaler.unmarshal(buffer, nativeType); - } - - /** - * FIXME: This doesn't actually work because getFields() returns fields in an unordered - * manner. Although we could sort and get the data to come out correctly on the *java* side, - * it would not be data-compatible with our strict XML definitions. - * - * Rewrite this code to use Parcelables instead, they are most likely compatible with - * what we are trying to do in general. - */ - - List<Field> instanceFields = findInstanceFields(type); - if (instanceFields.size() == 0) { - throw new UnsupportedOperationException("Class has no instance fields: " + type); - } - int fieldCount = instanceFields.size(); - - Constructor<T> constructor = findApplicableConstructor(type); - - /** - * Build the arguments by unpacking one field at a time - * (note that while the field type might be different, the native type is the same) - */ - Object[] arguments = new Object[fieldCount]; - for (int i = 0; i < fieldCount; ++i) { - Object o = unpackSingle(buffer, instanceFields.get(i).getType(), nativeType); - arguments[i] = o; + if (marshaler == null) { + throw new IllegalArgumentException("Unknown class type: " + type); } - T instance; - try { - instance = constructor.newInstance(arguments); - } catch (InstantiationException e) { - // type is abstract class, interface, etc... - throw new UnsupportedOperationException("Failed to instantiate type " + type, e); - } catch (IllegalAccessException e) { - // This could happen if we have to access a private. - throw new UnsupportedOperationException("Failed to access type " + type, e); - } catch (IllegalArgumentException e) { - throw new UnsupportedOperationException("Illegal arguments for constructor of type " - + type, e); - } catch (InvocationTargetException e) { - throw new UnsupportedOperationException( - "Underlying constructor threw exception for type " + type, e); - } - - return instance; + return marshaler.unmarshal(buffer, nativeType); } @SuppressWarnings("unchecked") @@ -745,7 +495,7 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * * <p>This value is looked up the first time, and cached subsequently.</p> * - * @return the tag numeric value corresponding to the string + * @return The tag numeric value corresponding to the string * * @hide */ @@ -784,7 +534,7 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * * <p>Useful to convert a CameraMetadata into e.g. a CaptureRequest.</p> * - * @param other metadata to swap with + * @param other Metadata to swap with * @throws NullPointerException if other was null * @hide */ @@ -846,8 +596,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { /** * Get the underlying native type for a tag. * - * @param tag an integer tag, see e.g. {@link #getTag} - * @return an int enum for the metadata type, see e.g. {@link #TYPE_BYTE} + * @param tag An integer tag, see e.g. {@link #getTag} + * @return An int enum for the metadata type, see e.g. {@link #TYPE_BYTE} * * @hide */ @@ -861,8 +611,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * * <p>An empty array can be passed in to update the entry to 0 elements.</p> * - * @param tag an integer tag, see e.g. {@link #getTag} - * @param src an array of bytes, or null to erase the entry + * @param tag An integer tag, see e.g. {@link #getTag} + * @param src An array of bytes, or null to erase the entry * * @hide */ @@ -876,9 +626,9 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * * <p>An empty array can be returned to denote an existing entry with 0 elements.</p> * - * @param tag an integer tag, see e.g. {@link #getTag} + * @param tag An integer tag, see e.g. {@link #getTag} * - * @return null if there were 0 entries for this tag, a byte[] otherwise. + * @return {@code null} if there were 0 entries for this tag, a byte[] otherwise. * @hide */ public byte[] readValues(int tag) { @@ -901,8 +651,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * Register a non-sequential set of values to be used with the pack/unpack functions. * This enables get/set to correctly marshal the enum into a value that is C-compatible. * - * @param enumType the class for an enum - * @param values a list of values mapping to the ordinals of the enum + * @param enumType The class for an enum + * @param values A list of values mapping to the ordinals of the enum * * @hide */ @@ -923,8 +673,8 @@ public class CameraMetadata implements Parcelable, AutoCloseable { * enums that have fully sequential values, although for C-style enums the range of values * may not map 1:1. * - * @param enumValue enum instance - * @return int guaranteed to be ABI-compatible with the C enum equivalent + * @param enumValue Enum instance + * @return Int guaranteed to be ABI-compatible with the C enum equivalent */ private static <T extends Enum<T>> int getEnumValue(T enumValue) { int[] values; @@ -941,9 +691,9 @@ public class CameraMetadata implements Parcelable, AutoCloseable { /** * Finds the enum corresponding to it's numeric value. Opposite of {@link #getEnumValue} method. * - * @param enumType class of the enum we want to find - * @param value the numeric value of the enum - * @return an instance of the enum + * @param enumType Class of the enum we want to find + * @param value The numeric value of the enum + * @return An instance of the enum */ private static <T extends Enum<T>> T getEnumFromValue(Class<T> enumType, int value) { int ordinal; @@ -1011,4 +761,1025 @@ public class CameraMetadata implements Parcelable, AutoCloseable { Log.v(TAG, "Registered metadata marshalers"); } + + /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * The enum values below this point are generated from metadata + * definitions in /system/media/camera/docs. Do not modify by hand or + * modify the comment blocks at the start or end. + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/ + + // + // Enumeration values for CameraProperties#LENS_FACING + // + + /** + * @see CameraProperties#LENS_FACING + */ + public static final int LENS_FACING_FRONT = 0; + + /** + * @see CameraProperties#LENS_FACING + */ + public static final int LENS_FACING_BACK = 1; + + // + // Enumeration values for CameraProperties#LED_AVAILABLE_LEDS + // + + /** + * <p> + * android.led.transmit control is used + * </p> + * @see CameraProperties#LED_AVAILABLE_LEDS + * @hide + */ + public static final int LED_AVAILABLE_LEDS_TRANSMIT = 0; + + // + // Enumeration values for CameraProperties#INFO_SUPPORTED_HARDWARE_LEVEL + // + + /** + * @see CameraProperties#INFO_SUPPORTED_HARDWARE_LEVEL + */ + public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; + + /** + * @see CameraProperties#INFO_SUPPORTED_HARDWARE_LEVEL + */ + public static final int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; + + // + // Enumeration values for CaptureRequest#COLOR_CORRECTION_MODE + // + + /** + * <p> + * Use the android.colorCorrection.transform matrix + * and android.colorCorrection.gains to do color conversion + * </p> + * @see CaptureRequest#COLOR_CORRECTION_MODE + */ + public static final int COLOR_CORRECTION_MODE_TRANSFORM_MATRIX = 0; + + /** + * <p> + * Must not slow down frame rate relative to raw + * bayer output + * </p> + * @see CaptureRequest#COLOR_CORRECTION_MODE + */ + public static final int COLOR_CORRECTION_MODE_FAST = 1; + + /** + * <p> + * Frame rate may be reduced by high + * quality + * </p> + * @see CaptureRequest#COLOR_CORRECTION_MODE + */ + public static final int COLOR_CORRECTION_MODE_HIGH_QUALITY = 2; + + // + // Enumeration values for CaptureRequest#CONTROL_AE_ANTIBANDING_MODE + // + + /** + * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE + */ + public static final int CONTROL_AE_ANTIBANDING_MODE_OFF = 0; + + /** + * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE + */ + public static final int CONTROL_AE_ANTIBANDING_MODE_50HZ = 1; + + /** + * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE + */ + public static final int CONTROL_AE_ANTIBANDING_MODE_60HZ = 2; + + /** + * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE + */ + public static final int CONTROL_AE_ANTIBANDING_MODE_AUTO = 3; + + // + // Enumeration values for CaptureRequest#CONTROL_AE_MODE + // + + /** + * <p> + * Autoexposure is disabled; sensor.exposureTime, + * sensor.sensitivity and sensor.frameDuration are used + * </p> + * @see CaptureRequest#CONTROL_AE_MODE + */ + public static final int CONTROL_AE_MODE_OFF = 0; + + /** + * <p> + * Autoexposure is active, no flash + * control + * </p> + * @see CaptureRequest#CONTROL_AE_MODE + */ + public static final int CONTROL_AE_MODE_ON = 1; + + /** + * <p> + * if flash exists Autoexposure is active, auto + * flash control; flash may be fired when precapture + * trigger is activated, and for captures for which + * captureIntent = STILL_CAPTURE + * </p> + * @see CaptureRequest#CONTROL_AE_MODE + */ + public static final int CONTROL_AE_MODE_ON_AUTO_FLASH = 2; + + /** + * <p> + * if flash exists Autoexposure is active, auto + * flash control for precapture trigger and always flash + * when captureIntent = STILL_CAPTURE + * </p> + * @see CaptureRequest#CONTROL_AE_MODE + */ + public static final int CONTROL_AE_MODE_ON_ALWAYS_FLASH = 3; + + /** + * <p> + * optional Automatic red eye reduction with flash. + * If deemed necessary, red eye reduction sequence should + * fire when precapture trigger is activated, and final + * flash should fire when captureIntent = + * STILL_CAPTURE + * </p> + * @see CaptureRequest#CONTROL_AE_MODE + */ + public static final int CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE = 4; + + // + // Enumeration values for CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + // + + /** + * <p> + * The trigger is idle. + * </p> + * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + */ + public static final int CONTROL_AE_PRECAPTURE_TRIGGER_IDLE = 0; + + /** + * <p> + * The precapture metering sequence + * must be started. The exact effect of the precapture + * trigger depends on the current AE mode and + * state. + * </p> + * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + */ + public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; + + // + // Enumeration values for CaptureRequest#CONTROL_AF_MODE + // + + /** + * <p> + * The 3A routines do not control the lens; + * android.lens.focusDistance is controlled by the + * application + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_OFF = 0; + + /** + * <p> + * if lens is not fixed focus. + * </p><p> + * Use android.lens.minimumFocusDistance to determine if lens + * is fixed focus In this mode, the lens does not move unless + * the autofocus trigger action is called. When that trigger + * is activated, AF must transition to ACTIVE_SCAN, then to + * the outcome of the scan (FOCUSED or + * NOT_FOCUSED). + * </p><p> + * Triggering cancel AF resets the lens position to default, + * and sets the AF state to INACTIVE. + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_AUTO = 1; + + /** + * <p> + * In this mode, the lens does not move unless the + * autofocus trigger action is called. + * </p><p> + * When that trigger is activated, AF must transition to + * ACTIVE_SCAN, then to the outcome of the scan (FOCUSED or + * NOT_FOCUSED). Triggering cancel AF resets the lens + * position to default, and sets the AF state to + * INACTIVE. + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_MACRO = 2; + + /** + * <p> + * In this mode, the AF algorithm modifies the lens + * position continually to attempt to provide a + * constantly-in-focus image stream. + * </p><p> + * The focusing behavior should be suitable for good quality + * video recording; typically this means slower focus + * movement and no overshoots. When the AF trigger is not + * involved, the AF algorithm should start in INACTIVE state, + * and then transition into PASSIVE_SCAN and PASSIVE_FOCUSED + * states as appropriate. When the AF trigger is activated, + * the algorithm should immediately transition into + * AF_FOCUSED or AF_NOT_FOCUSED as appropriate, and lock the + * lens position until a cancel AF trigger is received. + * </p><p> + * Once cancel is received, the algorithm should transition + * back to INACTIVE and resume passive scan. Note that this + * behavior is not identical to CONTINUOUS_PICTURE, since an + * ongoing PASSIVE_SCAN must immediately be + * canceled. + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_CONTINUOUS_VIDEO = 3; + + /** + * <p> + * In this mode, the AF algorithm modifies the lens + * position continually to attempt to provide a + * constantly-in-focus image stream. + * </p><p> + * The focusing behavior should be suitable for still image + * capture; typically this means focusing as fast as + * possible. When the AF trigger is not involved, the AF + * algorithm should start in INACTIVE state, and then + * transition into PASSIVE_SCAN and PASSIVE_FOCUSED states as + * appropriate as it attempts to maintain focus. When the AF + * trigger is activated, the algorithm should finish its + * PASSIVE_SCAN if active, and then transition into + * AF_FOCUSED or AF_NOT_FOCUSED as appropriate, and lock the + * lens position until a cancel AF trigger is received. + * </p><p> + * When the AF cancel trigger is activated, the algorithm + * should transition back to INACTIVE and then act as if it + * has just been started. + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_CONTINUOUS_PICTURE = 4; + + /** + * <p> + * Extended depth of field (digital focus). AF + * trigger is ignored, AF state should always be + * INACTIVE. + * </p> + * @see CaptureRequest#CONTROL_AF_MODE + */ + public static final int CONTROL_AF_MODE_EDOF = 5; + + // + // Enumeration values for CaptureRequest#CONTROL_AF_TRIGGER + // + + /** + * <p> + * The trigger is idle. + * </p> + * @see CaptureRequest#CONTROL_AF_TRIGGER + */ + public static final int CONTROL_AF_TRIGGER_IDLE = 0; + + /** + * <p> + * Autofocus must trigger now. + * </p> + * @see CaptureRequest#CONTROL_AF_TRIGGER + */ + public static final int CONTROL_AF_TRIGGER_START = 1; + + /** + * <p> + * Autofocus must return to initial + * state, and cancel any active trigger. + * </p> + * @see CaptureRequest#CONTROL_AF_TRIGGER + */ + public static final int CONTROL_AF_TRIGGER_CANCEL = 2; + + // + // Enumeration values for CaptureRequest#CONTROL_AWB_MODE + // + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_OFF = 0; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_AUTO = 1; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_INCANDESCENT = 2; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_FLUORESCENT = 3; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_WARM_FLUORESCENT = 4; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_DAYLIGHT = 5; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_CLOUDY_DAYLIGHT = 6; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_TWILIGHT = 7; + + /** + * @see CaptureRequest#CONTROL_AWB_MODE + */ + public static final int CONTROL_AWB_MODE_SHADE = 8; + + // + // Enumeration values for CaptureRequest#CONTROL_CAPTURE_INTENT + // + + /** + * <p> + * This request doesn't fall into the other + * categories. Default to preview-like + * behavior. + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_CUSTOM = 0; + + /** + * <p> + * This request is for a preview-like usecase. The + * precapture trigger may be used to start off a metering + * w/flash sequence + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_PREVIEW = 1; + + /** + * <p> + * This request is for a still capture-type + * usecase. + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_STILL_CAPTURE = 2; + + /** + * <p> + * This request is for a video recording + * usecase. + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_VIDEO_RECORD = 3; + + /** + * <p> + * This request is for a video snapshot (still + * image while recording video) usecase + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT = 4; + + /** + * <p> + * This request is for a ZSL usecase; the + * application will stream full-resolution images and + * reprocess one or several later for a final + * capture + * </p> + * @see CaptureRequest#CONTROL_CAPTURE_INTENT + */ + public static final int CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG = 5; + + // + // Enumeration values for CaptureRequest#CONTROL_EFFECT_MODE + // + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_OFF = 0; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_MONO = 1; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_NEGATIVE = 2; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_SOLARIZE = 3; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_SEPIA = 4; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_POSTERIZE = 5; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_WHITEBOARD = 6; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_BLACKBOARD = 7; + + /** + * @see CaptureRequest#CONTROL_EFFECT_MODE + */ + public static final int CONTROL_EFFECT_MODE_AQUA = 8; + + // + // Enumeration values for CaptureRequest#CONTROL_MODE + // + + /** + * <p> + * Full application control of pipeline. All 3A + * routines are disabled, no other settings in + * android.control.* have any effect + * </p> + * @see CaptureRequest#CONTROL_MODE + */ + public static final int CONTROL_MODE_OFF = 0; + + /** + * <p> + * Use settings for each individual 3A routine. + * Manual control of capture parameters is disabled. All + * controls in android.control.* besides sceneMode take + * effect + * </p> + * @see CaptureRequest#CONTROL_MODE + */ + public static final int CONTROL_MODE_AUTO = 1; + + /** + * <p> + * Use specific scene mode. Enabling this disables + * control.aeMode, control.awbMode and control.afMode + * controls; the HAL must ignore those settings while + * USE_SCENE_MODE is active (except for FACE_PRIORITY + * scene mode). Other control entries are still active. + * This setting can only be used if availableSceneModes != + * UNSUPPORTED + * </p> + * @see CaptureRequest#CONTROL_MODE + */ + public static final int CONTROL_MODE_USE_SCENE_MODE = 2; + + // + // Enumeration values for CaptureRequest#CONTROL_SCENE_MODE + // + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_UNSUPPORTED = 0; + + /** + * <p> + * if face detection support exists Use face + * detection data to drive 3A routines. If face detection + * statistics are disabled, should still operate correctly + * (but not return face detection statistics to the + * framework). + * </p><p> + * Unlike the other scene modes, aeMode, awbMode, and afMode + * remain active when FACE_PRIORITY is set. This is due to + * compatibility concerns with the old camera + * API + * </p> + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_FACE_PRIORITY = 1; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_ACTION = 2; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_PORTRAIT = 3; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_LANDSCAPE = 4; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_NIGHT = 5; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_NIGHT_PORTRAIT = 6; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_THEATRE = 7; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_BEACH = 8; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_SNOW = 9; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_SUNSET = 10; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_STEADYPHOTO = 11; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_FIREWORKS = 12; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_SPORTS = 13; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_PARTY = 14; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_CANDLELIGHT = 15; + + /** + * @see CaptureRequest#CONTROL_SCENE_MODE + */ + public static final int CONTROL_SCENE_MODE_BARCODE = 16; + + // + // Enumeration values for CaptureRequest#EDGE_MODE + // + + /** + * <p> + * No edge enhancement is applied + * </p> + * @see CaptureRequest#EDGE_MODE + */ + public static final int EDGE_MODE_OFF = 0; + + /** + * <p> + * Must not slow down frame rate relative to raw + * bayer output + * </p> + * @see CaptureRequest#EDGE_MODE + */ + public static final int EDGE_MODE_FAST = 1; + + /** + * <p> + * Frame rate may be reduced by high + * quality + * </p> + * @see CaptureRequest#EDGE_MODE + */ + public static final int EDGE_MODE_HIGH_QUALITY = 2; + + // + // Enumeration values for CaptureRequest#FLASH_MODE + // + + /** + * <p> + * Do not fire the flash for this + * capture + * </p> + * @see CaptureRequest#FLASH_MODE + */ + public static final int FLASH_MODE_OFF = 0; + + /** + * <p> + * if android.flash.available is true Fire flash + * for this capture based on firingPower, + * firingTime. + * </p> + * @see CaptureRequest#FLASH_MODE + */ + public static final int FLASH_MODE_SINGLE = 1; + + /** + * <p> + * if android.flash.available is true Flash + * continuously on, power set by + * firingPower + * </p> + * @see CaptureRequest#FLASH_MODE + */ + public static final int FLASH_MODE_TORCH = 2; + + // + // Enumeration values for CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE + // + + /** + * @see CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE + */ + public static final int LENS_OPTICAL_STABILIZATION_MODE_OFF = 0; + + /** + * @see CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE + */ + public static final int LENS_OPTICAL_STABILIZATION_MODE_ON = 1; + + // + // Enumeration values for CaptureRequest#NOISE_REDUCTION_MODE + // + + /** + * <p> + * No noise reduction is applied + * </p> + * @see CaptureRequest#NOISE_REDUCTION_MODE + */ + public static final int NOISE_REDUCTION_MODE_OFF = 0; + + /** + * <p> + * Must not slow down frame rate relative to raw + * bayer output + * </p> + * @see CaptureRequest#NOISE_REDUCTION_MODE + */ + public static final int NOISE_REDUCTION_MODE_FAST = 1; + + /** + * <p> + * May slow down frame rate to provide highest + * quality + * </p> + * @see CaptureRequest#NOISE_REDUCTION_MODE + */ + public static final int NOISE_REDUCTION_MODE_HIGH_QUALITY = 2; + + // + // Enumeration values for CaptureRequest#STATISTICS_FACE_DETECT_MODE + // + + /** + * @see CaptureRequest#STATISTICS_FACE_DETECT_MODE + */ + public static final int STATISTICS_FACE_DETECT_MODE_OFF = 0; + + /** + * <p> + * Optional Return rectangle and confidence + * only + * </p> + * @see CaptureRequest#STATISTICS_FACE_DETECT_MODE + */ + public static final int STATISTICS_FACE_DETECT_MODE_SIMPLE = 1; + + /** + * <p> + * Optional Return all face + * metadata + * </p> + * @see CaptureRequest#STATISTICS_FACE_DETECT_MODE + */ + public static final int STATISTICS_FACE_DETECT_MODE_FULL = 2; + + // + // Enumeration values for CaptureRequest#TONEMAP_MODE + // + + /** + * <p> + * Use the tone mapping curve specified in + * android.tonemap.curve + * </p> + * @see CaptureRequest#TONEMAP_MODE + */ + public static final int TONEMAP_MODE_CONTRAST_CURVE = 0; + + /** + * <p> + * Must not slow down frame rate relative to raw + * bayer output + * </p> + * @see CaptureRequest#TONEMAP_MODE + */ + public static final int TONEMAP_MODE_FAST = 1; + + /** + * <p> + * Frame rate may be reduced by high + * quality + * </p> + * @see CaptureRequest#TONEMAP_MODE + */ + public static final int TONEMAP_MODE_HIGH_QUALITY = 2; + + // + // Enumeration values for CaptureResult#CONTROL_AE_STATE + // + + /** + * <p> + * AE is off. When a camera device is opened, it starts in + * this state. + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_INACTIVE = 0; + + /** + * <p> + * AE doesn't yet have a good set of control values + * for the current scene + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_SEARCHING = 1; + + /** + * <p> + * AE has a good set of control values for the + * current scene + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_CONVERGED = 2; + + /** + * <p> + * AE has been locked (aeMode = + * LOCKED) + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_LOCKED = 3; + + /** + * <p> + * AE has a good set of control values, but flash + * needs to be fired for good quality still + * capture + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_FLASH_REQUIRED = 4; + + /** + * <p> + * AE has been asked to do a precapture sequence + * (through the + * trigger_action(CAMERA2_TRIGGER_PRECAPTURE_METERING) + * call), and is currently executing it. Once PRECAPTURE + * completes, AE will transition to CONVERGED or + * FLASH_REQUIRED as appropriate + * </p> + * @see CaptureResult#CONTROL_AE_STATE + */ + public static final int CONTROL_AE_STATE_PRECAPTURE = 5; + + // + // Enumeration values for CaptureResult#CONTROL_AF_STATE + // + + /** + * <p> + * AF off or has not yet tried to scan/been asked + * to scan. When a camera device is opened, it starts in + * this state. + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_INACTIVE = 0; + + /** + * <p> + * if CONTINUOUS_* modes are supported AF is + * currently doing an AF scan initiated by a continuous + * autofocus mode + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_PASSIVE_SCAN = 1; + + /** + * <p> + * if CONTINUOUS_* modes are supported AF currently + * believes it is in focus, but may restart scanning at + * any time. + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_PASSIVE_FOCUSED = 2; + + /** + * <p> + * if AUTO or MACRO modes are supported AF is doing + * an AF scan because it was triggered by AF + * trigger + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_ACTIVE_SCAN = 3; + + /** + * <p> + * if any AF mode besides OFF is supported AF + * believes it is focused correctly and is + * locked + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_FOCUSED_LOCKED = 4; + + /** + * <p> + * if any AF mode besides OFF is supported AF has + * failed to focus successfully and is + * locked + * </p> + * @see CaptureResult#CONTROL_AF_STATE + */ + public static final int CONTROL_AF_STATE_NOT_FOCUSED_LOCKED = 5; + + // + // Enumeration values for CaptureResult#CONTROL_AWB_STATE + // + + /** + * <p> + * AWB is not in auto mode. When a camera device is opened, it + * starts in this state. + * </p> + * @see CaptureResult#CONTROL_AWB_STATE + */ + public static final int CONTROL_AWB_STATE_INACTIVE = 0; + + /** + * <p> + * AWB doesn't yet have a good set of control + * values for the current scene + * </p> + * @see CaptureResult#CONTROL_AWB_STATE + */ + public static final int CONTROL_AWB_STATE_SEARCHING = 1; + + /** + * <p> + * AWB has a good set of control values for the + * current scene + * </p> + * @see CaptureResult#CONTROL_AWB_STATE + */ + public static final int CONTROL_AWB_STATE_CONVERGED = 2; + + /** + * <p> + * AE has been locked (aeMode = + * LOCKED) + * </p> + * @see CaptureResult#CONTROL_AWB_STATE + */ + public static final int CONTROL_AWB_STATE_LOCKED = 3; + + // + // Enumeration values for CaptureResult#FLASH_STATE + // + + /** + * <p> + * No flash on camera + * </p> + * @see CaptureResult#FLASH_STATE + */ + public static final int FLASH_STATE_UNAVAILABLE = 0; + + /** + * <p> + * if android.flash.available is true Flash is + * charging and cannot be fired + * </p> + * @see CaptureResult#FLASH_STATE + */ + public static final int FLASH_STATE_CHARGING = 1; + + /** + * <p> + * if android.flash.available is true Flash is + * ready to fire + * </p> + * @see CaptureResult#FLASH_STATE + */ + public static final int FLASH_STATE_READY = 2; + + /** + * <p> + * if android.flash.available is true Flash fired + * for this capture + * </p> + * @see CaptureResult#FLASH_STATE + */ + public static final int FLASH_STATE_FIRED = 3; + + // + // Enumeration values for CaptureResult#LENS_STATE + // + + /** + * @see CaptureResult#LENS_STATE + */ + public static final int LENS_STATE_STATIONARY = 0; + + // + // Enumeration values for CaptureResult#STATISTICS_SCENE_FLICKER + // + + /** + * @see CaptureResult#STATISTICS_SCENE_FLICKER + */ + public static final int STATISTICS_SCENE_FLICKER_NONE = 0; + + /** + * @see CaptureResult#STATISTICS_SCENE_FLICKER + */ + public static final int STATISTICS_SCENE_FLICKER_50HZ = 1; + + /** + * @see CaptureResult#STATISTICS_SCENE_FLICKER + */ + public static final int STATISTICS_SCENE_FLICKER_60HZ = 2; + + /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * End generated code + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ + } diff --git a/core/java/android/hardware/camera2/CameraProperties.java b/core/java/android/hardware/camera2/CameraProperties.java index 89e1f2a..e713d21 100644 --- a/core/java/android/hardware/camera2/CameraProperties.java +++ b/core/java/android/hardware/camera2/CameraProperties.java @@ -32,216 +32,466 @@ import java.util.List; * @see CameraManager */ public final class CameraProperties extends CameraMetadata { + + /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * The key entries below this point are generated from metadata + * definitions in /system/media/camera/docs. Do not modify by hand or + * modify the comment blocks at the start or end. + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/ + /** - * The model name of the camera. For fixed (non-removable) cameras, this is - * the manufacturer's name. For removable cameras, this is a string that - * uniquely identifies the camera model and manufacturer. The - * {@link #INFO_IDENTIFIER} can be used to distinguish between multiple - * removable cameras of the same model. + * <p> + * Which set of antibanding modes are + * supported + * </p> */ - public static final Key<String> INFO_MODEL = - new Key<String>("android.info.model", String.class); + public static final Key<byte[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES = + new Key<byte[]>("android.control.aeAvailableAntibandingModes", byte[].class); /** - * A unique identifier for this camera. For removable cameras, every - * camera will have a unique identifier, including two cameras of the - * same model and manufacturer. For non-removable cameras, the - * identifier is equal to the the device's id. + * <p> + * List of frame rate ranges supported by the + * AE algorithm/hardware + * </p> */ - public static final Key<String> INFO_IDENTIFIER = - new Key<String>("android.info.identifier", String.class); + public static final Key<int[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES = + new Key<int[]>("android.control.aeAvailableTargetFpsRanges", int[].class); /** - * <p>Whether this camera is removable or not.</p> - * - * <p>Applications using a removable camera must be prepared for the camera - * to be disconnected during use. Use the {@link #INFO_IDENTIFIER} field to - * determine if this camera is a match for a camera device seen earlier.</p> + * <p> + * Maximum and minimum exposure compensation + * setting, in counts of + * android.control.aeCompensationStepSize + * </p> */ - public static final Key<Boolean> INFO_REMOVABLE = - new Key<Boolean>("android.info.isRemovable", Boolean.TYPE); + public static final Key<int[]> CONTROL_AE_COMPENSATION_RANGE = + new Key<int[]>("android.control.aeCompensationRange", int[].class); /** - * <p>The hardware operational model of this device. One of the - * INFO_SUPPORTED_HARDWARE_LEVEL_* constants.</p> - * - * <p>Limited-capability devices have a number of limitations relative to - * full-capability cameras. Roughly, they have capabilities comparable to - * those provided by the deprecated {@link android.hardware.Camera} - * class.</p> - * - * <p>Specifically, limited-mode devices:</p> - * - * <ol> - * - * <li>Do not provide per-frame result metadata for repeating - * captures. This means that a CaptureListener will not be called for - * captures done through {@link CameraDevice#setRepeatingRequest - * setRepeatingRequest} or {@link CameraDevice#setRepeatingBurst - * setRepeatingBurst}.</li> - * - * <li>Do not support complete result metadata. Only a few fields are - * provided, such as the timestamp (TODO).</li> - * - * <li>Do not support manual capture controls. Only the (TODO) - * ANDROID_CONTROL_* fields and TODO controls are used, and the various - * AE/AF/AWB_OFF control values cannot be used.</li> - * - * <li>Do not support high frame rate captures. To obtain high frame rate, - * the {@link CameraDevice#setRepeatingRequest setRepeatingRequest} method - * must be used. The {@link CameraDevice#capture capture}, - * {@link CameraDevice#captureBurst captureBurst}, and - * {@link CameraDevice#setRepeatingBurst setRepeatingBurst} methods will - * result in slow frame captures.</li> - * - * </ol> - * - * @see #INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED - * @see #INFO_SUPPORTED_HARDWARE_LEVEL_FULL + * <p> + * Smallest step by which exposure compensation + * can be changed + * </p> */ - public static final Key<Integer> INFO_SUPPORTED_HARDWARE_LEVEL = - new Key<Integer>("android.info.supportedHardwareLevel", Integer.TYPE); + public static final Key<Rational> CONTROL_AE_COMPENSATION_STEP = + new Key<Rational>("android.control.aeCompensationStep", Rational.class); /** - * <p>The type reported by limited-capability camera devices.</p> - * - * <p>Limited-capability devices have a number of limitations relative to - * full-capability cameras. Roughly, they have capabilities comparable to - * those provided by the deprecated {@link android.hardware.Camera} - * class.</p> - * - * <p>Specifically, limited-mode devices:</p> - * - * <ol> - * - * <li>Do not provide per-frame result metadata for repeating - * captures. This means that a CaptureListener will not be called for - * captures done through {@link CameraDevice#setRepeatingRequest - * setRepeatingRequest} or {@link CameraDevice#setRepeatingBurst - * setRepeatingBurst}.</li> - * - * <li>Do not support complete result metadata. Only a few fields are - * provided, such as the timestamp (TODO).</li> - * - * <li>Do not support manual capture controls. Only the (TODO) - * ANDROID_CONTROL_* fields and TODO controls are used, and the various - * AE/AF/AWB_OFF control values cannot be used.</li> - * - * <li>Do not support high frame rate captures. To obtain high frame rate, - * the {@link CameraDevice#setRepeatingRequest setRepeatingRequest} method - * must be used. The {@link CameraDevice#capture capture}, - * {@link CameraDevice#captureBurst captureBurst}, and - * {@link CameraDevice#setRepeatingBurst setRepeatingBurst} methods will - * result in slow frame captures.</li> - * - * </ol> - * - * @see #INFO_SUPPORTED_HARDWARE_LEVEL + * <p> + * List of AF modes that can be + * selected + * </p> */ - public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; + public static final Key<byte[]> CONTROL_AF_AVAILABLE_MODES = + new Key<byte[]>("android.control.afAvailableModes", byte[].class); /** - * <p>The type reported by full-capability camera devices</p> - * - * <p>Full-capability devices allow for per-frame control of capture - * hardware and post-processing parameters at high frame rates. They also - * provide output data at high resolution in uncompressed formats, in - * addition to compressed JPEG output.</p> - * - * @see #INFO_SUPPORTED_HARDWARE_LEVEL + * <p> + * what subset of the full color effect enum + * list is supported + * </p> */ - public static final int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; + public static final Key<byte[]> CONTROL_AVAILABLE_EFFECTS = + new Key<byte[]>("android.control.availableEffects", byte[].class); /** - * <p>The available output formats from this camera device. When using a - * {@link android.media.ImageReader} as an output target, the - * ImageReader must be configured to use one of these formats.</p> - * - * <p>The list is a subset of the formats defined in - * {@link android.graphics.ImageFormat}.</p> - * - * <p>The image formats {@link android.graphics.ImageFormat#JPEG}, - * {@link android.graphics.ImageFormat#YUV_420_888} are guaranteed to be - * supported.</p> + * <p> + * what subset of the scene mode enum list is + * supported. + * </p> + */ + public static final Key<byte[]> CONTROL_AVAILABLE_SCENE_MODES = + new Key<byte[]>("android.control.availableSceneModes", byte[].class); + + /** + * <p> + * List of video stabilization modes that can + * be supported + * </p> + */ + public static final Key<byte[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES = + new Key<byte[]>("android.control.availableVideoStabilizationModes", byte[].class); + + /** + */ + public static final Key<byte[]> CONTROL_AWB_AVAILABLE_MODES = + new Key<byte[]>("android.control.awbAvailableModes", byte[].class); + + /** + * <p> + * For AE, AWB, and AF, how many individual + * regions can be listed for metering? + * </p> + */ + public static final Key<Integer> CONTROL_MAX_REGIONS = + new Key<Integer>("android.control.maxRegions", int.class); + + /** + * <p> + * Whether this camera has a + * flash + * </p> + * <p> + * If no flash, none of the flash controls do + * anything. All other metadata should return 0 + * </p> + */ + public static final Key<Byte> FLASH_INFO_AVAILABLE = + new Key<Byte>("android.flash.info.available", byte.class); + + /** + * <p> + * Supported resolutions for the JPEG + * thumbnail + * </p> + */ + public static final Key<android.hardware.camera2.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES = + new Key<android.hardware.camera2.Size[]>("android.jpeg.availableThumbnailSizes", android.hardware.camera2.Size[].class); + + /** + * <p> + * List of supported aperture + * values + * </p> + * <p> + * If variable aperture not available, only setting + * should be for the fixed aperture + * </p> + */ + public static final Key<float[]> LENS_INFO_AVAILABLE_APERTURES = + new Key<float[]>("android.lens.info.availableApertures", float[].class); + + /** + * <p> + * List of supported ND filter + * values + * </p> + * <p> + * If not available, only setting is 0. Otherwise, + * lists the available exposure index values for dimming + * (2 would mean the filter is set to reduce incoming + * light by two stops) + * </p> + */ + public static final Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES = + new Key<float[]>("android.lens.info.availableFilterDensities", float[].class); + + /** + * <p> + * If fitted with optical zoom, what focal + * lengths are available. If not, the static focal + * length + * </p> + * <p> + * If optical zoom not supported, only one value + * should be reported + * </p> + */ + public static final Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS = + new Key<float[]>("android.lens.info.availableFocalLengths", float[].class); + + /** + * <p> + * List of supported optical image + * stabilization modes + * </p> + */ + public static final Key<byte[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION = + new Key<byte[]>("android.lens.info.availableOpticalStabilization", byte[].class); + + /** + * <p> + * Hyperfocal distance for this lens; set to + * 0 if fixed focus + * </p> + * <p> + * The hyperfocal distance is used for the old + * API's 'fixed' setting + * </p> + */ + public static final Key<Float> LENS_INFO_HYPERFOCAL_DISTANCE = + new Key<Float>("android.lens.info.hyperfocalDistance", float.class); + + /** + * <p> + * Shortest distance from frontmost surface + * of the lens that can be focused correctly + * </p> + * <p> + * If the lens is fixed-focus, this should be + * 0 + * </p> + */ + public static final Key<Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE = + new Key<Float>("android.lens.info.minimumFocusDistance", float.class); + + /** + * <p> + * Dimensions of lens shading + * map + * </p> + */ + public static final Key<android.hardware.camera2.Size> LENS_INFO_SHADING_MAP_SIZE = + new Key<android.hardware.camera2.Size>("android.lens.info.shadingMapSize", android.hardware.camera2.Size.class); + + /** + * <p> + * Direction the camera faces relative to + * device screen + * </p> + * @see #LENS_FACING_FRONT + * @see #LENS_FACING_BACK + */ + public static final Key<Integer> LENS_FACING = + new Key<Integer>("android.lens.facing", int.class); + + /** + * <p> + * How many output streams can be allocated at + * the same time for each type of stream + * </p> + * <p> + * Video snapshot with preview callbacks requires 3 + * processed streams (preview, record, app callbacks) and + * one JPEG stream (snapshot) + * </p> + */ + public static final Key<int[]> REQUEST_MAX_NUM_OUTPUT_STREAMS = + new Key<int[]>("android.request.maxNumOutputStreams", int[].class); + + /** + * <p> + * List of app-visible formats + * </p> */ public static final Key<int[]> SCALER_AVAILABLE_FORMATS = new Key<int[]>("android.scaler.availableFormats", int[].class); /** - * <p>The available output sizes for JPEG buffers from this camera - * device. When using a {@link android.media.ImageReader} as an output - * target, the ImageReader must be configured to use one of these sizes - * when using format {@link android.graphics.ImageFormat#JPEG}.</p> + * <p> + * The minimum frame duration that is supported + * for each resolution in availableJpegSizes. Should + * correspond to the frame duration when only that JPEG + * stream is active and captured in a burst, with all + * processing set to FAST + * </p> + * <p> + * When multiple streams are configured, the minimum + * frame duration will be >= max(individual stream min + * durations) + * </p> */ - public static final Key<Size[]> SCALER_AVAILABLE_JPEG_SIZES = - new Key<Size[]>("android.scaler.availableJpegSizes", Size[].class); + public static final Key<long[]> SCALER_AVAILABLE_JPEG_MIN_DURATIONS = + new Key<long[]>("android.scaler.availableJpegMinDurations", long[].class); /** - * <p>The available sizes for output buffers from this camera device, when - * the buffers are neither of the {@link android.graphics.ImageFormat#JPEG} - * or of the {@link android.graphics.ImageFormat#RAW_SENSOR} type.</p> - * - * <p>When using a {@link android.view.SurfaceView}, - * {@link android.graphics.SurfaceTexture}, - * {@link android.media.MediaRecorder}, {@link android.media.MediaCodec}, or - * {@link android.renderscript.Allocation} as an output target, that target - * must be configured to one of these sizes. See - * {@link CameraDevice#configureOutputs} for details. - * - * <p>When using a {@link android.media.ImageReader} as an output - * target, the ImageReader must be configured to use one of these sizes - * when using format {@link android.graphics.ImageFormat#YUV_420_888}.</p> - * + * <p> + * The resolutions available for output from + * the JPEG block. Listed as width x height + * </p> */ - public static final Key<Size[]> SCALER_AVAILABLE_PROCESSED_SIZES = - new Key<Size[]>("android.scaler.availableProcessedSizes", Size[].class); + public static final Key<android.hardware.camera2.Size[]> SCALER_AVAILABLE_JPEG_SIZES = + new Key<android.hardware.camera2.Size[]>("android.scaler.availableJpegSizes", android.hardware.camera2.Size[].class); /** - * <p>The available sizes for output buffers from this camera device, when - * the buffers are of the {@link android.graphics.ImageFormat#RAW_SENSOR} type. This type of output may not be - * supported by the device; check {@link #SCALER_AVAILABLE_FORMATS} to - * check. In that case, this list will not exist.</p> - * - * <p>When using a {@link android.media.ImageReader} as an output - * target, the ImageReader must be configured to use one of these sizes - * when using image format {@link android.graphics.ImageFormat#RAW_SENSOR}.</p> - */ - public static final Key<Size[]> SCALER_AVAILABLE_RAW_SIZES = - new Key<Size[]>("android.scaler.availableRawSizes", Size[].class); - - /** - * <p>The coordinates of the sensor's active pixel array, relative to its - * total pixel array. These are the pixels that are actually used for image - * capture. The active pixel region may be smaller than the total number of - * pixels, if some pixels are used for other tasks such as calibrating the - * sensor's black level. If all pixels available for readout are used for - * imaging, then this rectangle will be - * {@code (0,0) - (SENSOR_PIXEL_ARRAY_SIZE.width, - * SENSOR_PIXEL_ARRAY_SIZE.height)}.</p> - * - * <p>If raw sensor capture is supported by this device, the width and - * height of the active pixel array match up to one of the supported raw - * capture sizes, and using that size will capture just the active pixel - * array region.</p> - * - * <p>Most other coordinates used by the camera device (for example, for - * metering and crop region selection, or for reporting detected faces) use - * a coordinate system based on the active array dimensions, with (0,0) - * being the top-left corner of the active array.</p> + * <p> + * The maximum ratio between active area width + * and crop region width, or between active area height and + * crop region height, if the crop region height is larger + * than width + * </p> + */ + public static final Key<Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM = + new Key<Float>("android.scaler.availableMaxDigitalZoom", float.class); + + /** + * <p> + * The minimum frame duration that is supported + * for each resolution in availableProcessedSizes. Should + * correspond to the frame duration when only that processed + * stream is active, with all processing set to + * FAST + * </p> + * <p> + * When multiple streams are configured, the minimum + * frame duration will be >= max(individual stream min + * durations) + * </p> + */ + public static final Key<long[]> SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS = + new Key<long[]>("android.scaler.availableProcessedMinDurations", long[].class); + + /** + * <p> + * The resolutions available for use with + * processed output streams, such as YV12, NV12, and + * platform opaque YUV/RGB streams to the GPU or video + * encoders. Listed as width, height + * </p> + */ + public static final Key<android.hardware.camera2.Size[]> SCALER_AVAILABLE_PROCESSED_SIZES = + new Key<android.hardware.camera2.Size[]>("android.scaler.availableProcessedSizes", android.hardware.camera2.Size[].class); + + /** + * <p> + * Area of raw data which corresponds to only + * active pixels; smaller or equal to + * pixelArraySize. + * </p> + */ + public static final Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE = + new Key<android.graphics.Rect>("android.sensor.info.activeArraySize", android.graphics.Rect.class); + + /** + * <p> + * Range of valid sensitivities + * </p> + */ + public static final Key<int[]> SENSOR_INFO_SENSITIVITY_RANGE = + new Key<int[]>("android.sensor.info.sensitivityRange", int[].class); + + /** + * <p> + * Range of valid exposure + * times + * </p> + */ + public static final Key<long[]> SENSOR_INFO_EXPOSURE_TIME_RANGE = + new Key<long[]>("android.sensor.info.exposureTimeRange", long[].class); + + /** + * <p> + * Maximum possible frame duration (minimum frame + * rate) + * </p> + * <p> + * Minimum duration is a function of resolution, + * processing settings. See + * android.scaler.availableProcessedMinDurations + * android.scaler.availableJpegMinDurations + * android.scaler.availableRawMinDurations + * </p> + */ + public static final Key<Long> SENSOR_INFO_MAX_FRAME_DURATION = + new Key<Long>("android.sensor.info.maxFrameDuration", long.class); + + /** + * <p> + * The physical dimensions of the full pixel + * array + * </p> + * <p> + * Needed for FOV calculation for old API + * </p> + */ + public static final Key<android.hardware.camera2.Size> SENSOR_INFO_PHYSICAL_SIZE = + new Key<android.hardware.camera2.Size>("android.sensor.info.physicalSize", android.hardware.camera2.Size.class); + + /** + * <p> + * Gain factor from electrons to raw units when + * ISO=100 + * </p> + */ + public static final Key<Rational> SENSOR_BASE_GAIN_FACTOR = + new Key<Rational>("android.sensor.baseGainFactor", Rational.class); + + /** + * <p> + * Maximum sensitivity that is implemented + * purely through analog gain + * </p> + * <p> + * For android.sensor.sensitivity values less than or + * equal to this, all applied gain must be analog. For + * values above this, it can be a mix of analog and + * digital + * </p> + */ + public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY = + new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class); + + /** + * <p> + * Clockwise angle through which the output + * image needs to be rotated to be upright on the device + * screen in its native orientation. Also defines the + * direction of rolling shutter readout, which is from top + * to bottom in the sensor's coordinate system + * </p> */ - public static final Key<Rect> SENSOR_ACTIVE_ARRAY_SIZE = - new Key<Rect>("android.sensor.activeArraySize", Rect.class); + public static final Key<Integer> SENSOR_ORIENTATION = + new Key<Integer>("android.sensor.orientation", int.class); /** - * <p>The size of the sensor's total pixel array available for readout. Some - * of these pixels may not be used for image capture, in which case - * {@link #SENSOR_ACTIVE_ARRAY_SIZE} will describe a rectangle smaller than - * this. If raw sensor capture is supported by this device, this is one of - * the supported capture sizes.</p> + * <p> + * Which face detection modes are available, + * if any + * </p> + * <p> + * OFF means face detection is disabled, it must + * be included in the list. + * </p><p> + * SIMPLE means the device supports the + * android.statistics.faceRectangles and + * android.statistics.faceScores outputs. + * </p><p> + * FULL means the device additionally supports the + * android.statistics.faceIds and + * android.statistics.faceLandmarks outputs. + * </p> */ - public static final Key<Size> SENSOR_PIXEL_ARRAY_SIZE = - new Key<Size>("android.sensor.activeArraySize", Size.class); + public static final Key<byte[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES = + new Key<byte[]>("android.statistics.info.availableFaceDetectModes", byte[].class); - // TODO: Many more of these. + /** + * <p> + * Maximum number of simultaneously detectable + * faces + * </p> + */ + public static final Key<Integer> STATISTICS_INFO_MAX_FACE_COUNT = + new Key<Integer>("android.statistics.info.maxFaceCount", int.class); + + /** + * <p> + * Maximum number of supported points in the + * tonemap curve + * </p> + */ + public static final Key<Integer> TONEMAP_MAX_CURVE_POINTS = + new Key<Integer>("android.tonemap.maxCurvePoints", int.class); + + /** + * <p> + * A list of camera LEDs that are available on this system. + * </p> + * @see #LED_AVAILABLE_LEDS_TRANSMIT + * + * @hide + */ + public static final Key<int[]> LED_AVAILABLE_LEDS = + new Key<int[]>("android.led.availableLeds", int[].class); + + /** + * <p> + * The camera 3 HAL device can implement one of two possible + * operational modes; limited and full. Full support is + * expected from new higher-end devices. Limited mode has + * hardware requirements roughly in line with those for a + * camera HAL device v1 implementation, and is expected from + * older or inexpensive devices. Full is a strict superset of + * limited, and they share the same essential operational flow. + * </p><p> + * For full details refer to "S3. Operational Modes" in camera3.h + * </p> + * @see #INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED + * @see #INFO_SUPPORTED_HARDWARE_LEVEL_FULL + */ + public static final Key<Integer> INFO_SUPPORTED_HARDWARE_LEVEL = + new Key<Integer>("android.info.supportedHardwareLevel", int.class); + /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * End generated code + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ } diff --git a/core/java/android/hardware/camera2/CameraPropertiesKeys.java b/core/java/android/hardware/camera2/CameraPropertiesKeys.java deleted file mode 100644 index 41b31ff..0000000 --- a/core/java/android/hardware/camera2/CameraPropertiesKeys.java +++ /dev/null @@ -1,268 +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.hardware.camera2; - -import static android.hardware.camera2.CameraMetadata.Key; - -/** - * ! Do not edit this file directly ! - * - * Generated automatically from CameraPropertiesKeys.mako - * - * TODO: Include a hash of the input files here that the build can check. - */ - -/** - * The base class for camera controls and information. - * - * This class defines the basic key/value map used for querying for camera - * characteristics or capture results, and for setting camera request - * parameters. - * - * @see CameraProperties - * @see CameraMetadata - * @hide - **/ -public final class CameraPropertiesKeys { - public static final class Control { - public static final Key<byte[]> AE_AVAILABLE_ANTIBANDING_MODES = - new Key<byte[]>("android.control.aeAvailableAntibandingModes", byte[].class); - public static final Key<int[]> AE_AVAILABLE_TARGET_FPS_RANGES = - new Key<int[]>("android.control.aeAvailableTargetFpsRanges", int[].class); - public static final Key<int[]> AE_COMPENSATION_RANGE = - new Key<int[]>("android.control.aeCompensationRange", int[].class); - public static final Key<Rational> AE_COMPENSATION_STEP = - new Key<Rational>("android.control.aeCompensationStep", Rational.class); - public static final Key<byte[]> AF_AVAILABLE_MODES = - new Key<byte[]>("android.control.afAvailableModes", byte[].class); - public static final Key<byte[]> AVAILABLE_EFFECTS = - new Key<byte[]>("android.control.availableEffects", byte[].class); - public static final Key<byte[]> AVAILABLE_SCENE_MODES = - new Key<byte[]>("android.control.availableSceneModes", byte[].class); - public static final Key<byte[]> AVAILABLE_VIDEO_STABILIZATION_MODES = - new Key<byte[]>("android.control.availableVideoStabilizationModes", byte[].class); - public static final Key<byte[]> AWB_AVAILABLE_MODES = - new Key<byte[]>("android.control.awbAvailableModes", byte[].class); - public static final Key<Integer> MAX_REGIONS = - new Key<Integer>("android.control.maxRegions", int.class); - - } - - public static final class Flash { - public static final class Info { - public static final Key<Byte> AVAILABLE = - new Key<Byte>("android.flash.info.available", byte.class); - } - - } - - public static final class Jpeg { - public static final Key<android.hardware.camera2.Size[]> AVAILABLE_THUMBNAIL_SIZES = - new Key<android.hardware.camera2.Size[]>("android.jpeg.availableThumbnailSizes", android.hardware.camera2.Size[].class); - - } - - public static final class Lens { - public static final class Info { - public static final Key<float[]> AVAILABLE_APERTURES = - new Key<float[]>("android.lens.info.availableApertures", float[].class); - public static final Key<float[]> AVAILABLE_FILTER_DENSITIES = - new Key<float[]>("android.lens.info.availableFilterDensities", float[].class); - public static final Key<float[]> AVAILABLE_FOCAL_LENGTHS = - new Key<float[]>("android.lens.info.availableFocalLengths", float[].class); - public static final Key<byte[]> AVAILABLE_OPTICAL_STABILIZATION = - new Key<byte[]>("android.lens.info.availableOpticalStabilization", byte[].class); - public static final Key<Float> HYPERFOCAL_DISTANCE = - new Key<Float>("android.lens.info.hyperfocalDistance", float.class); - public static final Key<Float> MINIMUM_FOCUS_DISTANCE = - new Key<Float>("android.lens.info.minimumFocusDistance", float.class); - public static final Key<android.hardware.camera2.Size> SHADING_MAP_SIZE = - new Key<android.hardware.camera2.Size>("android.lens.info.shadingMapSize", android.hardware.camera2.Size.class); - } - - public static final class FacingKey extends Key<Lens.FacingKey.Enum> { - public enum Enum { - FRONT, - BACK; - } - - public static final Enum FRONT = Enum.FRONT; - public static final Enum BACK = Enum.BACK; - - // TODO: remove requirement for constructor by making Key an interface - private FacingKey(String name) { - super(name, Lens.FacingKey.Enum.class); - } - - } - - public static final Key<Lens.FacingKey.Enum> FACING = - new FacingKey("android.lens.facing"); - - } - - public static final class Request { - public static final Key<int[]> MAX_NUM_OUTPUT_STREAMS = - new Key<int[]>("android.request.maxNumOutputStreams", int[].class); - - } - - public static final class Scaler { - - public static final class AvailableFormatsKey extends Key<Scaler.AvailableFormatsKey.Enum[]> { - public enum Enum { - RAW_SENSOR, - YV12, - YCrCb_420_SP, - IMPLEMENTATION_DEFINED, - YCbCr_420_888, - BLOB; - } - - public static final Enum RAW_SENSOR = Enum.RAW_SENSOR; - public static final Enum YV12 = Enum.YV12; - public static final Enum YCrCb_420_SP = Enum.YCrCb_420_SP; - public static final Enum IMPLEMENTATION_DEFINED = Enum.IMPLEMENTATION_DEFINED; - public static final Enum YCbCr_420_888 = Enum.YCbCr_420_888; - public static final Enum BLOB = Enum.BLOB; - - // TODO: remove requirement for constructor by making Key an interface - private AvailableFormatsKey(String name) { - super(name, Scaler.AvailableFormatsKey.Enum[].class); - } - - static { - CameraMetadata.registerEnumValues(Scaler.AvailableFormatsKey.Enum.class, new int[] { - 0x20, // RAW_SENSOR - 0x32315659, // YV12 - 0x11, // YCrCb_420_SP - 0x22, // IMPLEMENTATION_DEFINED - 0x23, // YCbCr_420_888 - 0x21 // BLOB - }); - } - } - - public static final Key<Scaler.AvailableFormatsKey.Enum[]> AVAILABLE_FORMATS = - new AvailableFormatsKey("android.scaler.availableFormats"); - public static final Key<long[]> AVAILABLE_JPEG_MIN_DURATIONS = - new Key<long[]>("android.scaler.availableJpegMinDurations", long[].class); - public static final Key<android.hardware.camera2.Size[]> AVAILABLE_JPEG_SIZES = - new Key<android.hardware.camera2.Size[]>("android.scaler.availableJpegSizes", android.hardware.camera2.Size[].class); - public static final Key<Float> AVAILABLE_MAX_DIGITAL_ZOOM = - new Key<Float>("android.scaler.availableMaxDigitalZoom", float.class); - public static final Key<long[]> AVAILABLE_PROCESSED_MIN_DURATIONS = - new Key<long[]>("android.scaler.availableProcessedMinDurations", long[].class); - public static final Key<android.hardware.camera2.Size[]> AVAILABLE_PROCESSED_SIZES = - new Key<android.hardware.camera2.Size[]>("android.scaler.availableProcessedSizes", android.hardware.camera2.Size[].class); - - } - - public static final class Sensor { - public static final class Info { - public static final Key<android.graphics.Rect> ACTIVE_ARRAY_SIZE = - new Key<android.graphics.Rect>("android.sensor.info.activeArraySize", android.graphics.Rect.class); - public static final Key<int[]> SENSITIVITY_RANGE = - new Key<int[]>("android.sensor.info.sensitivityRange", int[].class); - public static final Key<long[]> EXPOSURE_TIME_RANGE = - new Key<long[]>("android.sensor.info.exposureTimeRange", long[].class); - public static final Key<Long> MAX_FRAME_DURATION = - new Key<Long>("android.sensor.info.maxFrameDuration", long.class); - public static final Key<android.hardware.camera2.Size> PHYSICAL_SIZE = - new Key<android.hardware.camera2.Size>("android.sensor.info.physicalSize", android.hardware.camera2.Size.class); - } - public static final Key<Rational> BASE_GAIN_FACTOR = - new Key<Rational>("android.sensor.baseGainFactor", Rational.class); - public static final Key<Integer> MAX_ANALOG_SENSITIVITY = - new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class); - public static final Key<Integer> ORIENTATION = - new Key<Integer>("android.sensor.orientation", int.class); - - } - - public static final class Statistics { - public static final class Info { - public static final Key<byte[]> AVAILABLE_FACE_DETECT_MODES = - new Key<byte[]>("android.statistics.info.availableFaceDetectModes", byte[].class); - public static final Key<Integer> MAX_FACE_COUNT = - new Key<Integer>("android.statistics.info.maxFaceCount", int.class); - } - - } - - public static final class Tonemap { - public static final Key<Integer> MAX_CURVE_POINTS = - new Key<Integer>("android.tonemap.maxCurvePoints", int.class); - - } - - /** - * @hide - */ - public static final class Led { - - /** - * @hide - */ - public static final class AvailableLedsKey extends Key<Led.AvailableLedsKey.Enum[]> { - public enum Enum { - TRANSMIT; - } - - public static final Enum TRANSMIT = Enum.TRANSMIT; - - // TODO: remove requirement for constructor by making Key an interface - private AvailableLedsKey(String name) { - super(name, Led.AvailableLedsKey.Enum[].class); - } - - } - - /** - * @hide - */ - public static final Key<Led.AvailableLedsKey.Enum[]> AVAILABLE_LEDS = - new AvailableLedsKey("android.led.availableLeds"); - - } - - public static final class Info { - - public static final class SupportedHardwareLevelKey extends Key<Info.SupportedHardwareLevelKey.Enum> { - public enum Enum { - LIMITED, - FULL; - } - - public static final Enum LIMITED = Enum.LIMITED; - public static final Enum FULL = Enum.FULL; - - // TODO: remove requirement for constructor by making Key an interface - private SupportedHardwareLevelKey(String name) { - super(name, Info.SupportedHardwareLevelKey.Enum.class); - } - - } - - public static final Key<Info.SupportedHardwareLevelKey.Enum> SUPPORTED_HARDWARE_LEVEL = - new SupportedHardwareLevelKey("android.info.supportedHardwareLevel"); - - } - -} - - diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 15ba12c..28225e6 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -53,21 +53,7 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { private final Object mLock = new Object(); private final HashSet<Surface> mSurfaceSet = new HashSet<Surface>(); - - /** - * The exposure time for this capture, in nanoseconds. - */ - public static final Key<Long> SENSOR_EXPOSURE_TIME = - new Key<Long>("android.sensor.exposureTime", Long.TYPE); - - /** - * The sensor sensitivity (gain) setting for this camera. - * This is represented as an ISO sensitivity value - */ - public static final Key<Integer> SENSOR_SENSITIVITY = - new Key<Integer>("android.sensor.sensitivity", Integer.TYPE); - - // Many more settings + private Object mUserTag; /** * @hide @@ -83,7 +69,7 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * * <p>Adding a target more than once has no effect.</p> * - * @param outputTarget surface to use as an output target for this request + * @param outputTarget Surface to use as an output target for this request */ public void addTarget(Surface outputTarget) { synchronized (mLock) { @@ -96,7 +82,7 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * * <p>Removing a target that is not currently added has no effect.</p> * - * @param outputTarget surface to use as an output target for this request + * @param outputTarget Surface to use as an output target for this request */ public void removeTarget(Surface outputTarget) { synchronized (mLock) { @@ -104,6 +90,42 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { } } + /** + * Set a tag for this request. + * + * <p>This tag is not used for anything by the camera device, but can be + * used by an application to easily identify a CaptureRequest when it is + * returned by + * {@link CameraDevice.CaptureListener#onCaptureComplete CaptureListener.onCaptureComplete} + * + * @param tag an arbitrary Object to store with this request + * @see #getTag + */ + public void setTag(Object tag) { + synchronized (mLock) { + mUserTag = tag; + } + } + + /** + * Retrieve the tag for this request, if any. + * + * <p>This tag is not used for anything by the camera device, but can be + * used by an application to easily identify a CaptureRequest when it is + * returned by + * {@link CameraDevice.CaptureListener#onCaptureComplete CaptureListener.onCaptureComplete} + * </p> + * + * @return the last tag Object set on this request, or {@code null} if + * no tag has been set. + * @see #setTag + */ + public Object getTag() { + synchronized (mLock) { + return mUserTag; + } + } + public static final Parcelable.Creator<CaptureRequest> CREATOR = new Parcelable.Creator<CaptureRequest>() { @Override @@ -152,4 +174,751 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { } } -}
\ No newline at end of file + /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * The key entries below this point are generated from metadata + * definitions in /system/media/camera/docs. Do not modify by hand or + * modify the comment blocks at the start or end. + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/ + + /** + * @see #COLOR_CORRECTION_MODE_TRANSFORM_MATRIX + * @see #COLOR_CORRECTION_MODE_FAST + * @see #COLOR_CORRECTION_MODE_HIGH_QUALITY + */ + public static final Key<Integer> COLOR_CORRECTION_MODE = + new Key<Integer>("android.colorCorrection.mode", int.class); + + /** + * <p> + * A color transform matrix to use to transform + * from sensor RGB color space to output linear sRGB color space + * </p> + * <p> + * This matrix is either set by HAL when the request + * android.colorCorrection.mode is not TRANSFORM_MATRIX, or + * directly by the application in the request when the + * androird.colorCorrection.mode is TRANSFORM_MATRIX. + * In the latter case, the HAL may round the matrix to account + * for precision issues; the final rounded matrix should be + * reported back in this matrix result metadata. + * </p> + */ + public static final Key<Rational[]> COLOR_CORRECTION_TRANSFORM = + new Key<Rational[]>("android.colorCorrection.transform", Rational[].class); + + /** + * <p> + * Gains applying to Bayer color channels for + * white-balance + * </p> + * <p> + * The 4-channel white-balance gains are defined in + * the order of [R G_even G_odd B], where G_even is the gain + * for green pixels on even rows of the output, and G_odd + * is the gain for greenpixels on the odd rows. if a HAL + * does not support a separate gain for even/odd green channels, + * it should use the G_even value,and write G_odd equal to + * G_even in the output result metadata. + * </p><p> + * The ouput should be the gains actually applied by the HAL to + * the current frame. + * </p> + */ + public static final Key<float[]> COLOR_CORRECTION_GAINS = + new Key<float[]>("android.colorCorrection.gains", float[].class); + + /** + * <p> + * Enum for controlling + * antibanding + * </p> + * @see #CONTROL_AE_ANTIBANDING_MODE_OFF + * @see #CONTROL_AE_ANTIBANDING_MODE_50HZ + * @see #CONTROL_AE_ANTIBANDING_MODE_60HZ + * @see #CONTROL_AE_ANTIBANDING_MODE_AUTO + */ + public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE = + new Key<Integer>("android.control.aeAntibandingMode", int.class); + + /** + * <p> + * Adjustment to AE target image + * brightness + * </p> + * <p> + * For example, if EV step is 0.333, '6' will mean an + * exposure compensation of +2 EV; -3 will mean an exposure + * compensation of -1 + * </p> + */ + public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION = + new Key<Integer>("android.control.aeExposureCompensation", int.class); + + /** + * <p> + * Whether AE is currently locked to its latest + * calculated values + * </p> + * <p> + * Note that even when AE is locked, the flash may be + * fired if the AE mode is ON_AUTO_FLASH / ON_ALWAYS_FLASH / + * ON_AUTO_FLASH_REDEYE. + * </p> + */ + public static final Key<Boolean> CONTROL_AE_LOCK = + new Key<Boolean>("android.control.aeLock", boolean.class); + + /** + * <p> + * Whether AE is currently updating the sensor + * exposure and sensitivity fields + * </p> + * <p> + * Only effective if android.control.mode = + * AUTO + * </p> + * @see #CONTROL_AE_MODE_OFF + * @see #CONTROL_AE_MODE_ON + * @see #CONTROL_AE_MODE_ON_AUTO_FLASH + * @see #CONTROL_AE_MODE_ON_ALWAYS_FLASH + * @see #CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE + */ + public static final Key<Integer> CONTROL_AE_MODE = + new Key<Integer>("android.control.aeMode", int.class); + + /** + * <p> + * List of areas to use for + * metering + * </p> + * <p> + * Each area is a rectangle plus weight: xmin, ymin, + * xmax, ymax, weight. + * </p><p> + * The coordinate system is based on the active pixel array, + * with (0,0) being the top-left of the active pixel array, and + * (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific metering area + * needs to be used by the HAL. If the metering region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AE_REGIONS = + new Key<int[]>("android.control.aeRegions", int[].class); + + /** + * <p> + * Range over which fps can be adjusted to + * maintain exposure + * </p> + * <p> + * Only constrains AE algorithm, not manual control + * of android.sensor.exposureTime + * </p> + */ + public static final Key<int[]> CONTROL_AE_TARGET_FPS_RANGE = + new Key<int[]>("android.control.aeTargetFpsRange", int[].class); + + /** + * <p> + * Whether the HAL must trigger precapture + * metering. + * </p> + * <p> + * This entry is normally set to IDLE, or is not + * included at all in the request settings. When included and + * set to START, the HAL must trigger the autoexposure + * precapture metering sequence. + * </p><p> + * The effect of AE precapture trigger depends on the current + * AE mode and state; see the camera HAL device v3 header for + * details. + * </p> + * @see #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE + * @see #CONTROL_AE_PRECAPTURE_TRIGGER_START + */ + public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = + new Key<Integer>("android.control.aePrecaptureTrigger", int.class); + + /** + * <p> + * Whether AF is currently enabled, and what + * mode it is set to + * </p> + * @see #CONTROL_AF_MODE_OFF + * @see #CONTROL_AF_MODE_AUTO + * @see #CONTROL_AF_MODE_MACRO + * @see #CONTROL_AF_MODE_CONTINUOUS_VIDEO + * @see #CONTROL_AF_MODE_CONTINUOUS_PICTURE + * @see #CONTROL_AF_MODE_EDOF + */ + public static final Key<Integer> CONTROL_AF_MODE = + new Key<Integer>("android.control.afMode", int.class); + + /** + * <p> + * List of areas to use for focus + * estimation + * </p> + * <p> + * Each area is a rectangle plus weight: xmin, ymin, + * xmax, ymax, weight. + * </p><p> + * The coordinate system is based on the active pixel array, + * with (0,0) being the top-left of the active pixel array, and + * (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific focus area + * needs to be used by the HAL. If the focusing region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AF_REGIONS = + new Key<int[]>("android.control.afRegions", int[].class); + + /** + * <p> + * Whether the HAL must trigger autofocus. + * </p> + * <p> + * This entry is normally set to IDLE, or is not + * included at all in the request settings. + * </p><p> + * When included and set to START, the HAL must trigger the + * autofocus algorithm. The effect of AF trigger depends on the + * current AF mode and state; see the camera HAL device v3 + * header for details. When set to CANCEL, the HAL must cancel + * any active trigger, and return to initial AF state. + * </p> + * @see #CONTROL_AF_TRIGGER_IDLE + * @see #CONTROL_AF_TRIGGER_START + * @see #CONTROL_AF_TRIGGER_CANCEL + */ + public static final Key<Integer> CONTROL_AF_TRIGGER = + new Key<Integer>("android.control.afTrigger", int.class); + + /** + * <p> + * Whether AWB is currently locked to its + * latest calculated values + * </p> + * <p> + * Note that AWB lock is only meaningful for AUTO + * mode; in other modes, AWB is already fixed to a specific + * setting + * </p> + */ + public static final Key<Boolean> CONTROL_AWB_LOCK = + new Key<Boolean>("android.control.awbLock", boolean.class); + + /** + * <p> + * Whether AWB is currently setting the color + * transform fields, and what its illumination target + * is + * </p> + * <p> + * [BC - AWB lock,AWB modes] + * </p> + * @see #CONTROL_AWB_MODE_OFF + * @see #CONTROL_AWB_MODE_AUTO + * @see #CONTROL_AWB_MODE_INCANDESCENT + * @see #CONTROL_AWB_MODE_FLUORESCENT + * @see #CONTROL_AWB_MODE_WARM_FLUORESCENT + * @see #CONTROL_AWB_MODE_DAYLIGHT + * @see #CONTROL_AWB_MODE_CLOUDY_DAYLIGHT + * @see #CONTROL_AWB_MODE_TWILIGHT + * @see #CONTROL_AWB_MODE_SHADE + */ + public static final Key<Integer> CONTROL_AWB_MODE = + new Key<Integer>("android.control.awbMode", int.class); + + /** + * <p> + * List of areas to use for illuminant + * estimation + * </p> + * <p> + * Only used in AUTO mode. + * </p><p> + * Each area is a rectangle plus weight: xmin, ymin, xmax, + * ymax, weight. The coordinate system is based on the active + * pixel array, with (0,0) being the top-left of the active + * pixel array, and (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific metering area + * needs to be used by the HAL. If the metering region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AWB_REGIONS = + new Key<int[]>("android.control.awbRegions", int[].class); + + /** + * <p> + * Information to 3A routines about the purpose + * of this capture, to help decide optimal 3A + * strategy + * </p> + * <p> + * Only used if android.control.mode != OFF. + * </p> + * @see #CONTROL_CAPTURE_INTENT_CUSTOM + * @see #CONTROL_CAPTURE_INTENT_PREVIEW + * @see #CONTROL_CAPTURE_INTENT_STILL_CAPTURE + * @see #CONTROL_CAPTURE_INTENT_VIDEO_RECORD + * @see #CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT + * @see #CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG + */ + public static final Key<Integer> CONTROL_CAPTURE_INTENT = + new Key<Integer>("android.control.captureIntent", int.class); + + /** + * <p> + * Whether any special color effect is in use. + * Only used if android.control.mode != OFF + * </p> + * @see #CONTROL_EFFECT_MODE_OFF + * @see #CONTROL_EFFECT_MODE_MONO + * @see #CONTROL_EFFECT_MODE_NEGATIVE + * @see #CONTROL_EFFECT_MODE_SOLARIZE + * @see #CONTROL_EFFECT_MODE_SEPIA + * @see #CONTROL_EFFECT_MODE_POSTERIZE + * @see #CONTROL_EFFECT_MODE_WHITEBOARD + * @see #CONTROL_EFFECT_MODE_BLACKBOARD + * @see #CONTROL_EFFECT_MODE_AQUA + */ + public static final Key<Integer> CONTROL_EFFECT_MODE = + new Key<Integer>("android.control.effectMode", int.class); + + /** + * <p> + * Overall mode of 3A control + * routines + * </p> + * @see #CONTROL_MODE_OFF + * @see #CONTROL_MODE_AUTO + * @see #CONTROL_MODE_USE_SCENE_MODE + */ + public static final Key<Integer> CONTROL_MODE = + new Key<Integer>("android.control.mode", int.class); + + /** + * <p> + * Which scene mode is active when + * android.control.mode = SCENE_MODE + * </p> + * @see #CONTROL_SCENE_MODE_UNSUPPORTED + * @see #CONTROL_SCENE_MODE_FACE_PRIORITY + * @see #CONTROL_SCENE_MODE_ACTION + * @see #CONTROL_SCENE_MODE_PORTRAIT + * @see #CONTROL_SCENE_MODE_LANDSCAPE + * @see #CONTROL_SCENE_MODE_NIGHT + * @see #CONTROL_SCENE_MODE_NIGHT_PORTRAIT + * @see #CONTROL_SCENE_MODE_THEATRE + * @see #CONTROL_SCENE_MODE_BEACH + * @see #CONTROL_SCENE_MODE_SNOW + * @see #CONTROL_SCENE_MODE_SUNSET + * @see #CONTROL_SCENE_MODE_STEADYPHOTO + * @see #CONTROL_SCENE_MODE_FIREWORKS + * @see #CONTROL_SCENE_MODE_SPORTS + * @see #CONTROL_SCENE_MODE_PARTY + * @see #CONTROL_SCENE_MODE_CANDLELIGHT + * @see #CONTROL_SCENE_MODE_BARCODE + */ + public static final Key<Integer> CONTROL_SCENE_MODE = + new Key<Integer>("android.control.sceneMode", int.class); + + /** + * <p> + * Whether video stabilization is + * active + * </p> + * <p> + * If enabled, video stabilization can modify the + * android.scaler.cropRegion to keep the video stream + * stabilized + * </p> + */ + public static final Key<Boolean> CONTROL_VIDEO_STABILIZATION_MODE = + new Key<Boolean>("android.control.videoStabilizationMode", boolean.class); + + /** + * <p> + * Operation mode for edge + * enhancement + * </p> + * @see #EDGE_MODE_OFF + * @see #EDGE_MODE_FAST + * @see #EDGE_MODE_HIGH_QUALITY + */ + public static final Key<Integer> EDGE_MODE = + new Key<Integer>("android.edge.mode", int.class); + + /** + * <p> + * Select flash operation mode + * </p> + * @see #FLASH_MODE_OFF + * @see #FLASH_MODE_SINGLE + * @see #FLASH_MODE_TORCH + */ + public static final Key<Integer> FLASH_MODE = + new Key<Integer>("android.flash.mode", int.class); + + /** + * <p> + * GPS coordinates to include in output JPEG + * EXIF + * </p> + */ + public static final Key<double[]> JPEG_GPS_COORDINATES = + new Key<double[]>("android.jpeg.gpsCoordinates", double[].class); + + /** + * <p> + * 32 characters describing GPS algorithm to + * include in EXIF + * </p> + */ + public static final Key<String> JPEG_GPS_PROCESSING_METHOD = + new Key<String>("android.jpeg.gpsProcessingMethod", String.class); + + /** + * <p> + * Time GPS fix was made to include in + * EXIF + * </p> + */ + public static final Key<Long> JPEG_GPS_TIMESTAMP = + new Key<Long>("android.jpeg.gpsTimestamp", long.class); + + /** + * <p> + * Orientation of JPEG image to + * write + * </p> + */ + public static final Key<Integer> JPEG_ORIENTATION = + new Key<Integer>("android.jpeg.orientation", int.class); + + /** + * <p> + * Compression quality of the final JPEG + * image + * </p> + * <p> + * 85-95 is typical usage range + * </p> + */ + public static final Key<Byte> JPEG_QUALITY = + new Key<Byte>("android.jpeg.quality", byte.class); + + /** + * <p> + * Compression quality of JPEG + * thumbnail + * </p> + */ + public static final Key<Byte> JPEG_THUMBNAIL_QUALITY = + new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); + + /** + * <p> + * Resolution of embedded JPEG + * thumbnail + * </p> + */ + public static final Key<android.hardware.camera2.Size> JPEG_THUMBNAIL_SIZE = + new Key<android.hardware.camera2.Size>("android.jpeg.thumbnailSize", android.hardware.camera2.Size.class); + + /** + * <p> + * Size of the lens aperture + * </p> + * <p> + * Will not be supported on most devices. Can only + * pick from supported list + * </p> + */ + public static final Key<Float> LENS_APERTURE = + new Key<Float>("android.lens.aperture", float.class); + + /** + * <p> + * State of lens neutral density + * filter(s) + * </p> + * <p> + * Will not be supported on most devices. Can only + * pick from supported list + * </p> + */ + public static final Key<Float> LENS_FILTER_DENSITY = + new Key<Float>("android.lens.filterDensity", float.class); + + /** + * <p> + * Lens optical zoom setting + * </p> + * <p> + * Will not be supported on most devices. + * </p> + */ + public static final Key<Float> LENS_FOCAL_LENGTH = + new Key<Float>("android.lens.focalLength", float.class); + + /** + * <p> + * Distance to plane of sharpest focus, + * measured from frontmost surface of the lens + * </p> + * <p> + * 0 = infinity focus. Used value should be clamped + * to (0,minimum focus distance) + * </p> + */ + public static final Key<Float> LENS_FOCUS_DISTANCE = + new Key<Float>("android.lens.focusDistance", float.class); + + /** + * <p> + * Whether optical image stabilization is + * enabled. + * </p> + * <p> + * Will not be supported on most devices. + * </p> + * @see #LENS_OPTICAL_STABILIZATION_MODE_OFF + * @see #LENS_OPTICAL_STABILIZATION_MODE_ON + */ + public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE = + new Key<Integer>("android.lens.opticalStabilizationMode", int.class); + + /** + * <p> + * Mode of operation for the noise reduction + * algorithm + * </p> + * @see #NOISE_REDUCTION_MODE_OFF + * @see #NOISE_REDUCTION_MODE_FAST + * @see #NOISE_REDUCTION_MODE_HIGH_QUALITY + */ + public static final Key<Integer> NOISE_REDUCTION_MODE = + new Key<Integer>("android.noiseReduction.mode", int.class); + + /** + * <p> + * An application-specified ID for the current + * request. Must be maintained unchanged in output + * frame + * </p> + * + * @hide + */ + public static final Key<Integer> REQUEST_ID = + new Key<Integer>("android.request.id", int.class); + + /** + * <p> + * (x, y, width, height). + * </p><p> + * A rectangle with the top-level corner of (x,y) and size + * (width, height). The region of the sensor that is used for + * output. Each stream must use this rectangle to produce its + * output, cropping to a smaller region if necessary to + * maintain the stream's aspect ratio. + * </p><p> + * HAL2.x uses only (x, y, width) + * </p> + * <p> + * Any additional per-stream cropping must be done to + * maximize the final pixel area of the stream. + * </p><p> + * For example, if the crop region is set to a 4:3 aspect + * ratio, then 4:3 streams should use the exact crop + * region. 16:9 streams should further crop vertically + * (letterbox). + * </p><p> + * Conversely, if the crop region is set to a 16:9, then 4:3 + * outputs should crop horizontally (pillarbox), and 16:9 + * streams should match exactly. These additional crops must + * be centered within the crop region. + * </p><p> + * The output streams must maintain square pixels at all + * times, no matter what the relative aspect ratios of the + * crop region and the stream are. Negative values for + * corner are allowed for raw output if full pixel array is + * larger than active pixel array. Width and height may be + * rounded to nearest larger supportable width, especially + * for raw output, where only a few fixed scales may be + * possible. The width and height of the crop region cannot + * be set to be smaller than floor( activeArraySize.width / + * android.scaler.maxDigitalZoom ) and floor( + * activeArraySize.height / android.scaler.maxDigitalZoom), + * respectively. + * </p> + */ + public static final Key<android.graphics.Rect> SCALER_CROP_REGION = + new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); + + /** + * <p> + * Duration each pixel is exposed to + * light + * </p> + * <p> + * 1/10000 - 30 sec range. No bulb mode + * </p> + */ + public static final Key<Long> SENSOR_EXPOSURE_TIME = + new Key<Long>("android.sensor.exposureTime", long.class); + + /** + * <p> + * Duration from start of frame exposure to + * start of next frame exposure + * </p> + * <p> + * Exposure time has priority, so duration is set to + * max(duration, exposure time + overhead) + * </p> + */ + public static final Key<Long> SENSOR_FRAME_DURATION = + new Key<Long>("android.sensor.frameDuration", long.class); + + /** + * <p> + * Gain applied to image data. Must be + * implemented through analog gain only if set to values + * below 'maximum analog sensitivity'. + * </p> + * <p> + * ISO 12232:2006 REI method + * </p> + */ + public static final Key<Integer> SENSOR_SENSITIVITY = + new Key<Integer>("android.sensor.sensitivity", int.class); + + /** + * <p> + * State of the face detector + * unit + * </p> + * <p> + * Whether face detection is enabled, and whether it + * should output just the basic fields or the full set of + * fields. Value must be one of the + * android.statistics.info.availableFaceDetectModes. + * </p> + * @see #STATISTICS_FACE_DETECT_MODE_OFF + * @see #STATISTICS_FACE_DETECT_MODE_SIMPLE + * @see #STATISTICS_FACE_DETECT_MODE_FULL + */ + public static final Key<Integer> STATISTICS_FACE_DETECT_MODE = + new Key<Integer>("android.statistics.faceDetectMode", int.class); + + /** + * <p> + * Table mapping blue input values to output + * values + * </p> + */ + public static final Key<Float> TONEMAP_CURVE_BLUE = + new Key<Float>("android.tonemap.curveBlue", float.class); + + /** + * <p> + * Table mapping green input values to output + * values + * </p> + */ + public static final Key<Float> TONEMAP_CURVE_GREEN = + new Key<Float>("android.tonemap.curveGreen", float.class); + + /** + * <p> + * Table mapping red input values to output + * values + * </p> + * <p> + * .The input range must be monotonically increasing + * with N, and values between entries should be linearly + * interpolated. For example, if the array is: [0.0, 0.0, + * 0.3, 0.5, 1.0, 1.0], then the input->output mapping + * for a few sample points would be: 0 -> 0, 0.15 -> + * 0.25, 0.3 -> 0.5, 0.5 -> 0.64 + * </p> + */ + public static final Key<float[]> TONEMAP_CURVE_RED = + new Key<float[]>("android.tonemap.curveRed", float[].class); + + /** + * @see #TONEMAP_MODE_CONTRAST_CURVE + * @see #TONEMAP_MODE_FAST + * @see #TONEMAP_MODE_HIGH_QUALITY + */ + public static final Key<Integer> TONEMAP_MODE = + new Key<Integer>("android.tonemap.mode", int.class); + + /** + * <p> + * This LED is nominally used to indicate to the user + * that the camera is powered on and may be streaming images back to the + * Application Processor. In certain rare circumstances, the OS may + * disable this when video is processed locally and not transmitted to + * any untrusted applications. + * </p><p> + * In particular, the LED *must* always be on when the data could be + * transmitted off the device. The LED *should* always be on whenever + * data is stored locally on the device. + * </p><p> + * The LED *may* be off if a trusted application is using the data that + * doesn't violate the above rules. + * </p> + * + * @hide + */ + public static final Key<Boolean> LED_TRANSMIT = + new Key<Boolean>("android.led.transmit", boolean.class); + + /** + * <p> + * Whether black-level compensation is locked + * to its current values, or is free to vary + * </p> + * <p> + * When set to ON, the values used for black-level + * compensation must not change until the lock is set to + * OFF + * </p><p> + * Since changes to certain capture parameters (such as + * exposure time) may require resetting of black level + * compensation, the HAL must report whether setting the + * black level lock was successful in the output result + * metadata. + * </p> + */ + public static final Key<Boolean> BLACK_LEVEL_LOCK = + new Key<Boolean>("android.blackLevel.lock", boolean.class); + + /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * End generated code + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ +} diff --git a/core/java/android/hardware/camera2/CaptureRequestKeys.java b/core/java/android/hardware/camera2/CaptureRequestKeys.java deleted file mode 100644 index 17de8f0..0000000 --- a/core/java/android/hardware/camera2/CaptureRequestKeys.java +++ /dev/null @@ -1,617 +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.hardware.camera2; - -import static android.hardware.camera2.CameraMetadata.Key; - -/** - * ! Do not edit this file directly ! - * - * Generated automatically from CaptureRequestKeys.mako - * - * TODO: Include a hash of the input files here that the build can check. - */ - -/** - * The base class for camera controls and information. - * - * This class defines the basic key/value map used for querying for camera - * characteristics or capture results, and for setting camera request - * parameters. - * - * @see CaptureRequest - * @see CameraMetadata - * @hide - **/ -public final class CaptureRequestKeys { - public static final class ColorCorrection { - - public static final class ModeKey extends Key<ColorCorrection.ModeKey.Enum> { - public enum Enum { - TRANSFORM_MATRIX, - FAST, - HIGH_QUALITY; - } - - public static final Enum TRANSFORM_MATRIX = Enum.TRANSFORM_MATRIX; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, ColorCorrection.ModeKey.Enum.class); - } - - } - - public static final Key<ColorCorrection.ModeKey.Enum> MODE = - new ModeKey("android.colorCorrection.mode"); - public static final Key<Rational[]> TRANSFORM = - new Key<Rational[]>("android.colorCorrection.transform", Rational[].class); - public static final Key<float[]> GAINS = - new Key<float[]>("android.colorCorrection.gains", float[].class); - - } - - public static final class Control { - - public static final class AeAntibandingModeKey extends Key<Control.AeAntibandingModeKey.Enum> { - public enum Enum { - OFF, - _50HZ, - _60HZ, - AUTO; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum _50HZ = Enum._50HZ; - public static final Enum _60HZ = Enum._60HZ; - public static final Enum AUTO = Enum.AUTO; - - // TODO: remove requirement for constructor by making Key an interface - private AeAntibandingModeKey(String name) { - super(name, Control.AeAntibandingModeKey.Enum.class); - } - - } - - public static final Key<Control.AeAntibandingModeKey.Enum> AE_ANTIBANDING_MODE = - new AeAntibandingModeKey("android.control.aeAntibandingMode"); - public static final Key<Integer> AE_EXPOSURE_COMPENSATION = - new Key<Integer>("android.control.aeExposureCompensation", int.class); - public static final Key<Boolean> AE_LOCK = - new Key<Boolean>("android.control.aeLock", boolean.class); - - public static final class AeModeKey extends Key<Control.AeModeKey.Enum> { - public enum Enum { - OFF, - ON, - ON_AUTO_FLASH, - ON_ALWAYS_FLASH, - ON_AUTO_FLASH_REDEYE; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum ON = Enum.ON; - public static final Enum ON_AUTO_FLASH = Enum.ON_AUTO_FLASH; - public static final Enum ON_ALWAYS_FLASH = Enum.ON_ALWAYS_FLASH; - public static final Enum ON_AUTO_FLASH_REDEYE = Enum.ON_AUTO_FLASH_REDEYE; - - // TODO: remove requirement for constructor by making Key an interface - private AeModeKey(String name) { - super(name, Control.AeModeKey.Enum.class); - } - - } - - public static final Key<Control.AeModeKey.Enum> AE_MODE = - new AeModeKey("android.control.aeMode"); - public static final Key<int[]> AE_REGIONS = - new Key<int[]>("android.control.aeRegions", int[].class); - public static final Key<int[]> AE_TARGET_FPS_RANGE = - new Key<int[]>("android.control.aeTargetFpsRange", int[].class); - - public static final class AePrecaptureTriggerKey extends Key<Control.AePrecaptureTriggerKey.Enum> { - public enum Enum { - IDLE, - START; - } - - public static final Enum IDLE = Enum.IDLE; - public static final Enum START = Enum.START; - - // TODO: remove requirement for constructor by making Key an interface - private AePrecaptureTriggerKey(String name) { - super(name, Control.AePrecaptureTriggerKey.Enum.class); - } - - } - - public static final Key<Control.AePrecaptureTriggerKey.Enum> AE_PRECAPTURE_TRIGGER = - new AePrecaptureTriggerKey("android.control.aePrecaptureTrigger"); - - public static final class AfModeKey extends Key<Control.AfModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - MACRO, - CONTINUOUS_VIDEO, - CONTINUOUS_PICTURE, - EDOF; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum MACRO = Enum.MACRO; - public static final Enum CONTINUOUS_VIDEO = Enum.CONTINUOUS_VIDEO; - public static final Enum CONTINUOUS_PICTURE = Enum.CONTINUOUS_PICTURE; - public static final Enum EDOF = Enum.EDOF; - - // TODO: remove requirement for constructor by making Key an interface - private AfModeKey(String name) { - super(name, Control.AfModeKey.Enum.class); - } - - } - - public static final Key<Control.AfModeKey.Enum> AF_MODE = - new AfModeKey("android.control.afMode"); - public static final Key<int[]> AF_REGIONS = - new Key<int[]>("android.control.afRegions", int[].class); - - public static final class AfTriggerKey extends Key<Control.AfTriggerKey.Enum> { - public enum Enum { - IDLE, - START, - CANCEL; - } - - public static final Enum IDLE = Enum.IDLE; - public static final Enum START = Enum.START; - public static final Enum CANCEL = Enum.CANCEL; - - // TODO: remove requirement for constructor by making Key an interface - private AfTriggerKey(String name) { - super(name, Control.AfTriggerKey.Enum.class); - } - - } - - public static final Key<Control.AfTriggerKey.Enum> AF_TRIGGER = - new AfTriggerKey("android.control.afTrigger"); - public static final Key<Boolean> AWB_LOCK = - new Key<Boolean>("android.control.awbLock", boolean.class); - - public static final class AwbModeKey extends Key<Control.AwbModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - INCANDESCENT, - FLUORESCENT, - WARM_FLUORESCENT, - DAYLIGHT, - CLOUDY_DAYLIGHT, - TWILIGHT, - SHADE; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum INCANDESCENT = Enum.INCANDESCENT; - public static final Enum FLUORESCENT = Enum.FLUORESCENT; - public static final Enum WARM_FLUORESCENT = Enum.WARM_FLUORESCENT; - public static final Enum DAYLIGHT = Enum.DAYLIGHT; - public static final Enum CLOUDY_DAYLIGHT = Enum.CLOUDY_DAYLIGHT; - public static final Enum TWILIGHT = Enum.TWILIGHT; - public static final Enum SHADE = Enum.SHADE; - - // TODO: remove requirement for constructor by making Key an interface - private AwbModeKey(String name) { - super(name, Control.AwbModeKey.Enum.class); - } - - } - - public static final Key<Control.AwbModeKey.Enum> AWB_MODE = - new AwbModeKey("android.control.awbMode"); - public static final Key<int[]> AWB_REGIONS = - new Key<int[]>("android.control.awbRegions", int[].class); - - public static final class CaptureIntentKey extends Key<Control.CaptureIntentKey.Enum> { - public enum Enum { - CUSTOM, - PREVIEW, - STILL_CAPTURE, - VIDEO_RECORD, - VIDEO_SNAPSHOT, - ZERO_SHUTTER_LAG; - } - - public static final Enum CUSTOM = Enum.CUSTOM; - public static final Enum PREVIEW = Enum.PREVIEW; - public static final Enum STILL_CAPTURE = Enum.STILL_CAPTURE; - public static final Enum VIDEO_RECORD = Enum.VIDEO_RECORD; - public static final Enum VIDEO_SNAPSHOT = Enum.VIDEO_SNAPSHOT; - public static final Enum ZERO_SHUTTER_LAG = Enum.ZERO_SHUTTER_LAG; - - // TODO: remove requirement for constructor by making Key an interface - private CaptureIntentKey(String name) { - super(name, Control.CaptureIntentKey.Enum.class); - } - - } - - public static final Key<Control.CaptureIntentKey.Enum> CAPTURE_INTENT = - new CaptureIntentKey("android.control.captureIntent"); - - public static final class EffectModeKey extends Key<Control.EffectModeKey.Enum> { - public enum Enum { - OFF, - MONO, - NEGATIVE, - SOLARIZE, - SEPIA, - POSTERIZE, - WHITEBOARD, - BLACKBOARD, - AQUA; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum MONO = Enum.MONO; - public static final Enum NEGATIVE = Enum.NEGATIVE; - public static final Enum SOLARIZE = Enum.SOLARIZE; - public static final Enum SEPIA = Enum.SEPIA; - public static final Enum POSTERIZE = Enum.POSTERIZE; - public static final Enum WHITEBOARD = Enum.WHITEBOARD; - public static final Enum BLACKBOARD = Enum.BLACKBOARD; - public static final Enum AQUA = Enum.AQUA; - - // TODO: remove requirement for constructor by making Key an interface - private EffectModeKey(String name) { - super(name, Control.EffectModeKey.Enum.class); - } - - } - - public static final Key<Control.EffectModeKey.Enum> EFFECT_MODE = - new EffectModeKey("android.control.effectMode"); - - public static final class ModeKey extends Key<Control.ModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - USE_SCENE_MODE; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum USE_SCENE_MODE = Enum.USE_SCENE_MODE; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Control.ModeKey.Enum.class); - } - - } - - public static final Key<Control.ModeKey.Enum> MODE = - new ModeKey("android.control.mode"); - - public static final class SceneModeKey extends Key<Control.SceneModeKey.Enum> { - public enum Enum { - UNSUPPORTED, - FACE_PRIORITY, - ACTION, - PORTRAIT, - LANDSCAPE, - NIGHT, - NIGHT_PORTRAIT, - THEATRE, - BEACH, - SNOW, - SUNSET, - STEADYPHOTO, - FIREWORKS, - SPORTS, - PARTY, - CANDLELIGHT, - BARCODE; - } - - public static final Enum UNSUPPORTED = Enum.UNSUPPORTED; - public static final Enum FACE_PRIORITY = Enum.FACE_PRIORITY; - public static final Enum ACTION = Enum.ACTION; - public static final Enum PORTRAIT = Enum.PORTRAIT; - public static final Enum LANDSCAPE = Enum.LANDSCAPE; - public static final Enum NIGHT = Enum.NIGHT; - public static final Enum NIGHT_PORTRAIT = Enum.NIGHT_PORTRAIT; - public static final Enum THEATRE = Enum.THEATRE; - public static final Enum BEACH = Enum.BEACH; - public static final Enum SNOW = Enum.SNOW; - public static final Enum SUNSET = Enum.SUNSET; - public static final Enum STEADYPHOTO = Enum.STEADYPHOTO; - public static final Enum FIREWORKS = Enum.FIREWORKS; - public static final Enum SPORTS = Enum.SPORTS; - public static final Enum PARTY = Enum.PARTY; - public static final Enum CANDLELIGHT = Enum.CANDLELIGHT; - public static final Enum BARCODE = Enum.BARCODE; - - // TODO: remove requirement for constructor by making Key an interface - private SceneModeKey(String name) { - super(name, Control.SceneModeKey.Enum.class); - } - - static { - CameraMetadata.registerEnumValues(Control.SceneModeKey.Enum.class, new int[] { - 0, // UNSUPPORTED - 1, // FACE_PRIORITY - 2, // ACTION - 3, // PORTRAIT - 4, // LANDSCAPE - 5, // NIGHT - 6, // NIGHT_PORTRAIT - 7, // THEATRE - 8, // BEACH - 9, // SNOW - 10, // SUNSET - 11, // STEADYPHOTO - 12, // FIREWORKS - 13, // SPORTS - 14, // PARTY - 15, // CANDLELIGHT - 16 // BARCODE - }); - } - } - - public static final Key<Control.SceneModeKey.Enum> SCENE_MODE = - new SceneModeKey("android.control.sceneMode"); - public static final Key<Boolean> VIDEO_STABILIZATION_MODE = - new Key<Boolean>("android.control.videoStabilizationMode", boolean.class); - - } - - public static final class Edge { - - public static final class ModeKey extends Key<Edge.ModeKey.Enum> { - public enum Enum { - OFF, - FAST, - HIGH_QUALITY; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Edge.ModeKey.Enum.class); - } - - } - - public static final Key<Edge.ModeKey.Enum> MODE = - new ModeKey("android.edge.mode"); - - } - - public static final class Flash { - - public static final class ModeKey extends Key<Flash.ModeKey.Enum> { - public enum Enum { - OFF, - SINGLE, - TORCH; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum SINGLE = Enum.SINGLE; - public static final Enum TORCH = Enum.TORCH; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Flash.ModeKey.Enum.class); - } - - } - - public static final Key<Flash.ModeKey.Enum> MODE = - new ModeKey("android.flash.mode"); - - } - - public static final class Jpeg { - public static final Key<double[]> GPS_COORDINATES = - new Key<double[]>("android.jpeg.gpsCoordinates", double[].class); - public static final Key<String> GPS_PROCESSING_METHOD = - new Key<String>("android.jpeg.gpsProcessingMethod", String.class); - public static final Key<Long> GPS_TIMESTAMP = - new Key<Long>("android.jpeg.gpsTimestamp", long.class); - public static final Key<Integer> ORIENTATION = - new Key<Integer>("android.jpeg.orientation", int.class); - public static final Key<Byte> QUALITY = - new Key<Byte>("android.jpeg.quality", byte.class); - public static final Key<Byte> THUMBNAIL_QUALITY = - new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); - public static final Key<android.hardware.camera2.Size> THUMBNAIL_SIZE = - new Key<android.hardware.camera2.Size>("android.jpeg.thumbnailSize", android.hardware.camera2.Size.class); - - } - - public static final class Lens { - public static final Key<Float> APERTURE = - new Key<Float>("android.lens.aperture", float.class); - public static final Key<Float> FILTER_DENSITY = - new Key<Float>("android.lens.filterDensity", float.class); - public static final Key<Float> FOCAL_LENGTH = - new Key<Float>("android.lens.focalLength", float.class); - public static final Key<Float> FOCUS_DISTANCE = - new Key<Float>("android.lens.focusDistance", float.class); - - public static final class OpticalStabilizationModeKey extends Key<Lens.OpticalStabilizationModeKey.Enum> { - public enum Enum { - OFF, - ON; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum ON = Enum.ON; - - // TODO: remove requirement for constructor by making Key an interface - private OpticalStabilizationModeKey(String name) { - super(name, Lens.OpticalStabilizationModeKey.Enum.class); - } - - } - - public static final Key<Lens.OpticalStabilizationModeKey.Enum> OPTICAL_STABILIZATION_MODE = - new OpticalStabilizationModeKey("android.lens.opticalStabilizationMode"); - - } - - public static final class NoiseReduction { - - public static final class ModeKey extends Key<NoiseReduction.ModeKey.Enum> { - public enum Enum { - OFF, - FAST, - HIGH_QUALITY; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, NoiseReduction.ModeKey.Enum.class); - } - - } - - public static final Key<NoiseReduction.ModeKey.Enum> MODE = - new ModeKey("android.noiseReduction.mode"); - - } - - /** - * @hide - */ - public static final class Request { - /** - * @hide - */ - public static final Key<Integer> ID = - new Key<Integer>("android.request.id", int.class); - - } - - public static final class Scaler { - public static final Key<android.graphics.Rect> CROP_REGION = - new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); - - } - - public static final class Sensor { - public static final Key<Long> EXPOSURE_TIME = - new Key<Long>("android.sensor.exposureTime", long.class); - public static final Key<Long> FRAME_DURATION = - new Key<Long>("android.sensor.frameDuration", long.class); - public static final Key<Integer> SENSITIVITY = - new Key<Integer>("android.sensor.sensitivity", int.class); - - } - - public static final class Statistics { - - public static final class FaceDetectModeKey extends Key<Statistics.FaceDetectModeKey.Enum> { - public enum Enum { - OFF, - SIMPLE, - FULL; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum SIMPLE = Enum.SIMPLE; - public static final Enum FULL = Enum.FULL; - - // TODO: remove requirement for constructor by making Key an interface - private FaceDetectModeKey(String name) { - super(name, Statistics.FaceDetectModeKey.Enum.class); - } - - } - - public static final Key<Statistics.FaceDetectModeKey.Enum> FACE_DETECT_MODE = - new FaceDetectModeKey("android.statistics.faceDetectMode"); - - } - - public static final class Tonemap { - public static final Key<Float> CURVE_BLUE = - new Key<Float>("android.tonemap.curveBlue", float.class); - public static final Key<Float> CURVE_GREEN = - new Key<Float>("android.tonemap.curveGreen", float.class); - public static final Key<float[]> CURVE_RED = - new Key<float[]>("android.tonemap.curveRed", float[].class); - - public static final class ModeKey extends Key<Tonemap.ModeKey.Enum> { - public enum Enum { - CONTRAST_CURVE, - FAST, - HIGH_QUALITY; - } - - public static final Enum CONTRAST_CURVE = Enum.CONTRAST_CURVE; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Tonemap.ModeKey.Enum.class); - } - - } - - public static final Key<Tonemap.ModeKey.Enum> MODE = - new ModeKey("android.tonemap.mode"); - - } - - /** - * @hide - */ - public static final class Led { - /** - * @hide - */ - public static final Key<Boolean> TRANSMIT = - new Key<Boolean>("android.led.transmit", boolean.class); - - } - - public static final class BlackLevel { - public static final Key<Boolean> LOCK = - new Key<Boolean>("android.blackLevel.lock", boolean.class); - - } - -} - - diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 11c991a..31377be 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -34,73 +34,6 @@ import android.graphics.Rect; * */ public final class CaptureResult extends CameraMetadata { - - /** - * The timestamp representing the start of image capture, in nanoseconds. - * This corresponds to the timestamp available through - * {@link android.graphics.SurfaceTexture#getTimestamp SurfaceTexture.getTimestamp()} - * or {@link android.media.Image#getTimestamp Image.getTimestamp()} for this - * capture's image data. - */ - public static final Key<Long> SENSOR_TIMESTAMP = - new Key<Long>("android.sensor.timestamp", Long.TYPE); - - /** - * The state of the camera device's auto-exposure algorithm. One of the - * CONTROL_AE_STATE_* enumerations. - */ - public static final Key<Integer> CONTROL_AE_STATE = - new Key<Integer>("android.control.aeState", Integer.TYPE); - - /** - * The auto-exposure algorithm is inactive. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_INACTIVE = 0; - - /** - * The auto-exposure algorithm is currently searching for proper exposure. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_SEARCHING = 1; - - /** - * The auto-exposure algorithm has reached proper exposure values for the - * current scene. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_CONVERGED = 2; - - /** - * The auto-exposure algorithm has been locked to its current values. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_LOCKED = 3; - - /** - * The auto-exposure algorithm has reached proper exposure values as with - * CONTROL_AE_STATE_CONVERGED, but the scene is too dark to take a good - * quality image without firing the camera flash. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_FLASH_REQUIRED = 4; - - /** - * The precapture sequence of the auto-exposure algorithm has been triggered, - * and is underway. - * @see CONTROL_AE_STATE - */ - public static final int CONTROL_AE_STATE_PRECAPTURE =5; - - /** - * The list of faces detected in this capture. Available if face detection - * was enabled for this capture - */ - public static final Key<Face[]> STATISTICS_DETECTED_FACES = - new Key<Face[]>("android.statistics.faces", Face[].class); - - // TODO: Many many more - /** * @hide */ @@ -114,14 +47,14 @@ public final class CaptureResult extends CameraMetadata { /** * <p>Bounds of the face. A rectangle relative to the sensor's - * {@link CameraProperties#SENSOR_ACTIVE_ARRAY_SIZE}, with (0,0) + * {@link CameraProperties#SENSOR_INFO_ACTIVE_ARRAY_SIZE}, with (0,0) * representing the top-left corner of the active array rectangle.</p> */ public Rect getBounds() { return mBounds; } - /* <p>The confidence level for the detection of the face. The range is 1 to + /** <p>The confidence level for the detection of the face. The range is 1 to * 100. 100 is the highest confidence.</p> * * <p>Depending on the device, even very low-confidence faces may be @@ -189,4 +122,807 @@ public final class CaptureResult extends CameraMetadata { private Point mRightEye; private Point mMouth; } + + /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * The key entries below this point are generated from metadata + * definitions in /system/media/camera/docs. Do not modify by hand or + * modify the comment blocks at the start or end. + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/ + + /** + * <p> + * A color transform matrix to use to transform + * from sensor RGB color space to output linear sRGB color space + * </p> + * <p> + * This matrix is either set by HAL when the request + * android.colorCorrection.mode is not TRANSFORM_MATRIX, or + * directly by the application in the request when the + * androird.colorCorrection.mode is TRANSFORM_MATRIX. + * In the latter case, the HAL may round the matrix to account + * for precision issues; the final rounded matrix should be + * reported back in this matrix result metadata. + * </p> + */ + public static final Key<Rational[]> COLOR_CORRECTION_TRANSFORM = + new Key<Rational[]>("android.colorCorrection.transform", Rational[].class); + + /** + * <p> + * Gains applying to Bayer color channels for + * white-balance + * </p> + * <p> + * The 4-channel white-balance gains are defined in + * the order of [R G_even G_odd B], where G_even is the gain + * for green pixels on even rows of the output, and G_odd + * is the gain for greenpixels on the odd rows. if a HAL + * does not support a separate gain for even/odd green channels, + * it should use the G_even value,and write G_odd equal to + * G_even in the output result metadata. + * </p><p> + * The ouput should be the gains actually applied by the HAL to + * the current frame. + * </p> + */ + public static final Key<float[]> COLOR_CORRECTION_GAINS = + new Key<float[]>("android.colorCorrection.gains", float[].class); + + /** + * <p> + * The ID sent with the latest + * CAMERA2_TRIGGER_PRECAPTURE_METERING call + * </p> + * <p> + * Must be 0 if no + * CAMERA2_TRIGGER_PRECAPTURE_METERING trigger received yet + * by HAL. Always updated even if AE algorithm ignores the + * trigger + * </p> + * + * @hide + */ + public static final Key<Integer> CONTROL_AE_PRECAPTURE_ID = + new Key<Integer>("android.control.aePrecaptureId", int.class); + + /** + * <p> + * List of areas to use for + * metering + * </p> + * <p> + * Each area is a rectangle plus weight: xmin, ymin, + * xmax, ymax, weight. + * </p><p> + * The coordinate system is based on the active pixel array, + * with (0,0) being the top-left of the active pixel array, and + * (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific metering area + * needs to be used by the HAL. If the metering region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AE_REGIONS = + new Key<int[]>("android.control.aeRegions", int[].class); + + /** + * <p> + * Current state of AE algorithm + * </p> + * <p> + * Whenever the AE algorithm state changes, a + * MSG_AUTOEXPOSURE notification must be send if a + * notification callback is registered. + * </p> + * @see #CONTROL_AE_STATE_INACTIVE + * @see #CONTROL_AE_STATE_SEARCHING + * @see #CONTROL_AE_STATE_CONVERGED + * @see #CONTROL_AE_STATE_LOCKED + * @see #CONTROL_AE_STATE_FLASH_REQUIRED + * @see #CONTROL_AE_STATE_PRECAPTURE + */ + public static final Key<Integer> CONTROL_AE_STATE = + new Key<Integer>("android.control.aeState", int.class); + + /** + * <p> + * Whether AF is currently enabled, and what + * mode it is set to + * </p> + * @see #CONTROL_AF_MODE_OFF + * @see #CONTROL_AF_MODE_AUTO + * @see #CONTROL_AF_MODE_MACRO + * @see #CONTROL_AF_MODE_CONTINUOUS_VIDEO + * @see #CONTROL_AF_MODE_CONTINUOUS_PICTURE + * @see #CONTROL_AF_MODE_EDOF + */ + public static final Key<Integer> CONTROL_AF_MODE = + new Key<Integer>("android.control.afMode", int.class); + + /** + * <p> + * List of areas to use for focus + * estimation + * </p> + * <p> + * Each area is a rectangle plus weight: xmin, ymin, + * xmax, ymax, weight. + * </p><p> + * The coordinate system is based on the active pixel array, + * with (0,0) being the top-left of the active pixel array, and + * (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific focus area + * needs to be used by the HAL. If the focusing region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AF_REGIONS = + new Key<int[]>("android.control.afRegions", int[].class); + + /** + * <p> + * Current state of AF algorithm + * </p> + * <p> + * Whenever the AF algorithm state changes, a + * MSG_AUTOFOCUS notification must be send if a notification + * callback is registered. + * </p> + * @see #CONTROL_AF_STATE_INACTIVE + * @see #CONTROL_AF_STATE_PASSIVE_SCAN + * @see #CONTROL_AF_STATE_PASSIVE_FOCUSED + * @see #CONTROL_AF_STATE_ACTIVE_SCAN + * @see #CONTROL_AF_STATE_FOCUSED_LOCKED + * @see #CONTROL_AF_STATE_NOT_FOCUSED_LOCKED + */ + public static final Key<Integer> CONTROL_AF_STATE = + new Key<Integer>("android.control.afState", int.class); + + /** + * <p> + * The ID sent with the latest + * CAMERA2_TRIGGER_AUTOFOCUS call + * </p> + * <p> + * Must be 0 if no CAMERA2_TRIGGER_AUTOFOCUS trigger + * received yet by HAL. Always updated even if AF algorithm + * ignores the trigger + * </p> + * + * @hide + */ + public static final Key<Integer> CONTROL_AF_TRIGGER_ID = + new Key<Integer>("android.control.afTriggerId", int.class); + + /** + * <p> + * Whether AWB is currently setting the color + * transform fields, and what its illumination target + * is + * </p> + * <p> + * [BC - AWB lock,AWB modes] + * </p> + * @see #CONTROL_AWB_MODE_OFF + * @see #CONTROL_AWB_MODE_AUTO + * @see #CONTROL_AWB_MODE_INCANDESCENT + * @see #CONTROL_AWB_MODE_FLUORESCENT + * @see #CONTROL_AWB_MODE_WARM_FLUORESCENT + * @see #CONTROL_AWB_MODE_DAYLIGHT + * @see #CONTROL_AWB_MODE_CLOUDY_DAYLIGHT + * @see #CONTROL_AWB_MODE_TWILIGHT + * @see #CONTROL_AWB_MODE_SHADE + */ + public static final Key<Integer> CONTROL_AWB_MODE = + new Key<Integer>("android.control.awbMode", int.class); + + /** + * <p> + * List of areas to use for illuminant + * estimation + * </p> + * <p> + * Only used in AUTO mode. + * </p><p> + * Each area is a rectangle plus weight: xmin, ymin, xmax, + * ymax, weight. The coordinate system is based on the active + * pixel array, with (0,0) being the top-left of the active + * pixel array, and (android.sensor.info.activeArraySize.width, + * android.sensor.info.activeArraySize.height) being the + * bottom-right point of the active pixel array. The weight + * should be nonnegative. + * </p><p> + * If all regions have 0 weight, then no specific metering area + * needs to be used by the HAL. If the metering region is + * outside the current android.scaler.cropRegion, the HAL + * should ignore the sections outside the region and output the + * used sections in the frame metadata + * </p> + */ + public static final Key<int[]> CONTROL_AWB_REGIONS = + new Key<int[]>("android.control.awbRegions", int[].class); + + /** + * <p> + * Current state of AWB algorithm + * </p> + * <p> + * Whenever the AWB algorithm state changes, a + * MSG_AUTOWHITEBALANCE notification must be send if a + * notification callback is registered. + * </p> + * @see #CONTROL_AWB_STATE_INACTIVE + * @see #CONTROL_AWB_STATE_SEARCHING + * @see #CONTROL_AWB_STATE_CONVERGED + * @see #CONTROL_AWB_STATE_LOCKED + */ + public static final Key<Integer> CONTROL_AWB_STATE = + new Key<Integer>("android.control.awbState", int.class); + + /** + * <p> + * Overall mode of 3A control + * routines + * </p> + * @see #CONTROL_MODE_OFF + * @see #CONTROL_MODE_AUTO + * @see #CONTROL_MODE_USE_SCENE_MODE + */ + public static final Key<Integer> CONTROL_MODE = + new Key<Integer>("android.control.mode", int.class); + + /** + * <p> + * Operation mode for edge + * enhancement + * </p> + * @see #EDGE_MODE_OFF + * @see #EDGE_MODE_FAST + * @see #EDGE_MODE_HIGH_QUALITY + */ + public static final Key<Integer> EDGE_MODE = + new Key<Integer>("android.edge.mode", int.class); + + /** + * <p> + * Select flash operation mode + * </p> + * @see #FLASH_MODE_OFF + * @see #FLASH_MODE_SINGLE + * @see #FLASH_MODE_TORCH + */ + public static final Key<Integer> FLASH_MODE = + new Key<Integer>("android.flash.mode", int.class); + + /** + * <p> + * Current state of the flash + * unit + * </p> + * @see #FLASH_STATE_UNAVAILABLE + * @see #FLASH_STATE_CHARGING + * @see #FLASH_STATE_READY + * @see #FLASH_STATE_FIRED + */ + public static final Key<Integer> FLASH_STATE = + new Key<Integer>("android.flash.state", int.class); + + /** + * <p> + * GPS coordinates to include in output JPEG + * EXIF + * </p> + */ + public static final Key<double[]> JPEG_GPS_COORDINATES = + new Key<double[]>("android.jpeg.gpsCoordinates", double[].class); + + /** + * <p> + * 32 characters describing GPS algorithm to + * include in EXIF + * </p> + */ + public static final Key<String> JPEG_GPS_PROCESSING_METHOD = + new Key<String>("android.jpeg.gpsProcessingMethod", String.class); + + /** + * <p> + * Time GPS fix was made to include in + * EXIF + * </p> + */ + public static final Key<Long> JPEG_GPS_TIMESTAMP = + new Key<Long>("android.jpeg.gpsTimestamp", long.class); + + /** + * <p> + * Orientation of JPEG image to + * write + * </p> + */ + public static final Key<Integer> JPEG_ORIENTATION = + new Key<Integer>("android.jpeg.orientation", int.class); + + /** + * <p> + * Compression quality of the final JPEG + * image + * </p> + * <p> + * 85-95 is typical usage range + * </p> + */ + public static final Key<Byte> JPEG_QUALITY = + new Key<Byte>("android.jpeg.quality", byte.class); + + /** + * <p> + * Compression quality of JPEG + * thumbnail + * </p> + */ + public static final Key<Byte> JPEG_THUMBNAIL_QUALITY = + new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); + + /** + * <p> + * Resolution of embedded JPEG + * thumbnail + * </p> + */ + public static final Key<android.hardware.camera2.Size> JPEG_THUMBNAIL_SIZE = + new Key<android.hardware.camera2.Size>("android.jpeg.thumbnailSize", android.hardware.camera2.Size.class); + + /** + * <p> + * Size of the lens aperture + * </p> + * <p> + * Will not be supported on most devices. Can only + * pick from supported list + * </p> + */ + public static final Key<Float> LENS_APERTURE = + new Key<Float>("android.lens.aperture", float.class); + + /** + * <p> + * State of lens neutral density + * filter(s) + * </p> + * <p> + * Will not be supported on most devices. Can only + * pick from supported list + * </p> + */ + public static final Key<Float> LENS_FILTER_DENSITY = + new Key<Float>("android.lens.filterDensity", float.class); + + /** + * <p> + * Lens optical zoom setting + * </p> + * <p> + * Will not be supported on most devices. + * </p> + */ + public static final Key<Float> LENS_FOCAL_LENGTH = + new Key<Float>("android.lens.focalLength", float.class); + + /** + * <p> + * Distance to plane of sharpest focus, + * measured from frontmost surface of the lens + * </p> + * <p> + * Should be zero for fixed-focus cameras + * </p> + */ + public static final Key<Float> LENS_FOCUS_DISTANCE = + new Key<Float>("android.lens.focusDistance", float.class); + + /** + * <p> + * The range of scene distances that are in + * sharp focus (depth of field) + * </p> + * <p> + * If variable focus not supported, can still report + * fixed depth of field range + * </p> + */ + public static final Key<Float> LENS_FOCUS_RANGE = + new Key<Float>("android.lens.focusRange", float.class); + + /** + * <p> + * Whether optical image stabilization is + * enabled. + * </p> + * <p> + * Will not be supported on most devices. + * </p> + * @see #LENS_OPTICAL_STABILIZATION_MODE_OFF + * @see #LENS_OPTICAL_STABILIZATION_MODE_ON + */ + public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE = + new Key<Integer>("android.lens.opticalStabilizationMode", int.class); + + /** + * <p> + * Current lens status + * </p> + * @see #LENS_STATE_STATIONARY + */ + public static final Key<Integer> LENS_STATE = + new Key<Integer>("android.lens.state", int.class); + + /** + * <p> + * Mode of operation for the noise reduction + * algorithm + * </p> + * @see #NOISE_REDUCTION_MODE_OFF + * @see #NOISE_REDUCTION_MODE_FAST + * @see #NOISE_REDUCTION_MODE_HIGH_QUALITY + */ + public static final Key<Integer> NOISE_REDUCTION_MODE = + new Key<Integer>("android.noiseReduction.mode", int.class); + + /** + * <p> + * Number of frames captured since + * open() + * </p> + * <p> + * Reset on release() + * </p> + */ + public static final Key<Integer> REQUEST_FRAME_COUNT = + new Key<Integer>("android.request.frameCount", int.class); + + /** + * <p> + * An application-specified ID for the current + * request. Must be maintained unchanged in output + * frame + * </p> + * + * @hide + */ + public static final Key<Integer> REQUEST_ID = + new Key<Integer>("android.request.id", int.class); + + /** + * <p> + * (x, y, width, height). + * </p><p> + * A rectangle with the top-level corner of (x,y) and size + * (width, height). The region of the sensor that is used for + * output. Each stream must use this rectangle to produce its + * output, cropping to a smaller region if necessary to + * maintain the stream's aspect ratio. + * </p><p> + * HAL2.x uses only (x, y, width) + * </p> + * <p> + * Any additional per-stream cropping must be done to + * maximize the final pixel area of the stream. + * </p><p> + * For example, if the crop region is set to a 4:3 aspect + * ratio, then 4:3 streams should use the exact crop + * region. 16:9 streams should further crop vertically + * (letterbox). + * </p><p> + * Conversely, if the crop region is set to a 16:9, then 4:3 + * outputs should crop horizontally (pillarbox), and 16:9 + * streams should match exactly. These additional crops must + * be centered within the crop region. + * </p><p> + * The output streams must maintain square pixels at all + * times, no matter what the relative aspect ratios of the + * crop region and the stream are. Negative values for + * corner are allowed for raw output if full pixel array is + * larger than active pixel array. Width and height may be + * rounded to nearest larger supportable width, especially + * for raw output, where only a few fixed scales may be + * possible. The width and height of the crop region cannot + * be set to be smaller than floor( activeArraySize.width / + * android.scaler.maxDigitalZoom ) and floor( + * activeArraySize.height / android.scaler.maxDigitalZoom), + * respectively. + * </p> + */ + public static final Key<android.graphics.Rect> SCALER_CROP_REGION = + new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); + + /** + * <p> + * Duration each pixel is exposed to + * light + * </p> + * <p> + * 1/10000 - 30 sec range. No bulb mode + * </p> + */ + public static final Key<Long> SENSOR_EXPOSURE_TIME = + new Key<Long>("android.sensor.exposureTime", long.class); + + /** + * <p> + * Duration from start of frame exposure to + * start of next frame exposure + * </p> + * <p> + * Exposure time has priority, so duration is set to + * max(duration, exposure time + overhead) + * </p> + */ + public static final Key<Long> SENSOR_FRAME_DURATION = + new Key<Long>("android.sensor.frameDuration", long.class); + + /** + * <p> + * Gain applied to image data. Must be + * implemented through analog gain only if set to values + * below 'maximum analog sensitivity'. + * </p> + * <p> + * ISO 12232:2006 REI method + * </p> + */ + public static final Key<Integer> SENSOR_SENSITIVITY = + new Key<Integer>("android.sensor.sensitivity", int.class); + + /** + * <p> + * Time at start of exposure of first + * row + * </p> + * <p> + * Monotonic, should be synced to other timestamps in + * system + * </p> + */ + public static final Key<Long> SENSOR_TIMESTAMP = + new Key<Long>("android.sensor.timestamp", long.class); + + /** + * <p> + * State of the face detector + * unit + * </p> + * <p> + * Whether face detection is enabled, and whether it + * should output just the basic fields or the full set of + * fields. Value must be one of the + * android.statistics.info.availableFaceDetectModes. + * </p> + * @see #STATISTICS_FACE_DETECT_MODE_OFF + * @see #STATISTICS_FACE_DETECT_MODE_SIMPLE + * @see #STATISTICS_FACE_DETECT_MODE_FULL + */ + public static final Key<Integer> STATISTICS_FACE_DETECT_MODE = + new Key<Integer>("android.statistics.faceDetectMode", int.class); + + /** + * <p> + * List of unique IDs for detected + * faces + * </p> + * <p> + * Only available if faceDetectMode == FULL + * </p> + */ + public static final Key<int[]> STATISTICS_FACE_IDS = + new Key<int[]>("android.statistics.faceIds", int[].class); + + /** + * <p> + * List of landmarks for detected + * faces + * </p> + * <p> + * Only available if faceDetectMode == FULL + * </p> + */ + public static final Key<int[]> STATISTICS_FACE_LANDMARKS = + new Key<int[]>("android.statistics.faceLandmarks", int[].class); + + /** + * <p> + * List of the bounding rectangles for detected + * faces + * </p> + * <p> + * Only available if faceDetectMode != OFF + * </p> + */ + public static final Key<android.graphics.Rect[]> STATISTICS_FACE_RECTANGLES = + new Key<android.graphics.Rect[]>("android.statistics.faceRectangles", android.graphics.Rect[].class); + + /** + * <p> + * List of the face confidence scores for + * detected faces + * </p> + * <p> + * Only available if faceDetectMode != OFF + * </p> + */ + public static final Key<byte[]> STATISTICS_FACE_SCORES = + new Key<byte[]>("android.statistics.faceScores", byte[].class); + + /** + * <p> + * A low-resolution map of lens shading, per + * color channel + * </p> + * <p> + * Assume bilinear interpolation of map. The least + * shaded section of the image should have a gain factor + * of 1; all other sections should have gains above 1. + * the map should be on the order of 30-40 rows, and + * must be smaller than 64x64. + * </p> + */ + public static final Key<float[]> STATISTICS_LENS_SHADING_MAP = + new Key<float[]>("android.statistics.lensShadingMap", float[].class); + + /** + * <p> + * The best-fit color channel gains calculated + * by the HAL's statistics units for the current output frame + * </p> + * <p> + * This may be different than the gains used for this frame, + * since statistics processing on data from a new frame + * typically completes after the transform has already been + * applied to that frame. + * </p><p> + * The 4 channel gains are defined in Bayer domain, + * see android.colorCorrection.gains for details. + * </p> + */ + public static final Key<float[]> STATISTICS_PREDICTED_COLOR_GAINS = + new Key<float[]>("android.statistics.predictedColorGains", float[].class); + + /** + * <p> + * The best-fit color transform matrix estimate + * calculated by the HAL's statistics units for the current + * output frame + * </p> + * <p> + * The HAL must provide the estimate from its + * statistics unit on the white balance transforms to use + * for the next frame. These are the values the HAL believes + * are the best fit for the current output frame. This may + * be different than the transform used for this frame, since + * statistics processing on data from a new frame typically + * completes after the transform has already been applied to + * that frame. + * </p><p> + * These estimates must be provided for all frames, even if + * capture settings and color transforms are set by the application. + * </p> + */ + public static final Key<Rational[]> STATISTICS_PREDICTED_COLOR_TRANSFORM = + new Key<Rational[]>("android.statistics.predictedColorTransform", Rational[].class); + + /** + * <p> + * The HAL estimated scene illumination lighting + * frequency + * </p> + * <p> + * Report NONE if there doesn't appear to be flickering + * illumination + * </p> + * @see #STATISTICS_SCENE_FLICKER_NONE + * @see #STATISTICS_SCENE_FLICKER_50HZ + * @see #STATISTICS_SCENE_FLICKER_60HZ + */ + public static final Key<Integer> STATISTICS_SCENE_FLICKER = + new Key<Integer>("android.statistics.sceneFlicker", int.class); + + /** + * <p> + * Table mapping blue input values to output + * values + * </p> + */ + public static final Key<Float> TONEMAP_CURVE_BLUE = + new Key<Float>("android.tonemap.curveBlue", float.class); + + /** + * <p> + * Table mapping green input values to output + * values + * </p> + */ + public static final Key<Float> TONEMAP_CURVE_GREEN = + new Key<Float>("android.tonemap.curveGreen", float.class); + + /** + * <p> + * Table mapping red input values to output + * values + * </p> + * <p> + * .The input range must be monotonically increasing + * with N, and values between entries should be linearly + * interpolated. For example, if the array is: [0.0, 0.0, + * 0.3, 0.5, 1.0, 1.0], then the input->output mapping + * for a few sample points would be: 0 -> 0, 0.15 -> + * 0.25, 0.3 -> 0.5, 0.5 -> 0.64 + * </p> + */ + public static final Key<float[]> TONEMAP_CURVE_RED = + new Key<float[]>("android.tonemap.curveRed", float[].class); + + /** + * @see #TONEMAP_MODE_CONTRAST_CURVE + * @see #TONEMAP_MODE_FAST + * @see #TONEMAP_MODE_HIGH_QUALITY + */ + public static final Key<Integer> TONEMAP_MODE = + new Key<Integer>("android.tonemap.mode", int.class); + + /** + * <p> + * This LED is nominally used to indicate to the user + * that the camera is powered on and may be streaming images back to the + * Application Processor. In certain rare circumstances, the OS may + * disable this when video is processed locally and not transmitted to + * any untrusted applications. + * </p><p> + * In particular, the LED *must* always be on when the data could be + * transmitted off the device. The LED *should* always be on whenever + * data is stored locally on the device. + * </p><p> + * The LED *may* be off if a trusted application is using the data that + * doesn't violate the above rules. + * </p> + * + * @hide + */ + public static final Key<Boolean> LED_TRANSMIT = + new Key<Boolean>("android.led.transmit", boolean.class); + + /** + * <p> + * Whether black-level compensation is locked + * to its current values, or is free to vary + * </p> + * <p> + * When set to ON, the values used for black-level + * compensation must not change until the lock is set to + * OFF + * </p><p> + * Since changes to certain capture parameters (such as + * exposure time) may require resetting of black level + * compensation, the HAL must report whether setting the + * black level lock was successful in the output result + * metadata. + * </p> + */ + public static final Key<Boolean> BLACK_LEVEL_LOCK = + new Key<Boolean>("android.blackLevel.lock", boolean.class); + + /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ + * End generated code + *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ } diff --git a/core/java/android/hardware/camera2/CaptureResultKeys.java b/core/java/android/hardware/camera2/CaptureResultKeys.java deleted file mode 100644 index dd3ed83..0000000 --- a/core/java/android/hardware/camera2/CaptureResultKeys.java +++ /dev/null @@ -1,533 +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.hardware.camera2; - -import static android.hardware.camera2.CameraMetadata.Key; - -/** - * ! Do not edit this file directly ! - * - * Generated automatically from CaptureResultKeys.mako - * - * TODO: Include a hash of the input files here that the build can check. - */ - -/** - * The base class for camera controls and information. - * - * This class defines the basic key/value map used for querying for camera - * characteristics or capture results, and for setting camera request - * parameters. - * - * @see CaptureResult - * @see CameraMetadata - * @hide - **/ -public final class CaptureResultKeys { - public static final class ColorCorrection { - public static final Key<Rational[]> TRANSFORM = - new Key<Rational[]>("android.colorCorrection.transform", Rational[].class); - public static final Key<float[]> GAINS = - new Key<float[]>("android.colorCorrection.gains", float[].class); - - } - - public static final class Control { - /** - * @hide - */ - public static final Key<Integer> AE_PRECAPTURE_ID = - new Key<Integer>("android.control.aePrecaptureId", int.class); - public static final Key<int[]> AE_REGIONS = - new Key<int[]>("android.control.aeRegions", int[].class); - - public static final class AeStateKey extends Key<Control.AeStateKey.Enum> { - public enum Enum { - INACTIVE, - SEARCHING, - CONVERGED, - LOCKED, - FLASH_REQUIRED, - PRECAPTURE; - } - - public static final Enum INACTIVE = Enum.INACTIVE; - public static final Enum SEARCHING = Enum.SEARCHING; - public static final Enum CONVERGED = Enum.CONVERGED; - public static final Enum LOCKED = Enum.LOCKED; - public static final Enum FLASH_REQUIRED = Enum.FLASH_REQUIRED; - public static final Enum PRECAPTURE = Enum.PRECAPTURE; - - // TODO: remove requirement for constructor by making Key an interface - private AeStateKey(String name) { - super(name, Control.AeStateKey.Enum.class); - } - - } - - public static final Key<Control.AeStateKey.Enum> AE_STATE = - new AeStateKey("android.control.aeState"); - - public static final class AfModeKey extends Key<Control.AfModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - MACRO, - CONTINUOUS_VIDEO, - CONTINUOUS_PICTURE, - EDOF; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum MACRO = Enum.MACRO; - public static final Enum CONTINUOUS_VIDEO = Enum.CONTINUOUS_VIDEO; - public static final Enum CONTINUOUS_PICTURE = Enum.CONTINUOUS_PICTURE; - public static final Enum EDOF = Enum.EDOF; - - // TODO: remove requirement for constructor by making Key an interface - private AfModeKey(String name) { - super(name, Control.AfModeKey.Enum.class); - } - - } - - public static final Key<Control.AfModeKey.Enum> AF_MODE = - new AfModeKey("android.control.afMode"); - public static final Key<int[]> AF_REGIONS = - new Key<int[]>("android.control.afRegions", int[].class); - - public static final class AfStateKey extends Key<Control.AfStateKey.Enum> { - public enum Enum { - INACTIVE, - PASSIVE_SCAN, - PASSIVE_FOCUSED, - ACTIVE_SCAN, - FOCUSED_LOCKED, - NOT_FOCUSED_LOCKED; - } - - public static final Enum INACTIVE = Enum.INACTIVE; - public static final Enum PASSIVE_SCAN = Enum.PASSIVE_SCAN; - public static final Enum PASSIVE_FOCUSED = Enum.PASSIVE_FOCUSED; - public static final Enum ACTIVE_SCAN = Enum.ACTIVE_SCAN; - public static final Enum FOCUSED_LOCKED = Enum.FOCUSED_LOCKED; - public static final Enum NOT_FOCUSED_LOCKED = Enum.NOT_FOCUSED_LOCKED; - - // TODO: remove requirement for constructor by making Key an interface - private AfStateKey(String name) { - super(name, Control.AfStateKey.Enum.class); - } - - } - - public static final Key<Control.AfStateKey.Enum> AF_STATE = - new AfStateKey("android.control.afState"); - /** - * @hide - */ - public static final Key<Integer> AF_TRIGGER_ID = - new Key<Integer>("android.control.afTriggerId", int.class); - - public static final class AwbModeKey extends Key<Control.AwbModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - INCANDESCENT, - FLUORESCENT, - WARM_FLUORESCENT, - DAYLIGHT, - CLOUDY_DAYLIGHT, - TWILIGHT, - SHADE; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum INCANDESCENT = Enum.INCANDESCENT; - public static final Enum FLUORESCENT = Enum.FLUORESCENT; - public static final Enum WARM_FLUORESCENT = Enum.WARM_FLUORESCENT; - public static final Enum DAYLIGHT = Enum.DAYLIGHT; - public static final Enum CLOUDY_DAYLIGHT = Enum.CLOUDY_DAYLIGHT; - public static final Enum TWILIGHT = Enum.TWILIGHT; - public static final Enum SHADE = Enum.SHADE; - - // TODO: remove requirement for constructor by making Key an interface - private AwbModeKey(String name) { - super(name, Control.AwbModeKey.Enum.class); - } - - } - - public static final Key<Control.AwbModeKey.Enum> AWB_MODE = - new AwbModeKey("android.control.awbMode"); - public static final Key<int[]> AWB_REGIONS = - new Key<int[]>("android.control.awbRegions", int[].class); - - public static final class AwbStateKey extends Key<Control.AwbStateKey.Enum> { - public enum Enum { - INACTIVE, - SEARCHING, - CONVERGED, - LOCKED; - } - - public static final Enum INACTIVE = Enum.INACTIVE; - public static final Enum SEARCHING = Enum.SEARCHING; - public static final Enum CONVERGED = Enum.CONVERGED; - public static final Enum LOCKED = Enum.LOCKED; - - // TODO: remove requirement for constructor by making Key an interface - private AwbStateKey(String name) { - super(name, Control.AwbStateKey.Enum.class); - } - - } - - public static final Key<Control.AwbStateKey.Enum> AWB_STATE = - new AwbStateKey("android.control.awbState"); - - public static final class ModeKey extends Key<Control.ModeKey.Enum> { - public enum Enum { - OFF, - AUTO, - USE_SCENE_MODE; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum AUTO = Enum.AUTO; - public static final Enum USE_SCENE_MODE = Enum.USE_SCENE_MODE; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Control.ModeKey.Enum.class); - } - - } - - public static final Key<Control.ModeKey.Enum> MODE = - new ModeKey("android.control.mode"); - - } - - public static final class Edge { - - public static final class ModeKey extends Key<Edge.ModeKey.Enum> { - public enum Enum { - OFF, - FAST, - HIGH_QUALITY; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Edge.ModeKey.Enum.class); - } - - } - - public static final Key<Edge.ModeKey.Enum> MODE = - new ModeKey("android.edge.mode"); - - } - - public static final class Flash { - - public static final class ModeKey extends Key<Flash.ModeKey.Enum> { - public enum Enum { - OFF, - SINGLE, - TORCH; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum SINGLE = Enum.SINGLE; - public static final Enum TORCH = Enum.TORCH; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Flash.ModeKey.Enum.class); - } - - } - - public static final Key<Flash.ModeKey.Enum> MODE = - new ModeKey("android.flash.mode"); - - public static final class StateKey extends Key<Flash.StateKey.Enum> { - public enum Enum { - UNAVAILABLE, - CHARGING, - READY, - FIRED; - } - - public static final Enum UNAVAILABLE = Enum.UNAVAILABLE; - public static final Enum CHARGING = Enum.CHARGING; - public static final Enum READY = Enum.READY; - public static final Enum FIRED = Enum.FIRED; - - // TODO: remove requirement for constructor by making Key an interface - private StateKey(String name) { - super(name, Flash.StateKey.Enum.class); - } - - } - - public static final Key<Flash.StateKey.Enum> STATE = - new StateKey("android.flash.state"); - - } - - public static final class Jpeg { - public static final Key<double[]> GPS_COORDINATES = - new Key<double[]>("android.jpeg.gpsCoordinates", double[].class); - public static final Key<String> GPS_PROCESSING_METHOD = - new Key<String>("android.jpeg.gpsProcessingMethod", String.class); - public static final Key<Long> GPS_TIMESTAMP = - new Key<Long>("android.jpeg.gpsTimestamp", long.class); - public static final Key<Integer> ORIENTATION = - new Key<Integer>("android.jpeg.orientation", int.class); - public static final Key<Byte> QUALITY = - new Key<Byte>("android.jpeg.quality", byte.class); - public static final Key<Byte> THUMBNAIL_QUALITY = - new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); - public static final Key<android.hardware.camera2.Size> THUMBNAIL_SIZE = - new Key<android.hardware.camera2.Size>("android.jpeg.thumbnailSize", android.hardware.camera2.Size.class); - - } - - public static final class Lens { - public static final Key<Float> APERTURE = - new Key<Float>("android.lens.aperture", float.class); - public static final Key<Float> FILTER_DENSITY = - new Key<Float>("android.lens.filterDensity", float.class); - public static final Key<Float> FOCAL_LENGTH = - new Key<Float>("android.lens.focalLength", float.class); - public static final Key<Float> FOCUS_DISTANCE = - new Key<Float>("android.lens.focusDistance", float.class); - public static final Key<Float> FOCUS_RANGE = - new Key<Float>("android.lens.focusRange", float.class); - - public static final class OpticalStabilizationModeKey extends Key<Lens.OpticalStabilizationModeKey.Enum> { - public enum Enum { - OFF, - ON; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum ON = Enum.ON; - - // TODO: remove requirement for constructor by making Key an interface - private OpticalStabilizationModeKey(String name) { - super(name, Lens.OpticalStabilizationModeKey.Enum.class); - } - - } - - public static final Key<Lens.OpticalStabilizationModeKey.Enum> OPTICAL_STABILIZATION_MODE = - new OpticalStabilizationModeKey("android.lens.opticalStabilizationMode"); - - public static final class StateKey extends Key<Lens.StateKey.Enum> { - public enum Enum { - STATIONARY; - } - - public static final Enum STATIONARY = Enum.STATIONARY; - - // TODO: remove requirement for constructor by making Key an interface - private StateKey(String name) { - super(name, Lens.StateKey.Enum.class); - } - - } - - public static final Key<Lens.StateKey.Enum> STATE = - new StateKey("android.lens.state"); - - } - - public static final class NoiseReduction { - - public static final class ModeKey extends Key<NoiseReduction.ModeKey.Enum> { - public enum Enum { - OFF, - FAST, - HIGH_QUALITY; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, NoiseReduction.ModeKey.Enum.class); - } - - } - - public static final Key<NoiseReduction.ModeKey.Enum> MODE = - new ModeKey("android.noiseReduction.mode"); - - } - - public static final class Request { - public static final Key<Integer> FRAME_COUNT = - new Key<Integer>("android.request.frameCount", int.class); - /** - * @hide - */ - public static final Key<Integer> ID = - new Key<Integer>("android.request.id", int.class); - - } - - public static final class Scaler { - public static final Key<android.graphics.Rect> CROP_REGION = - new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); - - } - - public static final class Sensor { - public static final Key<Long> EXPOSURE_TIME = - new Key<Long>("android.sensor.exposureTime", long.class); - public static final Key<Long> FRAME_DURATION = - new Key<Long>("android.sensor.frameDuration", long.class); - public static final Key<Integer> SENSITIVITY = - new Key<Integer>("android.sensor.sensitivity", int.class); - public static final Key<Long> TIMESTAMP = - new Key<Long>("android.sensor.timestamp", long.class); - - } - - public static final class Statistics { - - public static final class FaceDetectModeKey extends Key<Statistics.FaceDetectModeKey.Enum> { - public enum Enum { - OFF, - SIMPLE, - FULL; - } - - public static final Enum OFF = Enum.OFF; - public static final Enum SIMPLE = Enum.SIMPLE; - public static final Enum FULL = Enum.FULL; - - // TODO: remove requirement for constructor by making Key an interface - private FaceDetectModeKey(String name) { - super(name, Statistics.FaceDetectModeKey.Enum.class); - } - - } - - public static final Key<Statistics.FaceDetectModeKey.Enum> FACE_DETECT_MODE = - new FaceDetectModeKey("android.statistics.faceDetectMode"); - public static final Key<int[]> FACE_IDS = - new Key<int[]>("android.statistics.faceIds", int[].class); - public static final Key<int[]> FACE_LANDMARKS = - new Key<int[]>("android.statistics.faceLandmarks", int[].class); - public static final Key<android.graphics.Rect[]> FACE_RECTANGLES = - new Key<android.graphics.Rect[]>("android.statistics.faceRectangles", android.graphics.Rect[].class); - public static final Key<byte[]> FACE_SCORES = - new Key<byte[]>("android.statistics.faceScores", byte[].class); - public static final Key<float[]> LENS_SHADING_MAP = - new Key<float[]>("android.statistics.lensShadingMap", float[].class); - public static final Key<float[]> PREDICTED_COLOR_GAINS = - new Key<float[]>("android.statistics.predictedColorGains", float[].class); - public static final Key<Rational[]> PREDICTED_COLOR_TRANSFORM = - new Key<Rational[]>("android.statistics.predictedColorTransform", Rational[].class); - - public static final class SceneFlickerKey extends Key<Statistics.SceneFlickerKey.Enum> { - public enum Enum { - NONE, - _50HZ, - _60HZ; - } - - public static final Enum NONE = Enum.NONE; - public static final Enum _50HZ = Enum._50HZ; - public static final Enum _60HZ = Enum._60HZ; - - // TODO: remove requirement for constructor by making Key an interface - private SceneFlickerKey(String name) { - super(name, Statistics.SceneFlickerKey.Enum.class); - } - - } - - public static final Key<Statistics.SceneFlickerKey.Enum> SCENE_FLICKER = - new SceneFlickerKey("android.statistics.sceneFlicker"); - - } - - public static final class Tonemap { - public static final Key<Float> CURVE_BLUE = - new Key<Float>("android.tonemap.curveBlue", float.class); - public static final Key<Float> CURVE_GREEN = - new Key<Float>("android.tonemap.curveGreen", float.class); - public static final Key<float[]> CURVE_RED = - new Key<float[]>("android.tonemap.curveRed", float[].class); - - public static final class ModeKey extends Key<Tonemap.ModeKey.Enum> { - public enum Enum { - CONTRAST_CURVE, - FAST, - HIGH_QUALITY; - } - - public static final Enum CONTRAST_CURVE = Enum.CONTRAST_CURVE; - public static final Enum FAST = Enum.FAST; - public static final Enum HIGH_QUALITY = Enum.HIGH_QUALITY; - - // TODO: remove requirement for constructor by making Key an interface - private ModeKey(String name) { - super(name, Tonemap.ModeKey.Enum.class); - } - - } - - public static final Key<Tonemap.ModeKey.Enum> MODE = - new ModeKey("android.tonemap.mode"); - - } - - /** - * @hide - */ - public static final class Led { - /** - * @hide - */ - public static final Key<Boolean> TRANSMIT = - new Key<Boolean>("android.led.transmit", boolean.class); - - } - - public static final class BlackLevel { - public static final Key<Boolean> LOCK = - new Key<Boolean>("android.blackLevel.lock", boolean.class); - - } - -} - - diff --git a/core/java/android/hardware/camera2/Rational.java b/core/java/android/hardware/camera2/Rational.java index 7ccc555..0260e02 100644 --- a/core/java/android/hardware/camera2/Rational.java +++ b/core/java/android/hardware/camera2/Rational.java @@ -85,7 +85,7 @@ public final class Rational { * * @param obj a reference to another object * - * @return boolean that determines whether or not the two Rational objects are equal. + * @return A boolean that determines whether or not the two Rational objects are equal. */ @Override public boolean equals(Object obj) { @@ -135,7 +135,7 @@ public final class Rational { /** * Calculates the greatest common divisor using Euclid's algorithm. * - * @return int value representing the gcd. Always positive. + * @return An int value representing the gcd. Always positive. * @hide */ public int gcd() { diff --git a/core/java/android/print/IPrinterDiscoverySessionController.aidl b/core/java/android/hardware/camera2/utils/BinderHolder.aidl index 13116ef..f39d645 100644 --- a/core/java/android/print/IPrinterDiscoverySessionController.aidl +++ b/core/java/android/hardware/camera2/utils/BinderHolder.aidl @@ -14,17 +14,7 @@ * limitations under the License. */ -package android.print; +package android.hardware.camera2.utils; -import android.print.PrinterId; - -/** -* Interface for the controlling part of a printer discovery session. - * - * @hide - */ -oneway interface IPrinterDiscoverySessionController { - void open(in List<PrinterId> priorityList); - void requestPrinterUpdate(in PrinterId printerId); - void close(); -} +/** @hide */ +parcelable BinderHolder; diff --git a/core/java/android/hardware/camera2/utils/BinderHolder.java b/core/java/android/hardware/camera2/utils/BinderHolder.java new file mode 100644 index 0000000..9eea390 --- /dev/null +++ b/core/java/android/hardware/camera2/utils/BinderHolder.java @@ -0,0 +1,74 @@ +/* + * 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.hardware.camera2.utils; + +import android.os.Parcel; +import android.os.Parcelable; +import android.os.IBinder; + +/** + * @hide + */ +public class BinderHolder implements Parcelable { + private IBinder mBinder = null; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeStrongBinder(mBinder); + } + + public void readFromParcel(Parcel src) { + mBinder = src.readStrongBinder(); + } + + public static final Parcelable.Creator<BinderHolder> CREATOR = + new Parcelable.Creator<BinderHolder>() { + @Override + public BinderHolder createFromParcel(Parcel in) { + return new BinderHolder(in); + } + + @Override + public BinderHolder[] newArray(int size) { + return new BinderHolder[size]; + } + }; + + public IBinder getBinder() { + return mBinder; + } + + public void setBinder(IBinder binder) { + mBinder = binder; + } + + public BinderHolder() {} + + public BinderHolder(IBinder binder) { + mBinder = binder; + } + + private BinderHolder(Parcel in) { + mBinder = in.readStrongBinder(); + } +} + diff --git a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java index 586c759..fbe7ff4 100644 --- a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java +++ b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java @@ -19,6 +19,7 @@ package android.hardware.camera2.utils; import static android.hardware.camera2.CameraAccessException.CAMERA_DISABLED; import static android.hardware.camera2.CameraAccessException.CAMERA_DISCONNECTED; import static android.hardware.camera2.CameraAccessException.CAMERA_IN_USE; +import static android.hardware.camera2.CameraAccessException.CAMERA_DEPRECATED_HAL; import android.os.DeadObjectException; import android.os.RemoteException; @@ -48,6 +49,7 @@ public class CameraBinderDecorator { public static final int EACCES = -13; public static final int EBUSY = -16; public static final int ENODEV = -19; + public static final int ENOTSUP = -129; private static class CameraBinderDecoratorListener implements Decorator.DecoratorListener { @@ -75,9 +77,6 @@ public class CameraBinderDecorator { case DEAD_OBJECT: UncheckedThrow.throwAnyException(new CameraRuntimeException( CAMERA_DISCONNECTED)); - // TODO: Camera service (native side) should return - // EACCES error - // when there's a policy manager disabled causing this case EACCES: UncheckedThrow.throwAnyException(new CameraRuntimeException( CAMERA_DISABLED)); @@ -87,6 +86,9 @@ public class CameraBinderDecorator { case ENODEV: UncheckedThrow.throwAnyException(new CameraRuntimeException( CAMERA_DISCONNECTED)); + case ENOTSUP: + UncheckedThrow.throwAnyException(new CameraRuntimeException( + CAMERA_DEPRECATED_HAL)); } /** diff --git a/core/java/android/hardware/location/GeofenceHardware.java b/core/java/android/hardware/location/GeofenceHardware.java index e67d0d7..21de9f5 100644 --- a/core/java/android/hardware/location/GeofenceHardware.java +++ b/core/java/android/hardware/location/GeofenceHardware.java @@ -15,16 +15,11 @@ */ package android.hardware.location; -import android.content.Context; import android.location.Location; import android.os.RemoteException; -import android.util.Log; import java.lang.ref.WeakReference; import java.util.HashMap; -import java.util.Map; -import java.util.Set; - /** * This class handles geofences managed by various hardware subsystems. It contains @@ -52,7 +47,7 @@ public final class GeofenceHardware { private IGeofenceHardware mService; // Hardware systems that do geofence monitoring. - static final int NUM_MONITORS = 1; + static final int NUM_MONITORS = 2; /** * Constant for geofence monitoring done by the GPS hardware. @@ -60,6 +55,13 @@ public final class GeofenceHardware { public static final int MONITORING_TYPE_GPS_HARDWARE = 0; /** + * Constant for geofence monitoring done by the Fused hardware. + * + * @hide + */ + public static final int MONITORING_TYPE_FUSED_HARDWARE = 1; + + /** * Constant to indiciate that the monitoring system is currently * available for monitoring geofences. */ @@ -124,8 +126,12 @@ public final class GeofenceHardware { */ public static final int GEOFENCE_FAILURE = 5; - static final int GPS_GEOFENCE_UNAVAILABLE = 1<<0L; - static final int GPS_GEOFENCE_AVAILABLE = 1<<1L; + /** + * The constant used to indicate that the operation failed due to insufficient memory. + * + * @hide + */ + public static final int GEOFENCE_ERROR_INSUFFICIENT_MEMORY = 6; private HashMap<GeofenceHardwareCallback, GeofenceHardwareCallbackWrapper> mCallbacks = new HashMap<GeofenceHardwareCallback, GeofenceHardwareCallbackWrapper>(); diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java index 77e3143..eac6620 100644 --- a/core/java/android/hardware/location/GeofenceHardwareImpl.java +++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java @@ -18,23 +18,21 @@ package android.hardware.location; import android.content.Context; import android.content.pm.PackageManager; +import android.location.FusedBatchOptions; +import android.location.IFusedGeofenceHardware; import android.location.IGpsGeofenceHardware; import android.location.Location; import android.location.LocationManager; -import android.os.Binder; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemClock; import android.util.Log; import android.util.SparseArray; import java.util.ArrayList; -import java.util.HashMap; /** * This class manages the geofences which are handled by hardware. @@ -54,6 +52,7 @@ public final class GeofenceHardwareImpl { new ArrayList[GeofenceHardware.NUM_MONITORS]; private final ArrayList<Reaper> mReapers = new ArrayList<Reaper>(); + private IFusedGeofenceHardware mFusedService; private IGpsGeofenceHardware mGpsService; private int[] mSupportedMonitorTypes = new int[GeofenceHardware.NUM_MONITORS]; @@ -67,7 +66,7 @@ public final class GeofenceHardwareImpl { private static final int GEOFENCE_CALLBACK_BINDER_DIED = 6; // mCallbacksHandler message types - private static final int GPS_GEOFENCE_STATUS = 1; + private static final int GEOFENCE_STATUS = 1; private static final int CALLBACK_ADD = 2; private static final int CALLBACK_REMOVE = 3; private static final int MONITOR_CALLBACK_BINDER_DIED = 4; @@ -91,16 +90,6 @@ public final class GeofenceHardwareImpl { private static final int RESOLUTION_LEVEL_COARSE = 2; private static final int RESOLUTION_LEVEL_FINE = 3; - // GPS Geofence errors. Should match gps.h constants. - private static final int GPS_GEOFENCE_OPERATION_SUCCESS = 0; - private static final int GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES = 100; - private static final int GPS_GEOFENCE_ERROR_ID_EXISTS = -101; - private static final int GPS_GEOFENCE_ERROR_ID_UNKNOWN = -102; - private static final int GPS_GEOFENCE_ERROR_INVALID_TRANSITION = -103; - private static final int GPS_GEOFENCE_ERROR_GENERIC = -149; - - - public synchronized static GeofenceHardwareImpl getInstance(Context context) { if (sInstance == null) { sInstance = new GeofenceHardwareImpl(context); @@ -113,6 +102,9 @@ public final class GeofenceHardwareImpl { // Init everything to unsupported. setMonitorAvailability(GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, GeofenceHardware.MONITOR_UNSUPPORTED); + setMonitorAvailability( + GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, + GeofenceHardware.MONITOR_UNSUPPORTED); } @@ -147,6 +139,22 @@ public final class GeofenceHardwareImpl { } } + private void updateFusedHardwareAvailability() { + boolean fusedSupported; + try { + fusedSupported = mFusedService.isSupported(); + } catch(RemoteException e) { + Log.e(TAG, "RemoteException calling LocationManagerService"); + fusedSupported = false; + } + + if(fusedSupported) { + setMonitorAvailability( + GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, + GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE); + } + } + public void setGpsHardwareGeofence(IGpsGeofenceHardware service) { if (mGpsService == null) { mGpsService = service; @@ -159,12 +167,39 @@ public final class GeofenceHardwareImpl { } } + public void setFusedGeofenceHardware(IFusedGeofenceHardware service) { + if(mFusedService == null) { + mFusedService = service; + updateFusedHardwareAvailability(); + } else if(service == null) { + mFusedService = null; + Log.w(TAG, "Fused Geofence Hardware service seems to have crashed"); + } else { + Log.e(TAG, "Error: FusedService being set again"); + } + } + public int[] getMonitoringTypes() { + boolean gpsSupported; + boolean fusedSupported; synchronized (mSupportedMonitorTypes) { - if (mSupportedMonitorTypes[GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE] != - GeofenceHardware.MONITOR_UNSUPPORTED) { - return new int[] {GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE}; + gpsSupported = mSupportedMonitorTypes[GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE] + != GeofenceHardware.MONITOR_UNSUPPORTED; + fusedSupported = mSupportedMonitorTypes[GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE] + != GeofenceHardware.MONITOR_UNSUPPORTED; + } + + if(gpsSupported) { + if(fusedSupported) { + return new int[] { + GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, + GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE }; + } else { + return new int[] { GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE }; } + } else if (fusedSupported) { + return new int[] { GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE }; + } else { return new int[0]; } } @@ -213,6 +248,30 @@ public final class GeofenceHardwareImpl { result = false; } break; + case GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE: + if(mFusedService == null) { + return false; + } + GeofenceHardwareRequest request = GeofenceHardwareRequest.createCircularGeofence( + latitude, + longitude, + radius); + request.setUnknownTimer(unknownTimer); + request.setNotificationResponsiveness(notificationResponsivenes); + request.setMonitorTransitions(monitorTransitions); + request.setLastTransition(lastTransition); + + GeofenceHardwareRequestParcelable parcelableRequest = + new GeofenceHardwareRequestParcelable(geofenceId, request); + try { + mFusedService.addGeofences( + new GeofenceHardwareRequestParcelable[] { parcelableRequest }); + result = true; + } catch(RemoteException e) { + Log.e(TAG, "AddGeofence: RemoteException calling LocationManagerService"); + result = false; + } + break; default: result = false; } @@ -251,6 +310,18 @@ public final class GeofenceHardwareImpl { result = false; } break; + case GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE: + if(mFusedService == null) { + return false; + } + try { + mFusedService.removeGeofences(new int[] { geofenceId }); + result = true; + } catch(RemoteException e) { + Log.e(TAG, "RemoveGeofence: RemoteException calling LocationManagerService"); + result = false; + } + break; default: result = false; } @@ -278,6 +349,18 @@ public final class GeofenceHardwareImpl { result = false; } break; + case GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE: + if(mFusedService == null) { + return false; + } + try { + mFusedService.pauseMonitoringGeofence(geofenceId); + result = true; + } catch(RemoteException e) { + Log.e(TAG, "PauseGeofence: RemoteException calling LocationManagerService"); + result = false; + } + break; default: result = false; } @@ -306,6 +389,18 @@ public final class GeofenceHardwareImpl { result = false; } break; + case GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE: + if(mFusedService == null) { + return false; + } + try { + mFusedService.resumeMonitoringGeofence(geofenceId, monitorTransition); + result = true; + } catch(RemoteException e) { + Log.e(TAG, "ResumeGeofence: RemoteException calling LocationManagerService"); + result = false; + } + break; default: result = false; } @@ -334,127 +429,106 @@ public final class GeofenceHardwareImpl { return true; } - private Location getLocation(int flags, double latitude, - double longitude, double altitude, float speed, float bearing, float accuracy, - long timestamp) { - if (DEBUG) Log.d(TAG, "GetLocation: " + flags + ":" + latitude); - Location location = new Location(LocationManager.GPS_PROVIDER); - if ((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) { - location.setLatitude(latitude); - location.setLongitude(longitude); - location.setTime(timestamp); - // It would be nice to push the elapsed real-time timestamp - // further down the stack, but this is still useful - location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); - } - if ((flags & LOCATION_HAS_ALTITUDE) == LOCATION_HAS_ALTITUDE) { - location.setAltitude(altitude); - } else { - location.removeAltitude(); - } - if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { - location.setSpeed(speed); - } else { - location.removeSpeed(); - } - if ((flags & LOCATION_HAS_BEARING) == LOCATION_HAS_BEARING) { - location.setBearing(bearing); - } else { - location.removeBearing(); - } - if ((flags & LOCATION_HAS_ACCURACY) == LOCATION_HAS_ACCURACY) { - location.setAccuracy(accuracy); - } else { - location.removeAccuracy(); - } - return location; + /** + * Used to report geofence transitions + */ + public void reportGeofenceTransition( + int geofenceId, + Location location, + int transition, + long transitionTimestamp, + int monitoringType, + int sourcesUsed) { + if(location == null) { + Log.e(TAG, String.format("Invalid Geofence Transition: location=%p", location)); + return; + } + if(DEBUG) { + Log.d( + TAG, + "GeofenceTransition| " + location + ", transition:" + transition + + ", transitionTimestamp:" + transitionTimestamp + ", monitoringType:" + + monitoringType + ", sourcesUsed:" + sourcesUsed); + } + + GeofenceTransition geofenceTransition = new GeofenceTransition( + geofenceId, + transition, + transitionTimestamp, + location, + monitoringType, + sourcesUsed); + acquireWakeLock(); + + Message message = mGeofenceHandler.obtainMessage( + GEOFENCE_TRANSITION_CALLBACK, + geofenceTransition); + message.sendToTarget(); } /** - * called from GpsLocationProvider to report geofence transition + * Used to report Monitor status changes. */ - public void reportGpsGeofenceTransition(int geofenceId, int flags, double latitude, - double longitude, double altitude, float speed, float bearing, float accuracy, - long timestamp, int transition, long transitionTimestamp) { - if (DEBUG) Log.d(TAG, "GeofenceTransition: Flags: " + flags + " Lat: " + latitude + - " Long: " + longitude + " Altitude: " + altitude + " Speed: " + speed + " Bearing: " + - bearing + " Accuracy: " + accuracy + " Timestamp: " + timestamp + " Transition: " + - transition + " TransitionTimestamp: " + transitionTimestamp); - Location location = getLocation(flags, latitude, longitude, altitude, speed, bearing, - accuracy, timestamp); - GeofenceTransition t = new GeofenceTransition(geofenceId, transition, timestamp, location); + public void reportGeofenceMonitorStatus( + int monitoringType, + int monitoringStatus, + Location location, + int source) { + // TODO: use the source if needed in the future + setMonitorAvailability(monitoringType, monitoringStatus); acquireWakeLock(); - Message m = mGeofenceHandler.obtainMessage(GEOFENCE_TRANSITION_CALLBACK, t); - mGeofenceHandler.sendMessage(m); + Message message = mCallbacksHandler.obtainMessage(GEOFENCE_STATUS, location); + message.arg1 = monitoringStatus; + message.arg2 = monitoringType; + message.sendToTarget(); } /** - * called from GpsLocationProvider to report GPS status change. + * Internal generic status report function for Geofence operations. + * + * @param operation The operation to be reported as defined internally. + * @param geofenceId The id of the geofence the operation is related to. + * @param operationStatus The status of the operation as defined in GeofenceHardware class. This + * status is independent of the statuses reported by different HALs. */ - public void reportGpsGeofenceStatus(int status, int flags, double latitude, - double longitude, double altitude, float speed, float bearing, float accuracy, - long timestamp) { - Location location = getLocation(flags, latitude, longitude, altitude, speed, bearing, - accuracy, timestamp); - boolean available = false; - if (status == GeofenceHardware.GPS_GEOFENCE_AVAILABLE) available = true; - - int val = (available ? GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE : - GeofenceHardware.MONITOR_CURRENTLY_UNAVAILABLE); - setMonitorAvailability(GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, val); - + private void reportGeofenceOperationStatus(int operation, int geofenceId, int operationStatus) { acquireWakeLock(); - Message m = mCallbacksHandler.obtainMessage(GPS_GEOFENCE_STATUS, location); - m.arg1 = val; - mCallbacksHandler.sendMessage(m); + Message message = mGeofenceHandler.obtainMessage(operation); + message.arg1 = geofenceId; + message.arg2 = operationStatus; + message.sendToTarget(); } /** - * called from GpsLocationProvider add geofence callback. + * Used to report the status of a Geofence Add operation. */ - public void reportGpsGeofenceAddStatus(int geofenceId, int status) { - if (DEBUG) Log.d(TAG, "Add Callback: GPS : Id: " + geofenceId + " Status: " + status); - acquireWakeLock(); - Message m = mGeofenceHandler.obtainMessage(ADD_GEOFENCE_CALLBACK); - m.arg1 = geofenceId; - m.arg2 = getGeofenceStatus(status); - mGeofenceHandler.sendMessage(m); + public void reportGeofenceAddStatus(int geofenceId, int status) { + if(DEBUG) Log.d(TAG, "AddCallback| id:" + geofenceId + ", status:" + status); + reportGeofenceOperationStatus(ADD_GEOFENCE_CALLBACK, geofenceId, status); } /** - * called from GpsLocationProvider remove geofence callback. + * Used to report the status of a Geofence Remove operation. */ - public void reportGpsGeofenceRemoveStatus(int geofenceId, int status) { - if (DEBUG) Log.d(TAG, "Remove Callback: GPS : Id: " + geofenceId + " Status: " + status); - acquireWakeLock(); - Message m = mGeofenceHandler.obtainMessage(REMOVE_GEOFENCE_CALLBACK); - m.arg1 = geofenceId; - m.arg2 = getGeofenceStatus(status); - mGeofenceHandler.sendMessage(m); + public void reportGeofenceRemoveStatus(int geofenceId, int status) { + if(DEBUG) Log.d(TAG, "RemoveCallback| id:" + geofenceId + ", status:" + status); + reportGeofenceOperationStatus(REMOVE_GEOFENCE_CALLBACK, geofenceId, status); } /** - * called from GpsLocationProvider pause geofence callback. + * Used to report the status of a Geofence Pause operation. */ - public void reportGpsGeofencePauseStatus(int geofenceId, int status) { - if (DEBUG) Log.d(TAG, "Pause Callback: GPS : Id: " + geofenceId + " Status: " + status); - acquireWakeLock(); - Message m = mGeofenceHandler.obtainMessage(PAUSE_GEOFENCE_CALLBACK); - m.arg1 = geofenceId; - m.arg2 = getGeofenceStatus(status); - mGeofenceHandler.sendMessage(m); + public void reportGeofencePauseStatus(int geofenceId, int status) { + if(DEBUG) Log.d(TAG, "PauseCallbac| id:" + geofenceId + ", status" + status); + reportGeofenceOperationStatus(PAUSE_GEOFENCE_CALLBACK, geofenceId, status); } /** - * called from GpsLocationProvider resume geofence callback. + * Used to report the status of a Geofence Resume operation. */ - public void reportGpsGeofenceResumeStatus(int geofenceId, int status) { - if (DEBUG) Log.d(TAG, "Resume Callback: GPS : Id: " + geofenceId + " Status: " + status); - acquireWakeLock(); - Message m = mGeofenceHandler.obtainMessage(RESUME_GEOFENCE_CALLBACK); - m.arg1 = geofenceId; - m.arg2 = getGeofenceStatus(status); - mGeofenceHandler.sendMessage(m); + public void reportGeofenceResumeStatus(int geofenceId, int status) { + if(DEBUG) Log.d(TAG, "ResumeCallback| id:" + geofenceId + ", status:" + status); + reportGeofenceOperationStatus(RESUME_GEOFENCE_CALLBACK, geofenceId, status); } // All operations on mGeofences @@ -539,7 +613,7 @@ public final class GeofenceHardwareImpl { callback.onGeofenceTransition( geofenceTransition.mGeofenceId, geofenceTransition.mTransition, geofenceTransition.mLocation, geofenceTransition.mTimestamp, - GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE); + geofenceTransition.mMonitoringType); } catch (RemoteException e) {} } releaseWakeLock(); @@ -571,21 +645,20 @@ public final class GeofenceHardwareImpl { IGeofenceHardwareMonitorCallback callback; switch (msg.what) { - case GPS_GEOFENCE_STATUS: + case GEOFENCE_STATUS: Location location = (Location) msg.obj; int val = msg.arg1; + monitoringType = msg.arg2; boolean available; available = (val == GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE ? true : false); - callbackList = mCallbacks[GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE]; + callbackList = mCallbacks[monitoringType]; if (callbackList != null) { if (DEBUG) Log.d(TAG, "MonitoringSystemChangeCallback: GPS : " + available); for (IGeofenceHardwareMonitorCallback c: callbackList) { try { - c.onMonitoringSystemChange( - GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, available, - location); + c.onMonitoringSystemChange(monitoringType, available, location); } catch (RemoteException e) {} } } @@ -666,12 +739,22 @@ public final class GeofenceHardwareImpl { private int mGeofenceId, mTransition; private long mTimestamp; private Location mLocation; - - GeofenceTransition(int geofenceId, int transition, long timestamp, Location location) { + private int mMonitoringType; + private int mSourcesUsed; + + GeofenceTransition( + int geofenceId, + int transition, + long timestamp, + Location location, + int monitoringType, + int sourcesUsed) { mGeofenceId = geofenceId; mTransition = transition; mTimestamp = timestamp; mLocation = location; + mMonitoringType = monitoringType; + mSourcesUsed = sourcesUsed; } } @@ -686,6 +769,8 @@ public final class GeofenceHardwareImpl { switch (monitoringType) { case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE: return RESOLUTION_LEVEL_FINE; + case GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE: + return RESOLUTION_LEVEL_FINE; } return RESOLUTION_LEVEL_NONE; } @@ -752,22 +837,4 @@ public final class GeofenceHardwareImpl { return RESOLUTION_LEVEL_NONE; } } - - private int getGeofenceStatus(int status) { - switch (status) { - case GPS_GEOFENCE_OPERATION_SUCCESS: - return GeofenceHardware.GEOFENCE_SUCCESS; - case GPS_GEOFENCE_ERROR_GENERIC: - return GeofenceHardware.GEOFENCE_FAILURE; - case GPS_GEOFENCE_ERROR_ID_EXISTS: - return GeofenceHardware.GEOFENCE_ERROR_ID_EXISTS; - case GPS_GEOFENCE_ERROR_INVALID_TRANSITION: - return GeofenceHardware.GEOFENCE_ERROR_INVALID_TRANSITION; - case GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES: - return GeofenceHardware.GEOFENCE_ERROR_TOO_MANY_GEOFENCES; - case GPS_GEOFENCE_ERROR_ID_UNKNOWN: - return GeofenceHardware.GEOFENCE_ERROR_ID_UNKNOWN; - } - return -1; - } } diff --git a/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.aidl b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.aidl new file mode 100644 index 0000000..b599d44 --- /dev/null +++ b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.aidl @@ -0,0 +1,19 @@ +/* + * 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.hardware.location; + +parcelable GeofenceHardwareRequestParcelable; diff --git a/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java new file mode 100644 index 0000000..40e7fc4 --- /dev/null +++ b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java @@ -0,0 +1,151 @@ +/* + * 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.hardware.location; + +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +/** + * Geofence Hardware Request used for internal location services communication. + * + * @hide + */ +public final class GeofenceHardwareRequestParcelable implements Parcelable { + private GeofenceHardwareRequest mRequest; + private int mId; + + public GeofenceHardwareRequestParcelable(int id, GeofenceHardwareRequest request) { + mId = id; + mRequest = request; + } + + /** + * Returns the id of this request. + */ + public int getId() { + return mId; + } + + /** + * Returns the latitude of this geofence. + */ + public double getLatitude() { + return mRequest.getLatitude(); + } + + /** + * Returns the longitude of this geofence. + */ + public double getLongitude() { + return mRequest.getLongitude(); + } + + /** + * Returns the radius of this geofence. + */ + public double getRadius() { + return mRequest.getRadius(); + } + + /** + * Returns transitions monitored for this geofence. + */ + public int getMonitorTransitions() { + return mRequest.getMonitorTransitions(); + } + + /** + * Returns the unknownTimer of this geofence. + */ + public int getUnknownTimer() { + return mRequest.getUnknownTimer(); + } + + /** + * Returns the notification responsiveness of this geofence. + */ + public int getNotificationResponsiveness() { + return mRequest.getNotificationResponsiveness(); + } + + /** + * Returns the last transition of this geofence. + */ + public int getLastTransition() { + return mRequest.getLastTransition(); + } + + /** + * Returns the type of the geofence for the current request. + */ + int getType() { + return mRequest.getType(); + } + + /** + * Method definitions to support Parcelable operations. + */ + public static final Parcelable.Creator<GeofenceHardwareRequestParcelable> CREATOR = + new Parcelable.Creator<GeofenceHardwareRequestParcelable>() { + @Override + public GeofenceHardwareRequestParcelable createFromParcel(Parcel parcel) { + int geofenceType = parcel.readInt(); + if(geofenceType != GeofenceHardwareRequest.GEOFENCE_TYPE_CIRCLE) { + Log.e( + "GeofenceHardwareRequest", + String.format("Invalid Geofence type: %d", geofenceType)); + return null; + } + + GeofenceHardwareRequest request = GeofenceHardwareRequest.createCircularGeofence( + parcel.readDouble(), + parcel.readDouble(), + parcel.readDouble()); + request.setLastTransition(parcel.readInt()); + request.setMonitorTransitions(parcel.readInt()); + request.setUnknownTimer(parcel.readInt()); + request.setNotificationResponsiveness(parcel.readInt()); + + int id = parcel.readInt(); + return new GeofenceHardwareRequestParcelable(id, request); + } + + @Override + public GeofenceHardwareRequestParcelable[] newArray(int size) { + return new GeofenceHardwareRequestParcelable[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(getType()); + parcel.writeDouble(getLatitude()); + parcel.writeDouble(getLongitude()); + parcel.writeDouble(getRadius()); + parcel.writeInt(getLastTransition()); + parcel.writeInt(getMonitorTransitions()); + parcel.writeInt(getUnknownTimer()); + parcel.writeInt(getNotificationResponsiveness()); + parcel.writeInt(getId()); + } +} diff --git a/core/java/android/hardware/location/GeofenceHardwareService.java b/core/java/android/hardware/location/GeofenceHardwareService.java index 3bc70ee..fb238bd 100644 --- a/core/java/android/hardware/location/GeofenceHardwareService.java +++ b/core/java/android/hardware/location/GeofenceHardwareService.java @@ -20,6 +20,7 @@ import android.Manifest; import android.app.Service; import android.content.Context; import android.content.Intent; +import android.location.IFusedGeofenceHardware; import android.location.IGpsGeofenceHardware; import android.os.Binder; import android.os.IBinder; @@ -68,6 +69,10 @@ public class GeofenceHardwareService extends Service { mGeofenceHardwareImpl.setGpsHardwareGeofence(service); } + public void setFusedGeofenceHardware(IFusedGeofenceHardware service) { + mGeofenceHardwareImpl.setFusedGeofenceHardware(service); + } + public int[] getMonitoringTypes() { mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, "Location Hardware permission not granted to access hardware geofence"); diff --git a/core/java/android/hardware/location/IGeofenceHardware.aidl b/core/java/android/hardware/location/IGeofenceHardware.aidl index 6900070..8900166 100644 --- a/core/java/android/hardware/location/IGeofenceHardware.aidl +++ b/core/java/android/hardware/location/IGeofenceHardware.aidl @@ -16,6 +16,7 @@ package android.hardware.location; +import android.location.IFusedGeofenceHardware; import android.location.IGpsGeofenceHardware; import android.hardware.location.IGeofenceHardwareCallback; import android.hardware.location.IGeofenceHardwareMonitorCallback; @@ -23,6 +24,7 @@ import android.hardware.location.IGeofenceHardwareMonitorCallback; /** @hide */ interface IGeofenceHardware { void setGpsGeofenceHardware(in IGpsGeofenceHardware service); + void setFusedGeofenceHardware(in IFusedGeofenceHardware service); int[] getMonitoringTypes(); int getStatusOfMonitoringType(int monitoringType); boolean addCircularFence(int id, int monitoringType, double lat, double longitude, diff --git a/core/java/android/net/PacProxySelector.java b/core/java/android/net/PacProxySelector.java index d3ce2e5..b674324 100644 --- a/core/java/android/net/PacProxySelector.java +++ b/core/java/android/net/PacProxySelector.java @@ -1,3 +1,18 @@ +/* + * 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; @@ -25,19 +40,25 @@ public class PacProxySelector extends ProxySelector { private static final String TAG = "PacProxySelector"; public static final String PROXY_SERVICE = "com.android.net.IProxyService"; private IProxyService mProxyService; + private final List<Proxy> mDefaultList; public PacProxySelector() { mProxyService = IProxyService.Stub.asInterface( ServiceManager.getService(PROXY_SERVICE)); if (mProxyService == null) { // Added because of b10267814 where mako is restarting. - Log.e(TAG, "PackManager: no proxy service"); + Log.e(TAG, "PacManager: no proxy service"); } + mDefaultList = Lists.newArrayList(java.net.Proxy.NO_PROXY); } @Override public List<Proxy> select(URI uri) { if (mProxyService == null) { + mProxyService = IProxyService.Stub.asInterface( + ServiceManager.getService(PROXY_SERVICE)); + } + if (mProxyService == null) { Log.e(TAG, "select: no proxy service return NO_PROXY"); return Lists.newArrayList(java.net.Proxy.NO_PROXY); } @@ -53,6 +74,9 @@ public class PacProxySelector extends ProxySelector { } catch (RemoteException e) { e.printStackTrace(); } + if (response == null) { + return mDefaultList; + } return parseResponse(response); } diff --git a/core/java/android/net/Proxy.java b/core/java/android/net/Proxy.java index 5b38f57..c3e1438 100644 --- a/core/java/android/net/Proxy.java +++ b/core/java/android/net/Proxy.java @@ -48,7 +48,6 @@ public final class Proxy { private static final String TAG = "Proxy"; private static final ProxySelector sDefaultProxySelector; - private static PacProxySelector sPacProxySelector; /** * Used to notify an app that's caching the default connection proxy @@ -352,11 +351,8 @@ public final class Proxy { System.clearProperty("http.nonProxyHosts"); System.clearProperty("https.nonProxyHosts"); } - if ((pacFileUrl != null) && !TextUtils.isEmpty(pacFileUrl)) { - if (sPacProxySelector == null) { - sPacProxySelector = new PacProxySelector(); - } - ProxySelector.setDefault(sPacProxySelector); + if (!TextUtils.isEmpty(pacFileUrl)) { + ProxySelector.setDefault(new PacProxySelector()); } else { ProxySelector.setDefault(sDefaultProxySelector); } diff --git a/core/java/android/nfc/cardemulation/HostApduService.java b/core/java/android/nfc/cardemulation/HostApduService.java index 6d091c1..cdc4adb 100644 --- a/core/java/android/nfc/cardemulation/HostApduService.java +++ b/core/java/android/nfc/cardemulation/HostApduService.java @@ -4,11 +4,13 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.app.Service; import android.content.Intent; +import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; +import android.os.Parcel; import android.os.RemoteException; import android.util.Log; @@ -98,6 +100,12 @@ public abstract class HostApduService extends Service { public static final int MSG_DEACTIVATED = 2; /** + * + * @hide + */ + public static final int MSG_UNHANDLED = 3; + + /** * @hide */ public static final String KEY_DATA = "data"; @@ -105,6 +113,8 @@ public abstract class HostApduService extends Service { /** * Messenger interface to NfcService for sending responses. * Only accessed on main thread by the message handler. + * + * @hide */ Messenger mNfcService = null; @@ -133,6 +143,7 @@ public abstract class HostApduService extends Service { Bundle responseBundle = new Bundle(); responseBundle.putByteArray(KEY_DATA, responseApdu); responseMsg.setData(responseBundle); + responseMsg.replyTo = mMessenger; try { mNfcService.send(responseMsg); } catch (RemoteException e) { @@ -150,6 +161,7 @@ public abstract class HostApduService extends Service { return; } try { + msg.replyTo = mMessenger; mNfcService.send(msg); } catch (RemoteException e) { Log.e(TAG, "RemoteException calling into NfcService."); @@ -160,6 +172,18 @@ public abstract class HostApduService extends Service { mNfcService = null; onDeactivated(msg.arg1); break; + case MSG_UNHANDLED: + if (mNfcService == null) { + Log.e(TAG, "notifyUnhandled not sent; service was deactivated."); + return; + } + try { + msg.replyTo = mMessenger; + mNfcService.send(msg); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException calling into NfcService."); + } + break; default: super.handleMessage(msg); } @@ -190,6 +214,64 @@ public abstract class HostApduService extends Service { } /** + * Calling this method allows the service to tell the OS + * that it won't be able to complete this transaction - + * for example, because it requires data connectivity + * that is not present at that moment. + * + * The OS may use this indication to give the user a list + * of alternative applications that can handle the last + * AID that was selected. If the user would select an + * application from the list, that action by itself + * will not cause the default to be changed; the selected + * application will be invoked for the next tap only. + * + * If there are no other applications that can handle + * this transaction, the OS will show an error dialog + * indicating your service could not complete the + * transaction. + * + * <p>Note: this method may be called anywhere between + * the first {@link #processCommandApdu(byte[], int)} + * call and a {@link #onDeactivated(int)} call. + */ + public final void notifyUnhandled() { + Message unhandledMsg = Message.obtain(null, MSG_UNHANDLED); + try { + mMessenger.send(unhandledMsg); + } catch (RemoteException e) { + Log.e("TAG", "Local messenger has died."); + } + } + + + /** + * <p>This method will be called when a command APDU has been received + * from a remote device. A response APDU can be provided directly + * by returning a byte-array in this method. Note that in general + * response APDUs must be sent as quickly as possible, given the fact + * that the user is likely holding his device over an NFC reader + * when this method is called. + * + * <p class="note">If there are multiple services that have registered for the same + * AIDs in their meta-data entry, you will only get called if the user has + * explicitly selected your service, either as a default or just for the next tap. + * + * <p class="note">This method is running on the main thread of your application. + * If you cannot return a response APDU immediately, return null + * and use the {@link #sendResponseApdu(byte[])} method later. + * + * @param commandApdu The APDU that received from the remote device + * @param extras A bundle containing extra data. May be null. + * @return a byte-array containing the response APDU, or null if no + * response APDU can be sent at this point. + */ + public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) { + // TODO make this abstract + return processCommandApdu(commandApdu, 0); + } + + /** * <p>This method will be called when a command APDU has been received * from a remote device. A response APDU can be provided directly * by returning a byte-array in this method. Note that in general @@ -205,6 +287,7 @@ public abstract class HostApduService extends Service { * If you cannot return a response APDU immediately, return null * and use the {@link #sendResponseApdu(byte[])} method later. * + * @deprecated use {@link #processCommandApdu(byte[], Bundle)} * @param commandApdu * @param flags * @return a byte-array containing the response APDU, or null if no diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 12f7915..46b0150 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -1520,6 +1520,11 @@ public final class Parcel { return fd != null ? new ParcelFileDescriptor(fd) : null; } + /** {@hide} */ + public final FileDescriptor readRawFileDescriptor() { + return nativeReadFileDescriptor(mNativePtr); + } + /*package*/ static native FileDescriptor openFileDescriptor(String file, int mode) throws FileNotFoundException; /*package*/ static native FileDescriptor dupFileDescriptor(FileDescriptor orig) diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 3de362c..579971d 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -16,8 +16,25 @@ package android.os; +import static libcore.io.OsConstants.AF_UNIX; +import static libcore.io.OsConstants.SEEK_SET; +import static libcore.io.OsConstants.SOCK_STREAM; +import static libcore.io.OsConstants.S_ISLNK; +import static libcore.io.OsConstants.S_ISREG; + +import android.content.BroadcastReceiver; +import android.content.ContentProvider; +import android.util.Log; + import dalvik.system.CloseGuard; +import libcore.io.ErrnoException; +import libcore.io.IoUtils; +import libcore.io.Libcore; +import libcore.io.Memory; +import libcore.io.OsConstants; +import libcore.io.StructStat; + import java.io.Closeable; import java.io.File; import java.io.FileDescriptor; @@ -27,36 +44,80 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.DatagramSocket; import java.net.Socket; +import java.nio.ByteOrder; /** * The FileDescriptor returned by {@link Parcel#readFileDescriptor}, allowing * you to close it when done with it. */ public class ParcelFileDescriptor implements Parcelable, Closeable { - private final FileDescriptor mFileDescriptor; + private static final String TAG = "ParcelFileDescriptor"; + + private final FileDescriptor mFd; + + /** + * Optional socket used to communicate close events, status at close, and + * detect remote process crashes. + */ + private FileDescriptor mCommFd; /** * Wrapped {@link ParcelFileDescriptor}, if any. Used to avoid - * double-closing {@link #mFileDescriptor}. + * double-closing {@link #mFd}. */ private final ParcelFileDescriptor mWrapped; + /** + * Maximum {@link #mStatusBuf} size; longer status messages will be + * truncated. + */ + private static final int MAX_STATUS = 1024; + + /** + * Temporary buffer used by {@link #readCommStatus(FileDescriptor, byte[])}, + * allocated on-demand. + */ + private byte[] mStatusBuf; + + /** + * Status read by {@link #checkError(boolean)}, or null if not read yet. + */ + private Status mStatus; + private volatile boolean mClosed; private final CloseGuard mGuard = CloseGuard.get(); /** - * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied - * and this file doesn't already exist, then create the file with - * permissions such that any application can read it. + * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied and + * this file doesn't already exist, then create the file with permissions + * such that any application can read it. + * + * @deprecated Creating world-readable files is very dangerous, and likely + * to cause security holes in applications. It is strongly + * discouraged; instead, applications should use more formal + * mechanism for interactions such as {@link ContentProvider}, + * {@link BroadcastReceiver}, and {@link android.app.Service}. + * There are no guarantees that this access mode will remain on + * a file, such as when it goes through a backup and restore. */ + @Deprecated public static final int MODE_WORLD_READABLE = 0x00000001; /** - * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied - * and this file doesn't already exist, then create the file with - * permissions such that any application can write it. + * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied and + * this file doesn't already exist, then create the file with permissions + * such that any application can write it. + * + * @deprecated Creating world-writable files is very dangerous, and likely + * to cause security holes in applications. It is strongly + * discouraged; instead, applications should use more formal + * mechanism for interactions such as {@link ContentProvider}, + * {@link BroadcastReceiver}, and {@link android.app.Service}. + * There are no guarantees that this access mode will remain on + * a file, such as when it goes through a backup and restore. */ + @Deprecated public static final int MODE_WORLD_WRITEABLE = 0x00000002; /** @@ -90,32 +151,102 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static final int MODE_APPEND = 0x02000000; /** + * Create a new ParcelFileDescriptor wrapped around another descriptor. By + * default all method calls are delegated to the wrapped descriptor. + */ + public ParcelFileDescriptor(ParcelFileDescriptor wrapped) { + // We keep a strong reference to the wrapped PFD, and rely on its + // finalizer to trigger CloseGuard. All calls are delegated to wrapper. + mWrapped = wrapped; + mFd = null; + mCommFd = null; + mClosed = true; + } + + /** {@hide} */ + public ParcelFileDescriptor(FileDescriptor fd) { + this(fd, null); + } + + /** {@hide} */ + public ParcelFileDescriptor(FileDescriptor fd, FileDescriptor commChannel) { + if (fd == null) { + throw new NullPointerException("FileDescriptor must not be null"); + } + mWrapped = null; + mFd = fd; + mCommFd = commChannel; + mGuard.open("close"); + } + + /** * Create a new ParcelFileDescriptor accessing a given file. * * @param file The file to be opened. * @param mode The desired access mode, must be one of - * {@link #MODE_READ_ONLY}, {@link #MODE_WRITE_ONLY}, or - * {@link #MODE_READ_WRITE}; may also be any combination of - * {@link #MODE_CREATE}, {@link #MODE_TRUNCATE}, - * {@link #MODE_WORLD_READABLE}, and {@link #MODE_WORLD_WRITEABLE}. - * - * @return Returns a new ParcelFileDescriptor pointing to the given - * file. + * {@link #MODE_READ_ONLY}, {@link #MODE_WRITE_ONLY}, or + * {@link #MODE_READ_WRITE}; may also be any combination of + * {@link #MODE_CREATE}, {@link #MODE_TRUNCATE}, + * {@link #MODE_WORLD_READABLE}, and + * {@link #MODE_WORLD_WRITEABLE}. + * @return a new ParcelFileDescriptor pointing to the given file. + * @throws FileNotFoundException if the given file does not exist or can not + * be opened with the requested mode. + */ + public static ParcelFileDescriptor open(File file, int mode) throws FileNotFoundException { + final FileDescriptor fd = openInternal(file, mode); + if (fd == null) return null; + + return new ParcelFileDescriptor(fd); + } + + /** + * Create a new ParcelFileDescriptor accessing a given file. * - * @throws FileNotFoundException Throws FileNotFoundException if the given - * file does not exist or can not be opened with the requested mode. + * @param file The file to be opened. + * @param mode The desired access mode, must be one of + * {@link #MODE_READ_ONLY}, {@link #MODE_WRITE_ONLY}, or + * {@link #MODE_READ_WRITE}; may also be any combination of + * {@link #MODE_CREATE}, {@link #MODE_TRUNCATE}, + * {@link #MODE_WORLD_READABLE}, and + * {@link #MODE_WORLD_WRITEABLE}. + * @param handler to call listener from; must not be null. + * @param listener to be invoked when the returned descriptor has been + * closed; must not be null. + * @return a new ParcelFileDescriptor pointing to the given file. + * @throws FileNotFoundException if the given file does not exist or can not + * be opened with the requested mode. */ - public static ParcelFileDescriptor open(File file, int mode) - throws FileNotFoundException { - String path = file.getPath(); + public static ParcelFileDescriptor open( + File file, int mode, Handler handler, OnCloseListener listener) throws IOException { + if (handler == null) { + throw new IllegalArgumentException("Handler must not be null"); + } + if (listener == null) { + throw new IllegalArgumentException("Listener must not be null"); + } + + final FileDescriptor fd = openInternal(file, mode); + if (fd == null) return null; + + final FileDescriptor[] comm = createCommSocketPair(true); + final ParcelFileDescriptor pfd = new ParcelFileDescriptor(fd, comm[0]); + + // Kick off thread to watch for status updates + final ListenerBridge bridge = new ListenerBridge(comm[1], handler.getLooper(), listener); + bridge.start(); + + return pfd; + } - if ((mode&MODE_READ_WRITE) == 0) { + private static FileDescriptor openInternal(File file, int mode) throws FileNotFoundException { + if ((mode & MODE_READ_WRITE) == 0) { throw new IllegalArgumentException( "Must specify MODE_READ_ONLY, MODE_WRITE_ONLY, or MODE_READ_WRITE"); } - FileDescriptor fd = Parcel.openFileDescriptor(path, mode); - return fd != null ? new ParcelFileDescriptor(fd) : null; + final String path = file.getPath(); + return Parcel.openFileDescriptor(path, mode); } /** @@ -125,8 +256,12 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * original file descriptor. */ public static ParcelFileDescriptor dup(FileDescriptor orig) throws IOException { - FileDescriptor fd = Parcel.dupFileDescriptor(orig); - return fd != null ? new ParcelFileDescriptor(fd) : null; + try { + final FileDescriptor fd = Libcore.os.dup(orig); + return new ParcelFileDescriptor(fd); + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } } /** @@ -136,7 +271,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * original file descriptor. */ public ParcelFileDescriptor dup() throws IOException { - return dup(getFileDescriptor()); + if (mWrapped != null) { + return mWrapped.dup(); + } else { + return dup(getFileDescriptor()); + } } /** @@ -150,12 +289,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * for a dup of the given fd. */ public static ParcelFileDescriptor fromFd(int fd) throws IOException { - FileDescriptor fdesc = getFileDescriptorFromFd(fd); - return new ParcelFileDescriptor(fdesc); - } + final FileDescriptor original = new FileDescriptor(); + original.setInt$(fd); - // Extracts the file descriptor from the specified socket and returns it untouched - private static native FileDescriptor getFileDescriptorFromFd(int fd) throws IOException; + try { + final FileDescriptor dup = Libcore.os.dup(original); + return new ParcelFileDescriptor(dup); + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } /** * Take ownership of a raw native fd in to a new ParcelFileDescriptor. @@ -168,13 +311,12 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * for the given fd. */ public static ParcelFileDescriptor adoptFd(int fd) { - FileDescriptor fdesc = getFileDescriptorFromFdNoDup(fd); + final FileDescriptor fdesc = new FileDescriptor(); + fdesc.setInt$(fd); + return new ParcelFileDescriptor(fdesc); } - // Extracts the file descriptor from the specified socket and returns it untouched - private static native FileDescriptor getFileDescriptorFromFdNoDup(int fd); - /** * Create a new ParcelFileDescriptor from the specified Socket. The new * ParcelFileDescriptor holds a dup of the original FileDescriptor in @@ -212,15 +354,90 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * is the write side. */ public static ParcelFileDescriptor[] createPipe() throws IOException { - FileDescriptor[] fds = new FileDescriptor[2]; - createPipeNative(fds); - ParcelFileDescriptor[] pfds = new ParcelFileDescriptor[2]; - pfds[0] = new ParcelFileDescriptor(fds[0]); - pfds[1] = new ParcelFileDescriptor(fds[1]); - return pfds; + try { + final FileDescriptor[] fds = Libcore.os.pipe(); + return new ParcelFileDescriptor[] { + new ParcelFileDescriptor(fds[0]), + new ParcelFileDescriptor(fds[1]) }; + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } + + /** + * Create two ParcelFileDescriptors structured as a data pipe. The first + * ParcelFileDescriptor in the returned array is the read side; the second + * is the write side. + * <p> + * The write end has the ability to deliver an error message through + * {@link #closeWithError(String)} which can be handled by the read end + * calling {@link #checkError(boolean)}, usually after detecting an EOF. + * This can also be used to detect remote crashes. + */ + public static ParcelFileDescriptor[] createReliablePipe() throws IOException { + try { + final FileDescriptor[] comm = createCommSocketPair(false); + final FileDescriptor[] fds = Libcore.os.pipe(); + return new ParcelFileDescriptor[] { + new ParcelFileDescriptor(fds[0], comm[0]), + new ParcelFileDescriptor(fds[1], comm[1]) }; + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } } - private static native void createPipeNative(FileDescriptor[] outFds) throws IOException; + /** + * Create two ParcelFileDescriptors structured as a pair of sockets + * connected to each other. The two sockets are indistinguishable. + */ + public static ParcelFileDescriptor[] createSocketPair() throws IOException { + try { + final FileDescriptor fd0 = new FileDescriptor(); + final FileDescriptor fd1 = new FileDescriptor(); + Libcore.os.socketpair(AF_UNIX, SOCK_STREAM, 0, fd0, fd1); + return new ParcelFileDescriptor[] { + new ParcelFileDescriptor(fd0), + new ParcelFileDescriptor(fd1) }; + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } + + /** + * Create two ParcelFileDescriptors structured as a pair of sockets + * connected to each other. The two sockets are indistinguishable. + * <p> + * Both ends have the ability to deliver an error message through + * {@link #closeWithError(String)} which can be detected by the other end + * calling {@link #checkError(boolean)}, usually after detecting an EOF. + * This can also be used to detect remote crashes. + */ + public static ParcelFileDescriptor[] createReliableSocketPair() throws IOException { + try { + final FileDescriptor[] comm = createCommSocketPair(false); + final FileDescriptor fd0 = new FileDescriptor(); + final FileDescriptor fd1 = new FileDescriptor(); + Libcore.os.socketpair(AF_UNIX, SOCK_STREAM, 0, fd0, fd1); + return new ParcelFileDescriptor[] { + new ParcelFileDescriptor(fd0, comm[0]), + new ParcelFileDescriptor(fd1, comm[1]) }; + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } + + private static FileDescriptor[] createCommSocketPair(boolean blocking) throws IOException { + try { + final FileDescriptor comm1 = new FileDescriptor(); + final FileDescriptor comm2 = new FileDescriptor(); + Libcore.os.socketpair(AF_UNIX, SOCK_STREAM, 0, comm1, comm2); + IoUtils.setBlocking(comm1, blocking); + IoUtils.setBlocking(comm2, blocking); + return new FileDescriptor[] { comm1, comm2 }; + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } /** * @hide Please use createPipe() or ContentProvider.openPipeHelper(). @@ -250,21 +467,51 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * @return Returns the FileDescriptor associated with this object. */ public FileDescriptor getFileDescriptor() { - return mFileDescriptor; + if (mWrapped != null) { + return mWrapped.getFileDescriptor(); + } else { + return mFd; + } } /** - * Return the total size of the file representing this fd, as determined - * by stat(). Returns -1 if the fd is not a file. + * Return the total size of the file representing this fd, as determined by + * {@code stat()}. Returns -1 if the fd is not a file. */ - public native long getStatSize(); + public long getStatSize() { + if (mWrapped != null) { + return mWrapped.getStatSize(); + } else { + try { + final StructStat st = Libcore.os.fstat(mFd); + if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { + return st.st_size; + } else { + return -1; + } + } catch (ErrnoException e) { + Log.w(TAG, "fstat() failed: " + e); + return -1; + } + } + } /** * This is needed for implementing AssetFileDescriptor.AutoCloseOutputStream, * and I really don't think we want it to be public. * @hide */ - public native long seekTo(long pos); + public long seekTo(long pos) throws IOException { + if (mWrapped != null) { + return mWrapped.seekTo(pos); + } else { + try { + return Libcore.os.lseek(mFd, pos, SEEK_SET); + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } + } /** * Return the native fd int for this ParcelFileDescriptor. The @@ -272,34 +519,39 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * through this API. */ public int getFd() { - if (mClosed) { - throw new IllegalStateException("Already closed"); + if (mWrapped != null) { + return mWrapped.getFd(); + } else { + if (mClosed) { + throw new IllegalStateException("Already closed"); + } + return mFd.getInt$(); } - return getFdNative(); } - private native int getFdNative(); - /** - * Return the native fd int for this ParcelFileDescriptor and detach it - * from the object here. You are now responsible for closing the fd in - * native code. + * Return the native fd int for this ParcelFileDescriptor and detach it from + * the object here. You are now responsible for closing the fd in native + * code. + * <p> + * You should not detach when the original creator of the descriptor is + * expecting a reliable signal through {@link #close()} or + * {@link #closeWithError(String)}. + * + * @see #canDetectErrors() */ public int detachFd() { - if (mClosed) { - throw new IllegalStateException("Already closed"); - } if (mWrapped != null) { - int fd = mWrapped.detachFd(); - mClosed = true; - mGuard.close(); + return mWrapped.detachFd(); + } else { + if (mClosed) { + throw new IllegalStateException("Already closed"); + } + final int fd = getFd(); + Parcel.clearFileDescriptor(mFd); + writeCommStatusAndClose(Status.DETACHED, null); return fd; } - int fd = getFd(); - mClosed = true; - mGuard.close(); - Parcel.clearFileDescriptor(mFileDescriptor); - return fd; } /** @@ -311,16 +563,176 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { */ @Override public void close() throws IOException { - if (mClosed) return; - mClosed = true; - mGuard.close(); - if (mWrapped != null) { - // If this is a proxy to another file descriptor, just call through to its - // close method. mWrapped.close(); } else { - Parcel.closeFileDescriptor(mFileDescriptor); + closeWithStatus(Status.OK, null); + } + } + + /** + * Close the ParcelFileDescriptor, informing any peer that an error occurred + * while processing. If the creator of this descriptor is not observing + * errors, it will close normally. + * + * @param msg describing the error; must not be null. + */ + public void closeWithError(String msg) throws IOException { + if (mWrapped != null) { + mWrapped.closeWithError(msg); + } else { + if (msg == null) { + throw new IllegalArgumentException("Message must not be null"); + } + closeWithStatus(Status.ERROR, msg); + } + } + + private void closeWithStatus(int status, String msg) throws IOException { + if (mWrapped != null) { + mWrapped.closeWithStatus(status, msg); + } else { + if (mClosed) return; + mClosed = true; + mGuard.close(); + // Status MUST be sent before closing actual descriptor + writeCommStatusAndClose(status, msg); + IoUtils.closeQuietly(mFd); + } + } + + private byte[] getOrCreateStatusBuffer() { + if (mStatusBuf == null) { + mStatusBuf = new byte[MAX_STATUS]; + } + return mStatusBuf; + } + + private void writeCommStatusAndClose(int status, String msg) { + if (mCommFd == null) { + // Not reliable, or someone already sent status + if (msg != null) { + Log.w(TAG, "Unable to inform peer: " + msg); + } + return; + } + + if (status == Status.DETACHED) { + Log.w(TAG, "Peer expected signal when closed; unable to deliver after detach"); + } + + try { + try { + if (status != Status.SILENCE) { + final byte[] buf = getOrCreateStatusBuffer(); + int writePtr = 0; + + Memory.pokeInt(buf, writePtr, status, ByteOrder.BIG_ENDIAN); + writePtr += 4; + + if (msg != null) { + final byte[] rawMsg = msg.getBytes(); + final int len = Math.min(rawMsg.length, buf.length - writePtr); + System.arraycopy(rawMsg, 0, buf, writePtr, len); + writePtr += len; + } + + Libcore.os.write(mCommFd, buf, 0, writePtr); + } + } catch (ErrnoException e) { + // Reporting status is best-effort + Log.w(TAG, "Failed to report status: " + e); + } + + if (status != Status.SILENCE) { + // Since we're about to close, read off any remote status. It's + // okay to remember missing here. + mStatus = readCommStatus(mCommFd, getOrCreateStatusBuffer()); + } + + } finally { + IoUtils.closeQuietly(mCommFd); + mCommFd = null; + } + } + + private static Status readCommStatus(FileDescriptor comm, byte[] buf) { + try { + final int n = Libcore.os.read(comm, buf, 0, buf.length); + if (n == 0) { + // EOF means they're dead + return new Status(Status.DEAD); + } else { + final int status = Memory.peekInt(buf, 0, ByteOrder.BIG_ENDIAN); + if (status == Status.ERROR) { + final String msg = new String(buf, 4, n - 4); + return new Status(status, msg); + } + return new Status(status); + } + } catch (ErrnoException e) { + if (e.errno == OsConstants.EAGAIN) { + // Remote is still alive, but no status written yet + return null; + } else { + Log.d(TAG, "Failed to read status; assuming dead: " + e); + return new Status(Status.DEAD); + } + } + } + + /** + * Indicates if this ParcelFileDescriptor can communicate and detect remote + * errors/crashes. + * + * @see #checkError(boolean) + */ + public boolean canDetectErrors() { + if (mWrapped != null) { + return mWrapped.canDetectErrors(); + } else { + return mCommFd != null; + } + } + + /** + * Detect and throw if the other end of a pipe or socket pair encountered an + * error or crashed. This allows a reader to distinguish between a valid EOF + * and an error/crash. + * <p> + * If this ParcelFileDescriptor is unable to detect remote errors, it will + * return silently. + * + * @param throwIfDetached requests that an exception be thrown if the remote + * side called {@link #detachFd()}. Once detached, the remote + * side is unable to communicate any errors through + * {@link #closeWithError(String)}. An application may pass true + * if it needs a stronger guarantee that the stream was closed + * normally and was not merely detached. + * @see #canDetectErrors() + */ + public void checkError(boolean throwIfDetached) throws IOException { + if (mWrapped != null) { + mWrapped.checkError(throwIfDetached); + } else { + if (mStatus == null) { + if (mCommFd == null) { + Log.w(TAG, "Peer didn't provide a comm channel; unable to check for errors"); + return; + } + + // Try reading status; it might be null if nothing written yet. + // Either way, we keep comm open to write our status later. + mStatus = readCommStatus(mCommFd, getOrCreateStatusBuffer()); + } + + if (mStatus == null || mStatus.status == Status.OK + || (mStatus.status == Status.DETACHED && !throwIfDetached)) { + // No status yet, or everything is peachy! + return; + } else { + throw mStatus.asIOException(); + } } } @@ -330,17 +742,17 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * ParcelFileDescriptor.close()} for you when the stream is closed. */ public static class AutoCloseInputStream extends FileInputStream { - private final ParcelFileDescriptor mFd; + private final ParcelFileDescriptor mPfd; - public AutoCloseInputStream(ParcelFileDescriptor fd) { - super(fd.getFileDescriptor()); - mFd = fd; + public AutoCloseInputStream(ParcelFileDescriptor pfd) { + super(pfd.getFileDescriptor()); + mPfd = pfd; } @Override public void close() throws IOException { try { - mFd.close(); + mPfd.close(); } finally { super.close(); } @@ -353,17 +765,17 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * ParcelFileDescriptor.close()} for you when the stream is closed. */ public static class AutoCloseOutputStream extends FileOutputStream { - private final ParcelFileDescriptor mFd; + private final ParcelFileDescriptor mPfd; - public AutoCloseOutputStream(ParcelFileDescriptor fd) { - super(fd.getFileDescriptor()); - mFd = fd; + public AutoCloseOutputStream(ParcelFileDescriptor pfd) { + super(pfd.getFileDescriptor()); + mPfd = pfd; } @Override public void close() throws IOException { try { - mFd.close(); + mPfd.close(); } finally { super.close(); } @@ -372,7 +784,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override public String toString() { - return "{ParcelFileDescriptor: " + mFileDescriptor + "}"; + if (mWrapped != null) { + return mWrapped.toString(); + } else { + return "{ParcelFileDescriptor: " + mFd + "}"; + } } @Override @@ -382,32 +798,20 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } try { if (!mClosed) { - close(); + closeWithStatus(Status.LEAKED, null); } } finally { super.finalize(); } } - public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { - mWrapped = descriptor; - mFileDescriptor = mWrapped.mFileDescriptor; - mGuard.open("close"); - } - - /** {@hide} */ - public ParcelFileDescriptor(FileDescriptor descriptor) { - if (descriptor == null) { - throw new NullPointerException("descriptor must not be null"); - } - mWrapped = null; - mFileDescriptor = descriptor; - mGuard.open("close"); - } - @Override public int describeContents() { - return Parcelable.CONTENTS_FILE_DESCRIPTOR; + if (mWrapped != null) { + return mWrapped.describeContents(); + } else { + return Parcelable.CONTENTS_FILE_DESCRIPTOR; + } } /** @@ -417,12 +821,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { */ @Override public void writeToParcel(Parcel out, int flags) { - out.writeFileDescriptor(mFileDescriptor); - if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { - try { - close(); - } catch (IOException e) { - // Empty + if (mWrapped != null) { + mWrapped.writeToParcel(out, flags); + } else { + out.writeFileDescriptor(mFd); + if (mCommFd != null) { + out.writeInt(1); + out.writeFileDescriptor(mCommFd); + } else { + out.writeInt(0); + } + if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { + try { + // Not a real close, so emit no status + closeWithStatus(Status.SILENCE, null); + } catch (IOException e) { + } } } } @@ -431,7 +845,12 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { = new Parcelable.Creator<ParcelFileDescriptor>() { @Override public ParcelFileDescriptor createFromParcel(Parcel in) { - return in.readFileDescriptor(); + final FileDescriptor fd = in.readRawFileDescriptor(); + FileDescriptor commChannel = null; + if (in.readInt() != 0) { + commChannel = in.readRawFileDescriptor(); + } + return new ParcelFileDescriptor(fd, commChannel); } @Override @@ -439,4 +858,111 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { return new ParcelFileDescriptor[size]; } }; + + /** + * Callback indicating that a ParcelFileDescriptor has been closed. + */ + public interface OnCloseListener { + /** + * Event indicating the ParcelFileDescriptor to which this listener was + * attached has been closed. + * + * @param e error state, or {@code null} if closed cleanly. + * @param fromDetach indicates if close event was result of + * {@link ParcelFileDescriptor#detachFd()}. After detach the + * remote side may continue reading/writing to the underlying + * {@link FileDescriptor}, but they can no longer deliver + * reliable close/error events. + */ + public void onClose(IOException e, boolean fromDetach); + } + + /** + * Internal class representing a remote status read by + * {@link ParcelFileDescriptor#readCommStatus(FileDescriptor, byte[])}. + */ + private static class Status { + /** Special value indicating remote side died. */ + public static final int DEAD = -2; + /** Special value indicating no status should be written. */ + public static final int SILENCE = -1; + + /** Remote reported that everything went better than expected. */ + public static final int OK = 0; + /** Remote reported error; length and message follow. */ + public static final int ERROR = 1; + /** Remote reported {@link #detachFd()} and went rogue. */ + public static final int DETACHED = 2; + /** Remote reported their object was finalized. */ + public static final int LEAKED = 3; + + public final int status; + public final String msg; + + public Status(int status) { + this(status, null); + } + + public Status(int status, String msg) { + this.status = status; + this.msg = msg; + } + + public IOException asIOException() { + switch (status) { + case DEAD: + return new IOException("Remote side is dead"); + case OK: + return null; + case ERROR: + return new IOException("Remote error: " + msg); + case DETACHED: + return new IOException("Remote side is detached"); + case LEAKED: + return new IOException("Remote side was leaked"); + default: + return new IOException("Unknown status: " + status); + } + } + } + + /** + * Bridge to watch for remote status, and deliver to listener. Currently + * requires that communication socket is <em>blocking</em>. + */ + private static final class ListenerBridge extends Thread { + // TODO: switch to using Looper to avoid burning a thread + + private FileDescriptor mCommFd; + private final Handler mHandler; + + public ListenerBridge(FileDescriptor comm, Looper looper, final OnCloseListener listener) { + mCommFd = comm; + mHandler = new Handler(looper) { + @Override + public void handleMessage(Message msg) { + final Status s = (Status) msg.obj; + if (s.status == Status.DETACHED) { + listener.onClose(null, true); + } else if (s.status == Status.OK) { + listener.onClose(null, false); + } else { + listener.onClose(s.asIOException(), false); + } + } + }; + } + + @Override + public void run() { + try { + final byte[] buf = new byte[MAX_STATUS]; + final Status status = readCommStatus(mCommFd, buf); + mHandler.obtainMessage(0, status).sendToTarget(); + } finally { + IoUtils.closeQuietly(mCommFd); + mCommFd = null; + } + } + } } diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java index 6c02965..08e3d7b 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -77,7 +77,7 @@ import java.util.Set; * @attr ref android.R.styleable#Preference_defaultValue * @attr ref android.R.styleable#Preference_shouldDisableView */ -public class Preference implements Comparable<Preference>, OnDependencyChangeListener { +public class Preference implements Comparable<Preference> { /** * Specify for {@link #setOrder(int)} if a specific order is not required. */ @@ -115,6 +115,7 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis private String mDependencyKey; private Object mDefaultValue; private boolean mDependencyMet = true; + private boolean mParentDependencyMet = true; /** * @see #setShouldDisableView(boolean) @@ -733,7 +734,7 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis * @return True if this Preference is enabled, false otherwise. */ public boolean isEnabled() { - return mEnabled && mDependencyMet; + return mEnabled && mDependencyMet && mParentDependencyMet; } /** @@ -1259,7 +1260,24 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis notifyChanged(); } } - + + /** + * Called when the implicit parent dependency changes. + * + * @param parent The Preference that this Preference depends on. + * @param disableChild Set true to disable this Preference. + */ + public void onParentChanged(Preference parent, boolean disableChild) { + if (mParentDependencyMet == disableChild) { + mParentDependencyMet = !disableChild; + + // Enabled state can change dependent preferences' states, so notify + notifyDependencyChange(shouldDisableDependents()); + + notifyChanged(); + } + } + /** * Checks whether this preference's dependents should currently be * disabled. diff --git a/core/java/android/preference/PreferenceCategory.java b/core/java/android/preference/PreferenceCategory.java index d8af324..229a96a 100644 --- a/core/java/android/preference/PreferenceCategory.java +++ b/core/java/android/preference/PreferenceCategory.java @@ -62,4 +62,8 @@ public class PreferenceCategory extends PreferenceGroup { return false; } + @Override + public boolean shouldDisableDependents() { + return !super.isEnabled(); + } } diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java index f33a6be..a5e05ba 100644 --- a/core/java/android/preference/PreferenceGroup.java +++ b/core/java/android/preference/PreferenceGroup.java @@ -290,13 +290,14 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla } @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - - // Dispatch to all contained preferences + public void notifyDependencyChange(boolean disableDependents) { + super.notifyDependencyChange(disableDependents); + + // Child preferences have an implicit dependency on their containing + // group. Dispatch dependency change to all contained preferences. final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { - getPreference(i).setEnabled(enabled); + getPreference(i).onParentChanged(this, disableDependents); } } diff --git a/core/java/android/print/IPrintSpooler.aidl b/core/java/android/print/IPrintSpooler.aidl index 8178180..5c8a22a 100644 --- a/core/java/android/print/IPrintSpooler.aidl +++ b/core/java/android/print/IPrintSpooler.aidl @@ -18,6 +18,7 @@ package android.print; import android.content.ComponentName; import android.os.ParcelFileDescriptor; +import android.print.PrinterId; import android.print.IPrintDocumentAdapter; import android.print.IPrintClient; import android.print.IPrintSpoolerClient; @@ -40,10 +41,15 @@ oneway interface IPrintSpooler { void createPrintJob(String printJobName, in IPrintClient client, in IPrintDocumentAdapter printAdapter, in PrintAttributes attributes, IPrintSpoolerCallbacks callback, int appId, int sequence); - void setPrintJobState(int printJobId, int status, CharSequence error, + void setPrintJobState(int printJobId, int status, String error, IPrintSpoolerCallbacks callback, int sequence); void setPrintJobTag(int printJobId, String tag, IPrintSpoolerCallbacks callback, int sequence); void writePrintJobData(in ParcelFileDescriptor fd, int printJobId); void setClient(IPrintSpoolerClient client); + + // Printer discovery APIs + void onPrintersAdded(in List<PrinterInfo> printers); + void onPrintersRemoved(in List<PrinterId> printerIds); + void onPrintersUpdated(in List<PrinterInfo> printerIds); } diff --git a/core/java/android/print/IPrintSpoolerClient.aidl b/core/java/android/print/IPrintSpoolerClient.aidl index 8db2169..da60120 100644 --- a/core/java/android/print/IPrintSpoolerClient.aidl +++ b/core/java/android/print/IPrintSpoolerClient.aidl @@ -17,7 +17,6 @@ package android.print; import android.content.ComponentName; -import android.print.IPrinterDiscoverySessionObserver; import android.print.PrinterId; import android.print.PrintJobInfo; @@ -28,8 +27,14 @@ import android.print.PrintJobInfo; * @hide */ oneway interface IPrintSpoolerClient { - void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer); void onPrintJobQueued(in PrintJobInfo printJob); void onAllPrintJobsForServiceHandled(in ComponentName printService); void onAllPrintJobsHandled(); + + // Printer discovery APIs + void createPrinterDiscoverySession(); + void startPrinterDiscovery(in List<PrinterId> priorityList); + void stopPrinterDiscovery(); + void requestPrinterUpdate(in PrinterId printerId); + void destroyPrinterDiscoverySession(); } diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java index 2fb4751..602f3c1 100644 --- a/core/java/android/print/PrintJobInfo.java +++ b/core/java/android/print/PrintJobInfo.java @@ -104,7 +104,7 @@ public final class PrintJobInfo implements Parcelable { private int mId; /** The human readable print job label. */ - private CharSequence mLabel; + private String mLabel; /** The unique id of the printer. */ private PrinterId mPrinterId; @@ -128,7 +128,7 @@ public final class PrintJobInfo implements Parcelable { private int mCopies; /** Failure reason if this job failed. */ - private CharSequence mFailureReason; + private String mFailureReason; /** The pages to print */ private PageRange[] mPageRanges; @@ -163,7 +163,7 @@ public final class PrintJobInfo implements Parcelable { private PrintJobInfo(Parcel parcel) { mId = parcel.readInt(); - mLabel = parcel.readCharSequence(); + mLabel = parcel.readString(); mPrinterId = parcel.readParcelable(null); mPrinterName = parcel.readString(); mState = parcel.readInt(); @@ -171,9 +171,7 @@ public final class PrintJobInfo implements Parcelable { mUserId = parcel.readInt(); mTag = parcel.readString(); mCopies = parcel.readInt(); - if (parcel.readInt() == 1) { - mFailureReason = parcel.readCharSequence(); - } + mFailureReason = parcel.readString(); if (parcel.readInt() == 1) { Parcelable[] parcelables = parcel.readParcelableArray(null); mPageRanges = new PageRange[parcelables.length]; @@ -214,7 +212,7 @@ public final class PrintJobInfo implements Parcelable { * * @return The label. */ - public CharSequence getLabel() { + public String getLabel() { return mLabel; } @@ -225,7 +223,7 @@ public final class PrintJobInfo implements Parcelable { * * @hide */ - public void setLabel(CharSequence label) { + public void setLabel(String label) { mLabel = label; } @@ -385,7 +383,7 @@ public final class PrintJobInfo implements Parcelable { * * @hide */ - public CharSequence getFailureReason() { + public String getFailureReason() { return mFailureReason; } @@ -396,7 +394,7 @@ public final class PrintJobInfo implements Parcelable { * * @hide */ - public void setFailureReason(CharSequence failureReason) { + public void setFailureReason(String failureReason) { mFailureReason = failureReason; } @@ -470,7 +468,7 @@ public final class PrintJobInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(mId); - parcel.writeCharSequence(mLabel); + parcel.writeString(mLabel); parcel.writeParcelable(mPrinterId, flags); parcel.writeString(mPrinterName); parcel.writeInt(mState); @@ -478,12 +476,7 @@ public final class PrintJobInfo implements Parcelable { parcel.writeInt(mUserId); parcel.writeString(mTag); parcel.writeInt(mCopies); - if (mFailureReason != null) { - parcel.writeInt(1); - parcel.writeCharSequence(mFailureReason); - } else { - parcel.writeInt(0); - } + parcel.writeString(mFailureReason); if (mPageRanges != null) { parcel.writeInt(1); parcel.writeParcelableArray(mPageRanges, flags); diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java index 636b9d4..531dcb2 100644 --- a/core/java/android/print/PrintManager.java +++ b/core/java/android/print/PrintManager.java @@ -374,14 +374,14 @@ public final class PrintManager { @Override public void onLayoutFinished(PrintDocumentInfo info, boolean changed) { + if (info == null) { + throw new NullPointerException("document info cannot be null"); + } final ILayoutResultCallback callback; synchronized (mLock) { callback = mCallback; clearLocked(); } - if (info == null) { - throw new IllegalArgumentException("info cannot be null"); - } if (callback != null) { try { callback.onLayoutFinished(info, changed, mSequence); diff --git a/core/java/android/print/PrinterInfo.java b/core/java/android/print/PrinterInfo.java index ac782a8..6f567a6 100644 --- a/core/java/android/print/PrinterInfo.java +++ b/core/java/android/print/PrinterInfo.java @@ -229,10 +229,11 @@ public final class PrinterInfo implements Parcelable { /** * Constructor. * - * @param prototype Prototype from which to start building. + * @param other Other info from which to start building. */ - public Builder(PrinterInfo prototype) { - mPrototype = prototype; + public Builder(PrinterInfo other) { + mPrototype = new PrinterInfo(); + mPrototype.copyFrom(other); } /** diff --git a/core/java/android/print/pdf/PdfDocument.java b/core/java/android/print/pdf/PdfDocument.java index cfeb975..dbd7dd1 100644 --- a/core/java/android/print/pdf/PdfDocument.java +++ b/core/java/android/print/pdf/PdfDocument.java @@ -324,7 +324,7 @@ public final class PdfDocument { /** * Creates a new builder with the mandatory page info attributes. * - * @param pageSize The page size in pixels. + * @param pageSize The page size in points, <strong>not</strong> dips. * @param pageNumber The page number. * @param density The page density in DPI. */ diff --git a/core/java/android/printservice/IPrintService.aidl b/core/java/android/printservice/IPrintService.aidl index 16b7a26..2cee1d8 100644 --- a/core/java/android/printservice/IPrintService.aidl +++ b/core/java/android/printservice/IPrintService.aidl @@ -16,7 +16,7 @@ package android.printservice; -import android.print.IPrinterDiscoverySessionObserver; +import android.print.PrinterId; import android.print.PrintJobInfo; import android.printservice.IPrintServiceClient; @@ -29,5 +29,10 @@ oneway interface IPrintService { void setClient(IPrintServiceClient client); void requestCancelPrintJob(in PrintJobInfo printJobInfo); void onPrintJobQueued(in PrintJobInfo printJobInfo); - void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer); + + void createPrinterDiscoverySession(); + void startPrinterDiscovery(in List<PrinterId> priorityList); + void stopPrinterDiscovery(); + void requestPrinterUpdate(in PrinterId printerId); + void destroyPrinterDiscoverySession(); } diff --git a/core/java/android/printservice/IPrintServiceClient.aidl b/core/java/android/printservice/IPrintServiceClient.aidl index f00b37c4..1e33fc0 100644 --- a/core/java/android/printservice/IPrintServiceClient.aidl +++ b/core/java/android/printservice/IPrintServiceClient.aidl @@ -29,7 +29,11 @@ import android.print.PrinterInfo; interface IPrintServiceClient { List<PrintJobInfo> getPrintJobInfos(); PrintJobInfo getPrintJobInfo(int printJobId); - boolean setPrintJobState(int printJobId, int state, CharSequence error); + boolean setPrintJobState(int printJobId, int state, String error); boolean setPrintJobTag(int printJobId, String tag); oneway void writePrintJobData(in ParcelFileDescriptor fd, int printJobId); + + void onPrintersAdded(in List<PrinterInfo> printers); + void onPrintersRemoved(in List<PrinterId> printerIds); + void onPrintersUpdated(in List<PrinterInfo> printers); } diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java index 5f9a730..d2fbef2 100644 --- a/core/java/android/printservice/PrintJob.java +++ b/core/java/android/printservice/PrintJob.java @@ -24,6 +24,10 @@ import android.util.Log; * This class represents a print job from the perspective of a print * service. It provides APIs for observing the print job state and * performing operations on the print job. + * <p> + * <strong>Note: </strong> All methods of this class must be executed on the main + * application thread. + * </p> */ public final class PrintJob { @@ -48,6 +52,7 @@ public final class PrintJob { * @return The id. */ public int getId() { + PrintService.throwIfNotCalledOnMainThread(); return mCachedInfo.getId(); } @@ -62,6 +67,7 @@ public final class PrintJob { * @return The print job info. */ public PrintJobInfo getInfo() { + PrintService.throwIfNotCalledOnMainThread(); if (isInImmutableState()) { return mCachedInfo; } @@ -83,6 +89,7 @@ public final class PrintJob { * @return The document. */ public PrintDocument getDocument() { + PrintService.throwIfNotCalledOnMainThread(); return mDocument; } @@ -96,6 +103,7 @@ public final class PrintJob { * @see #cancel() */ public boolean isQueued() { + PrintService.throwIfNotCalledOnMainThread(); return getInfo().getState() == PrintJobInfo.STATE_QUEUED; } @@ -110,6 +118,7 @@ public final class PrintJob { * @see #fail(CharSequence) */ public boolean isStarted() { + PrintService.throwIfNotCalledOnMainThread(); return getInfo().getState() == PrintJobInfo.STATE_STARTED; } @@ -122,6 +131,7 @@ public final class PrintJob { * @see #complete() */ public boolean isCompleted() { + PrintService.throwIfNotCalledOnMainThread(); return getInfo().getState() == PrintJobInfo.STATE_COMPLETED; } @@ -134,6 +144,7 @@ public final class PrintJob { * @see #fail(CharSequence) */ public boolean isFailed() { + PrintService.throwIfNotCalledOnMainThread(); return getInfo().getState() == PrintJobInfo.STATE_FAILED; } @@ -146,6 +157,7 @@ public final class PrintJob { * @see #cancel() */ public boolean isCancelled() { + PrintService.throwIfNotCalledOnMainThread(); return getInfo().getState() == PrintJobInfo.STATE_FAILED; } @@ -158,6 +170,7 @@ public final class PrintJob { * @see #isQueued() */ public boolean start() { + PrintService.throwIfNotCalledOnMainThread(); if (isQueued()) { return setState(PrintJobInfo.STATE_STARTED, null); } @@ -173,6 +186,7 @@ public final class PrintJob { * @see #isStarted() */ public boolean complete() { + PrintService.throwIfNotCalledOnMainThread(); if (isStarted()) { return setState(PrintJobInfo.STATE_COMPLETED, null); } @@ -191,7 +205,8 @@ public final class PrintJob { * @see #isQueued() * @see #isStarted() */ - public boolean fail(CharSequence error) { + public boolean fail(String error) { + PrintService.throwIfNotCalledOnMainThread(); if (isQueued() || isStarted()) { return setState(PrintJobInfo.STATE_FAILED, error); } @@ -210,6 +225,7 @@ public final class PrintJob { * @see #isQueued() */ public boolean cancel() { + PrintService.throwIfNotCalledOnMainThread(); if (isQueued() || isStarted()) { return setState(PrintJobInfo.STATE_CANCELED, null); } @@ -226,6 +242,7 @@ public final class PrintJob { * @return True if the tag was set, false otherwise. */ public boolean setTag(String tag) { + PrintService.throwIfNotCalledOnMainThread(); if (isInImmutableState()) { return false; } @@ -263,7 +280,7 @@ public final class PrintJob { || state == PrintJobInfo.STATE_CANCELED; } - private boolean setState(int state, CharSequence error) { + private boolean setState(int state, String error) { try { if (mPrintServiceClient.setPrintJobState(mCachedInfo.getId(), state, error)) { // Best effort - update the state of the cached info since diff --git a/core/java/android/printservice/PrintService.java b/core/java/android/printservice/PrintService.java index 92bccd4..f6c0a9a 100644 --- a/core/java/android/printservice/PrintService.java +++ b/core/java/android/printservice/PrintService.java @@ -25,7 +25,6 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; -import android.print.IPrinterDiscoverySessionObserver; import android.print.PrintJobInfo; import android.print.PrinterId; import android.util.Log; @@ -77,8 +76,8 @@ import java.util.List; * completion, the print job should be marked as completed by calling {@link * PrintJob#complete() PrintJob.complete()} after which {@link PrintJob#isCompleted() * PrintJob.isCompleted()} would return true. In case of a failure, the print job should - * be marked as failed by calling {@link PrintJob#fail(CharSequence) PrintJob.fail( - * CharSequence)} after which {@link PrintJob#isFailed() PrintJob.isFailed()} would + * be marked as failed by calling {@link PrintJob#fail(String) PrintJob.fail( + * String)} after which {@link PrintJob#isFailed() PrintJob.isFailed()} would * return true. * </p> * <p> @@ -146,6 +145,11 @@ import java.util.List; * {@link #SERVICE_META_DATA} and <code><{@link android.R.styleable#PrintService * print-service}></code>. * </p> + * <p> + * <strong>Note: </strong> All callbacks in this class are executed on the main + * application thread. You should also invoke any method of this class on the main + * application thread. + * </p> */ public abstract class PrintService extends Service { @@ -175,14 +179,14 @@ public abstract class PrintService extends Service { */ public static final String SERVICE_META_DATA = "android.printservice"; - private final Object mLock = new Object(); - private Handler mHandler; private IPrintServiceClient mClient; private int mLastSessionId = -1; + private PrinterDiscoverySession mDiscoverySession; + @Override protected final void attachBaseContext(Context base) { super.attachBaseContext(base); @@ -245,21 +249,18 @@ public abstract class PrintService extends Service { * @see PrintJob#isStarted() PrintJob.isStarted() */ public final List<PrintJob> getActivePrintJobs() { - final IPrintServiceClient client; - synchronized (mLock) { - client = mClient; - } - if (client == null) { + throwIfNotCalledOnMainThread(); + if (mClient == null) { return Collections.emptyList(); } try { List<PrintJob> printJobs = null; - List<PrintJobInfo> printJobInfos = client.getPrintJobInfos(); + List<PrintJobInfo> printJobInfos = mClient.getPrintJobInfos(); if (printJobInfos != null) { final int printJobInfoCount = printJobInfos.size(); printJobs = new ArrayList<PrintJob>(printJobInfoCount); for (int i = 0; i < printJobInfoCount; i++) { - printJobs.add(new PrintJob(printJobInfos.get(i), client)); + printJobs.add(new PrintJob(printJobInfos.get(i), mClient)); } } if (printJobs != null) { @@ -278,23 +279,50 @@ public abstract class PrintService extends Service { * @return Global printer id. */ public final PrinterId generatePrinterId(String localId) { + throwIfNotCalledOnMainThread(); return new PrinterId(new ComponentName(getPackageName(), getClass().getName()), localId); } + static void throwIfNotCalledOnMainThread() { + if (!Looper.getMainLooper().isCurrentThread()) { + throw new IllegalAccessError("must be called from the main thread"); + } + } + @Override public final IBinder onBind(Intent intent) { return new IPrintService.Stub() { @Override - public void setClient(IPrintServiceClient client) { - mHandler.obtainMessage(ServiceHandler.MSG_SET_CLEINT, client) - .sendToTarget(); + public void createPrinterDiscoverySession() { + mHandler.sendEmptyMessage(ServiceHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION); + } + + @Override + public void destroyPrinterDiscoverySession() { + mHandler.sendEmptyMessage(ServiceHandler.MSG_DESTROY_PRINTER_DISCOVERY_SESSION); + } + + public void startPrinterDiscovery(List<PrinterId> priorityList) { + mHandler.obtainMessage(ServiceHandler.MSG_START_PRINTER_DISCOVERY, + priorityList).sendToTarget(); } @Override - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { - mHandler.obtainMessage(ServiceHandler.MSG_ON_CREATE_PRINTER_DISCOVERY_SESSION, - observer).sendToTarget(); + public void stopPrinterDiscovery() { + mHandler.sendEmptyMessage(ServiceHandler.MSG_STOP_PRINTER_DISCOVERY); + } + + @Override + public void requestPrinterUpdate(PrinterId printerId) { + mHandler.obtainMessage(ServiceHandler.MSG_REQUEST_PRINTER_UPDATE, + printerId).sendToTarget(); + } + + @Override + public void setClient(IPrintServiceClient client) { + mHandler.obtainMessage(ServiceHandler.MSG_SET_CLEINT, client) + .sendToTarget(); } @Override @@ -312,33 +340,62 @@ public abstract class PrintService extends Service { } private final class ServiceHandler extends Handler { - public static final int MSG_ON_CREATE_PRINTER_DISCOVERY_SESSION = 1; - public static final int MSG_ON_PRINTJOB_QUEUED = 2; - public static final int MSG_ON_REQUEST_CANCEL_PRINTJOB = 3; - public static final int MSG_SET_CLEINT = 4; + public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1; + public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2; + public static final int MSG_START_PRINTER_DISCOVERY = 3; + public static final int MSG_STOP_PRINTER_DISCOVERY = 4; + public static final int MSG_REQUEST_PRINTER_UPDATE = 5; + public static final int MSG_ON_PRINTJOB_QUEUED = 6; + public static final int MSG_ON_REQUEST_CANCEL_PRINTJOB = 7; + public static final int MSG_SET_CLEINT = 8; public ServiceHandler(Looper looper) { super(looper, null, true); } @Override + @SuppressWarnings("unchecked") public void handleMessage(Message message) { final int action = message.what; switch (action) { - case MSG_ON_CREATE_PRINTER_DISCOVERY_SESSION: { - IPrinterDiscoverySessionObserver observer = - (IPrinterDiscoverySessionObserver) message.obj; + case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { PrinterDiscoverySession session = onCreatePrinterDiscoverySession(); if (session == null) { throw new NullPointerException("session cannot be null"); } - synchronized (mLock) { - if (session.getId() == mLastSessionId) { - throw new IllegalStateException("cannot reuse sessions"); - } - mLastSessionId = session.getId(); + if (session.getId() == mLastSessionId) { + throw new IllegalStateException("cannot reuse session instances"); + } + mDiscoverySession = session; + mLastSessionId = session.getId(); + session.setObserver(mClient); + } break; + + case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: { + if (mDiscoverySession != null) { + mDiscoverySession.destroy(); + mDiscoverySession = null; + } + } break; + + case MSG_START_PRINTER_DISCOVERY: { + if (mDiscoverySession != null) { + List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj; + mDiscoverySession.startPrinterDiscovery(priorityList); + } + } break; + + case MSG_STOP_PRINTER_DISCOVERY: { + if (mDiscoverySession != null) { + mDiscoverySession.stopPrinterDiscovery(); + } + } break; + + case MSG_REQUEST_PRINTER_UPDATE: { + if (mDiscoverySession != null) { + PrinterId printerId = (PrinterId) message.obj; + mDiscoverySession.requestPrinterUpdate(printerId); } - session.setObserver(observer); } break; case MSG_ON_REQUEST_CANCEL_PRINTJOB: { @@ -352,15 +409,12 @@ public abstract class PrintService extends Service { } break; case MSG_SET_CLEINT: { - IPrintServiceClient client = (IPrintServiceClient) message.obj; - synchronized (mLock) { - mClient = client; - } - if (client != null) { + mClient = (IPrintServiceClient) message.obj; + if (mClient != null) { onConnected(); } else { onDisconnected(); - } + } } break; default: { diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java index 92dc0dd..8b959a6 100644 --- a/core/java/android/printservice/PrinterDiscoverySession.java +++ b/core/java/android/printservice/PrinterDiscoverySession.java @@ -16,18 +16,15 @@ package android.printservice; -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.os.RemoteException; -import android.print.IPrinterDiscoverySessionController; -import android.print.IPrinterDiscoverySessionObserver; +import android.print.PrinterCapabilitiesInfo; import android.print.PrinterId; import android.print.PrinterInfo; +import android.util.ArrayMap; import android.util.Log; -import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -36,67 +33,75 @@ import java.util.List; * for adding discovered printers, removing already added printers that * disappeared, and updating already added printers. * <p> - * The opening of the session is announced by a call to {@link - * PrinterDiscoverySession#onOpen(List)} at which point you should start printer - * discovery. The closing of the session is announced by a call to {@link - * PrinterDiscoverySession#onClose()} at which point you should stop printer - * discovery. Discovered printers are added by invoking {@link - * PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared - * are removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. - * Added printers whose properties or capabilities changed are updated through - * a call to {@link PrinterDiscoverySession#updatePrinters(List)}. + * During the lifetime of this session you may be asked to start and stop + * performing printer discovery multiple times. You will receive a call to {@link + * PrinterDiscoverySession#onStartPrinterDiscovery(List)} to start printer + * discovery and a call to {@link PrinterDiscoverySession#onStopPrinterDiscovery()} + * to stop printer discovery. When the system is no longer interested in printers + * discovered by this session you will receive a call to {@link #onDestroy()} at + * which point the system will no longer call into the session and all the session + * methods will do nothing. + * </p> + * <p> + * Discovered printers are added by invoking {@link + * PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared are + * removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. Added + * printers whose properties or capabilities changed are updated through a call to + * {@link PrinterDiscoverySession#updatePrinters(List)}. The printers added in this + * session can be acquired via {@link #getPrinters()} where the returned printers + * will be an up-to-date snapshot of the printers that you reported during the + * session. Printers are <strong>not</strong> persisted across sessions. * </p> * <p> * The system will make a call to * {@link PrinterDiscoverySession#onRequestPrinterUpdate(PrinterId)} if you * need to update a given printer. It is possible that you add a printer without - * specifying its capabilities. This enables you to avoid querying all - * discovered printers for their capabilities, rather querying the capabilities - * of a printer only if necessary. For example, the system will require that you - * update a printer if it gets selected by the user. If you did not report the - * printer capabilities when adding it, you must do so after the system requests - * a printer update. Otherwise, the printer will be ignored. + * specifying its capabilities. This enables you to avoid querying all discovered + * printers for their capabilities, rather querying the capabilities of a printer + * only if necessary. For example, the system will request that you update a printer + * if it gets selected by the user. If you did not report the printer capabilities + * when adding it, you must do so after the system requests a printer update. + * Otherwise, the printer will be ignored. * </p> * <p> - * During printer discovery all printers that are known to your print service - * have to be added. The system does not retain any printers from previous - * sessions. + * <strong>Note: </strong> All callbacks in this class are executed on the main + * application thread. You also have to invoke any method of this class on the main + * application thread. * </p> */ public abstract class PrinterDiscoverySession { private static final String LOG_TAG = "PrinterDiscoverySession"; + private static final int MAX_ITEMS_PER_CALLBACK = 100; + private static int sIdCounter = 0; - private final Object mLock = new Object(); + private final int mId; - private final Handler mHandler; + private final ArrayMap<PrinterId, PrinterInfo> mPrinters = + new ArrayMap<PrinterId, PrinterInfo>(); - private final int mId; + private ArrayMap<PrinterId, PrinterInfo> mLastSentPrinters; + + private IPrintServiceClient mObserver; - private IPrinterDiscoverySessionController mController; + private boolean mIsDestroyed; - private IPrinterDiscoverySessionObserver mObserver; + private boolean mIsDiscoveryStarted; /** * Constructor. - * - * @param context A context instance. */ - public PrinterDiscoverySession(Context context) { + public PrinterDiscoverySession() { mId = sIdCounter++; - mHandler = new SessionHandler(context.getMainLooper()); - mController = new PrinterDiscoverySessionController(this); } - void setObserver(IPrinterDiscoverySessionObserver observer) { - synchronized (mLock) { - mObserver = observer; - try { - mObserver.setController(mController); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error setting session controller", re); - } + void setObserver(IPrintServiceClient observer) { + mObserver = observer; + // If some printers were added in the method that + // created the session, send them over. + if (!mPrinters.isEmpty()) { + sendAddedPrinters(mObserver, getPrinters()); } } @@ -105,131 +110,357 @@ public abstract class PrinterDiscoverySession { } /** + * Gets the printers reported in this session. For example, if you add two + * printers and remove one of them, the returned list will contain only + * the printer that was added but not removed. + * <p> + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored. + * </p> + * + * @return The printers. + * + * @see #addPrinters(List) + * @see #removePrinters(List) + * @see #updatePrinters(List) + * @see #isDestroyed() + */ + public final List<PrinterInfo> getPrinters() { + PrintService.throwIfNotCalledOnMainThread(); + if (mIsDestroyed) { + return Collections.emptyList(); + } + return new ArrayList<PrinterInfo>(mPrinters.values()); + } + + /** * Adds discovered printers. Adding an already added printer has no effect. * Removed printers can be added again. You can call this method multiple - * times during printer discovery. + * times during the life of this session. Duplicates will be ignored. * <p> - * <strong>Note: </strong> Calls to this method before the session is opened, - * i.e. before the {@link #onOpen(List)} call, and after the session is closed, - * i.e. after the call to {@link #onClose()}, will be ignored. + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored. * </p> * * @param printers The printers to add. * * @see #removePrinters(List) * @see #updatePrinters(List) + * @see #getPrinters() + * @see #isDestroyed() */ public final void addPrinters(List<PrinterInfo> printers) { - final IPrinterDiscoverySessionObserver observer; - synchronized (mLock) { - observer = mObserver; + PrintService.throwIfNotCalledOnMainThread(); + + // If the session is destroyed - nothing do to. + if (mIsDestroyed) { + Log.w(LOG_TAG, "Not adding printers - session destroyed."); + return; } - if (observer != null) { - try { - observer.onPrintersAdded(printers); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error adding printers", re); + + if (mIsDiscoveryStarted) { + // If during discovery, add the new printers and send them. + List<PrinterInfo> addedPrinters = new ArrayList<PrinterInfo>(); + final int addedPrinterCount = printers.size(); + for (int i = 0; i < addedPrinterCount; i++) { + PrinterInfo addedPrinter = printers.get(i); + if (mPrinters.get(addedPrinter.getId()) == null) { + mPrinters.put(addedPrinter.getId(), addedPrinter); + addedPrinters.add(addedPrinter); + } + } + + // Send the added printers, if such. + if (!addedPrinters.isEmpty()) { + sendAddedPrinters(mObserver, addedPrinters); } } else { - Log.w(LOG_TAG, "Printer discovery session not open not adding printers."); + // Remember the last sent printers if needed. + if (mLastSentPrinters == null) { + mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters); + } + + // Update the printers. + final int addedPrinterCount = printers.size(); + for (int i = 0; i < addedPrinterCount; i++) { + PrinterInfo addedPrinter = printers.get(i); + if (mPrinters.get(addedPrinter.getId()) == null) { + mPrinters.put(addedPrinter.getId(), addedPrinter); + } + } + } + } + + private static void sendAddedPrinters(IPrintServiceClient observer, + List<PrinterInfo> printers) { + try { + final int printerCount = printers.size(); + if (printerCount <= MAX_ITEMS_PER_CALLBACK) { + observer.onPrintersAdded(printers); + } else { + // Send the added printers in chunks avoiding the binder transaction limit. + final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; + for (int i = 0; i < transactionCount; i++) { + final int start = i * MAX_ITEMS_PER_CALLBACK; + final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); + List<PrinterInfo> subPrinters = printers.subList(start, end); + observer.onPrintersAdded(subPrinters); + } + } + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error sending added printers", re); } } /** * Removes added printers. Removing an already removed or never added - * printer has no effect. Removed printers can be added again. You - * can call this method multiple times during printer discovery. + * printer has no effect. Removed printers can be added again. You can + * call this method multiple times during the lifetime of this session. * <p> - * <strong>Note: </strong> Calls to this method before the session is opened, - * i.e. before the {@link #onOpen(List)} call, and after the session is closed, - * i.e. after the call to {@link #onClose()}, will be ignored. + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored. * </p> * * @param printerIds The ids of the removed printers. * * @see #addPrinters(List) * @see #updatePrinters(List) + * @see #getPrinters() + * @see #isDestroyed() */ public final void removePrinters(List<PrinterId> printerIds) { - final IPrinterDiscoverySessionObserver observer; - synchronized (mLock) { - observer = mObserver; + PrintService.throwIfNotCalledOnMainThread(); + + // If the session is destroyed - nothing do to. + if (mIsDestroyed) { + Log.w(LOG_TAG, "Not removing printers - session destroyed."); + return; } - if (observer != null) { - try { - observer.onPrintersRemoved(printerIds); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error removing printers", re); + + if (mIsDiscoveryStarted) { + // If during discovery, remove existing printers and send them. + List<PrinterId> removedPrinterIds = new ArrayList<PrinterId>(); + final int removedPrinterIdCount = printerIds.size(); + for (int i = 0; i < removedPrinterIdCount; i++) { + PrinterId removedPrinterId = printerIds.get(i); + if (mPrinters.remove(removedPrinterId) != null) { + removedPrinterIds.add(removedPrinterId); + } + } + + // Send the removed printers, if such. + if (!removedPrinterIds.isEmpty()) { + sendRemovedPrinters(mObserver, removedPrinterIds); } } else { - Log.w(LOG_TAG, "Printer discovery session not open not removing printers."); + // Remember the last sent printers if needed. + if (mLastSentPrinters == null) { + mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters); + } + + // Update the printers. + final int removedPrinterIdCount = printerIds.size(); + for (int i = 0; i < removedPrinterIdCount; i++) { + PrinterId removedPrinterId = printerIds.get(i); + mPrinters.remove(removedPrinterId); + } + } + } + + private static void sendRemovedPrinters(IPrintServiceClient observer, + List<PrinterId> printerIds) { + try { + final int printerIdCount = printerIds.size(); + if (printerIdCount <= MAX_ITEMS_PER_CALLBACK) { + observer.onPrintersRemoved(printerIds); + } else { + final int transactionCount = (printerIdCount / MAX_ITEMS_PER_CALLBACK) + 1; + for (int i = 0; i < transactionCount; i++) { + final int start = i * MAX_ITEMS_PER_CALLBACK; + final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerIdCount); + List<PrinterId> subPrinterIds = printerIds.subList(start, end); + observer.onPrintersRemoved(subPrinterIds); + } + } + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error sending removed printers", re); } } /** * Updates added printers. Updating a printer that was not added or that * was removed has no effect. You can call this method multiple times - * during printer discovery. + * during the lifetime of this session. * <p> - * <strong>Note: </strong> Calls to this method before the session is opened, - * i.e. before the {@link #onOpen(List)} call, and after the session is closed, - * i.e. after the call to {@link #onClose()}, will be ignored. + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored. * </p> * * @param printers The printers to update. * * @see #addPrinters(List) * @see #removePrinters(List) + * @see #getPrinters() + * @see #isDestroyed() */ public final void updatePrinters(List<PrinterInfo> printers) { - final IPrinterDiscoverySessionObserver observer; - synchronized (mLock) { - observer = mObserver; + PrintService.throwIfNotCalledOnMainThread(); + + // If the session is destroyed - nothing do to. + if (mIsDestroyed) { + Log.w(LOG_TAG, "Not updating printers - session destroyed."); + return; } - if (observer != null) { - try { - observer.onPrintersUpdated(printers); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error updating printers", re); + + if (mIsDiscoveryStarted) { + // If during discovery, update existing printers and send them. + List<PrinterInfo> updatedPrinters = new ArrayList<PrinterInfo>(); + final int updatedPrinterCount = printers.size(); + for (int i = 0; i < updatedPrinterCount; i++) { + PrinterInfo updatedPrinter = printers.get(i); + PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); + if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { + mPrinters.put(updatedPrinter.getId(), updatedPrinter); + updatedPrinters.add(updatedPrinter); + } + } + + // Send the updated printers, if such. + if (!updatedPrinters.isEmpty()) { + sendUpdatedPrinters(mObserver, updatedPrinters); } } else { - Log.w(LOG_TAG, "Printer discovery session not open not updating printers."); + // Remember the last sent printers if needed. + if (mLastSentPrinters == null) { + mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters); + } + + // Update the printers. + final int updatedPrinterCount = printers.size(); + for (int i = 0; i < updatedPrinterCount; i++) { + PrinterInfo updatedPrinter = printers.get(i); + PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); + if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { + mPrinters.put(updatedPrinter.getId(), updatedPrinter); + } + } + } + } + + private static void sendUpdatedPrinters(IPrintServiceClient observer, + List<PrinterInfo> printers) { + try { + final int printerCount = printers.size(); + if (printerCount <= MAX_ITEMS_PER_CALLBACK) { + observer.onPrintersUpdated(printers); + } else { + final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; + for (int i = 0; i < transactionCount; i++) { + final int start = i * MAX_ITEMS_PER_CALLBACK; + final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); + List<PrinterInfo> subPrinters = printers.subList(start, end); + observer.onPrintersUpdated(subPrinters); + } + } + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error sending updated printers", re); + } + } + + private void sendOutOfDiscoveryPeriodPrinterChanges() { + // Noting changed since the last discovery period - nothing to do. + if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) { + mLastSentPrinters = null; + return; + } + + List<PrinterInfo> addedPrinters = null; + List<PrinterInfo> updatedPrinters = null; + List<PrinterId> removedPrinterIds = null; + + // Determine the added and updated printers. + for (PrinterInfo printer : mPrinters.values()) { + PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId()); + if (sentPrinter != null) { + if (!sentPrinter.equals(printer)) { + if (updatedPrinters == null) { + updatedPrinters = new ArrayList<PrinterInfo>(); + } + updatedPrinters.add(printer); + } + } else { + if (addedPrinters == null) { + addedPrinters = new ArrayList<PrinterInfo>(); + } + addedPrinters.add(printer); + } } + + // Send the added printers, if such. + if (addedPrinters != null) { + sendAddedPrinters(mObserver, addedPrinters); + } + + // Send the updated printers, if such. + if (updatedPrinters != null) { + sendUpdatedPrinters(mObserver, updatedPrinters); + } + + // Determine the removed printers. + for (PrinterInfo sentPrinter : mLastSentPrinters.values()) { + if (!mPrinters.containsKey(sentPrinter.getId())) { + if (removedPrinterIds == null) { + removedPrinterIds = new ArrayList<PrinterId>(); + } + removedPrinterIds.add(sentPrinter.getId()); + } + } + + // Send the removed printers, if such. + if (removedPrinterIds != null) { + sendRemovedPrinters(mObserver, removedPrinterIds); + } + + mLastSentPrinters = null; } /** - * Callback notifying you that the session is open and you should start - * printer discovery. Discovered printers should be added via calling - * {@link #addPrinters(List)}. Added printers that disappeared should be - * removed via calling {@link #removePrinters(List)}. Added printers whose - * properties or capabilities changes should be updated via calling {@link - * #updatePrinters(List)}. When the session is closed you will receive a - * call to {@link #onClose()}. + * Callback asking you to start printer discovery. Discovered printers should be + * added via calling {@link #addPrinters(List)}. Added printers that disappeared + * should be removed via calling {@link #removePrinters(List)}. Added printers + * whose properties or capabilities changed should be updated via calling {@link + * #updatePrinters(List)}. You will receive a call to call to {@link + * #onStopPrinterDiscovery()} when you should stop printer discovery. * <p> - * During printer discovery all printers that are known to your print - * service have to be added. The system does not retain any printers from - * previous sessions. + * During the lifetime of this session all printers that are known to your print + * service have to be added. The system does not retain any printers across sessions. + * However, if you were asked to start and then stop performing printer discovery + * in this session, then a subsequent discovering should not re-discover already + * discovered printers. * </p> * <p> - * <strong>Note: </strong>You are also given a list of printers whose - * availability has to be checked first. For example, these printers could - * be the user's favorite ones, therefore they have to be verified first. + * <strong>Note: </strong>You are also given a list of printers whose availability + * has to be checked first. For example, these printers could be the user's favorite + * ones, therefore they have to be verified first. * </p> * - * @see #onClose() + * @param priorityList The list of printers to validate first. Never null. + * + * @see #onStopPrinterDiscovery() * @see #addPrinters(List) * @see #removePrinters(List) * @see #updatePrinters(List) + * @see #isPrinterDiscoveryStarted() */ - public abstract void onOpen(List<PrinterId> priorityList); + public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList); /** - * Callback notifying you that the session is closed and you should stop - * printer discovery. After the session is closed any call to the methods - * of this instance will be ignored. Once the session is closed - * it will never be opened again. + * Callback notifying you that you should stop printer discovery. + * + * @see #onStartPrinterDiscovery(List) + * @see #isPrinterDiscoveryStarted() */ - public abstract void onClose(); + public abstract void onStopPrinterDiscovery(); /** * Requests that you update a printer. You are responsible for updating @@ -255,77 +486,72 @@ public abstract class PrinterDiscoverySession { */ public abstract void onRequestPrinterUpdate(PrinterId printerId); - void close() { - synchronized (mLock) { - mController = null; - mObserver = null; - } - } + /** + * Notifies you that the session is destroyed. After this callback is invoked + * any calls to the methods of this class will be ignored, {@link #isDestroyed()} + * will return true and you will also no longer receive callbacks. + * + * @see #isDestroyed() + */ + public abstract void onDestroy(); - private final class SessionHandler extends Handler { - public static final int MSG_OPEN = 1; - public static final int MSG_CLOSE = 2; - public static final int MSG_REQUEST_PRINTER_UPDATE = 3; + /** + * Gets whether the session is destroyed. + * + * @return Whether the session is destroyed. + * + * @see #onDestroy() + */ + public final boolean isDestroyed() { + PrintService.throwIfNotCalledOnMainThread(); + return mIsDestroyed; + } - public SessionHandler(Looper looper) { - super(looper, null, true); - } + /** + * Gets whether printer discovery is started. + * + * @return Whether printer discovery is destroyed. + * + * @see #onStartPrinterDiscovery(List) + * @see #onStopPrinterDiscovery() + */ + public final boolean isPrinterDiscoveryStarted() { + PrintService.throwIfNotCalledOnMainThread(); + return mIsDiscoveryStarted; + } - @Override - @SuppressWarnings("unchecked") - public void handleMessage(Message message) { - switch (message.what) { - case MSG_OPEN: { - List<PrinterId> priorityList = (List<PrinterId>) message.obj; - onOpen(priorityList); - } break; - - case MSG_CLOSE: { - onClose(); - close(); - } break; - - case MSG_REQUEST_PRINTER_UPDATE: { - PrinterId printerId = (PrinterId) message.obj; - onRequestPrinterUpdate(printerId); - } break; + void startPrinterDiscovery(List<PrinterId> priorityList) { + if (!mIsDestroyed) { + mIsDiscoveryStarted = true; + sendOutOfDiscoveryPeriodPrinterChanges(); + if (priorityList == null) { + priorityList = Collections.emptyList(); } + onStartPrinterDiscovery(priorityList); } } - private static final class PrinterDiscoverySessionController extends - IPrinterDiscoverySessionController.Stub { - private final WeakReference<PrinterDiscoverySession> mWeakSession; - - public PrinterDiscoverySessionController(PrinterDiscoverySession session) { - mWeakSession = new WeakReference<PrinterDiscoverySession>(session); - } - - @Override - public void open(List<PrinterId> priorityList) { - PrinterDiscoverySession session = mWeakSession.get(); - if (session != null) { - session.mHandler.obtainMessage(SessionHandler.MSG_OPEN, - priorityList).sendToTarget(); - } + void stopPrinterDiscovery() { + if (!mIsDestroyed) { + mIsDiscoveryStarted = false; + onStopPrinterDiscovery(); } + } - @Override - public void close() { - PrinterDiscoverySession session = mWeakSession.get(); - if (session != null) { - session.mHandler.sendEmptyMessage(SessionHandler.MSG_CLOSE); - } + void requestPrinterUpdate(PrinterId printerId) { + if (!mIsDestroyed) { + onRequestPrinterUpdate(printerId); } + } - @Override - public void requestPrinterUpdate(PrinterId printerId) { - PrinterDiscoverySession session = mWeakSession.get(); - if (session != null) { - session.mHandler.obtainMessage( - SessionHandler.MSG_REQUEST_PRINTER_UPDATE, - printerId).sendToTarget(); - } + void destroy() { + if (!mIsDestroyed) { + mIsDestroyed = true; + mIsDiscoveryStarted = false; + mPrinters.clear(); + mLastSentPrinters = null; + mObserver = null; + onDestroy(); } - }; + } } diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 53f5d58..da7647a 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -36,8 +36,8 @@ import com.google.android.collect.Lists; import libcore.io.IoUtils; +import java.io.FileDescriptor; import java.io.IOException; -import java.io.InputStream; import java.util.List; /** @@ -53,63 +53,85 @@ public final class DocumentsContract { // content://com.example/roots/sdcard/docs/0/contents/ // content://com.example/roots/sdcard/docs/0/search/?query=pony - /** - * MIME type of a document which is a directory that may contain additional - * documents. - * - * @see #buildContentsUri(Uri) - */ - public static final String MIME_TYPE_DIRECTORY = "vnd.android.cursor.dir/doc"; - /** {@hide} */ public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; - /** - * {@link DocumentColumns#DOC_ID} value representing the root directory of a - * storage root. - */ - public static final String ROOT_DOC_ID = "0"; + /** {@hide} */ + public static final String ACTION_DOCUMENT_CHANGED = "android.provider.action.DOCUMENT_CHANGED"; - /** - * Flag indicating that a document is a directory that supports creation of - * new files within it. - * - * @see DocumentColumns#FLAGS - * @see #buildContentsUri(Uri) - */ - public static final int FLAG_SUPPORTS_CREATE = 1; + public static class Documents { + private Documents() { + } - /** - * Flag indicating that a document is renamable. - * - * @see DocumentColumns#FLAGS - * @see #renameDocument(ContentResolver, Uri, String) - */ - public static final int FLAG_SUPPORTS_RENAME = 1 << 1; + /** + * MIME type of a document which is a directory that may contain additional + * documents. + * + * @see #buildContentsUri(String, String, String) + */ + public static final String MIME_TYPE_DIR = "vnd.android.cursor.dir/doc"; - /** - * Flag indicating that a document is deletable. - * - * @see DocumentColumns#FLAGS - */ - public static final int FLAG_SUPPORTS_DELETE = 1 << 2; + /** + * {@link DocumentColumns#DOC_ID} value representing the root directory of a + * storage root. + */ + public static final String DOC_ID_ROOT = "0"; - /** - * Flag indicating that a document can be represented as a thumbnail. - * - * @see DocumentColumns#FLAGS - * @see #getThumbnail(ContentResolver, Uri, Point) - */ - public static final int FLAG_SUPPORTS_THUMBNAIL = 1 << 3; + /** + * Flag indicating that a document is a directory that supports creation of + * new files within it. + * + * @see DocumentColumns#FLAGS + * @see #createDocument(ContentResolver, Uri, String, String) + */ + public static final int FLAG_SUPPORTS_CREATE = 1; - /** - * Flag indicating that a document is a directory that supports search. - * - * @see DocumentColumns#FLAGS - */ - public static final int FLAG_SUPPORTS_SEARCH = 1 << 4; + /** + * Flag indicating that a document is renamable. + * + * @see DocumentColumns#FLAGS + * @see #renameDocument(ContentResolver, Uri, String) + */ + public static final int FLAG_SUPPORTS_RENAME = 1 << 1; - // TODO: flag indicating that document is writable? + /** + * Flag indicating that a document is deletable. + * + * @see DocumentColumns#FLAGS + */ + public static final int FLAG_SUPPORTS_DELETE = 1 << 2; + + /** + * Flag indicating that a document can be represented as a thumbnail. + * + * @see DocumentColumns#FLAGS + * @see #getThumbnail(ContentResolver, Uri, Point) + */ + public static final int FLAG_SUPPORTS_THUMBNAIL = 1 << 3; + + /** + * Flag indicating that a document is a directory that supports search. + * + * @see DocumentColumns#FLAGS + */ + public static final int FLAG_SUPPORTS_SEARCH = 1 << 4; + + /** + * Flag indicating that a document is writable. + * + * @see DocumentColumns#FLAGS + */ + public static final int FLAG_SUPPORTS_WRITE = 1 << 5; + + /** + * Flag indicating that a document is a directory that prefers its contents + * be shown in a larger format grid. Usually suitable when a directory + * contains mostly pictures. + * + * @see DocumentColumns#FLAGS + */ + public static final int FLAG_PREFERS_GRID = 1 << 6; + } /** * Optimal dimensions for a document thumbnail request, stored as a @@ -144,7 +166,8 @@ public final class DocumentsContract { private static final String PATH_CONTENTS = "contents"; private static final String PATH_SEARCH = "search"; - public static final String PARAM_QUERY = "query"; + private static final String PARAM_QUERY = "query"; + private static final String PARAM_LOCAL_ONLY = "localOnly"; /** * Build URI representing the roots in a storage backend. @@ -171,7 +194,7 @@ public final class DocumentsContract { /** * Build URI representing the contents of the given directory in a storage - * backend. The given document must be {@link #MIME_TYPE_DIRECTORY}. + * backend. The given document must be {@link Documents#MIME_TYPE_DIR}. */ public static Uri buildContentsUri(String authority, String rootId, String docId) { return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority) @@ -228,11 +251,32 @@ public final class DocumentsContract { return paths.get(3); } + /** + * Return requested search query from the given Uri. + */ public static String getSearchQuery(Uri documentUri) { return documentUri.getQueryParameter(PARAM_QUERY); } /** + * Mark the given Uri to indicate that only locally-available contents + * should be returned. + */ + public static Uri setLocalOnly(Uri documentUri) { + return documentUri.buildUpon() + .appendQueryParameter(PARAM_LOCAL_ONLY, String.valueOf(true)).build(); + } + + /** + * Return if the given Uri is requesting that only locally-available content + * be returned. That is, no network connections should be initiated to + * provide the metadata or content. + */ + public static boolean isLocalOnly(Uri documentUri) { + return documentUri.getBooleanQueryParameter(PARAM_LOCAL_ONLY, false); + } + + /** * These are standard columns for document URIs. Storage backend providers * <em>must</em> support at least these columns when queried. * @@ -257,7 +301,7 @@ public final class DocumentsContract { * <p> * Type: STRING * - * @see DocumentsContract#MIME_TYPE_DIRECTORY + * @see Documents#MIME_TYPE_DIR */ public static final String MIME_TYPE = "mime_type"; @@ -288,35 +332,43 @@ public final class DocumentsContract { public static final String SUMMARY = "summary"; } - /** - * Root that represents a cloud-based storage service. - * - * @see RootColumns#ROOT_TYPE - */ - public static final int ROOT_TYPE_SERVICE = 1; + public static class Roots { + private Roots() { + } - /** - * Root that represents a shortcut to content that may be available - * elsewhere through another storage root. - * - * @see RootColumns#ROOT_TYPE - */ - public static final int ROOT_TYPE_SHORTCUT = 2; + public static final String MIME_TYPE_DIR = "vnd.android.cursor.dir/root"; + public static final String MIME_TYPE_ITEM = "vnd.android.cursor.item/root"; - /** - * Root that represents a physical storage device. - * - * @see RootColumns#ROOT_TYPE - */ - public static final int ROOT_TYPE_DEVICE = 3; + /** + * Root that represents a cloud-based storage service. + * + * @see RootColumns#ROOT_TYPE + */ + public static final int ROOT_TYPE_SERVICE = 1; - /** - * Root that represents a physical storage device that should only be - * displayed to advanced users. - * - * @see RootColumns#ROOT_TYPE - */ - public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; + /** + * Root that represents a shortcut to content that may be available + * elsewhere through another storage root. + * + * @see RootColumns#ROOT_TYPE + */ + public static final int ROOT_TYPE_SHORTCUT = 2; + + /** + * Root that represents a physical storage device. + * + * @see RootColumns#ROOT_TYPE + */ + public static final int ROOT_TYPE_DEVICE = 3; + + /** + * Root that represents a physical storage device that should only be + * displayed to advanced users. + * + * @see RootColumns#ROOT_TYPE + */ + public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; + } /** * These are standard columns for the roots URI. @@ -331,8 +383,8 @@ public final class DocumentsContract { * <p> * Type: INTEGER (int) * - * @see DocumentsContract#ROOT_TYPE_SERVICE - * @see DocumentsContract#ROOT_TYPE_DEVICE + * @see Roots#ROOT_TYPE_SERVICE + * @see Roots#ROOT_TYPE_DEVICE */ public static final String ROOT_TYPE = "root_type"; @@ -401,7 +453,7 @@ public final class DocumentsContract { /** * Return thumbnail representing the document at the given URI. Callers are * responsible for their own caching. Given document must have - * {@link #FLAG_SUPPORTS_THUMBNAIL} set. + * {@link Documents#FLAG_SUPPORTS_THUMBNAIL} set. * * @return decoded thumbnail, or {@code null} if problem was encountered. */ @@ -409,22 +461,51 @@ public final class DocumentsContract { final Bundle opts = new Bundle(); opts.putParcelable(EXTRA_THUMBNAIL_SIZE, size); - InputStream is = null; + AssetFileDescriptor afd = null; try { - is = new AssetFileDescriptor.AutoCloseInputStream( - resolver.openTypedAssetFileDescriptor(documentUri, "image/*", opts)); - return BitmapFactory.decodeStream(is); + afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", opts); + + final FileDescriptor fd = afd.getFileDescriptor(); + final BitmapFactory.Options bitmapOpts = new BitmapFactory.Options(); + + bitmapOpts.inJustDecodeBounds = true; + BitmapFactory.decodeFileDescriptor(fd, null, bitmapOpts); + + final int widthSample = bitmapOpts.outWidth / size.x; + final int heightSample = bitmapOpts.outHeight / size.y; + + bitmapOpts.inJustDecodeBounds = false; + bitmapOpts.inSampleSize = Math.min(widthSample, heightSample); + return BitmapFactory.decodeFileDescriptor(fd, null, bitmapOpts); } catch (IOException e) { Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e); return null; } finally { - IoUtils.closeQuietly(is); + IoUtils.closeQuietly(afd); } } /** + * Create a new document under a specific parent document with the given + * display name and MIME type. + * + * @param parentDocumentUri document with + * {@link Documents#FLAG_SUPPORTS_CREATE} + * @param displayName name for new document + * @param mimeType MIME type for new document, which cannot be changed + * @return newly created document Uri, or {@code null} if failed + */ + public static Uri createDocument( + ContentResolver resolver, Uri parentDocumentUri, String displayName, String mimeType) { + final ContentValues values = new ContentValues(); + values.put(DocumentColumns.MIME_TYPE, mimeType); + values.put(DocumentColumns.DISPLAY_NAME, displayName); + return resolver.insert(parentDocumentUri, values); + } + + /** * Rename the document at the given URI. Given document must have - * {@link #FLAG_SUPPORTS_RENAME} set. + * {@link Documents#FLAG_SUPPORTS_RENAME} set. * * @return if rename was successful. */ @@ -434,4 +515,14 @@ public final class DocumentsContract { values.put(DocumentColumns.DISPLAY_NAME, displayName); return (resolver.update(documentUri, values, null, null) == 1); } + + /** + * Notify the system that roots have changed for the given storage provider. + * This signal is used to invalidate internal caches. + */ + public static void notifyRootsChanged(Context context, String authority) { + final Intent intent = new Intent(ACTION_DOCUMENT_CHANGED); + intent.setData(buildRootsUri(authority)); + context.sendBroadcast(intent); + } } diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index cb6300f..ad6839b 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -19,8 +19,8 @@ package android.provider; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.ContentResolver; -import android.content.ContentValues; import android.content.ContentUris; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; @@ -532,7 +532,8 @@ public final class MediaStore { private static final Object sThumbBufLock = new Object(); private static byte[] sThumbBuf; - private static Bitmap getMiniThumbFromFile(Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) { + private static Bitmap getMiniThumbFromFile( + Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) { Bitmap bitmap = null; Uri thumbUri = null; try { @@ -577,6 +578,7 @@ public final class MediaStore { if (c != null) c.close(); } } + /** * This method ensure thumbnails associated with origId are generated and decode the byte * stream from database (MICRO_KIND) or file (MINI_KIND). diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 585115a..fad6c73 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3269,6 +3269,23 @@ public final class Settings { public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; /** + * Location access disabled + */ + public static final int LOCATION_MODE_OFF = 0; + /** + * Network Location Provider disabled, but GPS and other sensors enabled. + */ + public static final int LOCATION_MODE_SENSORS_ONLY = 1; + /** + * Reduced power usage, such as limiting the number of GPS updates per hour. + */ + public static final int LOCATION_MODE_BATTERY_SAVING = 2; + /** + * Best-effort location computation allowed. + */ + public static final int LOCATION_MODE_HIGH_ACCURACY = 3; + + /** * A flag containing settings used for biometric weak * @hide */ @@ -4319,23 +4336,27 @@ public final class Settings { * @param cr the content resolver to use * @param provider the location provider to query * @return true if the provider is enabled + * @deprecated use {@link #getLocationMode(ContentResolver)} */ + @Deprecated public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) { return isLocationProviderEnabledForUser(cr, provider, UserHandle.myUserId()); } /** * Helper method for determining if the location master switch is enabled. + * + * TODO: worth retaining this method? + * * @param cr the content resolver to use * @return true if the master switch is enabled + * @deprecated use {@link #getLocationMode(ContentResolver)} != {@link #LOCATION_MODE_OFF} * @hide */ + @Deprecated public static final boolean isLocationMasterSwitchEnabled(ContentResolver cr) { - int uid = UserHandle.myUserId(); - synchronized (mLocationSettingsLock) { - return isLocationProviderEnabledForUser(cr, LocationManager.NETWORK_PROVIDER, uid) - || isLocationProviderEnabledForUser(cr, LocationManager.GPS_PROVIDER, uid); - } + int mode = getLocationMode(cr); + return mode != LOCATION_MODE_OFF; } /** @@ -4344,8 +4365,10 @@ public final class Settings { * @param provider the location provider to query * @param userId the userId to query * @return true if the provider is enabled + * @deprecated use {@link #getLocationModeForUser(ContentResolver, int)} * @hide */ + @Deprecated public static final boolean isLocationProviderEnabledForUser(ContentResolver cr, String provider, int userId) { String allowedProviders = Settings.Secure.getStringForUser(cr, LOCATION_PROVIDERS_ALLOWED, userId); @@ -4357,7 +4380,9 @@ public final class Settings { * @param cr the content resolver to use * @param provider the location provider to enable or disable * @param enabled true if the provider should be enabled + * @deprecated use {@link #setLocationMode(ContentResolver, int)} */ + @Deprecated public static final void setLocationProviderEnabled(ContentResolver cr, String provider, boolean enabled) { setLocationProviderEnabledForUser(cr, provider, enabled, UserHandle.myUserId()); @@ -4368,8 +4393,11 @@ public final class Settings { * * @param cr the content resolver to use * @param enabled true if master switch should be enabled + * @deprecated use {@link #setLocationMode(ContentResolver, int)} with + * {@link #LOCATION_MODE_HIGH_ACCURACY} * @hide */ + @Deprecated public static final void setLocationMasterSwitchEnabled(ContentResolver cr, boolean enabled) { int uid = UserHandle.myUserId(); @@ -4386,8 +4414,10 @@ public final class Settings { * @param provider the location provider to enable or disable * @param enabled true if the provider should be enabled * @param userId the userId for which to enable/disable providers + * @deprecated use {@link #setLocationModeForUser(ContentResolver, int, int)} * @hide */ + @Deprecated public static final void setLocationProviderEnabledForUser(ContentResolver cr, String provider, boolean enabled, int userId) { synchronized (mLocationSettingsLock) { @@ -4403,6 +4433,97 @@ public final class Settings { userId); } } + + /** + * Thread-safe method for setting the location mode to one of + * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, + * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. + * + * @param cr the content resolver to use + * @param mode such as {@link #LOCATION_MODE_HIGH_ACCURACY} + * @param userId the userId for which to change mode + * + * @throws IllegalArgumentException if mode is not one of the supported values + */ + public static final void setLocationModeForUser(ContentResolver cr, int mode, int userId) { + synchronized (mLocationSettingsLock) { + boolean gps = false; + boolean network = false; + switch (mode) { + case LOCATION_MODE_OFF: + break; + case LOCATION_MODE_SENSORS_ONLY: + gps = true; + break; + case LOCATION_MODE_BATTERY_SAVING: + network = true; + break; + case LOCATION_MODE_HIGH_ACCURACY: + gps = true; + network = true; + break; + default: + throw new IllegalArgumentException("Invalid location mode: " + mode); + } + Settings.Secure.setLocationProviderEnabledForUser( + cr, LocationManager.GPS_PROVIDER, gps, userId); + Settings.Secure.setLocationProviderEnabledForUser( + cr, LocationManager.NETWORK_PROVIDER, network, userId); + } + } + + /** + * Thread-safe method for setting the location mode to one of + * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, + * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. + * + * @param cr the content resolver to use + * @param mode such as {@link #LOCATION_MODE_HIGH_ACCURACY} + * + * @throws IllegalArgumentException if mode is not one of the supported values + */ + public static final void setLocationMode(ContentResolver cr, int mode) { + setLocationModeForUser(cr, mode, UserHandle.myUserId()); + } + + /** + * Thread-safe method for reading the location mode, returns one of + * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, + * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. + * + * @param cr the content resolver to use + * @param userId the userId for which to read the mode + * @return the location mode + */ + public static final int getLocationModeForUser(ContentResolver cr, int userId) { + synchronized (mLocationSettingsLock) { + boolean gpsEnabled = Settings.Secure.isLocationProviderEnabledForUser( + cr, LocationManager.GPS_PROVIDER, userId); + boolean networkEnabled = Settings.Secure.isLocationProviderEnabledForUser( + cr, LocationManager.NETWORK_PROVIDER, userId); + if (gpsEnabled && networkEnabled) { + return LOCATION_MODE_HIGH_ACCURACY; + } else if (gpsEnabled) { + return LOCATION_MODE_SENSORS_ONLY; + } else if (networkEnabled) { + return LOCATION_MODE_BATTERY_SAVING; + } else { + return LOCATION_MODE_OFF; + } + } + } + + /** + * Thread-safe method for reading the location mode, returns one of + * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, + * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. + * + * @param cr the content resolver to use + * @return the location mode + */ + public static final int getLocationMode(ContentResolver cr) { + return getLocationModeForUser(cr, UserHandle.myUserId()); + } } /** diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java index cba350f..22675b4 100644 --- a/core/java/android/text/format/DateUtils.java +++ b/core/java/android/text/format/DateUtils.java @@ -815,7 +815,14 @@ public class DateUtils * @return the formatter with the formatted date/time range appended to the string buffer. */ public static Formatter formatDateRange(Context context, Formatter formatter, long startMillis, - long endMillis, int flags, String timeZone) { + long endMillis, int flags, String timeZone) { + // If we're being asked to format a time without being explicitly told whether to use + // the 12- or 24-hour clock, icu4c will fall back to the locale's preferred 12/24 format, + // but we want to fall back to the user's preference. + if ((flags & (FORMAT_SHOW_TIME | FORMAT_12HOUR | FORMAT_24HOUR)) == FORMAT_SHOW_TIME) { + flags |= DateFormat.is24HourFormat(context) ? FORMAT_24HOUR : FORMAT_12HOUR; + } + String range = DateIntervalFormat.formatDateRange(startMillis, endMillis, flags, timeZone); try { formatter.out().append(range); diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index 2d24c1e..43fd628 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -208,9 +208,22 @@ public abstract class DisplayList { * {@link #isValid()} will return false. * * @see #isValid() + * @see #reset() */ public abstract void clear(); + + /** + * Reset native resources. This is called when cleaning up the state of display lists + * during destruction of hardware resources, to ensure that we do not hold onto + * obsolete resources after related resources are gone. + * + * @see #clear() + * + * @hide + */ + public abstract void reset(); + /** * Sets the dirty flag. When a display list is dirty, {@link #clear()} should * be invoked whenever possible. @@ -670,13 +683,4 @@ public abstract class DisplayList { * @see View#offsetTopAndBottom(int) */ public abstract void offsetTopAndBottom(float offset); - - /** - * Reset native resources. This is called when cleaning up the state of display lists - * during destruction of hardware resources, to ensure that we do not hold onto - * obsolete resources after related resources are gone. - * - * @hide - */ - public abstract void reset(); } diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index 8b2a2ef..c652bac 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -94,6 +94,7 @@ class GLES20DisplayList extends DisplayList { if (hasNativeDisplayList()) { nReset(mFinalizer.mNativeDisplayList); } + clear(); } @Override diff --git a/core/java/android/view/GLES20Layer.java b/core/java/android/view/GLES20Layer.java index 7ee628b..0e3311c 100644 --- a/core/java/android/view/GLES20Layer.java +++ b/core/java/android/view/GLES20Layer.java @@ -59,6 +59,9 @@ abstract class GLES20Layer extends HardwareLayer { @Override public void destroy() { + if (mDisplayList != null) { + mDisplayList.reset(); + } if (mFinalizer != null) { mFinalizer.destroy(); mFinalizer = null; diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index e0786f7..409db84 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -36,7 +36,7 @@ public class Surface implements Parcelable { throws OutOfResourcesException; private static native int nativeCreateFromSurfaceControl(int surfaceControlNativeObject); - private static native void nativeLockCanvas(int nativeObject, Canvas canvas, Rect dirty) + private static native int nativeLockCanvas(int nativeObject, Canvas canvas, Rect dirty) throws OutOfResourcesException; private static native void nativeUnlockCanvasAndPost(int nativeObject, Canvas canvas); @@ -72,6 +72,7 @@ public class Surface implements Parcelable { final Object mLock = new Object(); // protects the native state private String mName; int mNativeObject; // package scope only for SurfaceControl access + private int mLockedObject; private int mGenerationId; // incremented each time mNativeObject changes private final Canvas mCanvas = new CompatibleCanvas(); @@ -233,7 +234,14 @@ public class Surface implements Parcelable { throws OutOfResourcesException, IllegalArgumentException { synchronized (mLock) { checkNotReleasedLocked(); - nativeLockCanvas(mNativeObject, mCanvas, inOutDirty); + if (mLockedObject != 0) { + // Ideally, nativeLockCanvas() would throw in this situation and prevent the + // double-lock, but that won't happen if mNativeObject was updated. We can't + // abandon the old mLockedObject because it might still be in use, so instead + // we just refuse to re-lock the Surface. + throw new RuntimeException("Surface was already locked"); + } + mLockedObject = nativeLockCanvas(mNativeObject, mCanvas, inOutDirty); return mCanvas; } } @@ -252,11 +260,21 @@ public class Surface implements Parcelable { synchronized (mLock) { checkNotReleasedLocked(); - nativeUnlockCanvasAndPost(mNativeObject, canvas); + if (mNativeObject != mLockedObject) { + Log.w(TAG, "WARNING: Surface's mNativeObject (0x" + + Integer.toHexString(mNativeObject) + ") != mLockedObject (0x" + + Integer.toHexString(mLockedObject) +")"); + } + if (mLockedObject == 0) { + throw new RuntimeException("Surface was not locked"); + } + nativeUnlockCanvasAndPost(mLockedObject, canvas); + nativeRelease(mLockedObject); + mLockedObject = 0; } } - /** + /** * @deprecated This API has been removed and is not supported. Do not use. */ @Deprecated @@ -343,6 +361,10 @@ public class Surface implements Parcelable { } synchronized (mLock) { + // nativeReadFromParcel() will either return mNativeObject, or + // create a new native Surface and return it after reducing + // the reference count on mNativeObject. Either way, it is + // not necessary to call nativeRelease() here. mName = source.readString(); setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source)); } @@ -365,7 +387,8 @@ public class Surface implements Parcelable { @Override public String toString() { synchronized (mLock) { - return "Surface(name=" + mName + ")"; + return "Surface(name=" + mName + ")/@0x" + + Integer.toHexString(System.identityHashCode(this)); } } @@ -463,7 +486,7 @@ public class Surface implements Parcelable { public void getMatrix(Matrix m) { super.getMatrix(m); if (mOrigMatrix == null) { - mOrigMatrix = new Matrix(); + mOrigMatrix = new Matrix(); } mOrigMatrix.set(m); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7a82892..f05e372 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2379,7 +2379,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * when hiding the status bar with {@link #SYSTEM_UI_FLAG_FULLSCREEN} and/or hiding the * navigation bar with {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION} instead of having the system * clear these flags upon interaction. The system may compensate by temporarily overlaying - * transparent system bars while also delivering the event. + * semi-transparent system bars while also delivering the event. */ public static final int SYSTEM_UI_FLAG_ALLOW_TRANSIENT = 0x00000800; @@ -4572,10 +4572,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, System.out.println(this + " clearFocus()"); } + clearFocusInternal(true, true); + } + + /** + * Clears focus from the view, optionally propagating the change up through + * the parent hierarchy and requesting that the root view place new focus. + * + * @param propagate whether to propagate the change up through the parent + * hierarchy + * @param refocus when propagate is true, specifies whether to request the + * root view place new focus + */ + void clearFocusInternal(boolean propagate, boolean refocus) { if ((mPrivateFlags & PFLAG_FOCUSED) != 0) { mPrivateFlags &= ~PFLAG_FOCUSED; - if (mParent != null) { + if (propagate && mParent != null) { mParent.clearChildFocus(this); } @@ -4583,7 +4596,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, refreshDrawableState(); - if (!rootViewRequestFocus()) { + if (propagate && (!refocus || !rootViewRequestFocus())) { notifyGlobalFocusCleared(this); } } @@ -4613,12 +4626,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, System.out.println(this + " unFocus()"); } - if ((mPrivateFlags & PFLAG_FOCUSED) != 0) { - mPrivateFlags &= ~PFLAG_FOCUSED; - - onFocusChanged(false, 0, null); - refreshDrawableState(); - } + clearFocusInternal(false, false); } /** @@ -12068,12 +12076,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ public void resolvePadding() { + final int resolvedLayoutDirection = getLayoutDirection(); + if (!isRtlCompatibilityMode()) { // Post Jelly Bean MR1 case: we need to take the resolved layout direction into account. // If start / end padding are defined, they will be resolved (hence overriding) to // left / right or right / left depending on the resolved layout direction. // If start / end padding are not defined, use the left / right ones. - int resolvedLayoutDirection = getLayoutDirection(); switch (resolvedLayoutDirection) { case LAYOUT_DIRECTION_RTL: if (mUserPaddingStart != UNDEFINED_PADDING) { @@ -12102,11 +12111,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } mUserPaddingBottom = (mUserPaddingBottom >= 0) ? mUserPaddingBottom : mPaddingBottom; - - onRtlPropertiesChanged(resolvedLayoutDirection); } internalSetPadding(mUserPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom); + onRtlPropertiesChanged(resolvedLayoutDirection); mPrivateFlags2 |= PFLAG2_PADDING_RESOLVED; } @@ -12136,7 +12144,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, removeSendViewScrolledAccessibilityEventCallback(); destroyDrawingCache(); - destroyLayer(false); cleanupDraw(); @@ -12154,7 +12161,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mAttachInfo.mViewRootImpl.cancelInvalidate(this); } else { // Should never happen - clearDisplayList(); + resetDisplayList(); } } @@ -12765,9 +12772,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mHardwareLayer.destroy(); mHardwareLayer = null; - if (mDisplayList != null) { - mDisplayList.reset(); - } invalidate(true); invalidateParentCaches(); } @@ -12788,7 +12792,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ protected void destroyHardwareResources() { - clearDisplayList(); + resetDisplayList(); destroyLayer(true); } @@ -13036,6 +13040,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + private void resetDisplayList() { + if (mDisplayList != null) { + mDisplayList.reset(); + } + } + /** * <p>Calling this method is equivalent to calling <code>getDrawingCache(false)</code>.</p> * @@ -15436,6 +15446,90 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Transforms a motion event from view-local coordinates to on-screen + * coordinates. + * + * @param ev the view-local motion event + * @return false if the transformation could not be applied + * @hide + */ + public boolean toGlobalMotionEvent(MotionEvent ev) { + final AttachInfo info = mAttachInfo; + if (info == null) { + return false; + } + + transformMotionEventToGlobal(ev); + ev.offsetLocation(info.mWindowLeft, info.mWindowTop); + return true; + } + + /** + * Transforms a motion event from on-screen coordinates to view-local + * coordinates. + * + * @param ev the on-screen motion event + * @return false if the transformation could not be applied + * @hide + */ + public boolean toLocalMotionEvent(MotionEvent ev) { + final AttachInfo info = mAttachInfo; + if (info == null) { + return false; + } + + ev.offsetLocation(-info.mWindowLeft, -info.mWindowTop); + transformMotionEventToLocal(ev); + return true; + } + + /** + * Recursive helper method that applies transformations in post-order. + * + * @param ev the on-screen motion event + */ + private void transformMotionEventToLocal(MotionEvent ev) { + final ViewParent parent = mParent; + if (parent instanceof View) { + final View vp = (View) parent; + vp.transformMotionEventToLocal(ev); + ev.offsetLocation(vp.mScrollX, vp.mScrollY); + } else if (parent instanceof ViewRootImpl) { + final ViewRootImpl vr = (ViewRootImpl) parent; + ev.offsetLocation(0, vr.mCurScrollY); + } + + ev.offsetLocation(-mLeft, -mTop); + + if (!hasIdentityMatrix()) { + ev.transform(getInverseMatrix()); + } + } + + /** + * Recursive helper method that applies transformations in pre-order. + * + * @param ev the on-screen motion event + */ + private void transformMotionEventToGlobal(MotionEvent ev) { + if (!hasIdentityMatrix()) { + ev.transform(getMatrix()); + } + + ev.offsetLocation(mLeft, mTop); + + final ViewParent parent = mParent; + if (parent instanceof View) { + final View vp = (View) parent; + ev.offsetLocation(-vp.mScrollX, -vp.mScrollY); + vp.transformMotionEventToGlobal(ev); + } else if (parent instanceof ViewRootImpl) { + final ViewRootImpl vr = (ViewRootImpl) parent; + ev.offsetLocation(0, -vr.mCurScrollY); + } + } + + /** * <p>Computes the coordinates of this view on the screen. The argument * must be an array of two integers. After the method returns, the array * contains the x and y location in that order.</p> @@ -16540,7 +16634,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param visibility Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * and {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT}, + * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, + * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. */ public void setSystemUiVisibility(int visibility) { if (visibility != mSystemUiVisibility) { @@ -16552,11 +16648,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Returns the last {@link #setSystemUiVisibility(int) that this view has requested. + * Returns the last {@link #setSystemUiVisibility(int)} that this view has requested. * @return Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * and {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT}, + * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, + * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. */ public int getSystemUiVisibility() { return mSystemUiVisibility; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index f574efa..c874c82 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -5357,6 +5357,18 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } /** + * Returns whether layout calls on this container are currently being + * suppressed, due to an earlier call to {@link #suppressLayout(boolean)}. + * + * @return true if layout calls are currently suppressed, false otherwise. + * + * @hide + */ + public boolean isLayoutSuppressed() { + return mSuppressLayout; + } + + /** * {@inheritDoc} */ @Override diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 3977a33..354e815 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -614,15 +614,7 @@ public final class ViewRootImpl implements ViewParent, } void destroyHardwareResources() { - if (mAttachInfo.mHardwareRenderer != null) { - if (mAttachInfo.mHardwareRenderer.isEnabled()) { - mAttachInfo.mHardwareRenderer.destroyLayers(mView); - } - mAttachInfo.mHardwareRenderer.destroy(false); - } - } - - void terminateHardwareResources() { + invalidateDisplayLists(); if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView); mAttachInfo.mHardwareRenderer.destroy(false); @@ -636,6 +628,7 @@ public final class ViewRootImpl implements ViewParent, HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE); } } else { + invalidateDisplayLists(); if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { mAttachInfo.mHardwareRenderer.destroyLayers(mView); @@ -2554,7 +2547,7 @@ public final class ViewRootImpl implements ViewParent, for (int i = 0; i < count; i++) { final DisplayList displayList = displayLists.get(i); if (displayList.isDirty()) { - displayList.clear(); + displayList.reset(); } } @@ -3271,9 +3264,9 @@ public final class ViewRootImpl implements ViewParent, // focus return ancestorToTakeFocus.requestFocus(); } else { - // nothing appropriate to have focus in touch mode, clear it - // out - focused.clearFocus(); + // There's nothing to focus. Clear and propagate through the + // hierarchy, but don't attempt to place new focus. + focused.clearFocusInternal(true, false); return true; } } @@ -5967,6 +5960,11 @@ public final class ViewRootImpl implements ViewParent, // Do nothing. } + void changeCanvasOpacity(boolean opaque) { + // TODO(romainguy): recreate Canvas (software or hardware) to reflect the opacity change. + Log.d(TAG, "changeCanvasOpacity: opaque=" + opaque); + } + class TakenSurfaceHolder extends BaseSurfaceHolder { @Override public boolean onAllowLockCanvas() { diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index b183bb6..96c0ed2 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -21,7 +21,6 @@ import android.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.res.Configuration; import android.opengl.ManagedEGLContext; -import android.os.Debug; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -29,7 +28,6 @@ import android.os.SystemProperties; import android.util.AndroidRuntimeException; import android.util.ArraySet; import android.util.Log; -import android.util.Slog; import android.view.inputmethod.InputMethodManager; import com.android.internal.util.FastPrintWriter; @@ -385,7 +383,7 @@ public final class WindowManagerGlobal { // known windows synchronized (mLock) { for (int i = mRoots.size() - 1; i >= 0; --i) { - mRoots.get(i).terminateHardwareResources(); + mRoots.get(i).destroyHardwareResources(); } } // Force a full memory flush @@ -496,6 +494,21 @@ public final class WindowManagerGlobal { } } } + + /** @hide */ + public void changeCanvasOpacity(IBinder token, boolean opaque) { + if (token == null) { + return; + } + synchronized (mLock) { + for (int i = mParams.size() - 1; i >= 0; --i) { + if (mParams.get(i).token == token) { + mRoots.get(i).changeCanvasOpacity(opaque); + return; + } + } + } + } } final class WindowLeaked extends AndroidRuntimeException { diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index e924e8b..6d54094 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -1341,7 +1341,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @throws IllegalStateException If called from an AccessibilityService. */ public void setScrollable(boolean scrollable) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_SCROLLABLE, scrollable); } @@ -1495,7 +1494,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param liveRegion If the node is a live region. */ public void setLiveRegion(boolean liveRegion) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_LIVE_REGION, liveRegion); } @@ -1519,7 +1517,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param multiLine True if the node is multi line. */ public void setMultiLine(boolean multiLine) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_MULTI_LINE, multiLine); } @@ -1543,7 +1540,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param opensPopup If the the node opens a popup. */ public void setOpensPopup(boolean opensPopup) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_OPENS_POPUP, opensPopup); } @@ -1567,7 +1563,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param expandable If the node can be expanded. */ public void setExpandable(boolean expandable) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_EXPANDABLE, expandable); } @@ -1591,7 +1586,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param expanded If the node is expanded. */ public void setExpanded(boolean expanded) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_EXPANDED, expanded); } @@ -1615,7 +1609,6 @@ public class AccessibilityNodeInfo implements Parcelable { * @param dismissable If the node can be dismissed. */ public void setDismissable(boolean dismissable) { - enforceNotSealed(); setBooleanProperty(BOOLEAN_PROPERTY_DISMISSABLE, dismissable); } @@ -1929,6 +1922,7 @@ public class AccessibilityNodeInfo implements Parcelable { * @throws IllegalStateException If called from an AccessibilityService. */ public void setInputType(int inputType) { + enforceNotSealed(); mInputType = inputType; } diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index feaab3e..c440c7b 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -82,11 +82,16 @@ public final class InputMethodInfo implements Parcelable { private final boolean mIsAuxIme; /** - * Cavert: mForceDefault must be false for production. This flag is only for test. + * Caveat: mForceDefault must be false for production. This flag is only for test. */ private final boolean mForceDefault; /** + * The flag whether this IME supports ways to switch to a next input method (e.g. globe key.) + */ + private final boolean mSupportsSwitchingToNextInputMethod; + + /** * Constructor. * * @param context The Context in which we are parsing the input method. @@ -114,6 +119,7 @@ public final class InputMethodInfo implements Parcelable { ServiceInfo si = service.serviceInfo; mId = new ComponentName(si.packageName, si.name).flattenToShortString(); boolean isAuxIme = true; + boolean supportsSwitchingToNextInputMethod = false; // false as default mForceDefault = false; PackageManager pm = context.getPackageManager(); @@ -149,6 +155,9 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod_settingsActivity); isDefaultResId = sa.getResourceId( com.android.internal.R.styleable.InputMethod_isDefault, 0); + supportsSwitchingToNextInputMethod = sa.getBoolean( + com.android.internal.R.styleable.InputMethod_supportsSwitchingToNextInputMethod, + false); sa.recycle(); final int depth = parser.getDepth(); @@ -216,6 +225,7 @@ public final class InputMethodInfo implements Parcelable { mSettingsActivityName = settingsActivityComponent; mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; + mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; } InputMethodInfo(Parcel source) { @@ -223,6 +233,7 @@ public final class InputMethodInfo implements Parcelable { mSettingsActivityName = source.readString(); mIsDefaultResId = source.readInt(); mIsAuxIme = source.readInt() == 1; + mSupportsSwitchingToNextInputMethod = source.readInt() == 1; mService = ResolveInfo.CREATOR.createFromParcel(source); source.readTypedList(mSubtypes, InputMethodSubtype.CREATOR); mForceDefault = false; @@ -254,6 +265,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes.addAll(subtypes); } mForceDefault = forceDefault; + mSupportsSwitchingToNextInputMethod = true; } private static ResolveInfo buildDummyResolveInfo(String packageName, String className, @@ -435,6 +447,14 @@ public final class InputMethodInfo implements Parcelable { } /** + * @return true if this input method supports ways to switch to a next input method. + * @hide + */ + public boolean supportsSwitchingToNextInputMethod() { + return mSupportsSwitchingToNextInputMethod; + } + + /** * Used to package this object into a {@link Parcel}. * * @param dest The {@link Parcel} to be written. @@ -446,6 +466,7 @@ public final class InputMethodInfo implements Parcelable { dest.writeString(mSettingsActivityName); dest.writeInt(mIsDefaultResId); dest.writeInt(mIsAuxIme ? 1 : 0); + dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0); mService.writeToParcel(dest, flags); dest.writeTypedList(mSubtypes); } diff --git a/core/java/android/view/transition/Fade.java b/core/java/android/view/transition/Fade.java index 4fd60c1..45c21d8 100644 --- a/core/java/android/view/transition/Fade.java +++ b/core/java/android/view/transition/Fade.java @@ -19,6 +19,7 @@ package android.view.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -35,6 +36,7 @@ public class Fade extends Visibility { private static boolean DBG = Transition.DBG && false; private static final String LOG_TAG = "Fade"; + private static final String PROPNAME_ALPHA = "android:fade:alpha"; private static final String PROPNAME_SCREEN_X = "android:fade:screenX"; private static final String PROPNAME_SCREEN_Y = "android:fade:screenY"; @@ -74,20 +76,28 @@ public class Fade extends Visibility { /** * Utility method to handle creating and running the Animator. */ - private Animator runAnimation(View view, float startAlpha, float endAlpha, - Animator.AnimatorListener listener) { + private Animator createAnimation(View view, float startAlpha, float endAlpha, + AnimatorListenerAdapter listener) { + if (startAlpha == endAlpha) { + // run listener if we're noop'ing the animation, to get the end-state results now + if (listener != null) { + listener.onAnimationEnd(null); + } + return null; + } final ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", startAlpha, endAlpha); if (listener != null) { anim.addListener(listener); + anim.addPauseListener(listener); } - // TODO: Maybe extract a method into Transition to run an animation that handles the - // duration/startDelay stuff for all subclasses. return anim; } @Override protected void captureValues(TransitionValues values, boolean start) { super.captureValues(values, start); + float alpha = values.view.getAlpha(); + values.values.put(PROPNAME_ALPHA, alpha); int[] loc = new int[2]; values.view.getLocationOnScreen(loc); values.values.put(PROPNAME_SCREEN_X, loc[0]); @@ -95,6 +105,23 @@ public class Fade extends Visibility { } @Override + protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + TransitionValues endValues) { + Animator animator = super.play(sceneRoot, startValues, endValues); + if (animator == null && startValues != null && endValues != null) { + boolean endVisible = isVisible(endValues); + final View endView = endValues.view; + float endAlpha = endView.getAlpha(); + float startAlpha = (Float) startValues.values.get(PROPNAME_ALPHA); + if ((endVisible && startAlpha < endAlpha && (mFadingMode & Fade.IN) != 0) || + (!endVisible && startAlpha > endAlpha && (mFadingMode & Fade.OUT) != 0)) { + animator = createAnimation(endView, startAlpha, endAlpha, null); + } + } + return animator; + } + + @Override protected Animator appear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { @@ -102,15 +129,11 @@ public class Fade extends Visibility { return null; } final View endView = endValues.view; - endView.setAlpha(0); - final Animator.AnimatorListener endListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - // Always end animation with full alpha, in case it's canceled mid-stream - endView.setAlpha(1); - } - }; - return runAnimation(endView, 0, 1, endListener); + // if alpha < 1, just fade it in from the current value + if (endView.getAlpha() == 1.0f) { + endView.setAlpha(0); + } + return createAnimation(endView, endView.getAlpha(), 1, null); } @Override @@ -129,7 +152,7 @@ public class Fade extends Visibility { } View overlayView = null; View viewToKeep = null; - if (endView == null) { + if (endView == null || endView.getParent() == null) { // view was removed: add the start view to the Overlay view = startView; overlayView = view; @@ -167,7 +190,7 @@ public class Fade extends Visibility { final View finalOverlayView = overlayView; final View finalViewToKeep = viewToKeep; final ViewGroup finalSceneRoot = sceneRoot; - final Animator.AnimatorListener endListener = new AnimatorListenerAdapter() { + final AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { finalView.setAlpha(startAlpha); @@ -179,8 +202,22 @@ public class Fade extends Visibility { finalSceneRoot.getOverlay().remove(finalOverlayView); } } + + @Override + public void onAnimationPause(Animator animation) { + if (finalOverlayView != null) { + finalSceneRoot.getOverlay().remove(finalOverlayView); + } + } + + @Override + public void onAnimationResume(Animator animation) { + if (finalOverlayView != null) { + finalSceneRoot.getOverlay().add(finalOverlayView); + } + } }; - return runAnimation(view, startAlpha, endAlpha, endListener); + return createAnimation(view, startAlpha, endAlpha, endListener); } if (viewToKeep != null) { // TODO: find a different way to do this, like just changing the view to be @@ -193,12 +230,42 @@ public class Fade extends Visibility { final View finalOverlayView = overlayView; final View finalViewToKeep = viewToKeep; final ViewGroup finalSceneRoot = sceneRoot; - final Animator.AnimatorListener endListener = new AnimatorListenerAdapter() { + final AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() { + boolean mCanceled = false; + float mPausedAlpha = -1; + @Override - public void onAnimationEnd(Animator animation) { + public void onAnimationPause(Animator animation) { + if (finalViewToKeep != null && !mCanceled) { + finalViewToKeep.setVisibility(finalVisibility); + } + mPausedAlpha = finalView.getAlpha(); finalView.setAlpha(startAlpha); + } + + @Override + public void onAnimationResume(Animator animation) { + if (finalViewToKeep != null && !mCanceled) { + finalViewToKeep.setVisibility(View.VISIBLE); + } + finalView.setAlpha(mPausedAlpha); + } + + @Override + public void onAnimationCancel(Animator animation) { + mCanceled = true; + if (mPausedAlpha >= 0) { + finalView.setAlpha(mPausedAlpha); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCanceled) { + finalView.setAlpha(startAlpha); + } // TODO: restore view offset from overlay repositioning - if (finalViewToKeep != null) { + if (finalViewToKeep != null && !mCanceled) { finalViewToKeep.setVisibility(finalVisibility); } if (finalOverlayView != null) { @@ -206,7 +273,7 @@ public class Fade extends Visibility { } } }; - return runAnimation(view, startAlpha, endAlpha, endListener); + return createAnimation(view, startAlpha, endAlpha, endListener); } return null; } diff --git a/core/java/android/view/transition/Move.java b/core/java/android/view/transition/Move.java index ceda5a5..ae7d759 100644 --- a/core/java/android/view/transition/Move.java +++ b/core/java/android/view/transition/Move.java @@ -25,8 +25,6 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; -import android.util.ArrayMap; -import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -42,6 +40,13 @@ public class Move extends Transition { private static final String PROPNAME_PARENT = "android:move:parent"; private static final String PROPNAME_WINDOW_X = "android:move:windowX"; private static final String PROPNAME_WINDOW_Y = "android:move:windowY"; + private static String[] sTransitionProperties = { + PROPNAME_BOUNDS, + PROPNAME_PARENT, + PROPNAME_WINDOW_X, + PROPNAME_WINDOW_Y + }; + int[] tempLocation = new int[2]; boolean mResizeClip = false; boolean mReparent = false; @@ -49,6 +54,11 @@ public class Move extends Transition { private static RectEvaluator sRectEvaluator = new RectEvaluator(); + @Override + public String[] getTransitionProperties() { + return sTransitionProperties; + } + public void setResizeClip(boolean resizeClip) { mResizeClip = resizeClip; } @@ -146,12 +156,33 @@ public class Move extends Transition { if (view.getParent() instanceof ViewGroup) { final ViewGroup parent = (ViewGroup) view.getParent(); parent.suppressLayout(true); - anim.addListener(new AnimatorListenerAdapter() { + TransitionListener transitionListener = new TransitionListenerAdapter() { + boolean mCanceled = false; + @Override - public void onAnimationEnd(Animator animation) { + public void onTransitionCancel(Transition transition) { parent.suppressLayout(false); + mCanceled = true; + } + + @Override + public void onTransitionEnd(Transition transition) { + if (!mCanceled) { + parent.suppressLayout(false); + } + } + + @Override + public void onTransitionPause(Transition transition) { + parent.suppressLayout(false); + } + + @Override + public void onTransitionResume(Transition transition) { + parent.suppressLayout(true); } - }); + }; + addListener(transitionListener); } return anim; } else { @@ -191,12 +222,33 @@ public class Move extends Transition { if (view.getParent() instanceof ViewGroup) { final ViewGroup parent = (ViewGroup) view.getParent(); parent.suppressLayout(true); - anim.addListener(new AnimatorListenerAdapter() { + TransitionListener transitionListener = new TransitionListenerAdapter() { + boolean mCanceled = false; + @Override - public void onAnimationEnd(Animator animation) { + public void onTransitionCancel(Transition transition) { parent.suppressLayout(false); + mCanceled = true; + } + + @Override + public void onTransitionEnd(Transition transition) { + if (!mCanceled) { + parent.suppressLayout(false); + } + } + + @Override + public void onTransitionPause(Transition transition) { + parent.suppressLayout(false); + } + + @Override + public void onTransitionResume(Transition transition) { + parent.suppressLayout(true); } - }); + }; + addListener(transitionListener); } anim.addListener(new AnimatorListenerAdapter() { @Override diff --git a/core/java/android/view/transition/Transition.java b/core/java/android/view/transition/Transition.java index f99ddc0..0444843 100644 --- a/core/java/android/view/transition/Transition.java +++ b/core/java/android/view/transition/Transition.java @@ -22,7 +22,6 @@ import android.animation.TimeInterpolator; import android.util.ArrayMap; import android.util.Log; import android.util.LongSparseArray; -import android.util.Pair; import android.util.SparseArray; import android.view.SurfaceView; import android.view.TextureView; @@ -60,6 +59,8 @@ public abstract class Transition implements Cloneable { private static final String LOG_TAG = "Transition"; static final boolean DBG = false; + private String mName = getClass().getName(); + long mStartDelay = -1; long mDuration = -1; TimeInterpolator mInterpolator = null; @@ -69,29 +70,29 @@ public abstract class Transition implements Cloneable { private TransitionValuesMaps mEndValues = new TransitionValuesMaps(); TransitionGroup mParent = null; + // Per-animator information used for later canceling when future transitions overlap + private static ThreadLocal<ArrayMap<Animator, AnimationInfo>> sRunningAnimators = + new ThreadLocal<ArrayMap<Animator, AnimationInfo>>(); + // Scene Root is set at play() time in the cloned Transition ViewGroup mSceneRoot = null; - // Used to carry data between setup() and play(), cleared before every scene transition - private ArrayList<TransitionValues> mPlayStartValuesList = new ArrayList<TransitionValues>(); - private ArrayList<TransitionValues> mPlayEndValuesList = new ArrayList<TransitionValues>(); - // Track all animators in use in case the transition gets canceled and needs to // cancel running animators private ArrayList<Animator> mCurrentAnimators = new ArrayList<Animator>(); // Number of per-target instances of this Transition currently running. This count is - // determined by calls to startTransition() and endTransition() + // determined by calls to start() and end() int mNumInstances = 0; - + // Whether this transition is currently paused, due to a call to pause() + boolean mPaused = false; // The set of listeners to be sent transition lifecycle events. ArrayList<TransitionListener> mListeners = null; // The set of animators collected from calls to play(), to be run in runAnimations() - ArrayMap<Pair<TransitionValues, TransitionValues>, Animator> mAnimatorMap = - new ArrayMap<Pair<TransitionValues, TransitionValues>, Animator>(); + ArrayList<Animator> mAnimators = new ArrayList<Animator>(); /** * Constructs a Transition object with no target objects. A transition with @@ -115,6 +116,14 @@ public abstract class Transition implements Cloneable { return this; } + /** + * Returns the duration set on this transition. If no duration has been set, + * the returned value will be negative, indicating that resulting animators will + * retain their own durations. + * + * @return The duration set on this transition, if one has been set, otherwise + * returns a negative number. + */ public long getDuration() { return mDuration; } @@ -131,6 +140,14 @@ public abstract class Transition implements Cloneable { mStartDelay = startDelay; } + /** + * Returns the startDelay set on this transition. If no startDelay has been set, + * the returned value will be negative, indicating that resulting animators will + * retain their own startDelays. + * + * @return The startDealy set on this transition, if one has been set, otherwise + * returns a negative number. + */ public long getStartDelay() { return mStartDelay; } @@ -147,11 +164,44 @@ public abstract class Transition implements Cloneable { mInterpolator = interpolator; } + /** + * Returns the interpolator set on this transition. If no interpolator has been set, + * the returned value will be null, indicating that resulting animators will + * retain their own interpolators. + * + * @return The interpolator set on this transition, if one has been set, otherwise + * returns null. + */ public TimeInterpolator getInterpolator() { return mInterpolator; } /** + * Returns the set of property names used stored in the {@link TransitionValues} + * object passed into {@link #captureValues(TransitionValues, boolean)} that + * this transition cares about for the purposes of canceling overlapping animations. + * When any transition is started on a given scene root, all transitions + * currently running on that same scene root are checked to see whether the + * properties on which they based their animations agree with the end values of + * the same properties in the new transition. If the end values are not equal, + * then the old animation is canceled since the new transition will start a new + * animation to these new values. If the values are equal, the old animation is + * allowed to continue and no new animation is started for that transition. + * + * <p>A transition does not need to override this method. However, not doing so + * will mean that the cancellation logic outlined in the previous paragraph + * will be skipped for that transition, possibly leading to artifacts as + * old transitions and new transitions on the same targets run in parallel, + * animating views toward potentially different end values.</p> + * + * @return An array of property names as described in the class documentation for + * {@link TransitionValues}. The default implementation returns <code>null</code>. + */ + public String[] getTransitionProperties() { + return null; + } + + /** * This method is called by the transition's parent (all the way up to the * topmost Transition in the hierarchy) with the sceneRoot and start/end * values that the transition may need to set up initial target values @@ -210,8 +260,6 @@ public abstract class Transition implements Cloneable { if (DBG) { Log.d(LOG_TAG, "play() for " + this); } - mPlayStartValuesList.clear(); - mPlayEndValuesList.clear(); ArrayMap<View, TransitionValues> endCopy = new ArrayMap<View, TransitionValues>(endValues.viewValues); SparseArray<TransitionValues> endIdCopy = @@ -316,6 +364,7 @@ public abstract class Transition implements Cloneable { startValuesList.add(start); endValuesList.add(end); } + ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); for (int i = 0; i < startValuesList.size(); ++i) { TransitionValues start = startValuesList.get(i); TransitionValues end = endValuesList.get(i); @@ -345,14 +394,46 @@ public abstract class Transition implements Cloneable { // TODO: what to do about targetIds and itemIds? Animator animator = play(sceneRoot, start, end); if (animator != null) { - mAnimatorMap.put(new Pair(start, end), animator); - // Note: we've already done the check against targetIDs in these lists - mPlayStartValuesList.add(start); - mPlayEndValuesList.add(end); + // Save animation info for future cancellation purposes + View view = null; + TransitionValues infoValues = null; + if (end != null) { + view = end.view; + String[] properties = getTransitionProperties(); + if (view != null && properties != null && properties.length > 0) { + infoValues = new TransitionValues(); + infoValues.view = view; + TransitionValues newValues = endValues.viewValues.get(view); + if (newValues != null) { + for (int j = 0; j < properties.length; ++j) { + infoValues.values.put(properties[j], + newValues.values.get(properties[j])); + } + } + int numExistingAnims = runningAnimators.size(); + for (int j = 0; j < numExistingAnims; ++j) { + Animator anim = runningAnimators.keyAt(j); + AnimationInfo info = runningAnimators.get(anim); + if (info.values != null && info.view == view && + ((info.name == null && getName() == null) || + info.name.equals(getName()))) { + if (info.values.equals(infoValues)) { + // Favor the old animator + animator = null; + break; + } + } + } + } + } else { + view = (start != null) ? start.view : null; + } + if (animator != null) { + AnimationInfo info = new AnimationInfo(view, getName(), infoValues); + runningAnimators.put(animator, info); + mAnimators.add(animator); + } } - } else if (DBG) { - View view = (end != null) ? end.view : start.view; - Log.d(LOG_TAG, " No change for view " + view); } } } @@ -389,6 +470,15 @@ public abstract class Transition implements Cloneable { return false; } + private static ArrayMap<Animator, AnimationInfo> getRunningAnimators() { + ArrayMap<Animator, AnimationInfo> runningAnimators = sRunningAnimators.get(); + if (runningAnimators == null) { + runningAnimators = new ArrayMap<Animator, AnimationInfo>(); + sRunningAnimators.set(runningAnimators); + } + return runningAnimators; + } + /** * This is called internally once all animations have been set up by the * transition hierarchy. \ @@ -396,28 +486,27 @@ public abstract class Transition implements Cloneable { * @hide */ protected void runAnimations() { - if (DBG && mPlayStartValuesList.size() > 0) { - Log.d(LOG_TAG, "runAnimations (" + mPlayStartValuesList.size() + ") on " + this); - } - startTransition(); - // Now walk the list of TransitionValues, calling play for each pair - for (int i = 0; i < mPlayStartValuesList.size(); ++i) { - TransitionValues start = mPlayStartValuesList.get(i); - TransitionValues end = mPlayEndValuesList.get(i); - Animator anim = mAnimatorMap.get(new Pair(start, end)); + if (DBG) { + Log.d(LOG_TAG, "runAnimations() on " + this); + } + start(); + ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); + // Now start every Animator that was previously created for this transition in play() + for (Animator anim : mAnimators) { if (DBG) { Log.d(LOG_TAG, " anim: " + anim); } - startTransition(); - runAnimator(anim); + if (runningAnimators.containsKey(anim)) { + start(); + runAnimator(anim, runningAnimators); + } } - mPlayStartValuesList.clear(); - mPlayEndValuesList.clear(); - mAnimatorMap.clear(); - endTransition(); + mAnimators.clear(); + end(); } - private void runAnimator(Animator animator) { + private void runAnimator(Animator animator, + final ArrayMap<Animator, AnimationInfo> runningAnimators) { if (animator != null) { // TODO: could be a single listener instance for all of them since it uses the param animator.addListener(new AnimatorListenerAdapter() { @@ -427,6 +516,7 @@ public abstract class Transition implements Cloneable { } @Override public void onAnimationEnd(Animator animation) { + runningAnimators.remove(animation); mCurrentAnimators.remove(animation); } }); @@ -691,11 +781,112 @@ public abstract class Transition implements Cloneable { } /** + * Pauses this transition, sending out calls to {@link + * TransitionListener#onTransitionPause(Transition)} to all listeners + * and pausing all running animators started by this transition. + * + * @hide + */ + public void pause() { + ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); + int numOldAnims = runningAnimators.size(); + for (int i = numOldAnims - 1; i >= 0; i--) { + Animator anim = runningAnimators.keyAt(i); + anim.pause(); + } + if (mListeners != null && mListeners.size() > 0) { + ArrayList<TransitionListener> tmpListeners = + (ArrayList<TransitionListener>) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onTransitionPause(this); + } + } + mPaused = true; + } + + /** + * Resumes this transition, sending out calls to {@link + * TransitionListener#onTransitionPause(Transition)} to all listeners + * and pausing all running animators started by this transition. + * + * @hide + */ + public void resume() { + if (mPaused) { + ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); + int numOldAnims = runningAnimators.size(); + for (int i = numOldAnims - 1; i >= 0; i--) { + Animator anim = runningAnimators.keyAt(i); + anim.resume(); + } + if (mListeners != null && mListeners.size() > 0) { + ArrayList<TransitionListener> tmpListeners = + (ArrayList<TransitionListener>) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onTransitionResume(this); + } + } + mPaused = false; + } + } + + /** * Called by TransitionManager to play the transition. This calls * play() to set things up and create all of the animations and then * runAnimations() to actually start the animations. */ void playTransition(ViewGroup sceneRoot) { + ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); + int numOldAnims = runningAnimators.size(); + for (int i = numOldAnims - 1; i >= 0; i--) { + Animator anim = runningAnimators.keyAt(i); + if (anim != null) { + anim.resume(); + AnimationInfo oldInfo = runningAnimators.get(anim); + if (oldInfo != null) { + boolean cancel = false; + TransitionValues oldValues = oldInfo.values; + View oldView = oldInfo.view; + TransitionValues newValues = mEndValues.viewValues != null ? + mEndValues.viewValues.get(oldView) : null; + if (oldValues == null || newValues == null) { + if (oldValues != null || newValues != null) { + cancel = true; + } + } else { + for (String key : oldValues.values.keySet()) { + Object oldValue = oldValues.values.get(key); + Object newValue = newValues.values.get(key); + if ((oldValue == null && newValue != null) || + (oldValue != null && !oldValue.equals(newValue))) { + cancel = true; + if (DBG) { + Log.d(LOG_TAG, "Transition.play: oldValue != newValue for " + + key + ": old, new = " + oldValue + ", " + newValue); + } + break; + } + } + } + if (cancel) { + if (anim.isRunning() || anim.isStarted()) { + if (DBG) { + Log.d(LOG_TAG, "Canceling anim " + anim); + } + anim.cancel(); + } else { + if (DBG) { + Log.d(LOG_TAG, "removing anim from info list: " + anim); + } + runningAnimators.remove(anim); + } + } + } + } + } + // setup() must be called on entire transition hierarchy and set of views // before calling play() on anything; every transition needs a chance to set up // target views appropriately before transitions begin running @@ -707,7 +898,7 @@ public abstract class Transition implements Cloneable { * This is a utility method used by subclasses to handle standard parts of * setting up and running an Animator: it sets the {@link #getDuration() * duration} and the {@link #getStartDelay() startDelay}, starts the - * animation, and, when the animator ends, calls {@link #endTransition()}. + * animation, and, when the animator ends, calls {@link #end()}. * * @param animator The Animator to be run during this transition. * @@ -716,7 +907,7 @@ public abstract class Transition implements Cloneable { protected void animate(Animator animator) { // TODO: maybe pass auto-end as a boolean parameter? if (animator == null) { - endTransition(); + end(); } else { if (getDuration() >= 0) { animator.setDuration(getDuration()); @@ -730,7 +921,7 @@ public abstract class Transition implements Cloneable { animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - endTransition(); + end(); animation.removeListener(this); } }); @@ -739,39 +930,14 @@ public abstract class Transition implements Cloneable { } /** - * Subclasses may override to receive notice of when the transition starts. - * This is equivalent to listening for the - * {@link TransitionListener#onTransitionStart(Transition)} callback. - */ - protected void onTransitionStart() { - } - - /** - * Subclasses may override to receive notice of when the transition is - * canceled. This is equivalent to listening for the - * {@link TransitionListener#onTransitionCancel(Transition)} callback. - */ - protected void onTransitionCancel() { - } - - /** - * Subclasses may override to receive notice of when the transition ends. - * This is equivalent to listening for the - * {@link TransitionListener#onTransitionEnd(Transition)} callback. - */ - protected void onTransitionEnd() { - } - - /** * This method is called automatically by the transition and * TransitionGroup classes prior to a Transition subclass starting; * subclasses should not need to call it directly. * * @hide */ - protected void startTransition() { + protected void start() { if (mNumInstances == 0) { - onTransitionStart(); if (mListeners != null && mListeners.size() > 0) { ArrayList<TransitionListener> tmpListeners = (ArrayList<TransitionListener>) mListeners.clone(); @@ -790,15 +956,14 @@ public abstract class Transition implements Cloneable { * a transition did nothing (returned a null Animator from * {@link Transition#play(ViewGroup, TransitionValues, * TransitionValues)}) or because the transition returned a valid - * Animator and endTransition() was called in the onAnimationEnd() + * Animator and end() was called in the onAnimationEnd() * callback of the AnimatorListener. * * @hide */ - protected void endTransition() { + protected void end() { --mNumInstances; if (mNumInstances == 0) { - onTransitionEnd(); if (mListeners != null && mListeners.size() > 0) { ArrayList<TransitionListener> tmpListeners = (ArrayList<TransitionListener>) mListeners.clone(); @@ -828,7 +993,7 @@ public abstract class Transition implements Cloneable { * This method cancels a transition that is currently running. * Implementation TBD. */ - protected void cancelTransition() { + protected void cancel() { // TODO: how does this work with instances? // TODO: this doesn't actually do *anything* yet int numAnimators = mCurrentAnimators.size(); @@ -836,7 +1001,6 @@ public abstract class Transition implements Cloneable { Animator animator = mCurrentAnimators.get(i); animator.cancel(); } - onTransitionCancel(); if (mListeners != null && mListeners.size() > 0) { ArrayList<TransitionListener> tmpListeners = (ArrayList<TransitionListener>) mListeners.clone(); @@ -901,11 +1065,28 @@ public abstract class Transition implements Cloneable { Transition clone = null; try { clone = (Transition) super.clone(); + clone.mAnimators = new ArrayList<Animator>(); } catch (CloneNotSupportedException e) {} return clone; } + /** + * Returns the name of this Transition. This name is used internally to distinguish + * between different transitions to determine when interrupting transitions overlap. + * For example, a Move running on the same target view as another Move should determine + * whether the old transition is animating to different end values and should be + * canceled in favor of the new transition. + * + * <p>By default, a Transition's name is simply the value of {@link Class#getName()}, + * but subclasses are free to override and return something different.</p> + * + * @return The name of this transition. + */ + public String getName() { + return mName; + } + String toString(String indent) { String result = indent + getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + ": "; @@ -943,8 +1124,7 @@ public abstract class Transition implements Cloneable { /** * A transition listener receives notifications from a transition. - * Notifications indicate transition lifecycle events: when the transition - * begins, ends, or is canceled. + * Notifications indicate transition lifecycle events. */ public static interface TransitionListener { /** @@ -957,7 +1137,7 @@ public abstract class Transition implements Cloneable { /** * Notification about the end of the transition. Canceled transitions * will always notify listeners of both the cancellation and end - * events. That is, {@link #onTransitionEnd()} is always called, + * events. That is, {@link #onTransitionEnd(Transition)} is always called, * regardless of whether the transition was canceled or played * through to completion. * @@ -967,10 +1147,38 @@ public abstract class Transition implements Cloneable { /** * Notification about the cancellation of the transition. + * Note that cancel() may be called by a parent {@link TransitionGroup} on + * a child transition which has not yet started. This allows the child + * transition to restore state on target objects which was set at + * {@link #play(android.view.ViewGroup, TransitionValues, TransitionValues) + * play()} time. * * @param transition The transition which was canceled. */ void onTransitionCancel(Transition transition); + + /** + * Notification when a transition is paused. + * Note that play() may be called by a parent {@link TransitionGroup} on + * a child transition which has not yet started. This allows the child + * transition to restore state on target objects which was set at + * {@link #play(android.view.ViewGroup, TransitionValues, TransitionValues) + * play()} time. + * + * @param transition The transition which was paused. + */ + void onTransitionPause(Transition transition); + + /** + * Notification when a transition is resumed. + * Note that resume() may be called by a parent {@link TransitionGroup} on + * a child transition which has not yet started. This allows the child + * transition to restore state which may have changed in an earlier call + * to {@link #onTransitionPause(Transition)}. + * + * @param transition The transition which was resumed. + */ + void onTransitionResume(Transition transition); } /** @@ -991,6 +1199,32 @@ public abstract class Transition implements Cloneable { @Override public void onTransitionCancel(Transition transition) { } + + @Override + public void onTransitionPause(Transition transition) { + } + + @Override + public void onTransitionResume(Transition transition) { + } } + /** + * Holds information about each animator used when a new transition starts + * while other transitions are still running to determine whether a running + * animation should be canceled or a new animation noop'd. The structure holds + * information about the state that an animation is going to, to be compared to + * end state of a new animation. + */ + private static class AnimationInfo { + View view; + String name; + TransitionValues values; + + AnimationInfo(View view, String name, TransitionValues values) { + this.view = view; + this.name = name; + this.values = values; + } + } } diff --git a/core/java/android/view/transition/TransitionGroup.java b/core/java/android/view/transition/TransitionGroup.java index 313e33e..b3bacde 100644 --- a/core/java/android/view/transition/TransitionGroup.java +++ b/core/java/android/view/transition/TransitionGroup.java @@ -164,7 +164,7 @@ public class TransitionGroup extends Transition { @Override public void onTransitionStart(Transition transition) { if (!mTransitionGroup.mStarted) { - mTransitionGroup.startTransition(); + mTransitionGroup.start(); mTransitionGroup.mStarted = true; } } @@ -175,7 +175,7 @@ public class TransitionGroup extends Transition { if (mTransitionGroup.mCurrentListeners == 0) { // All child trans mTransitionGroup.mStarted = false; - mTransitionGroup.endTransition(); + mTransitionGroup.end(); } transition.removeListener(this); } @@ -233,12 +233,32 @@ public class TransitionGroup extends Transition { } } + /** @hide */ @Override - protected void cancelTransition() { - super.cancelTransition(); + public void pause() { + super.pause(); int numTransitions = mTransitions.size(); for (int i = 0; i < numTransitions; ++i) { - mTransitions.get(i).cancelTransition(); + mTransitions.get(i).pause(); + } + } + + /** @hide */ + @Override + public void resume() { + super.resume(); + int numTransitions = mTransitions.size(); + for (int i = 0; i < numTransitions; ++i) { + mTransitions.get(i).resume(); + } + } + + @Override + protected void cancel() { + super.cancel(); + int numTransitions = mTransitions.size(); + for (int i = 0; i < numTransitions; ++i) { + mTransitions.get(i).cancel(); } } diff --git a/core/java/android/view/transition/TransitionManager.java b/core/java/android/view/transition/TransitionManager.java index 7836268..3cb6f68 100644 --- a/core/java/android/view/transition/TransitionManager.java +++ b/core/java/android/view/transition/TransitionManager.java @@ -18,6 +18,7 @@ package android.view.transition; import android.util.ArrayMap; import android.util.Log; +import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -45,8 +46,8 @@ public class TransitionManager { ArrayMap<Scene, Transition> mSceneTransitions = new ArrayMap<Scene, Transition>(); ArrayMap<Scene, ArrayMap<Scene, Transition>> mScenePairTransitions = new ArrayMap<Scene, ArrayMap<Scene, Transition>>(); - static ArrayMap<ViewGroup, Transition> sRunningTransitions = - new ArrayMap<ViewGroup, Transition>(); + private static ThreadLocal<ArrayMap<ViewGroup, ArrayList<Transition>>> sRunningTransitions = + new ThreadLocal<ArrayMap<ViewGroup, ArrayList<Transition>>>(); private static ArrayList<ViewGroup> sPendingTransitions = new ArrayList<ViewGroup>(); @@ -160,6 +161,16 @@ public class TransitionManager { sceneChangeRunTransition(sceneRoot, transitionClone); } + private static ArrayMap<ViewGroup, ArrayList<Transition>> getRunningTransitions() { + ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions = + sRunningTransitions.get(); + if (runningTransitions == null) { + runningTransitions = new ArrayMap<ViewGroup, ArrayList<Transition>>(); + sRunningTransitions.set(runningTransitions); + } + return runningTransitions; + } + private static void sceneChangeRunTransition(final ViewGroup sceneRoot, final Transition transition) { if (transition != null) { @@ -169,16 +180,31 @@ public class TransitionManager { sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); sPendingTransitions.remove(sceneRoot); // Add to running list, handle end to remove it - sRunningTransitions.put(sceneRoot, transition); + final ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions = + getRunningTransitions(); + ArrayList<Transition> currentTransitions = runningTransitions.get(sceneRoot); + if (currentTransitions == null) { + currentTransitions = new ArrayList<Transition>(); + runningTransitions.put(sceneRoot, currentTransitions); + } + currentTransitions.add(transition); transition.addListener(new Transition.TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { - sRunningTransitions.remove(sceneRoot); + ArrayList<Transition> currentTransitions = + runningTransitions.get(sceneRoot); + currentTransitions.remove(transition); } }); transition.captureValues(sceneRoot, false); transition.playTransition(sceneRoot); - return true; + + // Returning false from onPreDraw() skips the current frame. This is + // necessary to avoid artifacts caused by resetting target views + // to their proper end states for capturing. Waiting until the next + // frame to draw allows these views to have their mid-transition + // values set on them again and avoid artifacts. + return false; } }); } @@ -187,14 +213,16 @@ public class TransitionManager { private static void sceneChangeSetup(ViewGroup sceneRoot, Transition transition) { // Capture current values - Transition runningTransition = sRunningTransitions.get(sceneRoot); + ArrayList<Transition> runningTransitions = getRunningTransitions().get(sceneRoot); - if (transition != null) { - transition.captureValues(sceneRoot, true); + if (runningTransitions != null && runningTransitions.size() > 0) { + for (Transition runningTransition : runningTransitions) { + runningTransition.pause(); + } } - if (runningTransition != null) { - runningTransition.cancelTransition(); + if (transition != null) { + transition.captureValues(sceneRoot, true); } // Notify previous scene that it is being exited diff --git a/core/java/android/view/transition/Visibility.java b/core/java/android/view/transition/Visibility.java index 6d39ab6..96ea044 100644 --- a/core/java/android/view/transition/Visibility.java +++ b/core/java/android/view/transition/Visibility.java @@ -19,6 +19,7 @@ package android.view.transition; import android.animation.Animator; import android.view.View; import android.view.ViewGroup; +import android.view.ViewOverlay; import android.view.ViewParent; /** @@ -38,6 +39,10 @@ public abstract class Visibility extends Transition { private static final String PROPNAME_VISIBILITY = "android:visibility:visibility"; private static final String PROPNAME_PARENT = "android:visibility:parent"; + private static String[] sTransitionProperties = { + PROPNAME_VISIBILITY, + PROPNAME_PARENT, + }; private static class VisibilityInfo { boolean visibilityChange; @@ -52,12 +57,42 @@ public abstract class Visibility extends Transition { private VisibilityInfo mTmpVisibilityInfo = new VisibilityInfo(); @Override + public String[] getTransitionProperties() { + return sTransitionProperties; + } + + @Override protected void captureValues(TransitionValues values, boolean start) { int visibility = values.view.getVisibility(); values.values.put(PROPNAME_VISIBILITY, visibility); values.values.put(PROPNAME_PARENT, values.view.getParent()); } + /** + * Returns whether the view is 'visible' according to the given values + * object. This is determined by testing the same properties in the values + * object that are used to determine whether the object is appearing or + * disappearing in the {@link + * #play(android.view.ViewGroup, TransitionValues, TransitionValues)} + * method. This method can be called by, for example, subclasses that want + * to know whether the object is visible in the same way that Visibility + * determines it for the actual animation. + * + * @param values The TransitionValues object that holds the information by + * which visibility is determined. + * @return True if the view reference by <code>values</code> is visible, + * false otherwise. + */ + public boolean isVisible(TransitionValues values) { + if (values == null) { + return false; + } + int visibility = (Integer) values.values.get(PROPNAME_VISIBILITY); + View parent = (View) values.values.get(PROPNAME_PARENT); + + return visibility == View.VISIBLE && parent != null; + } + private boolean isHierarchyVisibilityChanging(ViewGroup sceneRoot, ViewGroup view) { if (view == sceneRoot) { @@ -197,5 +232,4 @@ public abstract class Visibility extends Transition { TransitionValues endValues, int endVisibility) { return null; } - } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 0224fbe..1b57d50 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -28,6 +28,7 @@ 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; @@ -780,7 +781,8 @@ public class WebView extends AbsoluteLayout * {@link #loadUrl(String)} instead. * * @param url the URL of the resource to load - * @param postData the data will be passed to "POST" request + * @param postData the data will be passed to "POST" request, which must be + * be "application/x-www-form-urlencoded" encoded. */ public void postUrl(String url, byte[] postData) { checkThread(); @@ -1042,24 +1044,26 @@ public class WebView extends AbsoluteLayout * @param width The page width. Should be larger than 0. * @param height The page height. Should be larger than 0. * @param resultCallback A callback to be invoked when the PDF content is exported. - * A true indicates success, and a false failure. - * - * TODO: explain method parameters, margins, consider making the callback - * return more meaningful information, explain any threading concerns, HW - * draw limitations, and make it public. - * TODO: at the moment we are asking app to provide paper size information (width - * and height). This is likely not ideal (I think need margin info too). - * Another approach would be using PrintAttributes. This is to be clarified later. - * - * TODO: explain this webview will not draw during export (onDraw will clear to - * background color) so recommend taking it offscreen, or putting in a layer with an - * overlaid progress UI / spinner. + * A true indicates success, and a false failure. Cannot be null. + * @param cancellationSignal Signal for cancelling the PDF conversion request. Must not + * be null. + * + * The PDF conversion is done asynchronously and the PDF output is written to the provided + * outputstream. The caller should not close the outputstream until the resultCallback is + * called, indicating PDF conversion is complete. Webview cannot be drawn during the pdf + * export so the application is recommended to take it offscreen, or putting in a layer + * with an overlaid progress UI / spinner. + * + * If the caller cancels the task using the cancellationSignal, the cancellation will be + * acked using the resultCallback signal. + * + * TODO(sgurun) margins, explain the units, make it public. * @hide */ public void exportToPdf(OutputStream out, int width, int height, - ValueCallback<Boolean> resultCallback) { + ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) { checkThread(); - mProvider.exportToPdf(out, width, height, resultCallback); + mProvider.exportToPdf(out, width, height, resultCallback, cancellationSignal); } /** diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 228de5b..db98d30 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -57,6 +57,7 @@ import android.net.http.SslCertificate; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.os.CancellationSignal; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -2896,7 +2897,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc */ @Override public void exportToPdf(java.io.OutputStream out, int width, int height, - ValueCallback<Boolean> resultCallback) { + ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) { // K-only API not implemented in WebViewClassic. throw new IllegalStateException("This API not supported on Android 4.3 and earlier"); diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index 17b4061..8fe6edf 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -25,6 +25,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.http.SslCertificate; import android.os.Bundle; +import android.os.CancellationSignal; import android.os.Message; import android.view.KeyEvent; import android.view.MotionEvent; @@ -148,7 +149,7 @@ public interface WebViewProvider { public Picture capturePicture(); public void exportToPdf(OutputStream out, int width, int height, - ValueCallback<Boolean> resultCallback); + ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal); public float getScale(); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 07198c7..285e6f2 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1211,13 +1211,19 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * Enables fast scrolling by letting the user quickly scroll through lists by - * dragging the fast scroll thumb. The adapter attached to the list may want - * to implement {@link SectionIndexer} if it wishes to display alphabet preview and - * jump between sections of the list. + * Specifies whether fast scrolling is enabled or disabled. + * <p> + * When fast scrolling is enabled, the user can quickly scroll through lists + * by dragging the fast scroll thumb. + * <p> + * If the adapter backing this list implements {@link SectionIndexer}, the + * fast scroller will display section header previews as the user scrolls. + * Additionally, the user will be able to quickly jump between sections by + * tapping along the length of the scroll bar. + * * @see SectionIndexer * @see #isFastScrollEnabled() - * @param enabled whether or not to enable fast scrolling + * @param enabled true to enable fast scrolling, false otherwise */ public void setFastScrollEnabled(final boolean enabled) { if (mFastScrollEnabled != enabled) { @@ -1252,13 +1258,16 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * Set whether or not the fast scroller should always be shown in place of the - * standard scrollbars. Fast scrollers shown in this way will not fade out and will - * be a permanent fixture within the list. Best combined with an inset scroll bar style - * that will ensure enough padding. This will enable fast scrolling if it is not + * Set whether or not the fast scroller should always be shown in place of + * the standard scroll bars. This will enable fast scrolling if it is not * already enabled. + * <p> + * Fast scrollers shown in this way will not fade out and will be a + * permanent fixture within the list. This is best combined with an inset + * scroll bar style to ensure the scroll bar does not overlap content. * - * @param alwaysShow true if the fast scroller should always be displayed. + * @param alwaysShow true if the fast scroller should always be displayed, + * false otherwise * @see #setScrollBarStyle(int) * @see #setFastScrollEnabled(boolean) */ @@ -1297,10 +1306,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * Returns true if the fast scroller is set to always show on this view rather than - * fade out when not in use. + * Returns true if the fast scroller is set to always show on this view. * - * @return true if the fast scroller will always show. + * @return true if the fast scroller will always show * @see #setFastScrollAlwaysVisible(boolean) */ public boolean isFastScrollAlwaysVisible() { @@ -1316,7 +1324,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * Returns the current state of the fast scroll feature. + * Returns true if the fast scroller is enabled. + * * @see #setFastScrollEnabled(boolean) * @return true if fast scroll is enabled, false otherwise */ diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 414c318..2b4e520 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -16,6 +16,9 @@ package android.widget; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Rect; @@ -23,6 +26,7 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; +import android.util.IntProperty; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; @@ -31,6 +35,7 @@ import android.view.View.MeasureSpec; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.animation.AccelerateDecelerateInterpolator; import java.util.Locale; @@ -956,6 +961,33 @@ public class ListPopupWindow { } /** + * Receives motion events forwarded from a source view. This is used + * internally to implement support for drag-to-open. + * + * @param src view from which the event was forwarded + * @param srcEvent forwarded motion event in source-local coordinates + * @param activePointerId id of the pointer that activated forwarding + * @return whether the event was handled + * @hide + */ + public boolean onForwardedEvent(View src, MotionEvent srcEvent, int activePointerId) { + final DropDownListView dst = mDropDownList; + if (dst == null || !dst.isShown()) { + return false; + } + + // Convert event to local coordinates. + final MotionEvent dstEvent = MotionEvent.obtainNoHistory(srcEvent); + src.toGlobalMotionEvent(dstEvent); + dst.toLocalMotionEvent(dstEvent); + + // Forward converted event, then recycle it. + final boolean handled = dst.onForwardedEvent(dstEvent, activePointerId); + dstEvent.recycle(); + return handled; + } + + /** * <p>Builds the popup window's content and returns the height the popup * should have. Returns -1 when the content already exists.</p> * @@ -1130,6 +1162,27 @@ public class ListPopupWindow { */ private static class DropDownListView extends ListView { private static final String TAG = ListPopupWindow.TAG + ".DropDownListView"; + + /** Duration in milliseconds of the drag-to-open click animation. */ + private static final long CLICK_ANIM_DURATION = 150; + + /** Target alpha value for drag-to-open click animation. */ + private static final int CLICK_ANIM_ALPHA = 0x80; + + /** Wrapper around Drawable's <code>alpha</code> property. */ + private static final IntProperty<Drawable> DRAWABLE_ALPHA = + new IntProperty<Drawable>("alpha") { + @Override + public void setValue(Drawable object, int value) { + object.setAlpha(value); + } + + @Override + public Integer get(Drawable object) { + return object.getAlpha(); + } + }; + /* * WARNING: This is a workaround for a touch mode issue. * @@ -1165,6 +1218,12 @@ public class ListPopupWindow { */ private boolean mHijackFocus; + /** Whether to force drawing of the pressed state selector. */ + private boolean mDrawsInPressedState; + + /** Current drag-to-open click animation, if any. */ + private Animator mClickAnimation; + /** * <p>Creates a new list view wrapper.</p> * @@ -1178,6 +1237,119 @@ public class ListPopupWindow { } /** + * Handles forwarded events. + * + * @param activePointerId id of the pointer that activated forwarding + * @return whether the event was handled + */ + public boolean onForwardedEvent(MotionEvent event, int activePointerId) { + boolean handledEvent = true; + boolean clearPressedItem = false; + + final int actionMasked = event.getActionMasked(); + switch (actionMasked) { + case MotionEvent.ACTION_CANCEL: + handledEvent = false; + break; + case MotionEvent.ACTION_UP: + handledEvent = false; + // $FALL-THROUGH$ + case MotionEvent.ACTION_MOVE: + final int activeIndex = event.findPointerIndex(activePointerId); + if (activeIndex < 0) { + handledEvent = false; + break; + } + + final int x = (int) event.getX(activeIndex); + final int y = (int) event.getY(activeIndex); + final int position = pointToPosition(x, y); + if (position == INVALID_POSITION) { + clearPressedItem = true; + break; + } + + final View child = getChildAt(position - getFirstVisiblePosition()); + setPressedItem(child, position); + handledEvent = true; + + if (actionMasked == MotionEvent.ACTION_UP) { + clickPressedItem(child, position); + } + break; + } + + // Failure to handle the event cancels forwarding. + if (!handledEvent || clearPressedItem) { + clearPressedItem(); + } + + return handledEvent; + } + + /** + * Starts an alpha animation on the selector. When the animation ends, + * the list performs a click on the item. + */ + private void clickPressedItem(final View child, final int position) { + final long id = getItemIdAtPosition(position); + final Animator anim = ObjectAnimator.ofInt( + mSelector, DRAWABLE_ALPHA, 0xFF, CLICK_ANIM_ALPHA, 0xFF); + anim.setDuration(CLICK_ANIM_DURATION); + anim.setInterpolator(new AccelerateDecelerateInterpolator()); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + performItemClick(child, position, id); + } + }); + anim.start(); + + if (mClickAnimation != null) { + mClickAnimation.cancel(); + } + mClickAnimation = anim; + } + + private void clearPressedItem() { + mDrawsInPressedState = false; + setPressed(false); + updateSelectorState(); + + if (mClickAnimation != null) { + mClickAnimation.cancel(); + mClickAnimation = null; + } + } + + private void setPressedItem(View child, int position) { + mDrawsInPressedState = true; + + // Ordering is essential. First update the pressed state and layout + // the children. This will ensure the selector actually gets drawn. + setPressed(true); + layoutChildren(); + + // Ensure that keyboard focus starts from the last touched position. + setSelectedPositionInt(position); + positionSelector(position, child); + + // Refresh the drawable state to reflect the new pressed state, + // which will also update the selector state. + refreshDrawableState(); + + if (mClickAnimation != null) { + mClickAnimation.cancel(); + mClickAnimation = null; + } + } + + @Override + boolean touchModeDrawsInPressedState() { + return mDrawsInPressedState || super.touchModeDrawsInPressedState(); + } + + /** * <p>Avoids jarring scrolling effect by ensuring that list elements * made of a text view fit on a single line.</p> * diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 4a98f66..19cc3c2 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -1425,6 +1425,7 @@ public class NumberPicker extends LinearLayout { @Override protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); removeAllCallbacks(); } diff --git a/core/java/android/widget/SectionIndexer.java b/core/java/android/widget/SectionIndexer.java index a1c71f4..f6333d1 100644 --- a/core/java/android/widget/SectionIndexer.java +++ b/core/java/android/widget/SectionIndexer.java @@ -17,38 +17,62 @@ package android.widget; /** - * Interface that should be implemented on Adapters to enable fast scrolling - * in an {@link AbsListView} between sections of the list. A section is a group of list items - * to jump to that have something in common. For example, they may begin with the - * same letter or they may be songs from the same artist. ExpandableListAdapters that - * consider groups and sections as synonymous should account for collapsed groups and return - * an appropriate section/position. + * Interface that may implemented on {@link Adapter}s to enable fast scrolling + * between sections of an {@link AbsListView}. + * <p> + * A section is a group of list items that have something in common. For + * example, they may begin with the same letter or they may be songs from the + * same artist. + * <p> + * {@link ExpandableListAdapter}s that consider groups and sections as + * synonymous should account for collapsed groups and return an appropriate + * section/position. + * + * @see AbsListView#setFastScrollEnabled(boolean) */ public interface SectionIndexer { /** - * This provides the list view with an array of section objects. In the simplest - * case these are Strings, each containing one letter of the alphabet. - * They could be more complex objects that indicate the grouping for the adapter's - * consumption. The list view will call toString() on the objects to get the - * preview letter to display while scrolling. - * @return the array of objects that indicate the different sections of the list. + * Returns an array of objects representing sections of the list. The + * returned array and its contents should be non-null. + * <p> + * The list view will call toString() on the objects to get the preview text + * to display while scrolling. For example, an adapter may return an array + * of Strings representing letters of the alphabet. Or, it may return an + * array of objects whose toString() methods return their section titles. + * + * @return the array of section objects */ Object[] getSections(); - + /** - * Provides the starting index in the list for a given section. - * @param section the index of the section to jump to. - * @return the starting position of that section. If the section is out of bounds, the - * position must be clipped to fall within the size of the list. + * Given the index of a section within the array of section objects, returns + * the starting position of that section within the adapter. + * <p> + * If the section's starting position is outside of the adapter bounds, the + * position must be clipped to fall within the size of the adapter. + * + * @param sectionIndex the index of the section within the array of section + * objects + * @return the starting position of that section within the adapter, + * constrained to fall within the adapter bounds */ - int getPositionForSection(int section); - + int getPositionForSection(int sectionIndex); + /** - * This is a reverse mapping to fetch the section index for a given position - * in the list. - * @param position the position for which to return the section - * @return the section index. If the position is out of bounds, the section index + * Given a position within the adapter, returns the index of the + * corresponding section within the array of section objects. + * <p> + * If the section index is outside of the section array bounds, the index * must be clipped to fall within the size of the section array. + * <p> + * For example, consider an indexer where the section at array index 0 + * starts at adapter position 100. Calling this method with position 10, + * which is before the first section, must return index 0. + * + * @param position the position within the adapter for which to return the + * corresponding section index + * @return the index of the corresponding section within the array of + * section objects, constrained to fall within the array bounds */ - int getSectionForPosition(int position); + int getSectionForPosition(int position); } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 9c21f0d..a315546 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -359,9 +359,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mDrawableRight = mDrawableStart; mDrawableSizeRight = mDrawableSizeStart; mDrawableHeightRight = mDrawableHeightStart; - } - if (mOverride) { mDrawableLeft = mDrawableEnd; mDrawableSizeLeft = mDrawableSizeEnd; mDrawableHeightLeft = mDrawableHeightEnd; @@ -374,9 +372,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mDrawableLeft = mDrawableStart; mDrawableSizeLeft = mDrawableSizeStart; mDrawableHeightLeft = mDrawableHeightStart; - } - if (mOverride) { mDrawableRight = mDrawableEnd; mDrawableSizeRight = mDrawableSizeEnd; mDrawableHeightRight = mDrawableHeightEnd; diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index e33c4d4..1c1d77a 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -22,10 +22,12 @@ 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; @@ -105,6 +107,9 @@ public class TimePicker extends FrameLayout { private Locale mCurrentLocale; + private boolean mHourWithTwoDigit; + private char mHourFormat; + /** * The callback interface used to indicate the time has been adjusted. */ @@ -164,7 +169,7 @@ public class TimePicker extends FrameLayout { // divider (only for the new widget style) mDivider = (TextView) findViewById(R.id.divider); if (mDivider != null) { - mDivider.setText(R.string.time_picker_separator); + setDividerText(); } // minute @@ -235,6 +240,24 @@ public class TimePicker extends FrameLayout { 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(); @@ -259,6 +282,35 @@ public class TimePicker extends FrameLayout { } } + 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; + } + } + } + + private boolean isAmPmAtStart() { + final Locale defaultLocale = Locale.getDefault(); + final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale, + "hm" /* skeleton */); + + return bestDateTimePattern.startsWith("a"); + } + @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { @@ -423,9 +475,11 @@ public class TimePicker extends FrameLayout { if (mIs24HourView == is24HourView) { return; } - mIs24HourView = is24HourView; - // cache the current hour since spinner range changes + // 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); @@ -458,6 +512,38 @@ public class TimePicker extends FrameLayout { onTimeChanged(); } + /** + * 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 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); + } + @Override public int getBaseline() { return mHourSpinner.getBaseline(); @@ -500,14 +586,25 @@ public class TimePicker extends FrameLayout { private void updateHourControl() { if (is24HourView()) { - mHourSpinner.setMinValue(0); - mHourSpinner.setMaxValue(23); - mHourSpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); + // 'k' means 1-24 hour + if (mHourFormat == 'k') { + mHourSpinner.setMinValue(1); + mHourSpinner.setMaxValue(24); + } else { + mHourSpinner.setMinValue(0); + mHourSpinner.setMaxValue(23); + } } else { - mHourSpinner.setMinValue(1); - mHourSpinner.setMaxValue(12); - mHourSpinner.setFormatter(null); + // '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() { diff --git a/core/java/com/android/internal/os/HandlerCaller.java b/core/java/com/android/internal/os/HandlerCaller.java index b442ff5..d9e3ef6 100644 --- a/core/java/com/android/internal/os/HandlerCaller.java +++ b/core/java/com/android/internal/os/HandlerCaller.java @@ -65,7 +65,11 @@ public class HandlerCaller { mH.sendMessage(msg); } - + + public void sendMessageDelayed(Message msg, long delayMillis) { + mH.sendMessageDelayed(msg, delayMillis); + } + public boolean hasMessages(int what) { return mH.hasMessages(what); } diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index ff9678c..863d8cc 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -30,9 +30,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.View.MeasureSpec; import android.view.ViewGroup; -import android.widget.AbsListView; import android.widget.ImageButton; -import android.widget.ListPopupWindow; import com.android.internal.view.ActionBarPolicy; import com.android.internal.view.menu.ActionMenuView.ActionMenuChildView; @@ -694,32 +692,43 @@ public class ActionMenuPresenter extends BaseMenuPresenter } @Override - public boolean onTouchObserved(View v, MotionEvent ev) { - if (ev.getActionMasked() == MotionEvent.ACTION_MOVE && v.isEnabled() - && !v.pointInView(ev.getX(), ev.getY(), mScaledTouchSlop)) { - mActivePointerId = ev.getPointerId(0); - v.performClick(); - return true; + public boolean onTouchObserved(View src, MotionEvent srcEvent) { + if (!src.isEnabled()) { + return false; } - return false; + // Always start forwarding events when the source view is touched. + mActivePointerId = srcEvent.getPointerId(0); + src.performClick(); + return true; } @Override - public boolean onTouchForwarded(View v, MotionEvent ev) { - if (!v.isEnabled() || mOverflowPopup == null || !mOverflowPopup.isShowing()) { - return false; - } - - if (mActivePointerId != MotionEvent.INVALID_POINTER_ID) { - if (mOverflowPopup.forwardMotionEvent(v, ev, mActivePointerId)) { + public boolean onTouchForwarded(View src, MotionEvent srcEvent) { + final OverflowPopup popup = mOverflowPopup; + if (popup != null && popup.isShowing()) { + final int activePointerId = mActivePointerId; + if (activePointerId != MotionEvent.INVALID_POINTER_ID && src.isEnabled() + && popup.forwardMotionEvent(src, srcEvent, activePointerId)) { + // Handled the motion event, continue forwarding. return true; } - mActivePointerId = MotionEvent.INVALID_POINTER_ID; + final int activePointerIndex = srcEvent.findPointerIndex(activePointerId); + if (activePointerIndex >= 0) { + final float x = srcEvent.getX(activePointerIndex); + final float y = srcEvent.getY(activePointerIndex); + if (src.pointInView(x, y, mScaledTouchSlop)) { + // The user is touching the source view. Cancel + // forwarding, but don't dismiss the popup. + return false; + } + } + + popup.dismiss(); } - mOverflowPopup.dismiss(); + // Cancel forwarding. return false; } } diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java index 945f42b..9b266df 100644 --- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java +++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java @@ -27,7 +27,6 @@ import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.FrameLayout; @@ -48,8 +47,6 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On static final int ITEM_LAYOUT = com.android.internal.R.layout.popup_menu_item_layout; - private final int[] mTempLocation = new int[2]; - private final Context mContext; private final LayoutInflater mInflater; private final MenuBuilder mMenu; @@ -162,67 +159,20 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On return mPopup != null && mPopup.isShowing(); } - public boolean forwardMotionEvent(View v, MotionEvent ev, int activePointerId) { + /** + * Forwards motion events from a source view to the popup window. + * + * @param src view from which the event was forwarded + * @param event forwarded motion event in source-local coordinates + * @param activePointerId id of the pointer that activated forwarding + * @return whether the event was handled + */ + public boolean forwardMotionEvent(View src, MotionEvent event, int activePointerId) { if (mPopup == null || !mPopup.isShowing()) { return false; } - final AbsListView dstView = mPopup.getListView(); - if (dstView == null || !dstView.isShown()) { - return false; - } - - boolean cancelForwarding = false; - final int actionMasked = ev.getActionMasked(); - switch (actionMasked) { - case MotionEvent.ACTION_CANCEL: - cancelForwarding = true; - break; - case MotionEvent.ACTION_UP: - cancelForwarding = true; - // $FALL-THROUGH$ - case MotionEvent.ACTION_MOVE: - final int activeIndex = ev.findPointerIndex(activePointerId); - if (activeIndex < 0) { - return false; - } - - final int[] location = mTempLocation; - int x = (int) ev.getX(activeIndex); - int y = (int) ev.getY(activeIndex); - - // Convert to global coordinates. - v.getLocationOnScreen(location); - x += location[0]; - y += location[1]; - - // Convert to local coordinates. - dstView.getLocationOnScreen(location); - x -= location[0]; - y -= location[1]; - - final int position = dstView.pointToPosition(x, y); - if (position >= 0) { - final int childCount = dstView.getChildCount(); - final int firstVisiblePosition = dstView.getFirstVisiblePosition(); - final int index = position - firstVisiblePosition; - if (index < childCount) { - final View child = dstView.getChildAt(index); - if (actionMasked == MotionEvent.ACTION_UP) { - // Touch ended, click highlighted item. - final long id = dstView.getItemIdAtPosition(position); - dstView.performItemClick(child, position, id); - } else if (actionMasked == MotionEvent.ACTION_MOVE) { - // TODO: Highlight touched item, activate after - // long-hover. Consider forwarding events as HOVER and - // letting ListView handle this. - } - } - } - break; - } - - return true; + return mPopup.onForwardedEvent(src, event, activePointerId); } @Override diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 0efa227..d5d746a 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -63,7 +63,6 @@ LOCAL_SRC_FILES:= \ android_os_FileUtils.cpp \ android_os_MemoryFile.cpp \ android_os_MessageQueue.cpp \ - android_os_ParcelFileDescriptor.cpp \ android_os_Parcel.cpp \ android_os_SELinux.cpp \ android_os_SystemClock.cpp \ @@ -73,7 +72,7 @@ LOCAL_SRC_FILES:= \ android_net_LocalSocketImpl.cpp \ android_net_NetUtils.cpp \ android_net_TrafficStats.cpp \ - android_net_wifi_Wifi.cpp \ + android_net_wifi_WifiNative.cpp \ android_nio_utils.cpp \ android_text_format_Time.cpp \ android_util_AssetManager.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 91fdcc2..8472705 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -135,7 +135,6 @@ extern int register_android_text_format_Time(JNIEnv* env); extern int register_android_os_Debug(JNIEnv* env); extern int register_android_os_MessageQueue(JNIEnv* env); extern int register_android_os_Parcel(JNIEnv* env); -extern int register_android_os_ParcelFileDescriptor(JNIEnv *env); extern int register_android_os_SELinux(JNIEnv* env); extern int register_android_os_SystemProperties(JNIEnv *env); extern int register_android_os_SystemClock(JNIEnv* env); @@ -148,7 +147,7 @@ extern int register_android_print_pdf_PdfDocument(JNIEnv* env); extern int register_android_net_LocalSocketImpl(JNIEnv* env); extern int register_android_net_NetworkUtils(JNIEnv* env); extern int register_android_net_TrafficStats(JNIEnv* env); -extern int register_android_net_wifi_WifiManager(JNIEnv* env); +extern int register_android_net_wifi_WifiNative(JNIEnv* env); extern int register_android_text_AndroidCharacter(JNIEnv *env); extern int register_android_text_AndroidBidi(JNIEnv *env); extern int register_android_opengl_classes(JNIEnv *env); @@ -1178,7 +1177,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_FileObserver), REG_JNI(register_android_os_FileUtils), REG_JNI(register_android_os_MessageQueue), - REG_JNI(register_android_os_ParcelFileDescriptor), REG_JNI(register_android_os_SELinux), REG_JNI(register_android_os_Trace), REG_JNI(register_android_os_UEventObserver), @@ -1186,7 +1184,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_LocalSocketImpl), REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), - REG_JNI(register_android_net_wifi_WifiManager), + REG_JNI(register_android_net_wifi_WifiNative), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_android_hardware_Camera), diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index b03d12a..0ea3bf7 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -222,8 +222,12 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, }
}
- SkBitmap bitmap;
+ // ARGB_4444 is a deprecated format, convert automatically to 8888
+ if (config == SkBitmap::kARGB_4444_Config) {
+ config = SkBitmap::kARGB_8888_Config;
+ }
+ SkBitmap bitmap;
bitmap.setConfig(config, width, height);
jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL);
@@ -232,8 +236,7 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, }
if (jColors != NULL) {
- GraphicsJNI::SetPixels(env, jColors, offset, stride,
- 0, 0, width, height, bitmap);
+ GraphicsJNI::SetPixels(env, jColors, offset, stride, 0, 0, width, height, bitmap);
}
return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, isMutable, NULL, NULL);
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index f768ce8..5418006 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -306,19 +306,23 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName code->internalDataPath = code->internalDataPathObj.string(); env->ReleaseStringUTFChars(internalDataDir, dirStr); - dirStr = env->GetStringUTFChars(externalDataDir, NULL); - code->externalDataPathObj = dirStr; + if (externalDataDir != NULL) { + dirStr = env->GetStringUTFChars(externalDataDir, NULL); + code->externalDataPathObj = dirStr; + env->ReleaseStringUTFChars(externalDataDir, dirStr); + } code->externalDataPath = code->externalDataPathObj.string(); - env->ReleaseStringUTFChars(externalDataDir, dirStr); code->sdkVersion = sdkVersion; code->assetManager = assetManagerForJavaObject(env, jAssetMgr); - dirStr = env->GetStringUTFChars(obbDir, NULL); - code->obbPathObj = dirStr; + if (obbDir != NULL) { + dirStr = env->GetStringUTFChars(obbDir, NULL); + code->obbPathObj = dirStr; + env->ReleaseStringUTFChars(obbDir, dirStr); + } code->obbPath = code->obbPathObj.string(); - env->ReleaseStringUTFChars(obbDir, dirStr); jbyte* rawSavedState = NULL; jsize rawSavedSize = 0; diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index d6c5e4f..7d99464 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -41,11 +41,15 @@ enum AudioError { static int check_AudioSystem_Command(status_t status) { - if (status == NO_ERROR) { + switch (status) { + case DEAD_OBJECT: + return kAudioStatusMediaServerDied; + case NO_ERROR: return kAudioStatusOk; - } else { - return kAudioStatusError; + default: + break; } + return kAudioStatusError; } static int @@ -112,61 +116,19 @@ android_media_AudioSystem_getParameters(JNIEnv *env, jobject thiz, jstring keys) return env->NewStringUTF(AudioSystem::getParameters(0, c_keys8).string()); } -static JNIEnv* AudioSystem_getJNIEnv(bool* needsDetach) { - *needsDetach = false; - JNIEnv* env = AndroidRuntime::getJNIEnv(); - if (env == NULL) { - JavaVMAttachArgs args = {JNI_VERSION_1_4, NULL, NULL}; - JavaVM* vm = AndroidRuntime::getJavaVM(); - int result = vm->AttachCurrentThread(&env, (void*) &args); - if (result != JNI_OK) { - ALOGE("thread attach failed: %#x", result); - return NULL; - } - *needsDetach = true; - } - return env; -} - -static void AudioSystem_detachJNI() { - JavaVM* vm = AndroidRuntime::getJavaVM(); - int result = vm->DetachCurrentThread(); - if (result != JNI_OK) { - ALOGE("thread detach failed: %#x", result); - } -} - static void android_media_AudioSystem_error_callback(status_t err) { - bool needsDetach = false; - JNIEnv *env = AudioSystem_getJNIEnv(&needsDetach); - + JNIEnv *env = AndroidRuntime::getJNIEnv(); if (env == NULL) { return; } jclass clazz = env->FindClass(kClassPathName); - int error; - - switch (err) { - case DEAD_OBJECT: - error = kAudioStatusMediaServerDied; - break; - case NO_ERROR: - error = kAudioStatusOk; - break; - default: - error = kAudioStatusError; - break; - } - - env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), error); - - if (needsDetach) { - AudioSystem_detachJNI(); - } + env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, + "errorCallbackFromNative","(I)V"), + check_AudioSystem_Command(err)); } static int @@ -313,6 +275,12 @@ android_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean i return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice); } +static int +android_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz) +{ + return check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); +} + // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { @@ -340,6 +308,7 @@ static JNINativeMethod gMethods[] = { {"getPrimaryOutputFrameCount", "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount}, {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency}, {"setLowRamDevice", "(Z)I", (void *)android_media_AudioSystem_setLowRamDevice}, + {"checkAudioFlinger", "()I", (void *)android_media_AudioSystem_checkAudioFlinger}, }; int register_android_media_AudioSystem(JNIEnv *env) diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_WifiNative.cpp index aa6dbf3..6e11192 100644 --- a/core/jni/android_net_wifi_Wifi.cpp +++ b/core/jni/android_net_wifi_WifiNative.cpp @@ -25,111 +25,91 @@ #include "wifi.h" -#define WIFI_PKG_NAME "android/net/wifi/WifiNative" -#define BUF_SIZE 256 +#define REPLY_BUF_SIZE 4096 // wpa_supplicant's maximum size. #define EVENT_BUF_SIZE 2048 namespace android { static jint DBG = false; -static int doCommand(char *cmd, char *replybuf, int replybuflen) -{ - size_t reply_len = replybuflen - 1; +static bool doCommand(JNIEnv* env, jstring javaCommand, + char* reply, size_t reply_len) { + ScopedUtfChars command(env, javaCommand); + if (command.c_str() == NULL) { + return false; // ScopedUtfChars already threw on error. + } - if (::wifi_command(cmd, replybuf, &reply_len) != 0) - return -1; - else { - // Strip off trailing newline - if (reply_len > 0 && replybuf[reply_len-1] == '\n') - replybuf[reply_len-1] = '\0'; - else - replybuf[reply_len] = '\0'; - return 0; + if (DBG) { + ALOGD("doCommand: %s", command.c_str()); } -} -static jint doIntCommand(const char* fmt, ...) -{ - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return -1; + --reply_len; // Ensure we have room to add NUL termination. + if (::wifi_command(command.c_str(), reply, &reply_len) != 0) { + return false; + } + + // Strip off trailing newline. + if (reply_len > 0 && reply[reply_len-1] == '\n') { + reply[reply_len-1] = '\0'; + } else { + reply[reply_len] = '\0'; } - char reply[BUF_SIZE]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { + return true; +} + +static jint doIntCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return -1; } return static_cast<jint>(atoi(reply)); } -static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) -{ - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return JNI_FALSE; - } - char reply[BUF_SIZE]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { +static jboolean doBooleanCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return JNI_FALSE; } - return (strcmp(reply, expect) == 0); + return (strcmp(reply, "OK") == 0); } -// Send a command to the supplicant, and return the reply as a String -static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return NULL; - } - char reply[4096]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { +// Send a command to the supplicant, and return the reply as a String. +static jstring doStringCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return NULL; } - // TODO: why not just NewStringUTF? - String16 str((char *)reply); - return env->NewString((const jchar *)str.string(), str.size()); + return env->NewStringUTF(reply); } static jboolean android_net_wifi_isDriverLoaded(JNIEnv* env, jobject) { - return (jboolean)(::is_wifi_driver_loaded() == 1); + return (::is_wifi_driver_loaded() == 1); } static jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject) { - return (jboolean)(::wifi_load_driver() == 0); + return (::wifi_load_driver() == 0); } static jboolean android_net_wifi_unloadDriver(JNIEnv* env, jobject) { - return (jboolean)(::wifi_unload_driver() == 0); + return (::wifi_unload_driver() == 0); } static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) { - return (jboolean)(::wifi_start_supplicant(p2pSupported) == 0); + return (::wifi_start_supplicant(p2pSupported) == 0); } static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) { - return (jboolean)(::wifi_stop_supplicant(p2pSupported) == 0); + return (::wifi_stop_supplicant(p2pSupported) == 0); } static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) { - return (jboolean)(::wifi_connect_to_supplicant() == 0); + return (::wifi_connect_to_supplicant() == 0); } static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) @@ -148,36 +128,16 @@ static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) } } -static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - - if (command.c_str() == NULL) { - return JNI_FALSE; - } - if (DBG) ALOGD("doBoolean: %s", command.c_str()); - return doBooleanCommand("OK", "%s", command.c_str()); +static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doBooleanCommand(env, javaCommand); } -static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - - if (command.c_str() == NULL) { - return -1; - } - if (DBG) ALOGD("doInt: %s", command.c_str()); - return doIntCommand("%s", command.c_str()); +static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doIntCommand(env, javaCommand); } -static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - if (command.c_str() == NULL) { - return NULL; - } - if (DBG) ALOGD("doString: %s", command.c_str()); - return doStringCommand(env, "%s", command.c_str()); +static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doStringCommand(env,javaCommand); } @@ -205,10 +165,9 @@ static JNINativeMethod gWifiMethods[] = { (void*) android_net_wifi_doStringCommand }, }; -int register_android_net_wifi_WifiManager(JNIEnv* env) -{ +int register_android_net_wifi_WifiNative(JNIEnv* env) { return AndroidRuntime::registerNativeMethods(env, - WIFI_PKG_NAME, gWifiMethods, NELEM(gWifiMethods)); + "android/net/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); } }; // namespace android diff --git a/core/jni/android_os_ParcelFileDescriptor.cpp b/core/jni/android_os_ParcelFileDescriptor.cpp deleted file mode 100644 index 99a2d04..0000000 --- a/core/jni/android_os_ParcelFileDescriptor.cpp +++ /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. - */ - -//#define LOG_NDEBUG 0 - -#include "JNIHelp.h" - -#include <fcntl.h> -#include <sys/stat.h> -#include <stdio.h> - -#include <utils/Log.h> - -#include <android_runtime/AndroidRuntime.h> - -namespace android -{ - -static struct parcel_file_descriptor_offsets_t -{ - jfieldID mFileDescriptor; -} gParcelFileDescriptorOffsets; - -static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFd(JNIEnv* env, - jobject clazz, jint origfd) -{ - int fd = dup(origfd); - if (fd < 0) { - jniThrowException(env, "java/io/IOException", strerror(errno)); - return NULL; - } - return jniCreateFileDescriptor(env, fd); -} - -static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup(JNIEnv* env, - jobject clazz, jint fd) -{ - return jniCreateFileDescriptor(env, fd); -} - -static void android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env, - jobject clazz, jobjectArray outFds) -{ - int fds[2]; - if (pipe(fds) < 0) { - int therr = errno; - jniThrowException(env, "java/io/IOException", strerror(therr)); - return; - } - - for (int i=0; i<2; i++) { - jobject fdObj = jniCreateFileDescriptor(env, fds[i]); - env->SetObjectArrayElement(outFds, i, fdObj); - } -} - -static jint getFd(JNIEnv* env, jobject clazz) -{ - jobject descriptor = env->GetObjectField(clazz, gParcelFileDescriptorOffsets.mFileDescriptor); - if (descriptor == NULL) return -1; - return jniGetFDFromFileDescriptor(env, descriptor); -} - -static jlong android_os_ParcelFileDescriptor_getStatSize(JNIEnv* env, - jobject clazz) -{ - jint fd = getFd(env, clazz); - if (fd < 0) { - jniThrowException(env, "java/lang/IllegalArgumentException", "bad file descriptor"); - return -1; - } - - struct stat st; - if (fstat(fd, &st) != 0) { - return -1; - } - - if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { - return st.st_size; - } - - return -1; -} - -static jlong android_os_ParcelFileDescriptor_seekTo(JNIEnv* env, - jobject clazz, jlong pos) -{ - jint fd = getFd(env, clazz); - if (fd < 0) { - jniThrowException(env, "java/lang/IllegalArgumentException", "bad file descriptor"); - return -1; - } - - return lseek(fd, pos, SEEK_SET); -} - -static jlong android_os_ParcelFileDescriptor_getFdNative(JNIEnv* env, jobject clazz) -{ - jint fd = getFd(env, clazz); - if (fd < 0) { - jniThrowException(env, "java/lang/IllegalArgumentException", "bad file descriptor"); - return -1; - } - - return fd; -} - -static const JNINativeMethod gParcelFileDescriptorMethods[] = { - {"getFileDescriptorFromFd", "(I)Ljava/io/FileDescriptor;", - (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFd}, - {"getFileDescriptorFromFdNoDup", "(I)Ljava/io/FileDescriptor;", - (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup}, - {"createPipeNative", "([Ljava/io/FileDescriptor;)V", - (void*)android_os_ParcelFileDescriptor_createPipeNative}, - {"getStatSize", "()J", - (void*)android_os_ParcelFileDescriptor_getStatSize}, - {"seekTo", "(J)J", - (void*)android_os_ParcelFileDescriptor_seekTo}, - {"getFdNative", "()I", - (void*)android_os_ParcelFileDescriptor_getFdNative} -}; - -const char* const kParcelFileDescriptorPathName = "android/os/ParcelFileDescriptor"; - -int register_android_os_ParcelFileDescriptor(JNIEnv* env) -{ - jclass clazz = env->FindClass(kParcelFileDescriptorPathName); - LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); - gParcelFileDescriptorOffsets.mFileDescriptor = env->GetFieldID(clazz, "mFileDescriptor", "Ljava/io/FileDescriptor;"); - LOG_FATAL_IF(gParcelFileDescriptorOffsets.mFileDescriptor == NULL, - "Unable to find mFileDescriptor field in android.os.ParcelFileDescriptor"); - - return AndroidRuntime::registerNativeMethods( - env, kParcelFileDescriptorPathName, - gParcelFileDescriptorMethods, NELEM(gParcelFileDescriptorMethods)); -} - -} diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 304514b..3f54fd7 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -196,13 +196,13 @@ static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCa SkSafeUnref(previousCanvas); } -static void nativeLockCanvas(JNIEnv* env, jclass clazz, +static jint nativeLockCanvas(JNIEnv* env, jclass clazz, jint nativeObject, jobject canvasObj, jobject dirtyRectObj) { sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); if (!isSurfaceValid(surface)) { doThrowIAE(env); - return; + return 0; } Rect dirtyRect; @@ -223,7 +223,7 @@ static void nativeLockCanvas(JNIEnv* env, jclass clazz, OutOfResourcesException : "java/lang/IllegalArgumentException"; jniThrowException(env, exception, NULL); - return; + return 0; } // Associate a SkCanvas object to this surface @@ -255,6 +255,13 @@ static void nativeLockCanvas(JNIEnv* env, jclass clazz, env->SetIntField(dirtyRectObj, gRectClassInfo.right, dirtyRect.right); env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, dirtyRect.bottom); } + + // Create another reference to the surface and return it. This reference + // should be passed to nativeUnlockCanvasAndPost in place of mNativeObject, + // because the latter could be replaced while the surface is locked. + sp<Surface> lockedSurface(surface); + lockedSurface->incStrong(&sRefBaseOwner); + return (int) lockedSurface.get(); } static void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz, @@ -351,7 +358,7 @@ static JNINativeMethod gSurfaceMethods[] = { (void*)nativeIsValid }, {"nativeIsConsumerRunningBehind", "(I)Z", (void*)nativeIsConsumerRunningBehind }, - {"nativeLockCanvas", "(ILandroid/graphics/Canvas;Landroid/graphics/Rect;)V", + {"nativeLockCanvas", "(ILandroid/graphics/Canvas;Landroid/graphics/Rect;)I", (void*)nativeLockCanvas }, {"nativeUnlockCanvasAndPost", "(ILandroid/graphics/Canvas;)V", (void*)nativeUnlockCanvasAndPost }, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index d106cf2..33b77cc 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -218,6 +218,7 @@ <protected-broadcast android:name="android.location.GPS_ENABLED_CHANGE" /> <protected-broadcast android:name="android.location.PROVIDERS_CHANGED" /> <protected-broadcast android:name="android.location.GPS_FIX_CHANGE" /> + <protected-broadcast android:name="android.net.proxy.PAC_REFRESH" /> <!-- ====================================== --> <!-- Permissions for things that cost money --> @@ -1077,15 +1078,15 @@ <!-- Allows an application to read from external storage. <p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly granted this permission.</p> - <p>Currently, this permission is not enforced and all apps still have access to read from - external storage without this permission. That will change in a future release and apps - will require this permission to read from external storage. So if your - app reads from the external storage, you should add this permission to your app now - to ensure that it continues to work on future versions of Android.</p> - <p>You can test your app with the permission enforced by either running your app on the - Android Emulator when running Android 4.1 or higher, or enabling <em>Protect USB + <p>This permission is enforced starting in API level 19. Before API level 19, this + permission is not enforced and all apps still have access to read from external storage. + You can test your app with the permission enforced by enabling <em>Protect USB storage</em> under Developer options in the Settings app on a device running Android 4.1 or higher.</p> + <p>Also starting in API level 19, this permission is <em>not</em> required to + read/write files in your application-specific directories returned by + {@link android.content.Context#getExternalFilesDir} and + {@link android.content.Context#getExternalCacheDir}. <p class="note"><strong>Note:</strong> If <em>both</em> your <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> and <a @@ -1108,7 +1109,11 @@ targetSdkVersion}</a> values are set to 3 or lower, the system implicitly grants your app this permission. If you don't need this permission, be sure your <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code - targetSdkVersion}</a> is 4 or higher. --> + targetSdkVersion}</a> is 4 or higher. + <p>Starting in API level 19, this permission is <em>not</em> required to + read/write files in your application-specific directories returned by + {@link android.content.Context#getExternalFilesDir} and + {@link android.content.Context#getExternalCacheDir}. --> <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:permissionGroup="android.permission-group.STORAGE" android:label="@string/permlab_sdcardWrite" @@ -1613,6 +1618,14 @@ android:label="@string/permlab_anyCodecForPlayback" android:description="@string/permdesc_anyCodecForPlayback" /> + <!-- Allows an application to install and/or uninstall CA certificates on + behalf of the user. + @hide --> + <permission android:name="android.permission.MANAGE_CA_CERTIFICATES" + android:protectionLevel="signature|system" + android:label="@string/permlab_manageCaCertificates" + android:description="@string/permdesc_manageCaCertificates" /> + <!-- ========================================= --> <!-- Permissions for special development tools --> <!-- ========================================= --> diff --git a/core/res/res/drawable/spinner_ab_holo_dark.xml b/core/res/res/drawable/spinner_ab_holo_dark.xml index 0932eff..9b8967c 100644 --- a/core/res/res/drawable/spinner_ab_holo_dark.xml +++ b/core/res/res/drawable/spinner_ab_holo_dark.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true"> <item android:state_enabled="false" android:drawable="@drawable/spinner_ab_disabled_holo_dark" /> <item android:state_pressed="true" diff --git a/core/res/res/drawable/spinner_ab_holo_light.xml b/core/res/res/drawable/spinner_ab_holo_light.xml index e785cf4..a324c08 100644 --- a/core/res/res/drawable/spinner_ab_holo_light.xml +++ b/core/res/res/drawable/spinner_ab_holo_light.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true"> <item android:state_enabled="false" android:drawable="@drawable/spinner_ab_disabled_holo_light" /> <item android:state_pressed="true" diff --git a/core/res/res/drawable/spinner_background_holo_dark.xml b/core/res/res/drawable/spinner_background_holo_dark.xml index eb6b18b..a57f720 100644 --- a/core/res/res/drawable/spinner_background_holo_dark.xml +++ b/core/res/res/drawable/spinner_background_holo_dark.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true"> <item android:state_enabled="false" android:drawable="@drawable/spinner_disabled_holo_dark" /> <item android:state_pressed="true" diff --git a/core/res/res/drawable/spinner_background_holo_light.xml b/core/res/res/drawable/spinner_background_holo_light.xml index 9d17ed0..899633c 100644 --- a/core/res/res/drawable/spinner_background_holo_light.xml +++ b/core/res/res/drawable/spinner_background_holo_light.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true"> <item android:state_enabled="false" android:drawable="@drawable/spinner_disabled_holo_light" /> <item android:state_pressed="true" diff --git a/core/res/res/layout/time_picker.xml b/core/res/res/layout/time_picker.xml index a78cd85..4fa94f3 100644 --- a/core/res/res/layout/time_picker.xml +++ b/core/res/res/layout/time_picker.xml @@ -20,6 +20,7 @@ <!-- 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" diff --git a/core/res/res/layout/time_picker_holo.xml b/core/res/res/layout/time_picker_holo.xml index 7d8900e..c6b7d3a 100644 --- a/core/res/res/layout/time_picker_holo.xml +++ b/core/res/res/layout/time_picker_holo.xml @@ -20,14 +20,19 @@ <!-- 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: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 --> @@ -37,8 +42,6 @@ android:layout_height="wrap_content" android:layout_marginTop="16dip" android:layout_marginBottom="16dip" - android:layout_marginStart="16dip" - android:layout_marginEnd="6dip" android:focusable="true" android:focusableInTouchMode="true" /> @@ -48,6 +51,8 @@ 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" /> @@ -59,8 +64,6 @@ android:layout_height="wrap_content" android:layout_marginTop="16dip" android:layout_marginBottom="16dip" - android:layout_marginStart="6dip" - android:layout_marginEnd="8dip" android:focusable="true" android:focusableInTouchMode="true" /> @@ -75,7 +78,7 @@ android:layout_marginTop="16dip" android:layout_marginBottom="16dip" android:layout_marginStart="8dip" - android:layout_marginEnd="16dip" + android:layout_marginEnd="8dip" android:focusable="true" android:focusableInTouchMode="true" /> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index a9d4b0a..fbeb5b1 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Verkeerde PIN. Probeer weer oor 1 sekonde."</item> <item quantity="other" msgid="8030607343223287654">"Verkeerde PIN. Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Sleep rand van skerm om balk te wys"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sleep van rand van skerm af om stelselbalk te wys"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 8fc907a..aaeb2d6 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -314,7 +314,7 @@ <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="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> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"ትክክል ያልሆነ ፒን። በ1 ሰከንድ ውስጥ እንደገና ይሞክሩ።"</item> <item quantity="other" msgid="8030607343223287654">"ትክክል ያልሆነ ፒን። በ<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-ar/strings.xml b/core/res/res/values-ar/strings.xml index 03cc7b8..172b36e 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"رقم التعريف الشخصي غير صحيح، الرجاء إعادة المحاولة بعد ثانية واحدة."</item> <item quantity="other" msgid="8030607343223287654">"رقم التعريف الشخصي غير صحيح، الرجاء إعادة المحاولة بعد <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-az/strings.xml b/core/res/res/values-az/strings.xml new file mode 100644 index 0000000..b6bd753 --- /dev/null +++ b/core/res/res/values-az/strings.xml @@ -0,0 +1,1584 @@ +<?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_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ş > Tətbiqlər >."</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ç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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ü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 > 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 83a54b6..72d6483 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1653,4 +1653,8 @@ <skip /> <!-- no translation found for restr_pin_countdown:one (4835639969503729874) --> <!-- no translation found for restr_pin_countdown:other (8030607343223287654) --> + <!-- no translation found for transient_navigation_confirmation (4907844043611123426) --> + <skip /> + <!-- no translation found for transient_navigation_confirmation_long (8061685920508086697) --> + <skip /> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 38ea228..1b437f5 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Неправилен ПИН код. Опитайте отново след 1 секунда."</item> <item quantity="other" msgid="8030607343223287654">"Неправилен ПИН код. Опитайте отново след <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-ca/strings.xml b/core/res/res/values-ca/strings.xml index dae5009..dd55df5 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -314,7 +314,7 @@ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedir els canvis d\'aplicació"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impedeix que l\'usuari canviï a una altra aplicació."</string> <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"obtenció d\'informació de l\'aplicació actual"</string> - <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Permet que el titular recuperi informació privada sobre l\'aplicació i els serveis actual al primer pla de la pantalla."</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Permet que el titular recuperi informació privada sobre l\'aplicació i els serveis actuals al primer pla de la pantalla."</string> <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"supervisa i controla tots els inicis d\'aplicacions"</string> <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permet que l\'aplicació supervisi i controli com el sistema inicia activitats. Les aplicacions malicioses poden comprometre totalment el sistema. Aquest permís només és necessari per al desenvolupament, mai per a l\'ús normal."</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar difusió d\'eliminació de paquet"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorrecte. Torna-ho a provar d\'aquí a 1 segon."</item> <item quantity="other" msgid="8030607343223287654">"PIN incorrecte. Torna-ho a provar d\'aquí a <xliff:g id="COUNT">%d</xliff:g> segons."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Llisca des de vora per mostrar barra"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Fes lliscar el dit des de la vora de la pantalla perquè es mostri la barra del sistema"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8e16e3a..55d45da 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Nesprávný kód PIN. Zkuste to znovu za jednu sekundu."</item> <item quantity="other" msgid="8030607343223287654">"Nesprávný kód PIN. Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Panel zobrazíte přejetím kraje obr."</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Systémový panel zobrazíte přejetím přes okraj obrazovky"</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 9a053b8..f8e6e7c 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -245,9 +245,9 @@ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Tillader, at appen kan udvide og skjule statusbjælken."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"omdirigere udgående opkald"</string> <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Tillader, at appen kan behandle udgående opkald og ændre det nummer, der skal ringes til. Med denne tilladelse kan appen overvåge, omdirigere eller forhindre udgående opkald."</string> - <string name="permlab_receiveSms" msgid="8673471768947895082">"modtage tekstbeskeder (SMS)"</string> + <string name="permlab_receiveSms" msgid="8673471768947895082">"modtage tekstbeskeder (sms)"</string> <string name="permdesc_receiveSms" msgid="6424387754228766939">"Tillader, at appen kan modtage og behandle sms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string> - <string name="permlab_receiveMms" msgid="1821317344668257098">"modtage tekstbeskeder (MMS)"</string> + <string name="permlab_receiveMms" msgid="1821317344668257098">"modtage tekstbeskeder (mms)"</string> <string name="permdesc_receiveMms" msgid="533019437263212260">"Tillader, at appen kan modtage og behandle mms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string> <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"modtage nødudsendelser"</string> <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Tillader, at appen kan modtage og behandle nødtransmissioner. Denne tilladelse er kun tilgængelig for systemapps."</string> @@ -257,10 +257,10 @@ <string name="permdesc_sendSms" msgid="7094729298204937667">"Tillader, at appen kan sende sms-beskeder. Dette kan resultere i uventede opkrævninger. Skadelige apps kan koste dig penge ved at sende beskeder uden din bekræftelse."</string> <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"send hændelser, hvor der skal svares pr. besked"</string> <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Tillader, at appen kan sende anmodninger til andre apps til beskeder for at håndtere hændelser, hvor der skal svares pr. besked."</string> - <string name="permlab_readSms" msgid="8745086572213270480">"læse dine tekstbeskeder (SMS eller MMS)"</string> + <string name="permlab_readSms" msgid="8745086572213270480">"læse dine tekstbeskeder (sms eller mms)"</string> <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tillader, at appen kan læse de sms-beskeder, der er gemt på din tablet eller dit SIM-kort. Med denne tilladelse kan appen læse alle sms-beskeder, uanset indhold eller fortrolighed."</string> <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tillader, at appen kan læse de sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Med denne tilladelse kan appen læse alle sms-beskeder, uanset indhold eller fortrolighed."</string> - <string name="permlab_writeSms" msgid="3216950472636214774">"redigere dine tekstbeskeder (SMS eller MMS)"</string> + <string name="permlab_writeSms" msgid="3216950472636214774">"redigere dine tekstbeskeder (sms eller mms)"</string> <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tillader, at appen kan skrive til sms-beskeder, der er gemt på din tablet eller på SIM-kortet. Ondsindede apps kan slette dine beskeder."</string> <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tillader, at appen kan skrive til sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede apps kan slette dine beskeder."</string> <string name="permlab_receiveWapPush" msgid="5991398711936590410">"modtage tekstbeskeder (WAP)"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Forkert pinkode. Prøv igen om 1 sekund."</item> <item quantity="other" msgid="8030607343223287654">"Forkert pinkode. Prøv igen om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Stryg fra skærmkanten for at se bjælken"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Stryg med fingeren fra skærmens kant for at se systembjælken"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 7e4d274..1c67f7f 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Falsche PIN. In 1 Sek. erneut versuchen."</item> <item quantity="other" msgid="8030607343223287654">"Falsche PIN. In <xliff:g id="COUNT">%d</xliff:g> Sek. erneut versuchen."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Zum Einblenden der Leiste vom Rand weg wischen"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Zum Einblenden der Systemleiste vom Rand weg wischen"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 7c46560..a01ef71 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1579,4 +1579,6 @@ <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-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 22281c1..8a3f354 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Incorrect PIN. Try again in 1 second."</item> <item quantity="other" msgid="8030607343223287654">"Incorrect PIN. Try again in <xliff:g id="COUNT">%d</xliff:g> seconds."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swipe edge of screen to reveal bar"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swipe from edge of screen to reveal system bar"</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml new file mode 100644 index 0000000..8a3f354 --- /dev/null +++ b/core/res/res/values-en-rIN/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<Untitled>"</string> + <string name="ellipsis" msgid="7899829516048813237">"…"</string> + <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> + <string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string> + <string name="unknownName" msgid="2277556546742746522">"(Unknown)"</string> + <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Voicemail"</string> + <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string> + <string name="mmiError" msgid="5154499457739052907">"Connection problem or invalid MMI code."</string> + <string name="mmiFdnError" msgid="5224398216385316471">"Operation is restricted to fixed dialling numbers only."</string> + <string name="serviceEnabled" msgid="8147278346414714315">"Service was enabled."</string> + <string name="serviceEnabledFor" msgid="6856228140453471041">"Service was enabled for:"</string> + <string name="serviceDisabled" msgid="1937553226592516411">"Service has been disabled."</string> + <string name="serviceRegistered" msgid="6275019082598102493">"Registration was successful."</string> + <string name="serviceErased" msgid="1288584695297200972">"Erase successful."</string> + <string name="passwordIncorrect" msgid="7612208839450128715">"Incorrect password."</string> + <string name="mmiComplete" msgid="8232527495411698359">"MMI complete."</string> + <string name="badPin" msgid="9015277645546710014">"The old PIN that you typed is incorrect."</string> + <string name="badPuk" msgid="5487257647081132201">"The PUK that you typed isn\'t correct."</string> + <string name="mismatchPin" msgid="609379054496863419">"The PINs that you typed don\'t match."</string> + <string name="invalidPin" msgid="3850018445187475377">"Type a PIN that is 4 to 8 numbers."</string> + <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="imei" msgid="2625429890869005782">"IMEI"</string> + <string name="meid" msgid="4841221237681254195">"MEID"</string> + <string name="ClipMmi" msgid="6952821216480289285">"Incoming Caller ID"</string> + <string name="ClirMmi" msgid="7784673673446833091">"Outgoing Caller ID"</string> + <string name="CfMmi" msgid="5123218989141573515">"Call forwarding"</string> + <string name="CwMmi" msgid="9129678056795016867">"Call waiting"</string> + <string name="BaMmi" msgid="455193067926770581">"Call barring"</string> + <string name="PwdMmi" msgid="7043715687905254199">"Password change"</string> + <string name="PinMmi" msgid="3113117780361190304">"PIN change"</string> + <string name="CnipMmi" msgid="3110534680557857162">"Calling number present"</string> + <string name="CnirMmi" msgid="3062102121430548731">"Calling number restricted"</string> + <string name="ThreeWCMmi" msgid="9051047170321190368">"Three-way calling"</string> + <string name="RuacMmi" msgid="7827887459138308886">"Rejection of undesired annoying calls"</string> + <string name="CndMmi" msgid="3116446237081575808">"Calling number delivery"</string> + <string name="DndMmi" msgid="1265478932418334331">"Do not disturb"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Caller ID defaults to restricted. Next call: Restricted"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Caller ID defaults to restricted. Next call: Not restricted"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Caller ID defaults to not restricted. Next call: Restricted"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Caller ID defaults to not restricted. Next call: Not restricted"</string> + <string name="serviceNotProvisioned" msgid="8614830180508686666">"Service not provisioned."</string> + <string name="CLIRPermanent" msgid="3377371145926835671">"You can\'t change the caller ID setting."</string> + <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Restricted access changed"</string> + <string name="RestrictedOnData" msgid="8653794784690065540">"Data service is blocked."</string> + <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Emergency service is blocked."</string> + <string name="RestrictedOnNormal" msgid="4953867011389750673">"Voice service is blocked."</string> + <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"All voice services are blocked."</string> + <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS service is blocked."</string> + <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Voice/Data services are blocked."</string> + <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Voice/SMS services are blocked."</string> + <string name="RestrictedOnAll" msgid="5643028264466092821">"All voice/data/SMS services are blocked."</string> + <string name="serviceClassVoice" msgid="1258393812335258019">"Voice"</string> + <string name="serviceClassData" msgid="872456782077937893">"Data"</string> + <string name="serviceClassFAX" msgid="5566624998840486475">"FAX"</string> + <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string> + <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string> + <string name="serviceClassDataSync" msgid="7530000519646054776">"Sync"</string> + <string name="serviceClassPacket" msgid="6991006557993423453">"Packet"</string> + <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string> + <string name="roamingText0" msgid="7170335472198694945">"Roaming Indicator On"</string> + <string name="roamingText1" msgid="5314861519752538922">"Roaming Indicator Off"</string> + <string name="roamingText2" msgid="8969929049081268115">"Roaming Indicator Flashing"</string> + <string name="roamingText3" msgid="5148255027043943317">"Out of local area"</string> + <string name="roamingText4" msgid="8808456682550796530">"Out of Building"</string> + <string name="roamingText5" msgid="7604063252850354350">"Roaming - Preferred System"</string> + <string name="roamingText6" msgid="2059440825782871513">"Roaming - Available System"</string> + <string name="roamingText7" msgid="7112078724097233605">"Roaming - Alliance Partner"</string> + <string name="roamingText8" msgid="5989569778604089291">"Roaming - Premium Partner"</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 On"</string> + <string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string> + <string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string> + <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</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> after <xliff:g id="TIME_DELAY">{2}</xliff:g> seconds"</string> + <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string> + <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string> + <string name="fcComplete" msgid="3118848230966886575">"Feature code complete."</string> + <string name="fcError" msgid="3327560126588500777">"Connection problem or invalid feature code."</string> + <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string> + <string name="httpError" msgid="7956392511146698522">"There was a network error."</string> + <string name="httpErrorLookup" msgid="4711687456111963163">"Couldn\'t find the URL."</string> + <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"The site authentication scheme isn\'t supported."</string> + <string name="httpErrorAuth" msgid="1435065629438044534">"Couldn\'t authenticate."</string> + <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Authentication via the proxy server was unsuccessful."</string> + <string name="httpErrorConnect" msgid="8714273236364640549">"Couldn\'t connect to the server."</string> + <string name="httpErrorIO" msgid="2340558197489302188">"Couldn\'t communicate with the server. Try again later."</string> + <string name="httpErrorTimeout" msgid="4743403703762883954">"The connection to the server timed out."</string> + <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"The page contains too many server redirects."</string> + <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"The protocol isn\'t supported."</string> + <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Couldn\'t establish a secure connection."</string> + <string name="httpErrorBadUrl" msgid="3636929722728881972">"Couldn\'t open the page because the URL is invalid."</string> + <string name="httpErrorFile" msgid="2170788515052558676">"Couldn\'t access the file."</string> + <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Couldn\'t find the requested file."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Too many requests are being processed. Try again later."</string> + <string name="notification_title" msgid="8967710025036163822">"Sign-in error for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> + <string name="contentServiceSync" msgid="8353523060269335667">"Sync"</string> + <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string> + <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string> + <string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string> + <string name="low_memory" product="default" msgid="3475999286680000541">"Phone storage is full. Delete some files to free space."</string> + <string name="me" msgid="6545696007631404292">"Me"</string> + <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet options"</string> + <string name="power_dialog" product="default" msgid="1319919075463988638">"Phone options"</string> + <string name="silent_mode" msgid="7167703389802618663">"Silent mode"</string> + <string name="turn_on_radio" msgid="3912793092339962371">"Turn on wireless"</string> + <string name="turn_off_radio" msgid="8198784949987062346">"Turn off wireless"</string> + <string name="screen_lock" msgid="799094655496098153">"Screen lock"</string> + <string name="power_off" msgid="4266614107412865048">"Power off"</string> + <string name="silent_mode_silent" msgid="319298163018473078">"Ringer off"</string> + <string name="silent_mode_vibrate" msgid="7072043388581551395">"Ringer vibrate"</string> + <string name="silent_mode_ring" msgid="8592241816194074353">"Ringer on"</string> + <string name="shutdown_progress" msgid="2281079257329981203">"Shutting down…"</string> + <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Your tablet will shut down."</string> + <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Your phone will shut down."</string> + <string name="shutdown_confirm_question" msgid="2906544768881136183">"Do you want to shut down?"</string> + <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot to safe mode"</string> + <string name="reboot_safemode_confirm" msgid="55293944502784668">"Do you want to reboot into safe mode? This will disable all third-party applications that you have installed. They will be restored when you reboot again."</string> + <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> + <string name="no_recent_tasks" msgid="8794906658732193473">"No recent apps"</string> + <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet options"</string> + <string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string> + <string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string> + <string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string> + <string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string> + <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string> + <string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string> + <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string> + <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sound is OFF"</string> + <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sound is ON"</string> + <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string> + <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string> + <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</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 System"</string> + <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services that cost you money"</string> + <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Do things that can cost you money."</string> + <string name="permgrouplab_messages" msgid="7521249148445456662">"Your messages"</string> + <string name="permgroupdesc_messages" msgid="7821999071003699236">"Read and write your SMS, email and other messages."</string> + <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Your personal information"</string> + <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Direct access to information about you, stored in on your contact card."</string> + <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Your social information"</string> + <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Direct access to information about your contacts and social connections."</string> + <string name="permgrouplab_location" msgid="635149742436692049">"Your location"</string> + <string name="permgroupdesc_location" msgid="5704679763124170100">"Monitor your physical location."</string> + <string name="permgrouplab_network" msgid="5808983377727109831">"Network communication"</string> + <string name="permgroupdesc_network" msgid="4478299413241861987">"Access various network features."</string> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Access devices and networks through Bluetooth."</string> + <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audio Settings"</string> + <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Change audio settings."</string> + <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affects Battery"</string> + <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Use features that can quickly drain battery."</string> + <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string> + <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direct access to calendar and events."</string> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Read User Dictionary"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Read words in user dictionary."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Write User Dictionary"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Add words to the user dictionary."</string> + <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bookmarks and History"</string> + <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direct access to bookmarks and browser history."</string> + <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string> + <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Set the alarm clock."</string> + <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Voicemail"</string> + <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Direct access to voicemail."</string> + <string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string> + <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Direct access to the microphone to record audio."</string> + <string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string> + <string name="permgroupdesc_camera" msgid="2933667372289567714">"Direct access to camera for image or video capture."</string> + <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Lock screen"</string> + <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Ability to affect behaviour of the lock screen on your device."</string> + <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Your applications information"</string> + <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Ability to affect behaviour of other applications on your device."</string> + <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Wallpaper"</string> + <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Change the device wallpaper settings."</string> + <string name="permgrouplab_systemClock" msgid="406535759236612992">"Clock"</string> + <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Change the device time or timezone."</string> + <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Status Bar"</string> + <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Change the device status bar settings."</string> + <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Sync Settings"</string> + <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Access to the sync settings."</string> + <string name="permgrouplab_accounts" msgid="3359646291125325519">"Your accounts"</string> + <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Access the available accounts."</string> + <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Hardware controls"</string> + <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Direct access to hardware on the handset."</string> + <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Phone calls"</string> + <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Monitor, record and process phone calls."</string> + <string name="permgrouplab_systemTools" msgid="4652191644082714048">"System tools"</string> + <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Lower-level access and control of the system."</string> + <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Development tools"</string> + <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Features only needed for app developers."</string> + <string name="permgrouplab_display" msgid="4279909676036402636">"Other Application UI"</string> + <string name="permgroupdesc_display" msgid="6051002031933013714">"Effect the UI of other applications."</string> + <string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string> + <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Access the USB storage."</string> + <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Access the SD card."</string> + <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Accessibility features"</string> + <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Features that assistive technology can request."</string> + <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string> + <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string> + <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string> + <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Touched items will be spoken aloud and the screen can be explored using gestures."</string> + <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Turn on enhanced web accessibility"</string> + <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts may be installed to make app content more accessible."</string> + <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observe text that you type"</string> + <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Includes personal data such as credit card numbers and passwords."</string> + <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string> + <string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string> + <string name="permlab_statusBarService" msgid="7247281911387931485">"status bar"</string> + <string name="permdesc_statusBarService" msgid="716113660795976060">"Allows the app to be the status bar."</string> + <string name="permlab_expandStatusBar" msgid="1148198785937489264">"expand/collapse status bar"</string> + <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Allows the app to expand or collapse the status bar."</string> + <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reroute outgoing calls"</string> + <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Allows the app to process outgoing calls and change the number to be dialled. This permission allows the app to monitor, redirect or prevent outgoing calls."</string> + <string name="permlab_receiveSms" msgid="8673471768947895082">"receive text messages (SMS)"</string> + <string name="permdesc_receiveSms" msgid="6424387754228766939">"Allows the app to receive and process SMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string> + <string name="permlab_receiveMms" msgid="1821317344668257098">"receive text messages (MMS)"</string> + <string name="permdesc_receiveMms" msgid="533019437263212260">"Allows the app to receive and process MMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string> + <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"receive emergency broadcasts"</string> + <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Allows the app to receive and process emergency broadcast messages. This permission is only available for system apps."</string> + <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"read mobile broadcast messages"</string> + <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Allows the app to read mobile broadcast messages received by your device. Cell broadcast alerts are delivered in some locations to warn you of emergency situations. Malicious apps may interfere with the performance or operation of your device when an emergency mobile broadcast is received."</string> + <string name="permlab_sendSms" msgid="5600830612147671529">"send SMS messages"</string> + <string name="permdesc_sendSms" msgid="7094729298204937667">"Allows the app to send SMS messages. This may result in unexpected charges. Malicious apps may cost you money by sending messages without your confirmation."</string> + <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"send respond-via-message events"</string> + <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Allows the app to send requests to other messaging apps to handle respond-via-message events for incoming calls."</string> + <string name="permlab_readSms" msgid="8745086572213270480">"read your text messages (SMS or MMS)"</string> + <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Allows the app to read SMS messages stored on your tablet or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string> + <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Allows the app to read SMS messages stored on your phone or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string> + <string name="permlab_writeSms" msgid="3216950472636214774">"edit your text messages (SMS or MMS)"</string> + <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Allows the app to write to SMS messages stored on your tablet or SIM card. Malicious apps may delete your messages."</string> + <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Allows the app to write to SMS messages stored on your phone or SIM card. Malicious apps may delete your messages."</string> + <string name="permlab_receiveWapPush" msgid="5991398711936590410">"receive text messages (WAP)"</string> + <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Allows the app to receive and process WAP messages. This permission includes the ability to monitor or delete messages sent to you without showing them to you."</string> + <string name="permlab_getTasks" msgid="6466095396623933906">"retrieve running apps"</string> + <string name="permdesc_getTasks" msgid="7454215995847658102">"Allows the app to retrieve information about currently and recently running tasks. This may allow the app to discover information about which applications are used on the device."</string> + <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"interact across users"</string> + <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Allows the app to perform actions across different users on the device. Malicious apps may use this to violate the protection between users."</string> + <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"full license to interact across users"</string> + <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Allows all possible interactions across users."</string> + <string name="permlab_manageUsers" msgid="1676150911672282428">"manage users"</string> + <string name="permdesc_manageUsers" msgid="8409306667645355638">"Allows apps to manage users on the device, including query, creation and deletion."</string> + <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"retrieve details of running apps"</string> + <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Allows the app to retrieve detailed information about currently and recently running tasks. Malicious apps may discover private information about other apps."</string> + <string name="permlab_reorderTasks" msgid="2018575526934422779">"re-order running apps"</string> + <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Allows the app to move tasks to the foreground and background. The app may do this without your input."</string> + <string name="permlab_removeTasks" msgid="6821513401870377403">"stop running apps"</string> + <string name="permdesc_removeTasks" msgid="1394714352062635493">"Allows the app to remove tasks and kill their apps. Malicious apps may disrupt the behaviour of other apps."</string> + <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"manage activity stacks"</string> + <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Allows the app to add, remove and modify the activity stacks in which other apps run. Malicious apps may disrupt the behaviour of other apps."</string> + <string name="permlab_startAnyActivity" msgid="2918768238045206456">"start any activity"</string> + <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Allows the app to start any activity, regardless of permission protection or exported state."</string> + <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"set screen compatibility"</string> + <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Allows the app to control the screen compatibility mode of other applications. Malicious applications may break the behaviour of other applications."</string> + <string name="permlab_setDebugApp" msgid="3022107198686584052">"enable app debugging"</string> + <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Allows the app to turn on debugging for another app. Malicious apps may use this to kill other apps."</string> + <string name="permlab_changeConfiguration" msgid="4162092185124234480">"change system display settings"</string> + <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Allows the app to change the current configuration, such as the locale or overall font size."</string> + <string name="permlab_enableCarMode" msgid="5684504058192921098">"enable car mode"</string> + <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Allows the app to enable the car mode."</string> + <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"close other apps"</string> + <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Allows the app to end background processes of other apps. This may cause other apps to stop running."</string> + <string name="permlab_forceStopPackages" msgid="2329627428832067700">"force stop other apps"</string> + <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Allows the app to forcibly stop other apps."</string> + <string name="permlab_forceBack" msgid="652935204072584616">"force app to close"</string> + <string name="permdesc_forceBack" msgid="3892295830419513623">"Allows the app to force any activity that is in the foreground to close and go back. Should never be needed for normal apps."</string> + <string name="permlab_dump" msgid="1681799862438954752">"retrieve system internal status"</string> + <string name="permdesc_dump" msgid="1778299088692290329">"Allows the app to retrieve the internal state of the system. Malicious apps may retrieve a wide variety of private and secure information that they should never normally need."</string> + <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"retrieve screen content"</string> + <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Allows the app to retrieve the content of the active window. Malicious apps may retrieve the entire window content and examine all its text except passwords."</string> + <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"temporary enable accessibility"</string> + <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Allows an application to temporarily enable accessibility on the device. Malicious apps may enable accessibility without user consent."</string> + <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"retrieve window info"</string> + <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Allows an application to retrieve information about the windows from the window manager. Malicious apps may retrieve information that is intended for internal system usage."</string> + <string name="permlab_filter_events" msgid="8675535648807427389">"filter events"</string> + <string name="permdesc_filter_events" msgid="8006236315888347680">"Allows an application to register an input filter which filters the stream of all user events before they are dispatched. Malicious app may control the system UI without user intervention."</string> + <string name="permlab_magnify_display" msgid="5973626738170618775">"magnify display"</string> + <string name="permdesc_magnify_display" msgid="7121235684515003792">"Allows an application to magnify the content of a display. Malicious apps may transform the display content in a way that renders the device unusable."</string> + <string name="permlab_shutdown" msgid="7185747824038909016">"partial shutdown"</string> + <string name="permdesc_shutdown" msgid="7046500838746291775">"Puts the activity manager into a shut-down state. Does not perform a complete shut down."</string> + <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"prevent app switches"</string> + <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Prevents the user from switching to another app."</string> + <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"get current app info"</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Allows the holder to retrieve private information about the current application and services in the foreground of the screen."</string> + <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitor and control all app launching"</string> + <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Allows the app to monitor and control how the system launches activities. Malicious apps may completely compromise the system. This permission is only needed for development, never for normal use."</string> + <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"send package removed broadcast"</string> + <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Allows the app to broadcast a notification that an app package has been removed. Malicious apps may use this to kill any other running app."</string> + <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"send SMS-received broadcast"</string> + <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Allows the app to broadcast a notification that an SMS message has been received. Malicious apps may use this to forge incoming SMS messages."</string> + <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"send WAP-PUSH-received broadcast"</string> + <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Allows the app to broadcast a notification that a WAP PUSH message has been received. Malicious apps may use this to forge MMS message receipt or to silently replace the content of any web page with malicious variants."</string> + <string name="permlab_setProcessLimit" msgid="2451873664363662666">"limit number of running processes"</string> + <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Allows the app to control the maximum number of processes that will run. Never needed for normal apps."</string> + <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"force background apps to close"</string> + <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Allows the app to control whether activities are always finished as soon as they go to the background. Never needed for normal apps."</string> + <string name="permlab_batteryStats" msgid="2789610673514103364">"read battery statistics"</string> + <string name="permdesc_batteryStats" msgid="5897346582882915114">"Allows an application to read the current low-level battery use data. May allow the application to find out detailed information about which apps you use."</string> + <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modify battery statistics"</string> + <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Allows the app to modify collected battery statistics. Not for use by normal apps."</string> + <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"retrieve app ops statistics"</string> + <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Allows the app to retrieve collected application operation statistics. Not for use by normal apps."</string> + <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modify app ops statistics"</string> + <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Allows the app to modify collected component usage statistics. Not for use by normal apps."</string> + <string name="permlab_backup" msgid="470013022865453920">"control system back up and restore"</string> + <string name="permdesc_backup" msgid="6912230525140589891">"Allows the app to control the system\'s backup and restore mechanism. Not for use by normal apps."</string> + <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"confirm a full backup or restore operation"</string> + <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Allows the app to launch the full backup confirmation UI. Not to be used by any app."</string> + <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"display unauthorised windows"</string> + <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Allows the app to create windows that are intended to be used by the internal system user interface. Not for use by normal apps."</string> + <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"draw over other apps"</string> + <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Allows the app to draw on top of other applications or parts of the user interface. They may interfere with your use of the interface in any application, or change what you think you are seeing in other applications."</string> + <string name="permlab_setAnimationScale" msgid="2805103241153907174">"modify global animation speed"</string> + <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Allows the app to change the global animation speed (faster or slower animations) at any time."</string> + <string name="permlab_manageAppTokens" msgid="1286505717050121370">"manage app tokens"</string> + <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Allows the app to create and manage their own tokens, bypassing their normal Z-ordering. Should never be needed for normal apps."</string> + <string name="permlab_freezeScreen" msgid="4708181184441880175">"freeze screen"</string> + <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Allows the application to temporarily freeze the screen for a full-screen transition."</string> + <string name="permlab_injectEvents" msgid="1378746584023586600">"press keys and control buttons"</string> + <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Allows the app to deliver its own input events (key presses, etc.) to other apps. Malicious apps may use this to take over the tablet."</string> + <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Allows the app to deliver its own input events (key presses, etc.) to other apps. Malicious apps may use this to take over the phone."</string> + <string name="permlab_readInputState" msgid="469428900041249234">"record what you type and actions that you take"</string> + <string name="permdesc_readInputState" msgid="8387754901688728043">"Allows the app to watch the keys that you press even when interacting with another app (such as typing a password). Should never be needed for normal apps."</string> + <string name="permlab_bindInputMethod" msgid="3360064620230515776">"bind to an input method"</string> + <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Allows the holder to bind to the top-level interface of an input method. Should never be needed for normal apps."</string> + <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"bind to an accessibility service"</string> + <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Allows the holder to bind to the top-level interface of an accessibility service. Should never be needed for normal apps."</string> + <string name="permlab_bindPrintService" msgid="8462815179572748761">"bind to a print service"</string> + <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Allows the holder to bind to the top-level interface of a print service. Should never be needed for normal apps."</string> + <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"access all print jobs"</string> + <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Allows the holder to access print jobs created by another app. Should never be needed for normal apps."</string> + <string name="permlab_bindNfcService" msgid="2752731300419410724">"bind to NFC service"</string> + <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Allows the holder to bind to applications that are emulating NFC cards. Should never be needed for normal apps."</string> + <string name="permlab_bindTextService" msgid="7358378401915287938">"bind to a text service"</string> + <string name="permdesc_bindTextService" msgid="8151968910973998670">"Allows the holder to bind to the top-level interface of a text service (e.g. SpellCheckerService). Should never be needed for normal applications."</string> + <string name="permlab_bindVpnService" msgid="4708596021161473255">"bind to a VPN service"</string> + <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Allows the holder to bind to the top-level interface of a Vpn service. Should never be needed for normal apps."</string> + <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bind to wallpaper"</string> + <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Allows the holder to bind to the top-level interface of wallpaper. Should never be needed for normal applications."</string> + <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind to a widget service"</string> + <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Allows the holder to bind to the top-level interface of a widget service. Should never be needed for normal apps."</string> + <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interact with device admin"</string> + <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Allows the holder to send intents to a device administrator. Should never be needed for normal apps."</string> + <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"add or remove a device admin"</string> + <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Allows the holder to add or remove active device administrators. Should never be needed for normal apps."</string> + <string name="permlab_setOrientation" msgid="3365947717163866844">"change screen orientation"</string> + <string name="permdesc_setOrientation" msgid="3046126619316671476">"Allows the app to change the rotation of the screen at any time. Should never be needed for normal apps."</string> + <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"change pointer speed"</string> + <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Allows the app to change the mouse or touch pad pointer speed at any time. Should never be needed for normal apps."</string> + <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"change keyboard layout"</string> + <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Allows the app to change the keyboard layout. Should never be needed for normal apps."</string> + <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"send Linux signals to apps"</string> + <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Allows the app to request that the supplied signal be sent to all persistent processes."</string> + <string name="permlab_persistentActivity" msgid="8841113627955563938">"make app always run"</string> + <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string> + <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the phone."</string> + <string name="permlab_deletePackages" msgid="184385129537705938">"delete apps"</string> + <string name="permdesc_deletePackages" msgid="7411480275167205081">"Allows the app to delete Android packages. Malicious apps may use this to delete important apps."</string> + <string name="permlab_clearAppUserData" msgid="274109191845842756">"delete other apps\' data"</string> + <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Allows the app to clear user data."</string> + <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"delete other apps\' caches"</string> + <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Allows the app to delete cache files."</string> + <string name="permlab_getPackageSize" msgid="7472921768357981986">"measure app storage space"</string> + <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Allows the app to retrieve its code, data and cache sizes"</string> + <string name="permlab_installPackages" msgid="2199128482820306924">"directly install apps"</string> + <string name="permdesc_installPackages" msgid="5628530972548071284">"Allows the app to install new or updated Android packages. Malicious apps may use this to add new apps with arbitrarily powerful permissions."</string> + <string name="permlab_clearAppCache" msgid="7487279391723526815">"delete all app cache data"</string> + <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Allows the app to free tablet storage by deleting files in the cache directories of other applications. This may cause other applications to start up more slowly as they need to re-retrieve their data."</string> + <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Allows the app to free phone storage by deleting files in the cache directories of other applications. This may cause other applications to start up more slowly as they need to re-retrieve their data."</string> + <string name="permlab_movePackage" msgid="3289890271645921411">"move app resources"</string> + <string name="permdesc_movePackage" msgid="319562217778244524">"Allows the app to move app resources from internal to external media and vice versa."</string> + <string name="permlab_readLogs" msgid="6615778543198967614">"read sensitive log data"</string> + <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Allows the app to read from the system\'s various log files. This allows it to discover general information about what you are doing with the tablet, potentially including personal or private information."</string> + <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Allows the app to read from the system\'s various log files. This allows it to discover general information about what you are doing with the phone, potentially including personal or private information."</string> + <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"use any media decoder for playback"</string> + <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Allows the app to use any installed media decoder to decode for playback."</string> + <string name="permlab_diagnostic" msgid="8076743953908000342">"read/write to resources owned by diag"</string> + <string name="permdesc_diagnostic" msgid="6608295692002452283">"Allows the app to read and write to any resource owned by the diag group; for example, files in /dev. This could potentially affect system stability and security. This should ONLY be used for hardware-specific diagnostics by the manufacturer or operator."</string> + <string name="permlab_changeComponentState" msgid="6335576775711095931">"enable or disable app components"</string> + <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Allows the app to change whether a component of another app is enabled or not. Malicious apps may use this to disable important tablet capabilities. Care must be taken with this permission, as it is possible to get app components into an unusable, inconsistent or unstable state."</string> + <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Allows the app to change whether a component of another app is enabled or not. Malicious apps may use this to disable important phone capabilities. Care must be taken with this permission, as it is possible to get app components into an unusable, inconsistent or unstable state."</string> + <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"grant or revoke permissions"</string> + <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Allows an application to grant or revoke specific permissions for it or other applications. Malicious applications may use this to access features for which you have not granted them permission."</string> + <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"set preferred apps"</string> + <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Allows the app to modify your preferred apps. Malicious apps may silently change the apps that are run, spoofing your existing apps to collect private data from you."</string> + <string name="permlab_writeSettings" msgid="2226195290955224730">"modify system settings"</string> + <string name="permdesc_writeSettings" msgid="7775723441558907181">"Allows the app to modify the system\'s settings data. Malicious apps may corrupt your system\'s configuration."</string> + <string name="permlab_writeSecureSettings" msgid="204676251876718288">"modify secure system settings"</string> + <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Allows the app to modify the system\'s secure settings data. Not for use by normal apps."</string> + <string name="permlab_writeGservices" msgid="2149426664226152185">"modify the Google services map"</string> + <string name="permdesc_writeGservices" msgid="1287309437638380229">"Allows the app to modify the Google services map. Not for use by normal apps."</string> + <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"run at startup"</string> + <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Allows the app to have itself started as soon as the system has finished booting. This can make it take longer to start the tablet and allow the app to slow down the overall tablet by always running."</string> + <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Allows the app to have itself started as soon as the system has finished booting. This can make it take longer to start the phone and allow the app to slow down the overall phone by always running."</string> + <string name="permlab_broadcastSticky" msgid="7919126372606881614">"send sticky broadcast"</string> + <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Allows the app to send sticky broadcasts, which remain after the broadcast ends. Excessive use may make the tablet slow or unstable by causing it to use too much memory."</string> + <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Allows the app to send sticky broadcasts, which remain after the broadcast ends. Excessive use may make the phone slow or unstable by causing it to use too much memory."</string> + <string name="permlab_readContacts" msgid="8348481131899886131">"read your contacts"</string> + <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Allows the app to read data about your contacts stored on your tablet, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This permission allows apps to save your contact data, and malicious apps may share contact data without your knowledge."</string> + <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Allows the app to read data about your contacts stored on your phone, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This permission allows apps to save your contact data, and malicious apps may share contact data without your knowledge."</string> + <string name="permlab_writeContacts" msgid="5107492086416793544">"modify your contacts"</string> + <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Allows the app to modify the data about your contacts stored on your tablet, including the frequency with which you\'ve called, emailed or communicated in other ways with specific contacts. This permission allows apps to delete contact data."</string> + <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Allows the app to modify the data about your contacts stored on your phone, including the frequency with which you\'ve called, emailed or communicated in other ways with specific contacts. This permission allows apps to delete contact data."</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"read call log"</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Allows the app to read your tablet\'s call log, including data about incoming and outgoing calls. This permission allows apps to save your call log data, and malicious apps may share call log data without your knowledge."</string> + <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Allows the app to read your phone\'s call log, including data about incoming and outgoing calls. This permission allows apps to save your call log data, and malicious apps may share call log data without your knowledge."</string> + <string name="permlab_writeCallLog" msgid="8552045664743499354">"write call log"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Allows the app to modify your tablet\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string> + <string name="permlab_readProfile" msgid="4701889852612716678">"read your own contact card"</string> + <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Allows the app to read personal profile information stored on your device, such as your name and contact information. This means that the app can identify you and may send your profile information to others."</string> + <string name="permlab_writeProfile" msgid="907793628777397643">"modify your own contact card"</string> + <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Allows the app to change or add to personal profile information stored on your device, such as your name and contact information. This means that the app can identify you and may send your profile information to others."</string> + <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"read your social stream"</string> + <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Allows the app to access and sync social updates from you and your friends. Be careful when sharing information - this allows the app to read communications between you and your friends on social networks, regardless of confidentiality. Note: this permission may not be enforced on all social networks."</string> + <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"write to your social stream"</string> + <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Allows the app to display social updates from your friends. Be careful when sharing information - this allows the app to produce messages that may appear to come from a friend. Note: this permission may not be enforced on all social networks."</string> + <string name="permlab_readCalendar" msgid="5972727560257612398">"read calendar events plus confidential information"</string> + <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Allows the app to read all calendar events stored on your tablet, 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="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">"add or modify calendar events and send emails to guests without owners\' knowledge"</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Allows the app to add, remove and change events that you can modify on your tablet, including those of friends or co-workers. This may allow the app to send messages that appear to come from calendar owners, or modify events without the owners\' knowledge."</string> + <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Allows the app to add, remove and change events that you can modify on your phone, including those of friends or co-workers. This may allow the app to send messages that appear to come from calendar owners, or modify events without the owners\' knowledge."</string> + <string name="permlab_accessMockLocation" msgid="8688334974036823330">"mock location sources for testing"</string> + <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Create mock location sources for testing or install a new location provider. This allows the app to override the location and/or status returned by other location sources such as GPS or location providers."</string> + <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"access extra location provider commands"</string> + <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources."</string> + <string name="permlab_installLocationProvider" msgid="6578101199825193873">"permission to install a location provider"</string> + <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Create mock location sources for testing or install a new location provider. This allows the app to override the location and/or status returned by other location sources such as GPS or location providers."</string> + <string name="permlab_accessFineLocation" msgid="1191898061965273372">"precise location (GPS and network-based)"</string> + <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Allows the app to get your precise location using the Global Positioning System (GPS) or network location sources such as mobile towers and Wi-Fi. These location services must be turned on and available to your device for the app to use them. Apps may use this to determine where you are, and may consume additional battery power."</string> + <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"approximate location (network-based)"</string> + <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Allows the app to get your approximate location. This location is derived by location services using network location sources such as mobile towers and Wi-Fi. These location services must be turned on and available to your device for the app to use them. Apps may use this to determine approximately where you are."</string> + <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"access SurfaceFlinger"</string> + <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> + <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Allows the app to control low-level features of Wi-Fi displays."</string> + <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"capture audio output"</string> + <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Allows the app to capture and redirect audio output."</string> + <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"capture video output"</string> + <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Allows the app to capture and redirect video output."</string> + <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"capture secure video output"</string> + <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Allows the app to capture and redirect secure video output."</string> + <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"change your audio settings"</string> + <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Allows the app to modify global audio settings such as volume and which speaker is used for output."</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"record audio"</string> + <string name="permdesc_recordAudio" msgid="4906839301087980680">"Allows the app to record audio with the microphone. This permission allows the app to record audio at any time without your confirmation."</string> + <string name="permlab_camera" msgid="3616391919559751192">"take pictures and videos"</string> + <string name="permdesc_camera" msgid="8497216524735535009">"Allows the app to take pictures and videos with the camera. This permission allows the app to use the camera at any time without your confirmation."</string> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"disable transmit indicator LED when camera is in use"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Allows a pre-installed system application to disable the camera use indicator LED."</string> + <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanently disable tablet"</string> + <string name="permlab_brick" product="default" msgid="8337817093326370537">"permanently disable phone"</string> + <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Allows the app to permanently disable the entire tablet. This is very dangerous."</string> + <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Allows the app to permanently disable the entire phone. This is very dangerous."</string> + <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"force tablet reboot"</string> + <string name="permlab_reboot" product="default" msgid="2898560872462638242">"force phone reboot"</string> + <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Allows the app to force the tablet to reboot."</string> + <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Allows the app to force the phone to reboot."</string> + <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"access USB storage filesystem"</string> + <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"access SD Card filesystem"</string> + <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Allows the app to mount and unmount file systems for removable storage."</string> + <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"Erase USB storage"</string> + <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"erase SD Card"</string> + <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Allows the app to format removable storage."</string> + <string name="permlab_asec_access" msgid="3411338632002193846">"get information on internal storage"</string> + <string name="permdesc_asec_access" msgid="3094563844593878548">"Allows the application to access information on internal storage."</string> + <string name="permlab_asec_create" msgid="6414757234789336327">"create internal storage"</string> + <string name="permdesc_asec_create" msgid="4558869273585856876">"Allows the application to create internal storage."</string> + <string name="permlab_asec_destroy" msgid="526928328301618022">"destroy internal storage"</string> + <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Allows the app to destroy internal storage."</string> + <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"mount/unmount internal storage"</string> + <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Allows the app to mount/unmount internal storage."</string> + <string name="permlab_asec_rename" msgid="7496633954080472417">"rename internal storage"</string> + <string name="permdesc_asec_rename" msgid="1794757588472127675">"Allows the app to rename internal storage."</string> + <string name="permlab_vibrate" msgid="7696427026057705834">"control vibration"</string> + <string name="permdesc_vibrate" msgid="6284989245902300945">"Allows the app to control the vibrator."</string> + <string name="permlab_flashlight" msgid="2155920810121984215">"control flashlight"</string> + <string name="permdesc_flashlight" msgid="6522284794568368310">"Allows the app to control the flashlight."</string> + <string name="permlab_manageUsb" msgid="1113453430645402723">"manage preferences and permissions for USB devices"</string> + <string name="permdesc_manageUsb" msgid="7776155430218239833">"Allows the app to manage preferences and permissions for USB devices."</string> + <string name="permlab_accessMtp" msgid="4953468676795917042">"implement MTP protocol"</string> + <string name="permdesc_accessMtp" msgid="6532961200486791570">"Allows access to the kernel MTP driver to implement the MTP USB protocol."</string> + <string name="permlab_hardware_test" msgid="4148290860400659146">"test hardware"</string> + <string name="permdesc_hardware_test" msgid="6597964191208016605">"Allows the app to control various peripherals for the purpose of hardware testing."</string> + <string name="permlab_callPhone" msgid="3925836347681847954">"directly call phone numbers"</string> + <string name="permdesc_callPhone" msgid="3740797576113760827">"Allows the app to call phone numbers without your intervention. This may result in unexpected charges or calls. Note that this doesn\'t allow the app to call emergency numbers. Malicious apps may cost you money by making calls without your confirmation."</string> + <string name="permlab_callPrivileged" msgid="4198349211108497879">"directly call any phone numbers"</string> + <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Allows the app to call any phone number, including emergency numbers, without your intervention. Malicious apps may place unnecessary and illegal calls to emergency services."</string> + <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"directly start CDMA tablet setup"</string> + <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"directly start CDMA phone setup"</string> + <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Allows the app to start CDMA provisioning. Malicious apps may unnecessarily start CDMA provisioning."</string> + <string name="permlab_locationUpdates" msgid="7785408253364335740">"control location update notifications"</string> + <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Allows the app to enable/disable location update notifications from the radio. Not for use by normal apps."</string> + <string name="permlab_checkinProperties" msgid="7855259461268734914">"access check-in properties"</string> + <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Allows the app read/write access to properties uploaded by the check-in service. Not for use by normal apps."</string> + <string name="permlab_bindGadget" msgid="776905339015863471">"choose widgets"</string> + <string name="permdesc_bindGadget" msgid="8261326938599049290">"Allows the app to tell the system which widgets can be used by which app. An app with this permission can give other apps access to personal data. Not for use by normal apps."</string> + <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"modify phone status"</string> + <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Allows the app to control the phone features of the device. An app with this permission can switch networks, turn the phone radio on and off and the like without ever notifying you."</string> + <string name="permlab_readPhoneState" msgid="9178228524507610486">"read phone status and identity"</string> + <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> + <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> + <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"prevent phone from sleeping"</string> + <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Allows the app to prevent the tablet from going to sleep."</string> + <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Allows the app to prevent the phone from going to sleep."</string> + <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"turn tablet on or off"</string> + <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"turn phone on or off"</string> + <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Allows the app to turn the tablet on or off."</string> + <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Allows the app to turn the phone on or off."</string> + <string name="permlab_factoryTest" msgid="3715225492696416187">"run in factory test mode"</string> + <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Run as a low-level manufacturer test, allowing complete access to the tablet hardware. Only available when a tablet is running in manufacturer test mode."</string> + <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Run as a low-level manufacturer test, allowing complete access to the phone hardware. Only available when a phone is running in manufacturer test mode."</string> + <string name="permlab_setWallpaper" msgid="6627192333373465143">"set wallpaper"</string> + <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Allows the app to set the system wallpaper."</string> + <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"adjust your wallpaper size"</string> + <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Allows the app to set the system wallpaper size hints."</string> + <string name="permlab_masterClear" msgid="2315750423139697397">"reset system to factory defaults"</string> + <string name="permdesc_masterClear" msgid="3665380492633910226">"Allows the app to completely reset the system to its factory settings, erasing all data, configuration and installed apps."</string> + <string name="permlab_setTime" msgid="2021614829591775646">"set time"</string> + <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Allows the app to change the tablet\'s clock time."</string> + <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Allows the app to change the phone\'s clock time."</string> + <string name="permlab_setTimeZone" msgid="2945079801013077340">"set time zone"</string> + <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Allows the app to change the tablet\'s time zone."</string> + <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Allows the app to change the phone\'s time zone."</string> + <string name="permlab_accountManagerService" msgid="4829262349691386986">"act as the Account Manager Service"</string> + <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Allows the app to make calls to Account Authenticators."</string> + <string name="permlab_getAccounts" msgid="1086795467760122114">"find accounts on the device"</string> + <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Allows the app to get the list of accounts known by the tablet. This may include any accounts created by applications that you have installed."</string> + <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Allows the app to get the list of accounts known by the phone. This may include any accounts created by applications that you have installed."</string> + <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"create accounts and set passwords"</string> + <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Allows the app to use the account authenticator capabilities of the Account Manager, including creating accounts and getting and setting their passwords."</string> + <string name="permlab_manageAccounts" msgid="4983126304757177305">"add or remove accounts"</string> + <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Allows the app to perform operations like adding and removing accounts, and deleting their password."</string> + <string name="permlab_useCredentials" msgid="235481396163877642">"use accounts on the device"</string> + <string name="permdesc_useCredentials" msgid="7984227147403346422">"Allows the app to request authentication tokens."</string> + <string name="permlab_accessNetworkState" msgid="4951027964348974773">"view network connections"</string> + <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Allows the app to view information about network connections such as which networks exist and are connected."</string> + <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"full network access"</string> + <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Allows the app to create network sockets and use customised network protocols. The browser and other applications provide means to send data to the Internet, so this permission is not required to send data to the Internet."</string> + <string name="permlab_writeApnSettings" msgid="505660159675751896">"change/intercept network settings and traffic"</string> + <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Allows the app to change network settings and to intercept and inspect all network traffic, for example to change the proxy and port of any APN. Malicious apps may monitor, redirect or modify network packets without your knowledge."</string> + <string name="permlab_changeNetworkState" msgid="958884291454327309">"change network connectivity"</string> + <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Allows the app to change the state of network connectivity."</string> + <string name="permlab_changeTetherState" msgid="5952584964373017960">"change tethered connectivity"</string> + <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Allows the app to change the state of tethered network connectivity."</string> + <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"change background data usage setting"</string> + <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Allows the app to change the background data usage setting."</string> + <string name="permlab_accessWifiState" msgid="5202012949247040011">"view Wi-Fi connections"</string> + <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Allows the app to view information about Wi-Fi networking, such as whether Wi-Fi is enabled and name of connected Wi-Fi devices."</string> + <string name="permlab_changeWifiState" msgid="6550641188749128035">"connect and disconnect from Wi-Fi"</string> + <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Allows the app to connect to and disconnect from Wi-Fi access points and to make changes to device configuration for Wi-Fi networks."</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"allow Wi-Fi Multicast reception"</string> + <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Allows the app to receive packets sent to all devices on a Wi-Fi network using multicast addresses, not just your tablet. It uses more power than the non-multicast mode."</string> + <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Allows the app to receive packets sent to all devices on a Wi-Fi network using multicast addresses, not just your phone. It uses more power than the non-multicast mode."</string> + <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"access Bluetooth settings"</string> + <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Allows the app to configure the local Bluetooth tablet and to discover and pair with remote devices."</string> + <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Allows the app to configure the local Bluetooth phone and to discover and pair with remote devices."</string> + <string name="permlab_accessWimaxState" msgid="4195907010610205703">"connect and disconnect from WiMAX"</string> + <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Allows the app to determine whether WiMAX is enabled and information about any WiMAX networks that are connected."</string> + <string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string> + <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Allows the app to connect the tablet to and disconnect the tablet from WiMAX networks."</string> + <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Allows the app to connect the phone to and disconnect the phone from WiMAX networks."</string> + <string name="permlab_bluetooth" msgid="6127769336339276828">"pair with Bluetooth devices"</string> + <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Allows the app to view the configuration of Bluetooth on the tablet and to make and accept connections with paired devices."</string> + <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Allows the app to view the configuration of the Bluetooth on the phone and to make and accept connections with paired devices."</string> + <string name="permlab_nfc" msgid="4423351274757876953">"control Near-Field Communication"</string> + <string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string> + <string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string> + <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> + <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> + <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Allows an app to modify the sync settings for an account. For example, this can be used to enable syncing of the People app with an account."</string> + <string name="permlab_readSyncStats" msgid="7396577451360202448">"read sync statistics"</string> + <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string> + <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"read subscribed feeds"</string> + <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Allows the app to get details about the currently synced feeds."</string> + <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"write subscribed feeds"</string> + <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Allows the app to modify your currently synced feeds. Malicious apps may change your synced feeds."</string> + <string name="permlab_readDictionary" msgid="4107101525746035718">"read terms you added to the dictionary"</string> + <string name="permdesc_readDictionary" msgid="659614600338904243">"Allows the app to read all words, names and phrases that the user may have stored in the user dictionary."</string> + <string name="permlab_writeDictionary" msgid="2183110402314441106">"add words to user-defined dictionary"</string> + <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Allows the app to write new words into the user dictionary."</string> + <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"test access to protected storage"</string> + <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"test access to protected storage"</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Allows the app to test a permission for USB storage that will be available on future devices."</string> + <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Allows the app to test a permission for the SD card that will be available on future devices."</string> + <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modify or delete the contents of your USB storage"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modify or delete the contents of your SD card"</string> + <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Allows the app to write to the USB storage."</string> + <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Allows the app to write to the SD card."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modify/delete internal media storage contents"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Allows the app to modify the contents of the internal media storage."</string> + <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"manage document storage"</string> + <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Allows the app to manage document storage."</string> + <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"access external storage of all users"</string> + <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Allows the app to access external storage for all users."</string> + <string name="permlab_cache_filesystem" msgid="5656487264819669824">"access the cache file system"</string> + <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Allows the app to read and write the cache file system."</string> + <string name="permlab_use_sip" msgid="5986952362795870502">"make/receive Internet calls"</string> + <string name="permdesc_use_sip" msgid="4717632000062674294">"Allows the app to use the SIP service to make/receive Internet calls."</string> + <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"read historical network usage"</string> + <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Allows the app to read historical network usage for specific networks and apps."</string> + <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"manage network policy"</string> + <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Allows the app to manage network policies and define app-specific rules."</string> + <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modify network usage accounting"</string> + <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Allows the app to modify how network usage is accounted against apps. Not for use by normal apps."</string> + <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"modify socket marks"</string> + <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Allows the app to modify socket marks for routing"</string> + <string name="permlab_accessNotifications" msgid="7673416487873432268">"access notifications"</string> + <string name="permdesc_accessNotifications" msgid="458457742683431387">"Allows the app to retrieve, examine, and clear notifications, including those posted by other apps."</string> + <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bind to a notification listener service"</string> + <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Allows the holder to bind to the top-level interface of a notification listener service. Should never be needed for normal apps."</string> + <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoke the carrier-provided configuration app"</string> + <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Allows the holder to invoke the carrier-provided configuration app. Should never be needed for normal apps."</string> + <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"listen for observations on network conditions"</string> + <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Allows an application to listen for observations on network conditions. Should never be needed for normal apps."</string> + <string name="policylab_limitPassword" msgid="4497420728857585791">"Set password rules"</string> + <string name="policydesc_limitPassword" msgid="3252114203919510394">"Control the length and the characters allowed in screen-unlock passwords."</string> + <string name="policylab_watchLogin" msgid="914130646942199503">"Monitor screen-unlock attempts"</string> + <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Monitor the number of incorrect passwords typed when unlocking the screen and lock the tablet or erase all the tablet\'s data if too many incorrect passwords are typed."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Monitor the number of incorrect passwords typed when unlocking the screen and lock the phone or erase all the phone\'s data if too many incorrect passwords are typed."</string> + <string name="policylab_resetPassword" msgid="2620077191242688955">"Change the screen-unlock password"</string> + <string name="policydesc_resetPassword" msgid="605963962301904458">"Change the screen-unlock password."</string> + <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string> + <string name="policydesc_forceLock" msgid="1141797588403827138">"Control how and when the screen locks."</string> + <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string> + <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Erase the tablet\'s data without warning by performing a factory data reset."</string> + <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Erase the phone\'s data without warning by performing a factory data reset."</string> + <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Set the device global proxy"</string> + <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Set the device\'s global proxy to be used while policy is enabled. Only the first device admin sets the effective global proxy."</string> + <string name="policylab_expirePassword" msgid="885279151847254056">"Set lock-screen password expiry"</string> + <string name="policydesc_expirePassword" msgid="1729725226314691591">"Control how frequently the lock-screen password must be changed."</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Set storage encryption"</string> + <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Require that stored app data be encrypted."</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"Disable cameras"</string> + <string name="policydesc_disableCamera" msgid="2306349042834754597">"Prevent use of all device cameras."</string> + <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Disable features in keyguard"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Prevent use of some features in keyguard."</string> + <string-array name="phoneTypes"> + <item msgid="8901098336658710359">"Home"</item> + <item msgid="869923650527136615">"Mobile"</item> + <item msgid="7897544654242874543">"Work"</item> + <item msgid="1103601433382158155">"Work Fax"</item> + <item msgid="1735177144948329370">"Home Fax"</item> + <item msgid="603878674477207394">"Pager"</item> + <item msgid="1650824275177931637">"Other"</item> + <item msgid="9192514806975898961">"Custom"</item> + </string-array> + <string-array name="emailAddressTypes"> + <item msgid="8073994352956129127">"Home"</item> + <item msgid="7084237356602625604">"Work"</item> + <item msgid="1112044410659011023">"Other"</item> + <item msgid="2374913952870110618">"Custom"</item> + </string-array> + <string-array name="postalAddressTypes"> + <item msgid="6880257626740047286">"Home"</item> + <item msgid="5629153956045109251">"Work"</item> + <item msgid="4966604264500343469">"Other"</item> + <item msgid="4932682847595299369">"Custom"</item> + </string-array> + <string-array name="imAddressTypes"> + <item msgid="1738585194601476694">"Home"</item> + <item msgid="1359644565647383708">"Work"</item> + <item msgid="7868549401053615677">"Other"</item> + <item msgid="3145118944639869809">"Custom"</item> + </string-array> + <string-array name="organizationTypes"> + <item msgid="7546335612189115615">"Work"</item> + <item msgid="4378074129049520373">"Other"</item> + <item msgid="3455047468583965104">"Custom"</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">"Custom"</string> + <string name="phoneTypeHome" msgid="2570923463033985887">"Home"</string> + <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobile"</string> + <string name="phoneTypeWork" msgid="8863939667059911633">"Work"</string> + <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Work Fax"</string> + <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home Fax"</string> + <string name="phoneTypePager" msgid="7582359955394921732">"Pager"</string> + <string name="phoneTypeOther" msgid="1544425847868765990">"Other"</string> + <string name="phoneTypeCallback" msgid="2712175203065678206">"Callback"</string> + <string name="phoneTypeCar" msgid="8738360689616716982">"Car"</string> + <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Company Main"</string> + <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string> + <string name="phoneTypeMain" msgid="6766137010628326916">"Main"</string> + <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Other Fax"</string> + <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string> + <string name="phoneTypeTelex" msgid="3367879952476250512">"Telex"</string> + <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY/TDD"</string> + <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Work Mobile"</string> + <string name="phoneTypeWorkPager" msgid="649938731231157056">"Work Pager"</string> + <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistant"</string> + <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> + <string name="eventTypeCustom" msgid="7837586198458073404">"Customised"</string> + <string name="eventTypeBirthday" msgid="2813379844211390740">"Birthday"</string> + <string name="eventTypeAnniversary" msgid="3876779744518284000">"Anniversary"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Other"</string> + <string name="emailTypeCustom" msgid="8525960257804213846">"Custom"</string> + <string name="emailTypeHome" msgid="449227236140433919">"Home"</string> + <string name="emailTypeWork" msgid="3548058059601149973">"Work"</string> + <string name="emailTypeOther" msgid="2923008695272639549">"Other"</string> + <string name="emailTypeMobile" msgid="119919005321166205">"Mobile"</string> + <string name="postalTypeCustom" msgid="8903206903060479902">"Custom"</string> + <string name="postalTypeHome" msgid="8165756977184483097">"Home"</string> + <string name="postalTypeWork" msgid="5268172772387694495">"Work"</string> + <string name="postalTypeOther" msgid="2726111966623584341">"Other"</string> + <string name="imTypeCustom" msgid="2074028755527826046">"Custom"</string> + <string name="imTypeHome" msgid="6241181032954263892">"Home"</string> + <string name="imTypeWork" msgid="1371489290242433090">"Work"</string> + <string name="imTypeOther" msgid="5377007495735915478">"Other"</string> + <string name="imProtocolCustom" msgid="6919453836618749992">"Custom"</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">"Net Meeting"</string> + <string name="orgTypeWork" msgid="29268870505363872">"Work"</string> + <string name="orgTypeOther" msgid="3951781131570124082">"Other"</string> + <string name="orgTypeCustom" msgid="225523415372088322">"Custom"</string> + <string name="relationTypeCustom" msgid="3542403679827297300">"Customised"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Brother"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Child"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Domestic Partner"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Father"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Friend"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mother"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Parent"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Referred by"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Relative"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Sister"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Spouse"</string> + <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Customised"</string> + <string name="sipAddressTypeHome" msgid="6093598181069359295">"Home"</string> + <string name="sipAddressTypeWork" msgid="6920725730797099047">"Work"</string> + <string name="sipAddressTypeOther" msgid="4408436162950119849">"Other"</string> + <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_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="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Emergency number"</string> + <string name="lockscreen_carrier_default" msgid="8963839242565653192">"No service"</string> + <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Screen locked."</string> + <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Press Menu to unlock or place emergency call."</string> + <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Press Menu to unlock."</string> + <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Draw pattern to unlock"</string> + <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Emergency call"</string> + <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Return to call"</string> + <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correct!"</string> + <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Try again"</string> + <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Try again"</string> + <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximum Face Unlock attempts exceeded"</string> + <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Charging, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> + <string name="lockscreen_charged" msgid="321635745684060624">"Charged"</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">"Connect your charger."</string> + <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"No SIM card"</string> + <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"No SIM card in tablet."</string> + <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"No SIM card in phone."</string> + <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Insert a SIM card."</string> + <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"The SIM card is missing or not readable. Insert a SIM card."</string> + <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Unusable SIM card."</string> + <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Your SIM card has been permanently disabled.\n Contact your wireless service provider for another SIM card."</string> + <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Previous track button"</string> + <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Next-track button"</string> + <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pause button"</string> + <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Play button"</string> + <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Stop button"</string> + <string name="emergency_calls_only" msgid="6733978304386365407">"Emergency calls only"</string> + <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Network locked"</string> + <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM card is PUK-locked."</string> + <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"See the User Guide or contact Customer Care."</string> + <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM card is locked."</string> + <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Unlocking SIM card…"</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"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="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"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="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"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="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"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 your Google sign-in.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"You have drawn your unlock pattern incorrectly <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 your Google sign-in.\n\n Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> + <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"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="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"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="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"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="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string> + <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Forgotten pattern?"</string> + <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Account unlock"</string> + <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Too many pattern attempts"</string> + <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"To unlock, sign in with your Google account."</string> + <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Username (email)"</string> + <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Password"</string> + <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Sign in"</string> + <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Invalid username or password."</string> + <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Forgot your username or password?\nVisit "<b>"google.co.uk/accounts/recovery"</b>"."</string> + <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Checking…"</string> + <string name="lockscreen_unlock_label" msgid="737440483220667054">"Unlock"</string> + <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sound on"</string> + <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sound off"</string> + <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pattern started"</string> + <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pattern cleared"</string> + <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> + <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</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="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">"character"</string> + <string name="granularity_label_word" msgid="7075570328374918660">"word"</string> + <string name="granularity_label_link" msgid="5815508880782488267">"link"</string> + <string name="granularity_label_line" msgid="5764267235026120888">"line"</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">"Factory test failed"</string> + <string name="factorytest_not_system" msgid="4435201656767276723">"The FACTORY_TEST action is only supported for packages installed in /system/app."</string> + <string name="factorytest_no_action" msgid="872991874799998561">"No package was found that provides the FACTORY_TEST action."</string> + <string name="factorytest_reboot" msgid="6320168203050791643">"Reboot"</string> + <string name="js_dialog_title" msgid="1987483977834603872">"The page at \"<xliff:g id="TITLE">%s</xliff:g>\" says:"</string> + <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> + <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Confirm Navigation"</string> + <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Leave this Page"</string> + <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Stay on this Page"</string> + <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nAre you sure you want to navigate away from this page?"</string> + <string name="save_password_label" msgid="6860261758665825069">"Confirm"</string> + <string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string> + <string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string> + <string name="setup_autofill" msgid="7103495070180590814">"Set up Auto-fill"</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">"Province"</string> + <string name="autofill_postal_code" msgid="4696430407689377108">"Postcode"</string> + <string name="autofill_state" msgid="6988894195520044613">"State"</string> + <string name="autofill_zip_code" msgid="8697544592627322946">"Zip code"</string> + <string name="autofill_county" msgid="237073771020362891">"County"</string> + <string name="autofill_island" msgid="4020100875984667025">"Island"</string> + <string name="autofill_district" msgid="8400735073392267672">"District"</string> + <string name="autofill_department" msgid="5343279462564453309">"Department"</string> + <string name="autofill_prefecture" msgid="2028499485065800419">"Prefecture"</string> + <string name="autofill_parish" msgid="8202206105468820057">"Parish"</string> + <string name="autofill_area" msgid="3547409050889952423">"Area"</string> + <string name="autofill_emirate" msgid="2893880978835698818">"Emirate"</string> + <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"read your Web bookmarks and history"</string> + <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Allows the app to read the history of all URLs that the Browser has visited, and all of the Browser\'s bookmarks. Note: this permission may not be enforced by third-party browsers or other applications with web browsing capabilities."</string> + <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"write web bookmarks and history"</string> + <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Allows the app to modify the Browser\'s history or bookmarks stored on your tablet. This may allow the app to delete or modify Browser data. Note: this permission may not be enforced by third-party browsers or other applications with web browsing capabilities."</string> + <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Allows the app to modify the Browser\'s history or bookmarks stored on your phone. This may allow the app to delete or modify Browser data. Note: this permission may not be enforced by third-party browsers or other applications with web browsing capabilities."</string> + <string name="permlab_setAlarm" msgid="1379294556362091814">"set an alarm"</string> + <string name="permdesc_setAlarm" msgid="316392039157473848">"Allows the app to set an alarm in an installed alarm clock app. Some alarm clock apps may not implement this feature."</string> + <string name="permlab_addVoicemail" msgid="5525660026090959044">"add voicemail"</string> + <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Allows the app to add messages to your voicemail inbox."</string> + <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Modify Browser geo-location permissions"</string> + <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Allows the app to modify the Browser\'s geo-location permissions. Malicious apps may use this to allow sending location information to arbitrary websites."</string> + <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"verify packages"</string> + <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Allows the app to verify a package is installable."</string> + <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"bind to a package verifier"</string> + <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Allows the holder to make requests of package verifiers. Should never be needed for normal apps."</string> + <string name="permlab_serialPort" msgid="546083327654631076">"access serial ports"</string> + <string name="permdesc_serialPort" msgid="2991639985224598193">"Allows the holder to access serial ports using the SerialManager API."</string> + <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"access content providers externally"</string> + <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Allows the holder to access content providers from the shell. Should never be needed for normal apps."</string> + <string name="permlab_updateLock" msgid="3527558366616680889">"discourage automatic device updates"</string> + <string name="permdesc_updateLock" msgid="1655625832166778492">"Allows the holder to offer information to the system about when would be a good time for a non-interactive reboot to upgrade the device."</string> + <string name="save_password_message" msgid="767344687139195790">"Do you want the browser to remember this password?"</string> + <string name="save_password_notnow" msgid="6389675316706699758">"Not now"</string> + <string name="save_password_remember" msgid="6491879678996749466">"Remember"</string> + <string name="save_password_never" msgid="8274330296785855105">"Never"</string> + <string name="open_permission_deny" msgid="7374036708316629800">"You don\'t have permission to open this page."</string> + <string name="text_copied" msgid="4985729524670131385">"Text copied to clipboard."</string> + <string name="more_item_label" msgid="4650918923083320495">"More"</string> + <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</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">"delete"</string> + <string name="search_go" msgid="8298016669822141719">"Search"</string> + <string name="searchview_description_search" msgid="6749826639098512120">"Search"</string> + <string name="searchview_description_query" msgid="5911778593125355124">"Search query"</string> + <string name="searchview_description_clear" msgid="1330281990951833033">"Clear query"</string> + <string name="searchview_description_submit" msgid="2688450133297983542">"Submit query"</string> + <string name="searchview_description_voice" msgid="2453203695674994440">"Voice search"</string> + <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Enable 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> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the tablet."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone."</string> + <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 month ago"</string> + <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Before 1 month ago"</string> + <plurals name="num_seconds_ago"> + <item quantity="one" msgid="4869870056547896011">"1 second ago"</item> + <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> seconds ago"</item> + </plurals> + <plurals name="num_minutes_ago"> + <item quantity="one" msgid="3306787433088810191">"1 minute ago"</item> + <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> minutes ago"</item> + </plurals> + <plurals name="num_hours_ago"> + <item quantity="one" msgid="9150797944610821849">"1 hour ago"</item> + <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> hours ago"</item> + </plurals> + <plurals name="last_num_days"> + <item quantity="other" msgid="3069992808164318268">"Last <xliff:g id="COUNT">%d</xliff:g> days"</item> + </plurals> + <string name="last_month" msgid="3959346739979055432">"Last month"</string> + <string name="older" msgid="5211975022815554840">"Older"</string> + <plurals name="num_days_ago"> + <item quantity="one" msgid="861358534398115820">"yesterday"</item> + <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> days ago"</item> + </plurals> + <plurals name="in_num_seconds"> + <item quantity="one" msgid="2729745560954905102">"in 1 second"</item> + <item quantity="other" msgid="1241926116443974687">"in <xliff:g id="COUNT">%d</xliff:g> seconds"</item> + </plurals> + <plurals name="in_num_minutes"> + <item quantity="one" msgid="8793095251325200395">"in 1 minute"</item> + <item quantity="other" msgid="3330713936399448749">"in <xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="in_num_hours"> + <item quantity="one" msgid="7164353342477769999">"in 1 hour"</item> + <item quantity="other" msgid="547290677353727389">"in <xliff:g id="COUNT">%d</xliff:g> hours"</item> + </plurals> + <plurals name="in_num_days"> + <item quantity="one" msgid="5413088743009839518">"tomorrow"</item> + <item quantity="other" msgid="5109449375100953247">"in <xliff:g id="COUNT">%d</xliff:g> days"</item> + </plurals> + <plurals name="abbrev_num_seconds_ago"> + <item quantity="one" msgid="1849036840200069118">"1 sec ago"</item> + <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> secs ago"</item> + </plurals> + <plurals name="abbrev_num_minutes_ago"> + <item quantity="one" msgid="6361490147113871545">"1 min ago"</item> + <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> mins ago"</item> + </plurals> + <plurals name="abbrev_num_hours_ago"> + <item quantity="one" msgid="4796212039724722116">"1 hour ago"</item> + <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> hours ago"</item> + </plurals> + <plurals name="abbrev_num_days_ago"> + <item quantity="one" msgid="8463161711492680309">"yesterday"</item> + <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> days ago"</item> + </plurals> + <plurals name="abbrev_in_num_seconds"> + <item quantity="one" msgid="5842225370795066299">"in 1 sec"</item> + <item quantity="other" msgid="5495880108825805108">"in <xliff:g id="COUNT">%d</xliff:g> secs"</item> + </plurals> + <plurals name="abbrev_in_num_minutes"> + <item quantity="one" msgid="562786149928284878">"in 1 min"</item> + <item quantity="other" msgid="4216113292706568726">"in <xliff:g id="COUNT">%d</xliff:g> mins"</item> + </plurals> + <plurals name="abbrev_in_num_hours"> + <item quantity="one" msgid="3274708118124045246">"in 1 hour"</item> + <item quantity="other" msgid="3705373766798013406">"in <xliff:g id="COUNT">%d</xliff:g> hours"</item> + </plurals> + <plurals name="abbrev_in_num_days"> + <item quantity="one" msgid="2178576254385739855">"tomorrow"</item> + <item quantity="other" msgid="2973062968038355991">"in <xliff:g id="COUNT">%d</xliff:g> days"</item> + </plurals> + <string name="preposition_for_date" msgid="9093949757757445117">"on <xliff:g id="DATE">%s</xliff:g>"</string> + <string name="preposition_for_time" msgid="5506831244263083793">"at <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="preposition_for_year" msgid="5040395640711867177">"in<xliff:g id="YEAR">%s</xliff:g>"</string> + <string name="day" msgid="8144195776058119424">"day"</string> + <string name="days" msgid="4774547661021344602">"days"</string> + <string name="hour" msgid="2126771916426189481">"hour"</string> + <string name="hours" msgid="894424005266852993">"hours"</string> + <string name="minute" msgid="9148878657703769868">"min"</string> + <string name="minutes" msgid="5646001005827034509">"mins"</string> + <string name="second" msgid="3184235808021478">"sec"</string> + <string name="seconds" msgid="3161515347216589235">"secs"</string> + <string name="week" msgid="5617961537173061583">"week"</string> + <string name="weeks" msgid="6509623834583944518">"weeks"</string> + <string name="year" msgid="4001118221013892076">"year"</string> + <string name="years" msgid="6881577717993213522">"years"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 second"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> seconds"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minute"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hour"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> hours"</item> + </plurals> + <string name="VideoView_error_title" msgid="3534509135438353077">"Video problem"</string> + <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"This video isn\'t valid for streaming to this device."</string> + <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Can\'t play this video."</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">"noon"</string> + <string name="Noon" msgid="3342127745230013127">"Noon"</string> + <string name="midnight" msgid="7166259508850457595">"midnight"</string> + <string name="Midnight" msgid="5630806906897892201">"Midnight"</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">"Select all"</string> + <string name="cut" msgid="3092569408438626261">"Cut"</string> + <string name="copy" msgid="2681946229533511987">"Copy"</string> + <string name="paste" msgid="5629880836805036433">"Paste"</string> + <string name="replace" msgid="5781686059063148930">"Replace..."</string> + <string name="delete" msgid="6098684844021697789">"Delete"</string> + <string name="copyUrl" msgid="2538211579596067402">"Copy URL"</string> + <string name="selectTextMode" msgid="1018691815143165326">"Select text"</string> + <string name="textSelectionCABTitle" msgid="5236850394370820357">"Text selection"</string> + <string name="addToDictionary" msgid="4352161534510057874">"Add to dictionary"</string> + <string name="deleteText" msgid="6979668428458199034">"Delete"</string> + <string name="inputMethod" msgid="1653630062304567879">"Input method"</string> + <string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string> + <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> + <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> + <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string> + <string name="app_running_notification_text" msgid="4653586947747330058">"Touch for more information or to stop the app."</string> + <string name="ok" msgid="5970060430562524910">"OK"</string> + <string name="cancel" msgid="6442560571259935130">"Cancel"</string> + <string name="yes" msgid="5362982303337969312">"OK"</string> + <string name="no" msgid="5141531044935541497">"Cancel"</string> + <string name="dialog_alert_title" msgid="2049658708609043103">"Attention"</string> + <string name="loading" msgid="7933681260296021180">"Loading…"</string> + <string name="capital_on" msgid="1544682755514494298">"ON"</string> + <string name="capital_off" msgid="6815870386972805832">"OFF"</string> + <string name="whichApplication" msgid="4533185947064773386">"Complete action using"</string> + <string name="alwaysUse" msgid="4583018368000610438">"Use by default for this action."</string> + <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Clear default in System settings > Apps > Downloaded."</string> + <string name="chooseActivity" msgid="7486876147751803333">"Choose an action"</string> + <string name="chooseUsbActivity" msgid="6894748416073583509">"Choose an app for the USB device"</string> + <string name="noApplications" msgid="2991814273936504689">"No apps can perform this action."</string> + <string name="aerr_title" msgid="1905800560317137752"></string> + <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> + <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <string name="anr_title" msgid="4351948481459135709"></string> + <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> + <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> + <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> isn\'t responding. Do you want to close it?"</string> + <string name="anr_process" msgid="6513209874880517125">"Process <xliff:g id="PROCESS">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> + <string name="force_close" msgid="8346072094521265605">"OK"</string> + <string name="report" msgid="4060218260984795706">"Report"</string> + <string name="wait" msgid="7147118217226317732">"Wait"</string> + <string name="webpage_unresponsive" msgid="3272758351138122503">"The page has become unresponsive.\n\nDo you want to close it?"</string> + <string name="launch_warning_title" msgid="1547997780506713581">"App redirected"</string> + <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> is now running."</string> + <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> was originally launched."</string> + <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Scale"</string> + <string name="screen_compat_mode_show" msgid="4013878876486655892">"Always show"</string> + <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Re-enable this in System settings > Apps > Downloaded."</string> + <string name="smv_application" msgid="3307209192155442829">"The app <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced Strict Mode policy."</string> + <string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string> + <string name="android_upgrading_title" msgid="1584192285441405746">"Android is upgrading…"</string> + <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimising app <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> + <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> + <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> + <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Touch to switch to app"</string> + <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> + <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> + <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> + <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> + <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> + <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string> + <string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string> + <string name="volume_music" msgid="5421651157138628171">"Media volume"</string> + <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Playing through Bluetooth"</string> + <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Silent ringtone set"</string> + <string name="volume_call" msgid="3941680041282788711">"In-call volume"</string> + <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth in-call volume"</string> + <string name="volume_alarm" msgid="1985191616042689100">"Alarm volume"</string> + <string name="volume_notification" msgid="2422265656744276715">"Notification volume"</string> + <string name="volume_unknown" msgid="1400219669770445902">"Volume"</string> + <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth volume"</string> + <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Ringtone volume"</string> + <string name="volume_icon_description_incall" msgid="8890073218154543397">"Call volume"</string> + <string name="volume_icon_description_media" msgid="4217311719665194215">"Media volume"</string> + <string name="volume_icon_description_notification" msgid="7044986546477282274">"Notification volume"</string> + <string name="ringtone_default" msgid="3789758980357696936">"Default ringtone"</string> + <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Default ringtone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"None"</string> + <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringtones"</string> + <string name="ringtone_unknown" msgid="5477919988701784788">"Unknown ringtone"</string> + <plurals name="wifi_available"> + <item quantity="one" msgid="6654123987418168693">"Wi-Fi network available"</item> + <item quantity="other" msgid="4192424489168397386">"Wi-Fi networks available"</item> + </plurals> + <plurals name="wifi_available_detailed"> + <item quantity="one" msgid="1634101450343277345">"Open available Wi-Fi network"</item> + <item quantity="other" msgid="7915895323644292768">"Open Wi-Fi networks available"</item> + </plurals> + <string name="wifi_available_sign_in" msgid="4029489716605255386">"Sign in to Wi-Fi network"</string> + <string name="network_available_sign_in" msgid="8495155593358054676">"Sign in to network"</string> + <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> + <skip /> + <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Couldn\'t connect to Wi-Fi"</string> + <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" has a poor Internet connection."</string> + <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string> + <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Start Wi-Fi Direct. This will turn off Wi-Fi client/hotspot."</string> + <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Couldn\'t start Wi-Fi Direct."</string> + <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct is on"</string> + <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Touch for settings"</string> + <string name="accept" msgid="1645267259272829559">"Accept"</string> + <string name="decline" msgid="2112225451706137894">"Decline"</string> + <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Invitation sent"</string> + <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Invitation to connect"</string> + <string name="wifi_p2p_from_message" msgid="570389174731951769">"From:"</string> + <string name="wifi_p2p_to_message" msgid="248968974522044099">"To:"</string> + <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Type the required PIN:"</string> + <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string> + <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"The tablet will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> + <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"The phone will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> + <string name="select_character" msgid="3365550120617701745">"Insert character"</string> + <string name="sms_control_title" msgid="7296612781128917719">"Sending SMS messages"</string> + <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> is sending a large number of SMS messages. Do you want to allow this app to continue sending messages?"</string> + <string name="sms_control_yes" msgid="3663725993855816807">"Allow"</string> + <string name="sms_control_no" msgid="625438561395534982">"Deny"</string> + <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> would like to send a message to <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string> + <string name="sms_short_code_details" msgid="3492025719868078457">"This "<font fgcolor="#ffffb060">"may cause charges"</font>" on your mobile account."</string> + <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"This will cause charges on your mobile account."</font></string> + <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Send"</string> + <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Cancel"</string> + <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Remember my choice"</string> + <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"You can change this later in Settings > Apps"</string> + <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Always Allow*"</string> + <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Never Allow"</string> + <string name="sim_removed_title" msgid="6227712319223226185">"SIM card removed"</string> + <string name="sim_removed_message" msgid="2333164559970958645">"The mobile network will be unavailable until you restart with a valid SIM card inserted."</string> + <string name="sim_done_button" msgid="827949989369963775">"Done"</string> + <string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string> + <string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string> + <string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string> + <string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string> + <string name="date_picker_dialog_title" msgid="5879450659453782278">"Set date"</string> + <string name="date_time_set" msgid="5777075614321087758">"Set"</string> + <string name="date_time_done" msgid="2507683751759308828">"Done"</string> + <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NEW: "</font></string> + <string name="perms_description_app" msgid="5139836143293299417">"Provided by <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> + <string name="no_permissions" msgid="7283357728219338112">"No permission required"</string> + <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> + <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB mass storage"</string> + <string name="usb_storage_title" msgid="5901459041398751495">"USB connected"</string> + <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"You\'ve connected to your computer via USB. Touch the button below if you want to copy files between your computer and your Android\'s USB storage."</string> + <string name="usb_storage_message" product="default" msgid="805351000446037811">"You\'ve connected to your computer via USB. Touch the button below if you want to copy files between your computer and your Android\'s SD card."</string> + <string name="usb_storage_button_mount" msgid="1052259930369508235">"Turn on USB storage"</string> + <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"There\'s a problem using your USB storage for USB mass storage."</string> + <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"There\'s a problem using your SD card for USB mass storage."</string> + <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB connected"</string> + <string name="usb_storage_notification_message" msgid="939822783828183763">"Touch to copy files to/from your computer."</string> + <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Turn off USB storage"</string> + <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Touch to turn off USB storage."</string> + <string name="usb_storage_stop_title" msgid="660129851708775853">"USB storage in use"</string> + <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"Before turning off USB storage, unmount (\"eject\") your Android\'s USB storage from your computer."</string> + <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"Before turning off USB storage, unmount (\"eject\") your Android\'s SD card from your computer."</string> + <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Turn off USB storage"</string> + <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"There was a problem turning off USB storage. Check that you\'ve unmounted the USB host, then try again."</string> + <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Turn off USB storage"</string> + <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"If you turn on USB storage, some apps that you\'re using will stop and may be unavailable until you turn off USB storage."</string> + <string name="dlg_error_title" msgid="7323658469626514207">"USB operation unsuccessful"</string> + <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> + <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Connected as a media device"</string> + <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Connected as a camera"</string> + <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connected as an installer"</string> + <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <string name="usb_notification_message" msgid="2290859399983720271">"Touch for other USB options."</string> + <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"Format USB storage?"</string> + <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"Format SD card?"</string> + <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"All files stored in your USB storage will be erased. This action can\'t be reversed!"</string> + <string name="extmedia_format_message" product="default" msgid="14131895027543830">"All data on your card will be lost."</string> + <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> + <string name="adb_active_notification_message" msgid="1016654627626476142">"Touch to disable USB debugging."</string> + <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string> + <string name="configure_input_methods" msgid="9091652157722495116">"Set up input methods"</string> + <string name="use_physical_keyboard" msgid="6203112478095117625">"Physical keyboard"</string> + <string name="hardware" msgid="7517821086888990278">"Hardware"</string> + <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string> + <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Touch to select a keyboard layout."</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>"candidates"</u></string> + <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Preparing USB storage"</string> + <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Preparing SD card"</string> + <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Checking for errors."</string> + <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Blank USB storage"</string> + <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Blank SD card"</string> + <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB storage is blank or has unsupported filesystem."</string> + <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD card is blank or has unsupported file system."</string> + <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Damaged USB storage"</string> + <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Damaged SD card"</string> + <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB storage is damaged. Try reformatting it."</string> + <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD card is damaged. Try reformatting it."</string> + <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB storage removed unexpectedly"</string> + <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD card removed unexpectedly"</string> + <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Unmount USB storage before removing to avoid data loss."</string> + <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Unmount SD card before removing to avoid data loss."</string> + <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB storage safe to remove"</string> + <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD card safe to remove"</string> + <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"You can safely remove USB storage."</string> + <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"You can safely remove SD card."</string> + <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Removed USB storage"</string> + <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Removed SD card"</string> + <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB storage removed. Insert new media."</string> + <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD card removed. Insert a new one."</string> + <string name="activity_list_empty" msgid="1675388330786841066">"No matching activities found."</string> + <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"update component usage statistics"</string> + <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Allows the app to modify collected component usage statistics. Not for use by normal apps."</string> + <string name="permlab_copyProtectedData" msgid="4341036311211406692">"copy content"</string> + <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Allows the app to invoke default container service to copy content. Not for use by normal apps."</string> + <string name="permlab_route_media_output" msgid="1642024455750414694">"Route media output"</string> + <string name="permdesc_route_media_output" msgid="4932818749547244346">"Allows an application to route media output to other external devices."</string> + <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Access keyguard secure storage"</string> + <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Allows an application to access keyguard secure storage."</string> + <string name="permlab_control_keyguard" msgid="172195184207828387">"Control displaying and hiding keyguard"</string> + <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Allows an application to control keyguard."</string> + <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Touch twice for zoom control"</string> + <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Couldn\'t add widget."</string> + <string name="ime_action_go" msgid="8320845651737369027">"Go"</string> + <string name="ime_action_search" msgid="658110271822807811">"Search"</string> + <string name="ime_action_send" msgid="2316166556349314424">"Send"</string> + <string name="ime_action_next" msgid="3138843904009813834">"Next"</string> + <string name="ime_action_done" msgid="8971516117910934605">"Done"</string> + <string name="ime_action_previous" msgid="1443550039250105948">"Prev"</string> + <string name="ime_action_default" msgid="2840921885558045721">"Execute"</string> + <string name="dial_number_using" msgid="5789176425167573586">"Dial number\n using <xliff:g id="NUMBER">%s</xliff:g>"</string> + <string name="create_contact_using" msgid="4947405226788104538">"Create contact\n using <xliff:g id="NUMBER">%s</xliff:g>"</string> + <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"The following one or more applications request permission to access your account, now and in the future."</string> + <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Do you want to allow this request?"</string> + <string name="grant_permissions_header_text" msgid="6874497408201826708">"Access request"</string> + <string name="allow" msgid="7225948811296386551">"Allow"</string> + <string name="deny" msgid="2081879885755434506">"Deny"</string> + <string name="permission_request_notification_title" msgid="6486759795926237907">"Permission requested"</string> + <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"Permission requested\nfor account <xliff:g id="ACCOUNT">%s</xliff:g>."</string> + <string name="input_method_binding_label" msgid="1283557179944992649">"Input Method"</string> + <string name="sync_binding_label" msgid="3687969138375092423">"Sync"</string> + <string name="accessibility_binding_label" msgid="4148120742096474641">"Accessibility"</string> + <string name="wallpaper_binding_label" msgid="1240087844304687662">"Wallpaper"</string> + <string name="chooser_wallpaper" msgid="7873476199295190279">"Change wallpaper"</string> + <string name="notification_listener_binding_label" msgid="2014162835481906429">"Notification listener"</string> + <string name="vpn_title" msgid="19615213552042827">"VPN activated"</string> + <string name="vpn_title_long" msgid="6400714798049252294">"VPN is activated by <xliff:g id="APP">%s</xliff:g>"</string> + <string name="vpn_text" msgid="3011306607126450322">"Touch to manage the network."</string> + <string name="vpn_text_long" msgid="6407351006249174473">"Connected to <xliff:g id="SESSION">%s</xliff:g>. Touch to manage the network."</string> + <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string> + <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string> + <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string> + <string name="vpn_lockdown_config" msgid="6415899150671537970">"Touch to configure"</string> + <string name="upload_file" msgid="2897957172366730416">"Choose file"</string> + <string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string> + <string name="reset" msgid="2448168080964209908">"Reset"</string> + <string name="submit" msgid="1602335572089911941">"Submit"</string> + <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Car mode enabled"</string> + <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Touch to exit car mode."</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string> + <string name="tethered_notification_message" msgid="6857031760103062982">"Touch to set up."</string> + <string name="back_button_label" msgid="2300470004503343439">"Back"</string> + <string name="next_button_label" msgid="1080555104677992408">"Next"</string> + <string name="skip_button_label" msgid="1275362299471631819">"Skip"</string> + <string name="throttle_warning_notification_title" msgid="4890894267454867276">"High mobile data use"</string> + <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Touch to learn more about mobile data use."</string> + <string name="throttled_notification_title" msgid="6269541897729781332">"Mobile data limit exceeded"</string> + <string name="throttled_notification_message" msgid="5443457321354907181">"Touch to learn more about mobile data use."</string> + <string name="no_matches" msgid="8129421908915840737">"No matches"</string> + <string name="find_on_page" msgid="1946799233822820384">"Find on page"</string> + <plurals name="matches_found"> + <item quantity="one" msgid="8167147081136579439">"1 Match"</item> + <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g>"</item> + </plurals> + <string name="action_mode_done" msgid="7217581640461922289">"Done"</string> + <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"Unmounting USB storage…"</string> + <string name="progress_unmounting" product="default" msgid="1327894998409537190">"Unmounting SD card…"</string> + <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"Erasing USB storage..."</string> + <string name="progress_erasing" product="default" msgid="6596988875507043042">"Erasing SD card…"</string> + <string name="format_error" product="nosdcard" msgid="6299769563624776948">"Couldn\'t erase USB storage."</string> + <string name="format_error" product="default" msgid="7315248696644510935">"Couldn\'t erase SD card."</string> + <string name="media_bad_removal" msgid="7960864061016603281">"SD card was removed before being unmounted."</string> + <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB storage is currently being checked."</string> + <string name="media_checking" product="default" msgid="7334762503904827481">"SD card is currently being checked."</string> + <string name="media_removed" msgid="7001526905057952097">"SD card has been removed."</string> + <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB storage is currently in use by a computer."</string> + <string name="media_shared" product="default" msgid="5706130568133540435">"SD card is currently in use by a computer."</string> + <string name="media_unknown_state" msgid="729192782197290385">"External media in unknown state."</string> + <string name="share" msgid="1778686618230011964">"Share"</string> + <string name="find" msgid="4808270900322985960">"Find"</string> + <string name="websearch" msgid="4337157977400211589">"Web Search"</string> + <string name="find_next" msgid="5742124618942193978">"Find next"</string> + <string name="find_previous" msgid="2196723669388360506">"Find previous"</string> + <string name="gpsNotifTicker" msgid="5622683912616496172">"Location request from <xliff:g id="NAME">%s</xliff:g>"</string> + <string name="gpsNotifTitle" msgid="5446858717157416839">"Location request"</string> + <string name="gpsNotifMessage" msgid="1374718023224000702">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> + <string name="gpsVerifYes" msgid="2346566072867213563">"Yes"</string> + <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <string name="sync_too_many_deletes" msgid="5296321850662746890">"Deletion limit exceeded"</string> + <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"There are <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> deleted items for <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. What do you want to do?"</string> + <string name="sync_really_delete" msgid="2572600103122596243">"Delete the items"</string> + <string name="sync_undo_deletes" msgid="2941317360600338602">"Undo the deletes"</string> + <string name="sync_do_nothing" msgid="3743764740430821845">"Do nothing for now"</string> + <string name="choose_account_label" msgid="5655203089746423927">"Choose an account"</string> + <string name="add_account_label" msgid="2935267344849993553">"Add an account"</string> + <string name="add_account_button_label" msgid="3611982894853435874">"Add account"</string> + <string name="number_picker_increment_button" msgid="2412072272832284313">"Increase"</string> + <string name="number_picker_decrement_button" msgid="476050778386779067">"Decrease"</string> + <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> touch and hold."</string> + <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Slide up to increase and down to decrease."</string> + <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Increase minute"</string> + <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Decrease minute"</string> + <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Increase hour"</string> + <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Decrease hour"</string> + <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Set p.m."</string> + <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Set a.m."</string> + <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Increase month"</string> + <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Decrease month"</string> + <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Increase day"</string> + <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Decrease day"</string> + <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Increase year"</string> + <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Decrease year"</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="activitychooserview_choose_application" msgid="2125168057199941199">"Choose an app"</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 & hold."</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="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_target_unlock_tablet" msgid="3833195335629795055">"Swipe to unlock."</string> + <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plug in a headset to hear password keys spoken."</string> + <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot"</string> + <string name="action_bar_home_description" msgid="5293600496601490216">"Navigate home"</string> + <string name="action_bar_up_description" msgid="2237496562952152589">"Navigate up"</string> + <string name="action_menu_overflow_description" msgid="2295659037509008453">"More options"</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">"Internal storage"</string> + <string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string> + <string name="storage_usb" msgid="3017954059538517278">"USB storage"</string> + <string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string> + <string name="data_usage_warning_title" msgid="1955638862122232342">"Data usage warning"</string> + <string name="data_usage_warning_body" msgid="2814673551471969954">"Touch to view usage and settings."</string> + <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G data disabled"</string> + <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G data disabled"</string> + <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobile data disabled"</string> + <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi data disabled"</string> + <string name="data_usage_limit_body" msgid="3317964706973601386">"Touch to enable."</string> + <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limit exceeded"</string> + <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limit exceeded"</string> + <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobile data limit exceeded"</string> + <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limit exceeded"</string> + <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over specified limit."</string> + <string name="data_usage_restricted_title" msgid="5965157361036321914">"Background data restricted"</string> + <string name="data_usage_restricted_body" msgid="6741521330997452990">"Touch to remove restriction."</string> + <string name="ssl_certificate" msgid="6510040486049237639">"Security certificate"</string> + <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"This certificate is valid."</string> + <string name="issued_to" msgid="454239480274921032">"Issued to:"</string> + <string name="common_name" msgid="2233209299434172646">"Common name:"</string> + <string name="org_name" msgid="6973561190762085236">"Organisation:"</string> + <string name="org_unit" msgid="7265981890422070383">"Organisational unit:"</string> + <string name="issued_by" msgid="2647584988057481566">"Issued by:"</string> + <string name="validity_period" msgid="8818886137545983110">"Validity:"</string> + <string name="issued_on" msgid="5895017404361397232">"Issued on:"</string> + <string name="expires_on" msgid="3676242949915959821">"Expires on:"</string> + <string name="serial_number" msgid="758814067660862493">"Serial number:"</string> + <string name="fingerprints" msgid="4516019619850763049">"Fingerprints:"</string> + <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 fingerprint"</string> + <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 fingerprint"</string> + <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string> + <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string> + <string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string> + <string name="status_bar_device_locked" msgid="3092703448690669768">"Device locked."</string> + <string name="list_delimeter" msgid="3975117572185494152">", "</string> + <string name="sending" msgid="3245653681008218030">"Sending…"</string> + <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> + <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> + <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablet"</string> + <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Phone"</string> + <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Headphones"</string> + <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Dock speakers"</string> + <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string> + <string name="default_audio_route_category_name" msgid="3722811174003886946">"System"</string> + <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth audio"</string> + <string name="wireless_display_route_description" msgid="9070346425023979651">"Wireless display"</string> + <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Done"</string> + <string name="media_route_button_content_description" msgid="5758553567065145276">"Media output"</string> + <string name="media_route_status_scanning" msgid="7279908761758293783">"Scanning..."</string> + <string name="media_route_status_connecting" msgid="6422571716007825440">"Connecting..."</string> + <string name="media_route_status_available" msgid="6983258067194649391">"Available"</string> + <string name="media_route_status_not_available" msgid="6739899962681886401">"Not available"</string> + <string name="media_route_status_in_use" msgid="4533786031090198063">"In use"</string> + <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Built-in Screen"</string> + <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Screen"</string> + <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">", secure"</string> + <string name="wifi_display_notification_title" msgid="2223050649240326557">"Wireless display is connected"</string> + <string name="wifi_display_notification_message" msgid="4498802012464170685">"This screen is showing on another device"</string> + <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Disconnect"</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">%1$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_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> + <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="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Raise volume above recommended level?\nListening at high volume for long periods may damage your hearing."</string> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Keep holding down two fingers to enable accessibility."</string> + <string name="accessibility_enabled" msgid="1381972048564547685">"Accessibility enabled."</string> + <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibility cancelled."</string> + <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> + <string name="owner_name" msgid="2716755460376028154">"Owner"</string> + <string name="error_message_title" msgid="4510373083082500195">"Error"</string> + <string name="app_no_restricted_accounts" msgid="5739463249673727736">"This app doesn\'t support accounts for restricted profiles"</string> + <string name="app_not_found" msgid="3429141853498927379">"No application found to handle this action"</string> + <string name="revoke" msgid="5404479185228271586">"Revoke"</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">"Cancelled"</string> + <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error writing content"</string> + <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Enter PIN"</string> + <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Current PIN:"</string> + <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"New PIN"</string> + <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirm new PIN"</string> + <string name="restr_pin_create_pin" msgid="8017600000263450337">"Create a PIN for modifying restrictions"</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PINs don\'t match. Try again."</string> + <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN is too short. Must be at least 4 digits."</string> + <plurals name="restr_pin_countdown"> + <item quantity="one" msgid="4835639969503729874">"Incorrect PIN. Try again in 1 second."</item> + <item quantity="other" msgid="8030607343223287654">"Incorrect PIN. Try again in <xliff:g id="COUNT">%d</xliff:g> seconds."</item> + </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swipe edge of screen to reveal bar"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swipe from edge of screen to reveal system bar"</string> +</resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 9c1156bc..983bfb3 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorrecto. Reintentar en 1 s"</item> <item quantity="other" msgid="8030607343223287654">"PIN incorrecto. Reintentar en <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Desliza el borde para ver la barra."</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Desliza el dedo desde el borde de la pantalla para mostrar la barra del sistema."</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index d64a07a..fa38dbc 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorrecto. Inténtalo de nuevo dentro de 1 segundo."</item> <item quantity="other" msgid="8030607343223287654">"PIN incorrecto. Inténtalo de nuevo dentro de <xliff:g id="COUNT">%d</xliff:g> segundos."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Deslizar borde para mostrar barra"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Desliza el borde de la pantalla para mostrar la barra del sistema"</string> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 386ea2d..df92621 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1579,4 +1579,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 136e027..8f12064 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"پین نادرست است. امتحان در ۱ ثانیه."</item> <item quantity="other" msgid="8030607343223287654">"پین نادرست است. امتحان در <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-fi/strings.xml b/core/res/res/values-fi/strings.xml index 098be12..ee990b8 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Väärä PIN. Yritä uudelleen yhden sekunnin kuluttua."</item> <item quantity="other" msgid="8030607343223287654">"Väärä PIN. Yritä uudelleen <xliff:g id="COUNT">%d</xliff:g> sekunnin kuluttua."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Näytä palkki liu\'uttamalla reunasta"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Tuo järjestelmäpalkki näkyviin liu\'uttamalla ruudun reunasta"</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml new file mode 100644 index 0000000..d3792e7 --- /dev/null +++ b/core/res/res/values-fr-rCA/strings.xml @@ -0,0 +1,1584 @@ +<?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">"Ko"</string> + <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string> + <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> + <string name="terabyteShort" msgid="231613018159186962">"To"</string> + <string name="petabyteShort" msgid="5637816680144990219">"Po"</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">"<Sans_titre>"</string> + <string name="ellipsis" msgid="7899829516048813237">"..."</string> + <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> + <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Aucun numéro de téléphone)"</string> + <string name="unknownName" msgid="2277556546742746522">"(Inconnu)"</string> + <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Messagerie vocale"</string> + <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string> + <string name="mmiError" msgid="5154499457739052907">"Problème de connexion ou code IHM incorrect"</string> + <string name="mmiFdnError" msgid="5224398216385316471">"Opération réservée aux numéros autorisés"</string> + <string name="serviceEnabled" msgid="8147278346414714315">"Le service a été activé."</string> + <string name="serviceEnabledFor" msgid="6856228140453471041">"Ce service a été activé pour :"</string> + <string name="serviceDisabled" msgid="1937553226592516411">"Ce service a été désactivé."</string> + <string name="serviceRegistered" msgid="6275019082598102493">"Enregistrement réussi"</string> + <string name="serviceErased" msgid="1288584695297200972">"Effacement réussi."</string> + <string name="passwordIncorrect" msgid="7612208839450128715">"Mot de passe incorrect"</string> + <string name="mmiComplete" msgid="8232527495411698359">"IHM terminée."</string> + <string name="badPin" msgid="9015277645546710014">"L\'ancien NIP saisi est incorrect."</string> + <string name="badPuk" msgid="5487257647081132201">"La clé PUK saisie est incorrecte."</string> + <string name="mismatchPin" msgid="609379054496863419">"Les NIP saisis ne correspondent pas."</string> + <string name="invalidPin" msgid="3850018445187475377">"Veuillez saisir un NIP comprenant entre quatre et huit chiffres."</string> + <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="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> + <string name="ClirMmi" msgid="7784673673446833091">"Numéro de l\'appelant (sortant)"</string> + <string name="CfMmi" msgid="5123218989141573515">"Transfert d\'appel"</string> + <string name="CwMmi" msgid="9129678056795016867">"Appel en attente"</string> + <string name="BaMmi" msgid="455193067926770581">"Interdiction d\'appel"</string> + <string name="PwdMmi" msgid="7043715687905254199">"Modification du mot de passe"</string> + <string name="PinMmi" msgid="3113117780361190304">"Modification du NIP"</string> + <string name="CnipMmi" msgid="3110534680557857162">"Présentation du numéro d\'appelant"</string> + <string name="CnirMmi" msgid="3062102121430548731">"Numéro de l\'appelant masqué"</string> + <string name="ThreeWCMmi" msgid="9051047170321190368">"Conférence téléphonique à trois"</string> + <string name="RuacMmi" msgid="7827887459138308886">"Rejeter les appels indésirables"</string> + <string name="CndMmi" msgid="3116446237081575808">"Livraison du numéro d\'appel"</string> + <string name="DndMmi" msgid="1265478932418334331">"Ne pas déranger"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string> + <string name="serviceNotProvisioned" msgid="8614830180508686666">"Ce service n\'est pas pris en charge."</string> + <string name="CLIRPermanent" msgid="3377371145926835671">"Impossible de modifier le paramètre relatif au numéro de l\'appelant."</string> + <string name="RestrictedChangedTitle" msgid="5592189398956187498">"L\'accès limité a été modifié."</string> + <string name="RestrictedOnData" msgid="8653794784690065540">"Le service de données est bloqué."</string> + <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Le service d\'appel d\'urgence est bloqué."</string> + <string name="RestrictedOnNormal" msgid="4953867011389750673">"Le service vocal est bloqué."</string> + <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Tous les services voix sont bloqués."</string> + <string name="RestrictedOnSms" msgid="8314352327461638897">"Le service SMS est bloqué."</string> + <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Les services vocaux/de données sont bloqués."</string> + <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Les services voix/SMS sont bloqués."</string> + <string name="RestrictedOnAll" msgid="5643028264466092821">"Tous les services vocaux/de données/SMS sont bloqués."</string> + <string name="serviceClassVoice" msgid="1258393812335258019">"Google Voice"</string> + <string name="serviceClassData" msgid="872456782077937893">"Données"</string> + <string name="serviceClassFAX" msgid="5566624998840486475">"Télécopie"</string> + <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string> + <string name="serviceClassDataAsync" msgid="4523454783498551468">"Asynchrones"</string> + <string name="serviceClassDataSync" msgid="7530000519646054776">"Synchroniser"</string> + <string name="serviceClassPacket" msgid="6991006557993423453">"Paquet"</string> + <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string> + <string name="roamingText0" msgid="7170335472198694945">"Indicateur d\'itinérance activé"</string> + <string name="roamingText1" msgid="5314861519752538922">"Indicateur d\'itinérance désactivé"</string> + <string name="roamingText2" msgid="8969929049081268115">"Indicateur d\'itinérance clignotant"</string> + <string name="roamingText3" msgid="5148255027043943317">"Hors zone"</string> + <string name="roamingText4" msgid="8808456682550796530">"Hors du bâtiment"</string> + <string name="roamingText5" msgid="7604063252850354350">"Itinérance - Système préféré"</string> + <string name="roamingText6" msgid="2059440825782871513">"Itinérance - Système disponible"</string> + <string name="roamingText7" msgid="7112078724097233605">"Itinérance - Partenaire Alliance"</string> + <string name="roamingText8" msgid="5989569778604089291">"Itinérance - Partenaire Premium"</string> + <string name="roamingText9" msgid="7969296811355152491">"Itinérance - Tous services disponibles"</string> + <string name="roamingText10" msgid="3992906999815316417">"Itinérance - Services partiellement disponibles"</string> + <string name="roamingText11" msgid="4154476854426920970">"Bannière d\'itinérance activée"</string> + <string name="roamingText12" msgid="1189071119992726320">"Bannière d\'itinérance désactivée"</string> + <string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string> + <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</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> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string> + <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string> + <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string> + <string name="fcComplete" msgid="3118848230966886575">"Code de service terminé"</string> + <string name="fcError" msgid="3327560126588500777">"Problème de connexion ou code de service non valide"</string> + <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string> + <string name="httpError" msgid="7956392511146698522">"Une erreur réseau s\'est produite."</string> + <string name="httpErrorLookup" msgid="4711687456111963163">"Impossible de trouver l\'URL."</string> + <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Le modèle d\'authentification du site n\'est pas compatible."</string> + <string name="httpErrorAuth" msgid="1435065629438044534">"Impossible de procéder à l\'authentification."</string> + <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Échec de l\'authentification par un serveur mandataire."</string> + <string name="httpErrorConnect" msgid="8714273236364640549">"Impossible de se connecter au serveur."</string> + <string name="httpErrorIO" msgid="2340558197489302188">"Impossible d\'établir une communication avec le serveur. Veuillez réessayer plus tard."</string> + <string name="httpErrorTimeout" msgid="4743403703762883954">"Délai de connexion au serveur dépassé."</string> + <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Cette page contient trop de redirections de serveurs."</string> + <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Ce protocole n\'est pas compatible."</string> + <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Impossible d\'établir une connexion sécurisée."</string> + <string name="httpErrorBadUrl" msgid="3636929722728881972">"Impossible d\'ouvrir la page, car l\'URL n\'est pas valide."</string> + <string name="httpErrorFile" msgid="2170788515052558676">"Impossible d\'accéder au fichier."</string> + <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Impossible de trouver le fichier demandé."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trop de requêtes sont en cours de traitement. Veuillez réessayer plus tard."</string> + <string name="notification_title" msgid="8967710025036163822">"Erreur de connexion au compte <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> + <string name="contentServiceSync" msgid="8353523060269335667">"Synchroniser"</string> + <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchroniser"</string> + <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string> + <string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string> + <string name="low_memory" product="default" msgid="3475999286680000541">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> + <string name="me" msgid="6545696007631404292">"Moi"</string> + <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Options de la tablette"</string> + <string name="power_dialog" product="default" msgid="1319919075463988638">"Options du téléphone"</string> + <string name="silent_mode" msgid="7167703389802618663">"Mode silencieux"</string> + <string name="turn_on_radio" msgid="3912793092339962371">"Activer le mode sans fil"</string> + <string name="turn_off_radio" msgid="8198784949987062346">"Désactiver le mode sans fil"</string> + <string name="screen_lock" msgid="799094655496098153">"Verrouillage de l\'écran"</string> + <string name="power_off" msgid="4266614107412865048">"Éteindre"</string> + <string name="silent_mode_silent" msgid="319298163018473078">"Sonnerie désactivée"</string> + <string name="silent_mode_vibrate" msgid="7072043388581551395">"Sonnerie en mode vibreur"</string> + <string name="silent_mode_ring" msgid="8592241816194074353">"Sonnerie activée"</string> + <string name="shutdown_progress" msgid="2281079257329981203">"Arrêt en cours..."</string> + <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Votre tablette va s\'éteindre."</string> + <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Votre téléphone va s\'éteindre."</string> + <string name="shutdown_confirm_question" msgid="2906544768881136183">"Voulez-vous éteindre l\'appareil?"</string> + <string name="reboot_safemode_title" msgid="7054509914500140361">"Redémarrer en mode sans échec"</string> + <string name="reboot_safemode_confirm" msgid="55293944502784668">"Voulez-vous redémarrer en mode sans échec? Cette opération aura pour effet de désactiver toutes les applications tierces que vous avez installées. Elles seront réactivées au prochain redémarrage."</string> + <string name="recent_tasks_title" msgid="3691764623638127888">"Récents"</string> + <string name="no_recent_tasks" msgid="8794906658732193473">"Aucune application récente"</string> + <string name="global_actions" product="tablet" msgid="408477140088053665">"Options de la tablette"</string> + <string name="global_actions" product="default" msgid="2406416831541615258">"Options du téléphone"</string> + <string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string> + <string name="global_action_power_off" msgid="4471879440839879722">"Éteindre"</string> + <string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bogue"</string> + <string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bogue"</string> + <string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme de courriel. Merci de patienter pendant la préparation du rapport de bogue. Cette opération peut prendre quelques instants."</string> + <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode silencieux"</string> + <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Le son est désactivé."</string> + <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Le son est activé."</string> + <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string> + <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string> + <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string> + <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> + <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> + <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> + <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services payants"</string> + <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Effectuer des opérations payantes"</string> + <string name="permgrouplab_messages" msgid="7521249148445456662">"Vos messages"</string> + <string name="permgroupdesc_messages" msgid="7821999071003699236">"Permet de lire et de rédiger vos SMS, courriels et autres messages."</string> + <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Vos données personnelles"</string> + <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Accès direct aux informations vous concernant enregistrées dans la fiche de contact"</string> + <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Vos données sur les réseaux sociaux"</string> + <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Accès direct aux informations sur vos contacts et vos amis sur les réseaux sociaux"</string> + <string name="permgrouplab_location" msgid="635149742436692049">"Votre position"</string> + <string name="permgroupdesc_location" msgid="5704679763124170100">"Déterminer votre position géographique"</string> + <string name="permgrouplab_network" msgid="5808983377727109831">"Communications réseau"</string> + <string name="permgroupdesc_network" msgid="4478299413241861987">"Accéder à différentes fonctionnalités du réseau"</string> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Accéder aux appareils et aux réseaux via Bluetooth"</string> + <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Paramètres audio"</string> + <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Modification des paramètres audio"</string> + <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affecte la batterie"</string> + <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Utilisation de fonctionnalités qui peuvent épuiser rapidement la batterie"</string> + <string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string> + <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Accès direct à l\'agenda et aux événements"</string> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Consulter le dictionnaire personnel"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Consulter les mots ajoutés au dictionnaire personnel"</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Modifier le dictionnaire personnel"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Ajouter des mots au dictionnaire personnel"</string> + <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Favoris et historique"</string> + <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Accès direct aux favoris et à l\'historique du navigateur"</string> + <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarme"</string> + <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Réglage du réveil"</string> + <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Messagerie vocale"</string> + <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Accès direct à la messagerie vocale"</string> + <string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string> + <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Accès direct au microphone pour enregistrer du contenu audio"</string> + <string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string> + <string name="permgroupdesc_camera" msgid="2933667372289567714">"Accès direct à la caméra pour la capture d\'images ou de vidéos"</string> + <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Écran de verrouillage"</string> + <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Modifier le comportement de l\'écran de verrouillage sur votre appareil"</string> + <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Informations sur vos applications"</string> + <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Possibilité de modifier le comportement des autres applications sur votre appareil"</string> + <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Fond d\'écran"</string> + <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Modification des paramètres du fond d\'écran de l\'appareil"</string> + <string name="permgrouplab_systemClock" msgid="406535759236612992">"Horloge"</string> + <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Modification de l\'heure ou du fuseau horaire de l\'appareil"</string> + <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Barre d\'état"</string> + <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Modification des paramètres de la barre d\'état de l\'appareil"</string> + <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Paramètres de synchronisation"</string> + <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Accès aux paramètres de synchronisation"</string> + <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vos comptes"</string> + <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accéder aux comptes disponibles"</string> + <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Contrôle du matériel"</string> + <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Accès direct au matériel de l\'appareil"</string> + <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Appels téléphoniques"</string> + <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Suivre, enregistrer et traiter les appels téléphoniques"</string> + <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Outils système"</string> + <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Accès et contrôle de faible niveau du système."</string> + <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Outils de conception"</string> + <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Ces fonctionnalités sont destinées uniquement aux développeurs d\'applications."</string> + <string name="permgrouplab_display" msgid="4279909676036402636">"Interface utilisateur d\'une autre application"</string> + <string name="permgroupdesc_display" msgid="6051002031933013714">"Effet sur l\'interface utilisateur d\'autres applications"</string> + <string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string> + <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Accéder à la mémoire de stockage USB"</string> + <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accès à la carte SD"</string> + <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Fonctionnalités d\'accessibilité"</string> + <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Fonctionnalités pouvant être requises dans le cadre des technologies d\'assistance"</string> + <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string> + <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string> + <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string> + <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes."</string> + <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activer l\'accessibilité Web améliorée"</string> + <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible."</string> + <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observer le texte que vous saisissez"</string> + <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe."</string> + <string name="permlab_statusBar" msgid="7417192629601890791">"désactiver ou modifier la barre d\'état"</string> + <string name="permdesc_statusBar" msgid="8434669549504290975">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string> + <string name="permlab_statusBarService" msgid="7247281911387931485">"barre d\'état"</string> + <string name="permdesc_statusBarService" msgid="716113660795976060">"Permet à l\'application de faire office de barre d\'état."</string> + <string name="permlab_expandStatusBar" msgid="1148198785937489264">"agrandir ou réduire la barre d\'état"</string> + <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Permet à l\'application de réduire ou de développer la barre d\'état."</string> + <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"transférer les appels sortants"</string> + <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Permet à l\'application de traiter les appels sortants et de modifier le numéro à composer. Cette autorisation lui permet de surveiller, rediriger ou empêcher les appels sortants."</string> + <string name="permlab_receiveSms" msgid="8673471768947895082">"recevoir des messages texte"</string> + <string name="permdesc_receiveSms" msgid="6424387754228766939">"Permet à l\'application de recevoir et de traiter les messages texte. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string> + <string name="permlab_receiveMms" msgid="1821317344668257098">"recevoir des messages multimédias"</string> + <string name="permdesc_receiveMms" msgid="533019437263212260">"Permet à l\'application de recevoir et de traiter les messages multimédias. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string> + <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"recevoir les messages de diffusion d\'urgence"</string> + <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Permet à l\'application de recevoir et de traiter les messages d\'urgence. Cette autorisation n\'est possible que pour les applications système."</string> + <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lire les messages de diffusion cellulaire"</string> + <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permet à l\'application de lire les messages de diffusion cellulaire que votre appareil reçoit. Dans certaines zones géographiques, des alertes vous sont envoyées afin de vous prévenir en cas de situation d\'urgence. Des applications malveillantes peuvent venir perturber les performances ou le fonctionnement de votre appareil lors de la réception d\'un message de diffusion cellulaire."</string> + <string name="permlab_sendSms" msgid="5600830612147671529">"envoyer des messages texte"</string> + <string name="permdesc_sendSms" msgid="7094729298204937667">"Permet à l\'application d\'envoyer des messages texte. Cette autorisation peut entraîner des frais inattendus. Des applications malveillantes peuvent générer des frais en envoyant des messages sans votre consentement."</string> + <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"envoyer des réponses par message"</string> + <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Permet à l\'application d\'envoyer à d\'autres applications de SMS/MMS des demandes pour gérer les réponses par message pour les appels entrants."</string> + <string name="permlab_readSms" msgid="8745086572213270480">"voir les messages texte ou multimédias"</string> + <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permet à l\'application de lire les SMS stockés sur votre tablette ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string> + <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permet à l\'application de lire les SMS stockés sur votre téléphone ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string> + <string name="permlab_writeSms" msgid="3216950472636214774">"modifier les messages texte ou multimédias"</string> + <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permet à l\'application de modifier les SMS stockés sur votre tablette ou sur la carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string> + <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permet à l\'application de modifier les SMS stockés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string> + <string name="permlab_receiveWapPush" msgid="5991398711936590410">"recevoir des messages WAP"</string> + <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permet à l\'application de recevoir et de traiter les messages WAP. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string> + <string name="permlab_getTasks" msgid="6466095396623933906">"récupérer les données des applications en cours d\'exécution"</string> + <string name="permdesc_getTasks" msgid="7454215995847658102">"Permet à l\'application de récupérer des données sur des tâches en cours d\'exécution et récemment exécutées. L\'application est ainsi susceptible d\'obtenir des données concernant les applications utilisées sur l\'appareil."</string> + <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"interagir entre les utilisateurs"</string> + <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Permet à l\'application d\'effectuer des actions entre les différents utilisateurs de l\'appareil. Les applications malveillantes peuvent utiliser cette autorisation pour passer outre la protection entre les utilisateurs."</string> + <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"autorisation totale d\'interagir entre les utilisateurs"</string> + <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Permet toutes les interactions possibles entre les utilisateurs."</string> + <string name="permlab_manageUsers" msgid="1676150911672282428">"Gérer les utilisateurs"</string> + <string name="permdesc_manageUsers" msgid="8409306667645355638">"Permet aux applications de gérer les utilisateurs de l\'appareil, y compris la recherche, la création et la suppression d\'utilisateurs."</string> + <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"récupérer les détails des applications en cours d\'exécution"</string> + <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permet à l\'application de récupérer des données détaillées sur les tâches en cours d\'exécution ou récemment exécutées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour obtenir des données confidentielles relatives à d\'autres applications."</string> + <string name="permlab_reorderTasks" msgid="2018575526934422779">"réorganiser les applications en cours d\'exécution"</string> + <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Permet à l\'application de déplacer les tâches au premier plan et en arrière-plan. L\'application peut procéder à ces opérations sans votre intervention."</string> + <string name="permlab_removeTasks" msgid="6821513401870377403">"arrêter les applications en cours d\'exécution"</string> + <string name="permdesc_removeTasks" msgid="1394714352062635493">"Permet à l\'application de supprimer des tâches et de fermer les applications qui les exécutent. Des applications malveillantes peuvent utiliser cette fonctionnalité pour perturber le comportement d\'autres applications."</string> + <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"gérer des piles d\'activité"</string> + <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Permet à l\'application d\'ajouter, de supprimer et de modifier l\'activité des piles dans lesquelles d\'autres applications fonctionnent. Des applications malveillantes peuvent perturber le comportement des autres applications."</string> + <string name="permlab_startAnyActivity" msgid="2918768238045206456">"démarrer n\'importe quelle activité"</string> + <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Permet à l\'application de démarrer n\'importe quelle activité, quels que soient l\'état exporté ou le degré de protection appliqué à l\'autorisation."</string> + <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"définir la compatibilité de l\'écran"</string> + <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Permettre de contrôler le mode de compatibilité de l\'écran des autres applications. Des applications malveillantes peuvent perturber le fonctionnement d\'autres applications."</string> + <string name="permlab_setDebugApp" msgid="3022107198686584052">"activer le débogage des applications"</string> + <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Permet à l\'application d\'activer le débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour en fermer d\'autres."</string> + <string name="permlab_changeConfiguration" msgid="4162092185124234480">"modifier les paramètres d\'affichage du système"</string> + <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Permet à l\'application de modifier la configuration actuelle, par exemple les paramètres régionaux ou la taille de la police."</string> + <string name="permlab_enableCarMode" msgid="5684504058192921098">"activer le mode voiture"</string> + <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Permet à l\'application d\'activer le mode Voiture."</string> + <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"fermer les autres applications"</string> + <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permet à l\'application de mettre fin aux processus d\'autres applications exécutés en arrière-plan. Cette autorisation peut interrompre l\'exécution d\'autres applications."</string> + <string name="permlab_forceStopPackages" msgid="2329627428832067700">"forcer l\'arrêt d\'autres applications"</string> + <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Permet à l\'application de forcer l\'arrêt d\'autres applications."</string> + <string name="permlab_forceBack" msgid="652935204072584616">"forcer la fermeture de l\'application"</string> + <string name="permdesc_forceBack" msgid="3892295830419513623">"Permet à l\'application de forcer l\'arrêt de toute activité au premier plan et de la faire passer en arrière-plan. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_dump" msgid="1681799862438954752">"vérifier l\'état interne du système"</string> + <string name="permdesc_dump" msgid="1778299088692290329">"Permet à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour récupérer de nombreuses données confidentielles et sécurisées dont elles ne devraient pas avoir besoin normalement."</string> + <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"récupérer le contenu de l\'écran"</string> + <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Permet à l\'application de récupérer le contenu de la fenêtre active. Des applications malveillantes peuvent exploiter cette fonctionnalité pour récupérer et lire la totalité du contenu de la fenêtre, à l\'exception des mots de passe."</string> + <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"activer temporairement l\'accessibilité"</string> + <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Permet à une application d\'activer temporairement l\'accessibilité sur l\'appareil. Des applications malveillantes peuvent activer l\'accessibilité sans le consentement de l\'utilisateur."</string> + <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"récupérer les données sur les fenêtres"</string> + <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Permet à une application de récupérer les données sur les fenêtres dans le gestionnaire de fenêtres. Des applications malveillantes peuvent récupérer des données destinées à un usage interne du système."</string> + <string name="permlab_filter_events" msgid="8675535648807427389">"filtrer les événements"</string> + <string name="permdesc_filter_events" msgid="8006236315888347680">"Permet à une application d\'enregistrer un filtre d\'entrée pour filtrer le flux de tous les événements des utilisateurs avant qu\'ils ne soient traités. Des applications malveillantes peuvent contrôler l\'interface utilisateur du système sans l\'intervention de l\'utilisateur."</string> + <string name="permlab_magnify_display" msgid="5973626738170618775">"agrandir l\'écran"</string> + <string name="permdesc_magnify_display" msgid="7121235684515003792">"Permet à une application d\'agrandir le contenu à l\'écran. Les applications malveillantes peuvent transformer ce contenu et rendre l\'appareil inutilisable."</string> + <string name="permlab_shutdown" msgid="7185747824038909016">"arrêt partiel"</string> + <string name="permdesc_shutdown" msgid="7046500838746291775">"Place le gestionnaire d\'activités en état d\'arrêt, mais n\'effectue pas d\'arrêt complet."</string> + <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"empêcher les changements d\'applications"</string> + <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Empêche l\'utilisateur de changer d\'application."</string> + <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"récupérer des informations sur l\'application actuelle"</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Permet à l\'application autorisée de récupérer des données privées à propos de l\'application exécutée au premier plan sur l\'écran."</string> + <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"suivre et gérer le lancement de toutes les applications"</string> + <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permet à l\'application de suivre et de gérer la façon dont le système lance les activités. Des applications malveillantes peuvent utiliser cette fonctionnalité pour entièrement compromettre l\'intégrité du système. Cette autorisation est uniquement destinée aux concepteurs. Elle ne doit jamais être activée dans le cadre d\'une utilisation standard."</string> + <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"envoyer une diffusion sans paquet"</string> + <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Permet à l\'application d\'envoyer une notification indiquant la suppression d\'un paquet d\'application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour fermer les autres applications en cours d\'exécution."</string> + <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"envoyer une diffusion reçue par message texte"</string> + <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un message texte. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux messages entrants."</string> + <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"envoyer une diffusion de réception de WAP par poussée"</string> + <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permet à l\'application d\'envoyer une notification indiquant la réception d\'un message WAP par poussée. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux messages multimédias entrants ou pour remplacer le contenu d\'une page Web par du contenu malveillant."</string> + <string name="permlab_setProcessLimit" msgid="2451873664363662666">"restreindre le nombre de processus en cours d\'exécution"</string> + <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permet à l\'application de définir le nombre maximal de processus devant s\'exécuter. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forcer la fermeture des applications en arrière-plan"</string> + <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Permet à l\'application de définir si les activités sont toujours terminées lorsqu\'elles passent en arrière-plan. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_batteryStats" msgid="2789610673514103364">"lire les statistiques de la batterie"</string> + <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permet à une application de lire les données de consommation actuelles indiquant le faible niveau de la batterie. Permet éventuellement à l\'application d\'obtenir des informations détaillées sur les applications que vous utilisez."</string> + <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifier les statistiques de la batterie"</string> + <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permet à l\'application de modifier les statistiques collectées concernant la batterie. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"récupérer les statistiques de fonctionnement des applications"</string> + <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permet à l\'application de récupérer les statistiques de fonctionnement des applications recueillies. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifier les statistiques de fonctionnement des applications"</string> + <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permet à l\'application de modifier les statistiques de fonctionnement des applications collectées. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_backup" msgid="470013022865453920">"gérer la sauvegarde et la restauration du système"</string> + <string name="permdesc_backup" msgid="6912230525140589891">"Permet à l\'application de contrôler le mécanisme de sauvegarde et de restauration du système. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"confirmer une sauvegarde complète ou une restauration"</string> + <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Permet à l\'application de lancer l\'interface utilisateur de confirmation de sauvegarde complète. Seules certaines applications peuvent bénéficier de cette autorisation."</string> + <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"afficher les fenêtres non autorisées"</string> + <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Permet à l\'application de créer des fenêtres destinées à être utilisées par l\'interface utilisateur du système interne. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"ignorer les autres applications"</string> + <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Permet à l\'application d\'ignorer d\'autres applications ou certaines parties de l\'interface utilisateur. Cela peut altérer votre utilisation de l\'interface de n\'importe quelle application, ou modifier ce que vous pensez voir dans d\'autres applications."</string> + <string name="permlab_setAnimationScale" msgid="2805103241153907174">"modifier la vitesse des animations"</string> + <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Permet à l\'application de modifier à tout moment la vitesse générale des animations pour les ralentir ou les accélérer."</string> + <string name="permlab_manageAppTokens" msgid="1286505717050121370">"gérer les jetons d\'application"</string> + <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Permet à l\'application de créer et de gérer ses propres jetons en ignorant l\'ordre de plan normal. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_freezeScreen" msgid="4708181184441880175">"bloquer l\'écran"</string> + <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Permet à l\'application de bloquer temporairement l\'écran pour passer en mode plein écran."</string> + <string name="permlab_injectEvents" msgid="1378746584023586600">"utiliser les touches et les boutons de commande"</string> + <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Permet à l\'application de fournir ses propres événements d\'entrée (pression de touche, etc.) à d\'autres applications. Des applications malveillantes peuvent exploiter cette fonctionnalité pour prendre le contrôle de la tablette."</string> + <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Permet à l\'application de fournir ses propres événements d\'entrée (pression de touche, etc.) à d\'autres applications. Des applications malveillantes peuvent exploiter cette fonctionnalité pour prendre le contrôle du téléphone."</string> + <string name="permlab_readInputState" msgid="469428900041249234">"enregistrer le texte entré et les actions effectuées"</string> + <string name="permdesc_readInputState" msgid="8387754901688728043">"Permet à l\'application d\'identifier les touches sur lesquelles vous appuyez, même lorsque vous utilisez une autre application (lorsque vous entrez un mot de passe, par exemple). Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindInputMethod" msgid="3360064620230515776">"s\'associer à un mode d\'entrée"</string> + <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un mode d\'entrée. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"s\'associer à un service d\'accessibilité"</string> + <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service d\'accessibilité. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindPrintService" msgid="8462815179572748761">"lier à un service d\'impression"</string> + <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de widget. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"accéder à tous les travaux d\'impression"</string> + <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permet à l\'application d\'accéder aux travaux d\'impression créés par une autre application. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindNfcService" msgid="2752731300419410724">"s\'associer au service NFC"</string> + <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permet à l\'application autorisée de s\'associer aux applications qui reproduisent le fonctionnement des cartes NFC. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> + <string name="permlab_bindTextService" msgid="7358378401915287938">"s\'associer à un service de texte"</string> + <string name="permdesc_bindTextService" msgid="8151968910973998670">"Permet à l\'application de s\'associer à l\'interface de haut niveau d\'un service de texte (par exemple, SpellCheckerService). Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindVpnService" msgid="4708596021161473255">"s\'associer à un service RPV"</string> + <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service RPV. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindWallpaper" msgid="8716400279937856462">"se fixer à un fond d\'écran"</string> + <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un fond d\'écran. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"s\'associer à un service de widget"</string> + <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de widget. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir avec l\'administrateur d\'un périphérique"</string> + <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permet à l\'application autorisée d\'envoyer des intentions à l\'administrateur de l\'appareil. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"ajouter ou supprimer un administrateur de l\'appareil"</string> + <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Permet à l\'application d\'ajouter ou de supprimer des administrateurs actifs de l\'appareil. Les applications standards ne devraient jamais utiliser cette autorisation."</string> + <string name="permlab_setOrientation" msgid="3365947717163866844">"modifier l\'orientation de l\'écran"</string> + <string name="permdesc_setOrientation" msgid="3046126619316671476">"Permet à l\'application de changer l\'orientation de l\'écran à tout moment. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"modifier la vitesse du pointeur"</string> + <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Permet à l\'application de modifier à tout moment la vitesse du pointeur de la souris ou du pavé tactile. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"changer la disposition du clavier"</string> + <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Permet à l\'application de changer la disposition du clavier. Les applications standards ne devraient pas nécessiter cette autorisation."</string> + <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"envoyer des signaux Linux aux applications"</string> + <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Permet à l\'application de demander que le signal fourni soit envoyé à tous les processus persistants."</string> + <string name="permlab_persistentActivity" msgid="8841113627955563938">"exécuter l\'application en continu"</string> + <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string> + <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir le téléphone."</string> + <string name="permlab_deletePackages" msgid="184385129537705938">"supprimer des applications"</string> + <string name="permdesc_deletePackages" msgid="7411480275167205081">"Permet à l\'application de supprimer des paquets Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour supprimer des applications importantes."</string> + <string name="permlab_clearAppUserData" msgid="274109191845842756">"supprimer les données d\'autres applications"</string> + <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Permet à l\'application d\'effacer les données utilisateur."</string> + <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"vider le cache d\'autres applications"</string> + <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Permet à l\'application de supprimer les fichiers du cache."</string> + <string name="permlab_getPackageSize" msgid="7472921768357981986">"évaluer l\'espace de stockage de l\'application"</string> + <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permet à l\'application de récupérer la taille de son code, de ses données et de sa mémoire cache."</string> + <string name="permlab_installPackages" msgid="2199128482820306924">"installer directement des applications"</string> + <string name="permdesc_installPackages" msgid="5628530972548071284">"Permet à l\'application d\'installer des paquets Android nouveaux ou mis à jour. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications à l\'aide d\'autorisations anormalement puissantes."</string> + <string name="permlab_clearAppCache" msgid="7487279391723526815">"supprimer toutes les données du cache de l\'application"</string> + <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Permet à l\'application de libérer de la mémoire de stockage sur la tablette en supprimant des fichiers dans les répertoires en cache d\'autres applications. Cette autorisation peut occasionner un démarrage plus lent de ces applications, dans la mesure où une nouvelle récupération de leurs données est requise."</string> + <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Permet à l\'application de libérer de la mémoire de stockage sur le téléphone en supprimant des fichiers dans les répertoires en cache d\'autres applications. Cette autorisation peut occasionner un démarrage plus lent de ces applications, dans la mesure où une nouvelle récupération de leurs données est requise."</string> + <string name="permlab_movePackage" msgid="3289890271645921411">"déplacer les ressources d\'une application"</string> + <string name="permdesc_movePackage" msgid="319562217778244524">"Permet à l\'application de déplacer les ressources d\'une application à partir d\'un support interne vers un support externe, et inversement."</string> + <string name="permlab_readLogs" msgid="6615778543198967614">"lire les données des journaux à caractère confidentiel"</string> + <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Permet à l\'application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre tablette. Celles-ci peuvent éventuellement inclure des informations d\'ordre personnel ou privé."</string> + <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Permet à l\'application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone. Celles-ci peuvent éventuellement inclure des informations d\'ordre personnel ou privé."</string> + <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"utiliser n\'importe quel décodeur pour lire les fichiers multimédias"</string> + <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Permet à une application d\'utiliser n\'importe quel décodeur installé pour lire les fichiers multimédias."</string> + <string name="permlab_diagnostic" msgid="8076743953908000342">"lire ou modifier les ressources appartenant au groupe de diagnostics"</string> + <string name="permdesc_diagnostic" msgid="6608295692002452283">"Permet à l\'application d\'obtenir des droits en lecture et en écriture pour toute ressource appartenant au groupe de diagnostics (par exemple, les fichiers du répertoire /dev). Cela peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou le fournisseur de services."</string> + <string name="permlab_changeComponentState" msgid="6335576775711095931">"activer ou désactiver les composants d\'une application"</string> + <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Permet à l\'application d\'activer ou de désactiver un composant d\'une autre application. Des applications malveillantes peuvent exploiter cette fonctionnalité pour désactiver les fonctionnalités principales de votre tablette. Cette autorisation doit être utilisée avec prudence, car elle peut rendre les composants d\'une application instables, voire inutilisables."</string> + <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Permet à l\'application d\'activer ou de désactiver un composant d\'une autre application. Des applications malveillantes peuvent exploiter cette fonctionnalité pour désactiver les fonctionnalités principales de votre téléphone. Cette autorisation doit être utilisée avec prudence, car elle peut rendre les composants d\'une application instables, voire inutilisables."</string> + <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"accorder ou révoquer des autorisations"</string> + <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Permet à une application d\'accorder ou de révoquer des autorisations propres à celle-ci ou pour d\'autres applications. Des applications malveillantes peuvent exploiter cette autorisation pour accéder à des fonctionnalités auxquelles vous ne leur avez pas donné accès."</string> + <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"définir les applications préférées"</string> + <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Permet à l\'application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier les applications exécutées en usurpant l\'identité de vos applications existantes dans le but de recueillir des données confidentielles."</string> + <string name="permlab_writeSettings" msgid="2226195290955224730">"modifier les paramètres du système"</string> + <string name="permdesc_writeSettings" msgid="7775723441558907181">"Permet à l\'application de modifier les paramètres du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre la configuration de votre système."</string> + <string name="permlab_writeSecureSettings" msgid="204676251876718288">"modifier les paramètres de sécurité du système"</string> + <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Permet à l\'application de modifier les paramètres sécurisés du système. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_writeGservices" msgid="2149426664226152185">"modifier la carte des services Google"</string> + <string name="permdesc_writeGservices" msgid="1287309437638380229">"Permet à l\'application de modifier la carte des services Google. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"s\'exécuter au démarrage"</string> + <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Permet à l\'application de se lancer une fois le démarrage du système terminé. Elle peut rallonger le temps de démarrage de la tablette et ralentir son fonctionnement global en raison de son exécution continue."</string> + <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Permet à l\'application de se lancer une fois le démarrage du système terminé. Elle peut rallonger le temps de démarrage du téléphone et ralentir son fonctionnement global en raison de son exécution continue."</string> + <string name="permlab_broadcastSticky" msgid="7919126372606881614">"envoyer une diffusion persistante"</string> + <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Permet à l\'application d\'envoyer des intentions de diffusion \"persistantes\", qui perdurent une fois la diffusion terminée. Une utilisation excessive peut ralentir la tablette ou la rendre instable en l\'obligeant à utiliser trop de mémoire."</string> + <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Permet à l\'application d\'envoyer des intentions de diffusion \"persistantes\", qui perdurent une fois la diffusion terminée. Une utilisation excessive peut ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire."</string> + <string name="permlab_readContacts" msgid="8348481131899886131">"lire vos contacts"</string> + <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Permet à l\'application de lire les données relatives aux contacts stockés sur votre tablette, y compris la fréquence à laquelle vous avez appelé des personnes spécifiques, leur avez envoyé des courriels ou avez communiqué avec elles par d\'autres moyens. Cette autorisation permet aux applications d\'enregistrer ces données. Les applications malveillantes peuvent les partager à votre insu."</string> + <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Permet à l\'application de lire les données relatives aux contacts stockés sur votre téléphone, y compris la fréquence à laquelle vous avez appelé des personnes spécifiques, leur avez envoyé des courriels ou avez communiqué avec elles par d\'autres moyens. Cette autorisation permet aux applications d\'enregistrer ces données. Les applications malveillantes peuvent les partager à votre insu."</string> + <string name="permlab_writeContacts" msgid="5107492086416793544">"modifier vos contacts"</string> + <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Permet à l\'application de modifier les données relatives aux contacts stockés sur votre tablette, y compris la fréquence à laquelle vous avez appelé des personnes spécifiques, leur avez envoyé des courriels ou avez communiqué avec elles par d\'autres moyens. Cette autorisation permet aux applications de supprimer ces données."</string> + <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Permet à l\'application de modifier les données relatives aux contacts stockés sur votre téléphone, y compris la fréquence à laquelle vous avez appelé des personnes spécifiques, leur avez envoyé des courriels ou avez communiqué avec elles par d\'autres moyens. Cette autorisation permet aux applications de supprimer ces données."</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"lire le journal d\'appels"</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Permet à l\'application d\'accéder au journal d\'appels de votre tablette, y compris aux données relatives aux appels entrants et sortants. Cette autorisation permet aux applications d\'enregistrer les données du journal d\'appels. Les applications malveillantes peuvent partager ces données à votre insu."</string> + <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Permet à l\'application d\'accéder au journal d\'appels de votre téléphone, y compris aux données relatives aux appels entrants et sortants. Cette autorisation permet aux applications d\'enregistrer les données du journal d\'appels. Les applications malveillantes peuvent partager ces données à votre insu."</string> + <string name="permlab_writeCallLog" msgid="8552045664743499354">"modifier le journal d\'appels"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Permet à l\'application de lire le journal d\'appels de votre tablette, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Permet à l\'application de lire le journal d\'appels de votre téléphone, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string> + <string name="permlab_readProfile" msgid="4701889852612716678">"lire votre fiche de contact"</string> + <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Permet à l\'application d\'accéder aux données de profil enregistrées sur votre appareil, comme votre nom et vos coordonnées. L\'application peut alors vous identifier et envoyer les données de votre profil à des tiers."</string> + <string name="permlab_writeProfile" msgid="907793628777397643">"modifier votre fiche de contact"</string> + <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permet à l\'application de modifier les données de profil enregistrées sur votre appareil, telles que votre nom et vos coordonnées, ou d\'en ajouter. Elle peut alors vous identifier et envoyer vos données de profil à des tiers."</string> + <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lire les flux de réseaux sociaux"</string> + <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permet à l\'application d\'accéder à vos mises à jour sur les réseaux sociaux, ainsi qu\'à celles de vos amis, et de les synchroniser. Soyez prudent lorsque vous partagez de l\'information. Cette autorisation permet à l\'application de lire les communications entre vous et vos amis sur les réseaux sociaux, indépendamment de leur caractère confidentiel. Remarque : Il est possible que cette autorisation ne soit pas appliquée sur tous les réseaux sociaux."</string> + <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"modifier vos flux de réseaux sociaux"</string> + <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Permet à l\'application d\'afficher les mises à jour de vos amis sur les réseaux sociaux. Soyez prudent lorsque vous partagez de l\'information. Cette autorisation permet à l\'application de générer des messages qui peuvent sembler provenir d\'un ami. Remarque : Il est possible que cette autorisation ne soit pas appliquée sur tous les réseaux sociaux."</string> + <string name="permlab_readCalendar" msgid="5972727560257612398">"consulter les événements d\'agenda ainsi que les données confidentielles qu\'ils contiennent"</string> + <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Permet à l\'application de lire tous les événements d\'agenda stockés sur votre tablette, y compris ceux de vos amis ou de vos collègues. Cette autorisation peut lui permettre de partager ou d\'enregistrer vos données d\'agenda, indépendamment de leur caractère confidentiel ou sensible."</string> + <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Permet à l\'application de lire tous les événements d\'agenda stockés sur votre téléphone, y compris ceux de vos amis ou de vos collègues. Cette autorisation peut lui permettre de partager ou d\'enregistrer vos données d\'agenda, indépendamment de leur caractère confidentiel ou sensible."</string> + <string name="permlab_writeCalendar" msgid="8438874755193825647">"ajouter ou modifier des événements d\'agenda et envoyer des courriels aux invités à l\'insu du propriétaire"</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Permet à l\'application d\'ajouter, de supprimer et d\'apporter des modifications aux événements modifiables sur votre tablette, y compris ceux de vos amis ou de vos collègues. Cette autorisation peut lui permettre d\'envoyer des messages qui semblent provenir de propriétaires de l\'agenda ou de modifier les événements à l\'insu des propriétaires."</string> + <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Permet à l\'application d\'ajouter, de supprimer et d\'apporter des modifications aux événements modifiables sur votre téléphone, y compris ceux de vos amis ou de vos collègues. Cette autorisation peut lui permettre d\'envoyer des messages qui semblent provenir de propriétaires de l\'agenda ou de modifier les événements à l\'insu des propriétaires."</string> + <string name="permlab_accessMockLocation" msgid="8688334974036823330">"créer des sources de localisation fictives à des fins de test"</string> + <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Permet de créer des sources de localisation fictives à des fins de tests ou pour installer un nouveau fournisseur de position. L\'application peut ainsi modifier la position ou l\'état renvoyé par d\'autres sources de localisation telles que le GPS ou les fournisseurs de position."</string> + <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accéder aux commandes de fournisseur de position géographique supplémentaires"</string> + <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Permet à l\'application d\'accéder à des commandes de fournisseur de position supplémentaires. Elle est ainsi susceptible d\'interférer avec le bon fonctionnement du GPS ou de toute autre source de localisation."</string> + <string name="permlab_installLocationProvider" msgid="6578101199825193873">"autorisation d\'installer un fournisseur de services de localisation"</string> + <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Permet de créer des sources de localisation fictives à des fins de tests ou pour installer un nouveau fournisseur de position. L\'application peut ainsi modifier la position ou l\'état renvoyé par d\'autres sources de localisation telles que le GPS ou les fournisseurs de position."</string> + <string name="permlab_accessFineLocation" msgid="1191898061965273372">"position précise (GPS et réseau)"</string> + <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Permet à l\'application d\'obtenir votre position exacte à l\'aide du récepteur satellite GPS ou des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puissent déterminer où vous vous trouvez, le cas échéant. Cette autorisation peut entraîner une utilisation accrue de la batterie."</string> + <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"position approximative (réseau)"</string> + <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Permet à l\'application d\'obtenir votre position approximative. Celle-ci est fournie par des services de localisation sur la base des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puisse déterminer où vous vous trouvez de façon approximative, le cas échéant."</string> + <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"accéder à SurfaceFlinger"</string> + <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> + <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Permet à l\'application de contrôler les fonctionnalités de base des écrans Wi-Fi."</string> + <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"capturer la sortie audio"</string> + <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Autoriser l\'application à capturer et à rediriger la sortie audio."</string> + <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"capturer la sortie vidéo"</string> + <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Autoriser l\'application à capturer et à rediriger la sortie vidéo."</string> + <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"capturer la sortie vidéo sécurisée"</string> + <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Autoriser l\'application à capturer et à rediriger la sortie vidéo sécurisée."</string> + <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string> + <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"enregistrer fichier audio"</string> + <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permet à l\'application d\'enregistrer des contenus audio à l\'aide du microphone. Cette autorisation lui donne la possibilité d\'enregistrer du contenu audio à tout moment sans votre consentement."</string> + <string name="permlab_camera" msgid="3616391919559751192">"prendre des photos et filmer des vidéos"</string> + <string name="permdesc_camera" msgid="8497216524735535009">"Permet à l\'application de prendre des photos et de filmer des vidéos avec l\'appareil photo. Cette autorisation lui permet d\'utiliser l\'appareil photo à tout moment sans votre consentement."</string> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"désactiver l\'indicateur d\'émission LED lorsque la caméra est en cours d\'utilisation"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permet à une application système préinstallée de désactiver l\'indicateur LED d\'utilisation de la caméra."</string> + <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"désactiver définitivement la tablette"</string> + <string name="permlab_brick" product="default" msgid="8337817093326370537">"désactiver définitivement le téléphone"</string> + <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permet à l\'application de désactiver définitivement la tablette. Cette fonctionnalité peut avoir des répercussions très sérieuses."</string> + <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Permet à l\'application de désactiver définitivement le téléphone. Cette fonctionnalité peut avoir des répercussions très sérieuses."</string> + <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forcer le redémarrage de la tablette"</string> + <string name="permlab_reboot" product="default" msgid="2898560872462638242">"forcer le redémarrage du téléphone"</string> + <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Permet à l\'application de forcer le redémarrage de la tablette."</string> + <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Permet à l\'application de forcer le redémarrage du téléphone."</string> + <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"accéder système fichiers mémoire USB"</string> + <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"accéder au système de fichiers de la carte SD"</string> + <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Permet à l\'application d\'installer et de désinstaller des systèmes de fichiers pour des périphériques de stockage amovibles."</string> + <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"effacer la mémoire USB"</string> + <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"effacer la carte SD"</string> + <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Permet à l\'application de formater le périphérique de stockage amovible."</string> + <string name="permlab_asec_access" msgid="3411338632002193846">"obtenir des données sur la mémoire de stockage interne"</string> + <string name="permdesc_asec_access" msgid="3094563844593878548">"Permet à l\'application d\'obtenir des données sur la mémoire de stockage interne."</string> + <string name="permlab_asec_create" msgid="6414757234789336327">"créer une mémoire de stockage interne"</string> + <string name="permdesc_asec_create" msgid="4558869273585856876">"Permet à l\'application de créer une mémoire de stockage interne."</string> + <string name="permlab_asec_destroy" msgid="526928328301618022">"détruire la mémoire de stockage interne"</string> + <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Permet à l\'application de détruire la mémoire de stockage interne."</string> + <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"monter ou démonter de la mémoire de stockage interne"</string> + <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Permet à l\'application de monter ou de démonter la mémoire de stockage interne."</string> + <string name="permlab_asec_rename" msgid="7496633954080472417">"renommer la mémoire de stockage interne"</string> + <string name="permdesc_asec_rename" msgid="1794757588472127675">"Permet à l\'application de renommer la mémoire de stockage interne."</string> + <string name="permlab_vibrate" msgid="7696427026057705834">"gérer le vibreur"</string> + <string name="permdesc_vibrate" msgid="6284989245902300945">"Permet à l\'application de gérer le vibreur de l\'appareil."</string> + <string name="permlab_flashlight" msgid="2155920810121984215">"gérer la lampe de poche"</string> + <string name="permdesc_flashlight" msgid="6522284794568368310">"Permet à l\'application de gérer la lampe de poche."</string> + <string name="permlab_manageUsb" msgid="1113453430645402723">"gérer les préférences et les autorisations des périphériques USB"</string> + <string name="permdesc_manageUsb" msgid="7776155430218239833">"Permet à l\'application de gérer les préférences et les autorisations des périphériques USB."</string> + <string name="permlab_accessMtp" msgid="4953468676795917042">"mettre en œuvre le protocole MTP"</string> + <string name="permdesc_accessMtp" msgid="6532961200486791570">"Permet l\'accès au pilote MTP du noyau afin de mettre en œuvre le protocole USB MTP."</string> + <string name="permlab_hardware_test" msgid="4148290860400659146">"tester le matériel"</string> + <string name="permdesc_hardware_test" msgid="6597964191208016605">"Permet à l\'application de contrôler différents périphériques à des fins de test matériel."</string> + <string name="permlab_callPhone" msgid="3925836347681847954">"appeler directement des numéros de téléphone"</string> + <string name="permdesc_callPhone" msgid="3740797576113760827">"Permet à l\'application d\'appeler des numéros de téléphone sans votre intervention. Cette autorisation peut entraîner des frais ou des appels imprévus et ne permet pas à l\'application d\'appeler des numéros d\'urgence. Des applications malveillantes peuvent générer des frais en passant des appels sans votre consentement."</string> + <string name="permlab_callPrivileged" msgid="4198349211108497879">"appeler directement tout numéro de téléphone"</string> + <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Permet à l\'application d\'appeler n\'importe quel numéro de téléphone, y compris les numéros d\'urgence, sans votre intervention. Des applications malveillantes peuvent passer des appels inutiles et interdits aux services d\'urgence."</string> + <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"lancer directement la configuration de la tablette CDMA"</string> + <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"démarrer directement la configuration du téléphone CDMA"</string> + <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Permet à l\'application de lancer le déploiement CDMA. Des applications malveillantes sont susceptibles de le lancer inutilement."</string> + <string name="permlab_locationUpdates" msgid="7785408253364335740">"contrôler les notifications de mise à jour de la position géographique"</string> + <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Permet à l\'application d\'activer ou de désactiver les notifications de mise à jour de la position à partir du signal radio. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_checkinProperties" msgid="7855259461268734914">"accéder aux propriétés d\'enregistrement"</string> + <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Permet à l\'application d\'obtenir des droits d\'accès en lecture et en écriture pour les propriétés envoyées par le service d\'enregistrement. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_bindGadget" msgid="776905339015863471">"choisir les widgets"</string> + <string name="permdesc_bindGadget" msgid="8261326938599049290">"Permet à l\'application d\'indiquer au système les widgets qui peuvent être utilisés par les applications. Une application disposant de cette autorisation peut accorder à d\'autres applications l\'accès à des données personnelles. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"modifier l\'état du téléphone"</string> + <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Permet à l\'application de contrôler les fonctionnalités de téléphonie de l\'appareil. Une application disposant de cette autorisation peut, par exemple, basculer d\'un réseau à l\'autre et activer ou désactiver le signal radio du téléphone à votre insu."</string> + <string name="permlab_readPhoneState" msgid="9178228524507610486">"voir l\'état et l\'identité du téléphone"</string> + <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel."</string> + <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"empêcher la tablette de passer en mode veille"</string> + <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"empêcher le téléphone de passer en mode veille"</string> + <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permet à l\'application d\'empêcher la tablette de passer en mode veille."</string> + <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permet à l\'application d\'empêcher le téléphone de passer en mode veille."</string> + <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"éteindre ou allumer la tablette"</string> + <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"éteindre ou allumer le téléphone"</string> + <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Permet à l\'application d\'éteindre et d\'allumer la tablette."</string> + <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Permet à l\'application d\'éteindre et d\'allumer le téléphone."</string> + <string name="permlab_factoryTest" msgid="3715225492696416187">"exécuter en mode test d\'usine"</string> + <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Permet d\'exécuter une application en mode test fabricant de faible niveau, autorisant ainsi l\'accès complet à la tablette. Cette fonctionnalité est uniquement disponible lorsque la tablette est en mode test fabricant."</string> + <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Permet d\'exécuter en tant que test fabricant de faible niveau en autorisant l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant."</string> + <string name="permlab_setWallpaper" msgid="6627192333373465143">"définir le fond d\'écran"</string> + <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Permet à l\'application de définir le fond d\'écran du système."</string> + <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"modifier la taille du fond d\'écran"</string> + <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Permet à l\'application de définir les bulles d\'aide concernant la taille du fond d\'écran du système."</string> + <string name="permlab_masterClear" msgid="2315750423139697397">"réinitialiser les paramètres d\'usine du système"</string> + <string name="permdesc_masterClear" msgid="3665380492633910226">"Permet à l\'application de rétablir la configuration d\'usine du système. Toutes les données, ainsi que les paramètres et les applications installées sont alors effacés."</string> + <string name="permlab_setTime" msgid="2021614829591775646">"définir l\'heure"</string> + <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Permet à l\'application de modifier l\'heure de la tablette."</string> + <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Permet à l\'application de modifier l\'heure du téléphone."</string> + <string name="permlab_setTimeZone" msgid="2945079801013077340">"définir le fuseau horaire"</string> + <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Permet à l\'application de modifier le fuseau horaire de la tablette."</string> + <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Permet à l\'application de modifier le fuseau horaire du téléphone."</string> + <string name="permlab_accountManagerService" msgid="4829262349691386986">"agir en tant que service AccountManagerService"</string> + <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Permet à l\'application d\'appeler le service AccountAuthenticators."</string> + <string name="permlab_getAccounts" msgid="1086795467760122114">"rechercher des comptes sur l\'appareil"</string> + <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Permet à l\'application d\'obtenir la liste des comptes connus par la tablette. Il peut s\'agir de n\'importe quel compte créé par les applications que vous avez installées."</string> + <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Permet à l\'application d\'obtenir la liste des comptes connus par le téléphone. Il peut s\'agir de n\'importe quel compte créé par les applications que vous avez installées."</string> + <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"créer des comptes et définir des mots de passe"</string> + <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Permet à l\'application d\'utiliser les fonctionnalités d\'authentification de compte du service AccountManager, y compris pour créer des comptes, et obtenir et définir les mots de passe associés."</string> + <string name="permlab_manageAccounts" msgid="4983126304757177305">"ajouter ou supprimer des comptes"</string> + <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Permet à l\'application d\'effectuer certaines opérations, par exemple d\'ajouter ou de supprimer des comptes et d\'effacer les mots de passe associés."</string> + <string name="permlab_useCredentials" msgid="235481396163877642">"utiliser les comptes sur l\'appareil"</string> + <string name="permdesc_useCredentials" msgid="7984227147403346422">"Permet à l\'application de demander des jetons d\'authentification."</string> + <string name="permlab_accessNetworkState" msgid="4951027964348974773">"afficher les connexions réseau"</string> + <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Permet à l\'application d\'accéder à des détails concernant les connexions réseau, comme les réseaux existants et connectés."</string> + <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"bénéficier d\'un accès complet au réseau"</string> + <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Permet à l\'application de créer des interfaces de connexion réseau et d\'utiliser des protocoles réseau personnalisés. Le navigateur et d\'autres applications permettent d\'envoyer des données sur Internet. Cette autorisation n\'est donc pas nécessaire pour envoyer des données sur Internet."</string> + <string name="permlab_writeApnSettings" msgid="505660159675751896">"changer ou intercepter les paramètres et le trafic du réseau"</string> + <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Permet à l\'application de modifier les paramètres réseau, ainsi que d\'intercepter et de surveiller tout le trafic réseau en vue de modifier le mandataire et le port d\'un nom de point d\'accès, par exemple. Des applications malveillantes peuvent utiliser cette fonctionnalité pour surveiller, rediriger ou modifier les paquets réseau à votre insu."</string> + <string name="permlab_changeNetworkState" msgid="958884291454327309">"modifier la connectivité réseau"</string> + <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Permet à l\'application de modifier l\'état de la connectivité réseau."</string> + <string name="permlab_changeTetherState" msgid="5952584964373017960">"changer la connectivité du partage de connexion"</string> + <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permet à l\'application de modifier l\'état de la connectivité du partage de connexion."</string> + <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"modifier les paramètres d\'utilisation des données en arrière-plan"</string> + <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Permet à l\'application de modifier les paramètres de consommation des données en arrière-plan."</string> + <string name="permlab_accessWifiState" msgid="5202012949247040011">"afficher les connexions Wi-Fi"</string> + <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Permet à l\'application d\'accéder à des détails sur les réseaux Wi-Fi afin de savoir si une connexion Wi-Fi est activée et pour connaître le nom des appareils connectés au Wi-Fi, par exemple."</string> + <string name="permlab_changeWifiState" msgid="6550641188749128035">"activer/désactiver la connexion Wi-Fi"</string> + <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Permet à l\'application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier la configuration de l\'appareil pour les réseaux Wi-Fi."</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"autoriser la réception de données en mode Wi-Fi multidiffusion"</string> + <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Permet à l\'application de recevoir des paquets envoyés à tous les appareils (et pas seulement à votre tablette) d\'un réseau Wi-Fi qui utilise des adresses de multidiffusion. Cette autorisation entraîne une consommation d\'énergie supérieure au mode de diffusion simple."</string> + <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Permet à l\'application de recevoir des paquets envoyés à tous les appareils (et pas seulement à votre téléphone) d\'un réseau Wi-Fi qui utilise des adresses de multidiffusion. Cette autorisation entraîne une consommation d\'énergie supérieure au mode de diffusion simple."</string> + <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accéder aux paramètres Bluetooth"</string> + <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet à l\'application de configurer la tablette Bluetooth locale, d\'identifier des appareils distants et de les associer à la tablette."</string> + <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet à l\'application de configurer le téléphone Bluetooth local, d\'identifier des appareils distants et de les associer au téléphone."</string> + <string name="permlab_accessWimaxState" msgid="4195907010610205703">"se connecter au réseau WiMAX et s\'en déconnecter"</string> + <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet à l\'application de déterminer si le WiMAX est activé et d\'obtenir des détails sur tous les réseaux WiMAX connectés."</string> + <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string> + <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permet à l\'application de connecter la tablette aux réseaux WiMAX et de l\'en déconnecter."</string> + <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permet à l\'application de connecter le téléphone aux réseaux WiMAX et de l\'en déconnecter."</string> + <string name="permlab_bluetooth" msgid="6127769336339276828">"s\'associer à des appareils Bluetooth"</string> + <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur la tablette, et d\'établir et accepter des connexions avec les appareils associés."</string> + <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permet à l\'application d\'accéder à la configuration du Bluetooth sur le téléphone, et d\'établir et accepter des connexions avec les appareils associés."</string> + <string name="permlab_nfc" msgid="4423351274757876953">"gérer la communication en champ proche"</string> + <string name="permdesc_nfc" msgid="7120611819401789907">"Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)."</string> + <string name="permlab_disableKeyguard" msgid="3598496301486439258">"désactiver le verrouillage de l\'écran"</string> + <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string> + <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer ou désactiver la synchronisation"</string> + <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Permet à une application de modifier les paramètres de synchronisation d\'un compte. Cette autorisation peut, par exemple, être utilisée pour activer la synchronisation de l\'application Contacts avec un compte."</string> + <string name="permlab_readSyncStats" msgid="7396577451360202448">"lire les statistiques de synchronisation"</string> + <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Permet à une application d\'accéder aux statistiques de synchronisation d\'un compte, y compris l\'historique des événements de synchronisation et le volume de données synchronisées."</string> + <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lire les flux auxquels vous êtes abonné"</string> + <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permet à l\'application d\'obtenir des données sur les flux en cours de synchronisation."</string> + <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"modifier les flux auxquels vous êtes abonné"</string> + <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Permet à l\'application de modifier les flux en cours de synchronisation. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier vos flux synchronisés."</string> + <string name="permlab_readDictionary" msgid="4107101525746035718">"voir les termes ajoutés au dictionnaire personnel"</string> + <string name="permdesc_readDictionary" msgid="659614600338904243">"Permet à l\'application d\'accéder aux mots, noms et expressions que l\'utilisateur a pu enregistrer dans son dictionnaire personnel."</string> + <string name="permlab_writeDictionary" msgid="2183110402314441106">"ajouter des mots au dictionnaire personnel"</string> + <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permet à l\'application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string> + <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"tester l\'accès à la mémoire de stockage protégée"</string> + <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"tester l\'accès à la mémoire de stockage protégée"</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Permet à l\'application de tester une autorisation pour la mémoire de stockage USB qui sera ensuite proposée sur les futurs appareils."</string> + <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Permet à l\'application de tester une autorisation pour la carte SD qui sera ensuite proposée sur les futurs appareils."</string> + <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modifier ou supprimer le contenu de la mémoire USB"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modifier ou supprimer le contenu de la carte SD"</string> + <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permet à l\'application de modifier le contenu de la mémoire de stockage USB."</string> + <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet à l\'application de modifier le contenu de la carte SD."</string> + <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modifier ou supprimer le contenu de la mémoire de stockage interne du support"</string> + <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Permet à l\'application de modifier le contenu de la mémoire de stockage multimédia interne."</string> + <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"gérer stockage des documents"</string> + <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Permet à l\'application de gérer le stockage des documents."</string> + <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"accéder stock. ext. tous utilis."</string> + <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Permet à l\'application d\'accéder à la mémoire de stockage externe pour tous les utilisateurs."</string> + <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accéder au système de fichiers en cache"</string> + <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permet à l\'application d\'obtenir des droits en lecture et en écriture pour le système de fichiers du cache."</string> + <string name="permlab_use_sip" msgid="5986952362795870502">"faire et recevoir des appels Internet"</string> + <string name="permdesc_use_sip" msgid="4717632000062674294">"Permet à l\'application d\'utiliser le service SIP pour faire ou recevoir des appels Internet."</string> + <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lire l\'historique d\'utilisation de réseaux"</string> + <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permet à l\'application de lire l\'historique d\'utilisation de réseaux et d\'applications particuliers."</string> + <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gérer les politiques du réseau"</string> + <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permet à l\'application de gérer les politiques du réseau et de définir celles propres à l\'application"</string> + <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modifier le système d\'analyse de l\'utilisation du réseau"</string> + <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permet à l\'application de modifier le système d\'analyse de l\'utilisation du réseau par les autres applications. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"modifier les marques d\'interface de connexion"</string> + <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Permet à l\'application de modifier les marques d\'interface de connexion pour le routage"</string> + <string name="permlab_accessNotifications" msgid="7673416487873432268">"accéder aux notifications"</string> + <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permet aux applications de récupérer, d\'examiner et d\'autoriser les notifications, y compris celles envoyées par d\'autres applications."</string> + <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications"</string> + <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permet à l\'application de s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications. Ne devrait jamais être nécessaire pour les applications normales."</string> + <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"faire appel à l\'application de configuration du fournisseur de services"</string> + <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permet à l\'application autorisée de faire appel à l\'application de configuration fournie par le fournisseur de services. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> + <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"détecter des observations sur les conditions du réseau"</string> + <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permet à une application de détecter les observations sur les conditions du réseau. Ne devrait jamais être nécessaire pour les applications standards."</string> + <string name="policylab_limitPassword" msgid="4497420728857585791">"Définir les règles du mot de passe"</string> + <string name="policydesc_limitPassword" msgid="3252114203919510394">"Choisir le nombre et le type de caractères autorisés dans les mots de passe de déverrouillage de l\'écran"</string> + <string name="policylab_watchLogin" msgid="914130646942199503">"Gérer les tentatives de déverrouillage de l\'écran"</string> + <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller la tablette ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint"</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouille le téléphone ou efface toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint."</string> + <string name="policylab_resetPassword" msgid="2620077191242688955">"Modifier le mot de passe de déverrouillage de l\'écran"</string> + <string name="policydesc_resetPassword" msgid="605963962301904458">"Modifier le mot de passe de déverrouillage de l\'écran"</string> + <string name="policylab_forceLock" msgid="2274085384704248431">"Verrouiller l\'écran"</string> + <string name="policydesc_forceLock" msgid="1141797588403827138">"Gérer le mode et les conditions de verrouillage de l\'écran"</string> + <string name="policylab_wipeData" msgid="3910545446758639713">"Effacer toutes les données"</string> + <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Effacer les données de la tablette sans avertissement, en rétablissant la configuration d\'usine"</string> + <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Effacer les données du téléphone sans avertissement, en rétablissant la configuration d\'usine"</string> + <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Définir le serveur mandataire global du mobile"</string> + <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Indiquer le serveur mandataire global à utiliser pour ce mobile lorsque les règles sont activées. Seul l\'administrateur principal du mobile peut définir le serveur mandataire global utilisé."</string> + <string name="policylab_expirePassword" msgid="885279151847254056">"Définir exp. mot passe verr."</string> + <string name="policydesc_expirePassword" msgid="1729725226314691591">"Contrôler la fréquence de modification du mot de passe de verrouillage de l\'écran"</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Définir cryptage du stockage"</string> + <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exiger le chiffrement des données d\'application stockées"</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"Désactiver les appareils photo"</string> + <string name="policydesc_disableCamera" msgid="2306349042834754597">"Empêcher l\'utilisation de tous les appareils photos"</string> + <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Désact. fonct. si protec. clav."</string> + <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Empêcher l\'utilisation de certaines fonctionnalités lorsque la protection du clavier est activée"</string> + <string-array name="phoneTypes"> + <item msgid="8901098336658710359">"Domicile"</item> + <item msgid="869923650527136615">"Mobile"</item> + <item msgid="7897544654242874543">"Travail"</item> + <item msgid="1103601433382158155">"Télécopieur professionnel"</item> + <item msgid="1735177144948329370">"Télécopieur personnel"</item> + <item msgid="603878674477207394">"Téléavertisseur"</item> + <item msgid="1650824275177931637">"Autre"</item> + <item msgid="9192514806975898961">"Personnaliser"</item> + </string-array> + <string-array name="emailAddressTypes"> + <item msgid="8073994352956129127">"Domicile"</item> + <item msgid="7084237356602625604">"Travail"</item> + <item msgid="1112044410659011023">"Autre"</item> + <item msgid="2374913952870110618">"Personnaliser"</item> + </string-array> + <string-array name="postalAddressTypes"> + <item msgid="6880257626740047286">"Domicile"</item> + <item msgid="5629153956045109251">"Travail"</item> + <item msgid="4966604264500343469">"Autre"</item> + <item msgid="4932682847595299369">"Personnaliser"</item> + </string-array> + <string-array name="imAddressTypes"> + <item msgid="1738585194601476694">"Domicile"</item> + <item msgid="1359644565647383708">"Travail"</item> + <item msgid="7868549401053615677">"Autre"</item> + <item msgid="3145118944639869809">"Personnaliser"</item> + </string-array> + <string-array name="organizationTypes"> + <item msgid="7546335612189115615">"Travail"</item> + <item msgid="4378074129049520373">"Autre"</item> + <item msgid="3455047468583965104">"Personnaliser"</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">"Personnaliser"</string> + <string name="phoneTypeHome" msgid="2570923463033985887">"Domicile"</string> + <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobile"</string> + <string name="phoneTypeWork" msgid="8863939667059911633">"Travail"</string> + <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Télécopieur professionnel"</string> + <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Télécopieur personnel"</string> + <string name="phoneTypePager" msgid="7582359955394921732">"Téléavertisseur"</string> + <string name="phoneTypeOther" msgid="1544425847868765990">"Autre"</string> + <string name="phoneTypeCallback" msgid="2712175203065678206">"Rappel"</string> + <string name="phoneTypeCar" msgid="8738360689616716982">"Véhicule"</string> + <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Téléphone professionnel principal"</string> + <string name="phoneTypeIsdn" msgid="8022453193171370337">"RNIS"</string> + <string name="phoneTypeMain" msgid="6766137010628326916">"Principal"</string> + <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Autre télécopieur"</string> + <string name="phoneTypeRadio" msgid="4093738079908667513">"Satellite"</string> + <string name="phoneTypeTelex" msgid="3367879952476250512">"Télex"</string> + <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY/ATS (malentendants)"</string> + <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Cellulaire professionnel"</string> + <string name="phoneTypeWorkPager" msgid="649938731231157056">"Téléavertisseur professionnel"</string> + <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistant"</string> + <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personnaliser"</string> + <string name="eventTypeBirthday" msgid="2813379844211390740">"Date de naissance"</string> + <string name="eventTypeAnniversary" msgid="3876779744518284000">"Anniversaire"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Autre"</string> + <string name="emailTypeCustom" msgid="8525960257804213846">"Personnaliser"</string> + <string name="emailTypeHome" msgid="449227236140433919">"Domicile"</string> + <string name="emailTypeWork" msgid="3548058059601149973">"Travail"</string> + <string name="emailTypeOther" msgid="2923008695272639549">"Autre"</string> + <string name="emailTypeMobile" msgid="119919005321166205">"Mobile"</string> + <string name="postalTypeCustom" msgid="8903206903060479902">"Personnaliser"</string> + <string name="postalTypeHome" msgid="8165756977184483097">"Domicile"</string> + <string name="postalTypeWork" msgid="5268172772387694495">"Travail"</string> + <string name="postalTypeOther" msgid="2726111966623584341">"Autre"</string> + <string name="imTypeCustom" msgid="2074028755527826046">"Personnaliser"</string> + <string name="imTypeHome" msgid="6241181032954263892">"Domicile"</string> + <string name="imTypeWork" msgid="1371489290242433090">"Travail"</string> + <string name="imTypeOther" msgid="5377007495735915478">"Autre"</string> + <string name="imProtocolCustom" msgid="6919453836618749992">"Personnaliser"</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">"Conversations"</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">"Travail"</string> + <string name="orgTypeOther" msgid="3951781131570124082">"Autre"</string> + <string name="orgTypeCustom" msgid="225523415372088322">"Personnaliser"</string> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personnaliser"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Frère"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Enfant"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Compagne/Compagnon"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Père"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Ami(e)"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Gestionnaire"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mère"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Parent"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partenaire"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Recommandé par"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Proche"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Sœur"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Conjoint(e)"</string> + <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personnaliser"</string> + <string name="sipAddressTypeHome" msgid="6093598181069359295">"Domicile"</string> + <string name="sipAddressTypeWork" msgid="6920725730797099047">"Travail"</string> + <string name="sipAddressTypeOther" msgid="4408436162950119849">"Autre"</string> + <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Saisissez le NIP."</string> + <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Saisissez la clé PUK et le nouveau NIP."</string> + <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Clé PUK"</string> + <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nouveau NIP"</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="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numéro d\'urgence"</string> + <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Aucun service"</string> + <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Écran verrouillé"</string> + <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Appuyez sur \"Menu\" pour débloquer le téléphone ou appeler un numéro d\'urgence."</string> + <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Appuyez sur \"Menu\" pour déverrouiller l\'appareil."</string> + <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dessinez un schéma pour déverrouiller le téléphone"</string> + <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Appel d\'urgence"</string> + <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Retour à l\'appel"</string> + <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"C\'est exact!"</string> + <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Réessayer"</string> + <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Réessayer"</string> + <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nombre maximal autorisé de tentatives Face Unlock atteint."</string> + <string name="lockscreen_plugged_in" msgid="8057762828355572315">"En charge (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string> + <string name="lockscreen_charged" msgid="321635745684060624">"Chargé"</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">"Branchez votre chargeur."</string> + <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Aucune carte SIM"</string> + <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Aucune carte SIM n\'est insérée dans la tablette."</string> + <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Aucune carte SIM n\'est insérée dans le téléphone."</string> + <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Insérez une carte SIM."</string> + <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"Carte SIM absente ou illisible. Veuillez insérer une carte SIM."</string> + <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Carte SIM inutilisable."</string> + <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"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="lockscreen_transport_prev_description" msgid="201594905152746886">"Bouton pour revenir au titre précédent"</string> + <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Bouton pour atteindre le titre suivant"</string> + <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Bouton de pause"</string> + <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Bouton de lecture"</string> + <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Bouton d\'arrêt"</string> + <string name="emergency_calls_only" msgid="6733978304386365407">"Appels d\'urgence uniquement"</string> + <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Réseau verrouillé"</string> + <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"La carte SIM est verrouillée par clé PUK."</string> + <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Veuillez consulter le guide utilisateur ou contacter le service à la clientèle."</string> + <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"La carte SIM est verrouillée."</string> + <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Déverrouillage de la carte SIM en cours…"</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"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="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"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="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"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="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre tablette à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre téléphone à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string> + <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"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="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"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="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"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="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"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="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Veuillez réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string> + <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Schéma oublié?"</string> + <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Déverrouillage du compte"</string> + <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Nombre maximal de tentatives de déverrouillage par schéma dépassé."</string> + <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Pour déverrouiller l\'appareil, connectez-vous avec votre compte Google."</string> + <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Nom d\'utilisateur (courriel)"</string> + <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Mot de passe"</string> + <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Connexion"</string> + <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Nom d\'utilisateur ou mot de passe erroné."</string> + <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"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="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Vérification en cours…"</string> + <string name="lockscreen_unlock_label" msgid="737440483220667054">"Déverrouiller"</string> + <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Son activé"</string> + <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Son désactivé"</string> + <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Schéma commencé."</string> + <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Schéma effacé."</string> + <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> + <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</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="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">"caractère"</string> + <string name="granularity_label_word" msgid="7075570328374918660">"mot"</string> + <string name="granularity_label_link" msgid="5815508880782488267">"Lié"</string> + <string name="granularity_label_line" msgid="5764267235026120888">"ligne"</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">"Échec du test usine"</string> + <string name="factorytest_not_system" msgid="4435201656767276723">"L\'action FACTORY_TEST est uniquement prise en charge pour les paquets de données installés dans in/system/app."</string> + <string name="factorytest_no_action" msgid="872991874799998561">"Impossible de trouver un paquet proposant l\'action FACTORY_TEST."</string> + <string name="factorytest_reboot" msgid="6320168203050791643">"Redémarrer"</string> + <string name="js_dialog_title" msgid="1987483977834603872">"La page \"<xliff:g id="TITLE">%s</xliff:g>\" indique :"</string> + <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> + <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Vous êtes sur le point de quitter cette page"</string> + <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Quitter cette page"</string> + <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Rester sur cette page"</string> + <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nVoulez-vous vraiment quitter cette page?"</string> + <string name="save_password_label" msgid="6860261758665825069">"Confirmer"</string> + <string name="double_tap_toast" msgid="4595046515400268881">"Conseil : Appuyez deux fois pour faire un zoom avant ou arrière."</string> + <string name="autofill_this_form" msgid="4616758841157816676">"Saisie auto"</string> + <string name="setup_autofill" msgid="7103495070180590814">"Conf. saisie auto"</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">"Province"</string> + <string name="autofill_postal_code" msgid="4696430407689377108">"Code postal"</string> + <string name="autofill_state" msgid="6988894195520044613">"État"</string> + <string name="autofill_zip_code" msgid="8697544592627322946">"Code postal"</string> + <string name="autofill_county" msgid="237073771020362891">"Comté"</string> + <string name="autofill_island" msgid="4020100875984667025">"Île"</string> + <string name="autofill_district" msgid="8400735073392267672">"District"</string> + <string name="autofill_department" msgid="5343279462564453309">"Département"</string> + <string name="autofill_prefecture" msgid="2028499485065800419">"Préfecture"</string> + <string name="autofill_parish" msgid="8202206105468820057">"Paroisse"</string> + <string name="autofill_area" msgid="3547409050889952423">"Zone"</string> + <string name="autofill_emirate" msgid="2893880978835698818">"Émirat"</string> + <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"voir l\'historique et les favoris Web"</string> + <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Permet à l\'application d\'accéder à l\'historique de toutes les URL auxquelles le navigateur a accédé, ainsi qu\'à l\'ensemble des favoris du navigateur. Remarque : Il est possible que cette autorisation ne soit pas appliquée par les navigateurs tiers ni par d\'autres applications permettant de naviguer sur le Web."</string> + <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"modifier l\'historique et les favoris Web"</string> + <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Permet à l\'application de modifier l\'historique du navigateur ou les favoris enregistrés sur votre tablette. Cette autorisation peut lui permettre d\'effacer ou de modifier les données du navigateur. Remarque : il est possible que cette autorisation ne soit pas appliquée par les navigateurs tiers ni par d\'autres applications permettant de naviguer sur le Web."</string> + <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Permet à l\'application de modifier l\'historique du navigateur ou les favoris enregistrés sur votre téléphone. Cette autorisation peut lui permettre d\'effacer ou de modifier les données du navigateur. Remarque : il est possible que cette autorisation ne soit pas appliquée par les navigateurs tiers ni par d\'autres applications permettant de naviguer sur le Web."</string> + <string name="permlab_setAlarm" msgid="1379294556362091814">"définir une alarme"</string> + <string name="permdesc_setAlarm" msgid="316392039157473848">"Permet à l\'application de régler la sonnerie d\'une fonction de réveil installée sur votre appareil. Cette fonctionnalité n\'est pas compatible avec toutes les applications de réveils."</string> + <string name="permlab_addVoicemail" msgid="5525660026090959044">"ajouter des messages vocaux"</string> + <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Permet à l\'application d\'ajouter des messages à votre messagerie vocale."</string> + <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"modifier les autorisations de géolocalisation du navigateur"</string> + <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Permet à l\'application de modifier les autorisations de géolocalisation du navigateur. Des applications malveillantes peuvent exploiter cette fonctionnalité pour permettre l\'envoi de données de localisation à des sites Web arbitraires."</string> + <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"vérifier les paquets"</string> + <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Permet à l\'application de vérifier qu\'un paquet peut être installé."</string> + <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"s\'associer à un vérificateur de paquet"</string> + <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Permet à l\'application autorisée d\'effectuer des requêtes de vérificateurs de paquet. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string> + <string name="permlab_serialPort" msgid="546083327654631076">"accéder aux ports série"</string> + <string name="permdesc_serialPort" msgid="2991639985224598193">"Permet à l\'application autorisée d\'accéder aux ports série avec l\'API SerialManager."</string> + <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"accès externe aux fournisseurs de contenu"</string> + <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Permettre à l\'application titulaire d\'accéder à des fournisseurs de contenu depuis l\'interface de commande. Les applications standards ne devraient jamais avoir recours à cette autorisation."</string> + <string name="permlab_updateLock" msgid="3527558366616680889">"déconseiller les mises à jour automatiques de l\'appareil"</string> + <string name="permdesc_updateLock" msgid="1655625832166778492">"Permet à l\'application autorisée d\'indiquer au système le moment opportun pour un redémarrage non interactif en vue de la mise à jour de l\'appareil."</string> + <string name="save_password_message" msgid="767344687139195790">"Voulez-vous que le navigateur se souvienne de ce mot de passe?"</string> + <string name="save_password_notnow" msgid="6389675316706699758">"Pas maintenant"</string> + <string name="save_password_remember" msgid="6491879678996749466">"Rappelez-vous"</string> + <string name="save_password_never" msgid="8274330296785855105">"Jamais"</string> + <string name="open_permission_deny" msgid="7374036708316629800">"Vous n\'êtes pas autorisé à ouvrir cette page."</string> + <string name="text_copied" msgid="4985729524670131385">"Le texte a été copié dans le presse-papiers."</string> + <string name="more_item_label" msgid="4650918923083320495">"Plus"</string> + <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string> + <string name="menu_space_shortcut_label" msgid="2410328639272162537">"espace"</string> + <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"entrée"</string> + <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"suppr"</string> + <string name="search_go" msgid="8298016669822141719">"Recherche"</string> + <string name="searchview_description_search" msgid="6749826639098512120">"Recherche"</string> + <string name="searchview_description_query" msgid="5911778593125355124">"Requête de recherche"</string> + <string name="searchview_description_clear" msgid="1330281990951833033">"Effacer la requête"</string> + <string name="searchview_description_submit" msgid="2688450133297983542">"Envoyer la requête"</string> + <string name="searchview_description_voice" msgid="2453203695674994440">"Recherche vocale"</string> + <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Activer \"Explorer au toucher\"?"</string> + <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec la tablette en effectuant certains gestes."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes."</string> + <string name="oneMonthDurationPast" msgid="7396384508953779925">"Il y a 1 mois"</string> + <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Il y a plus d\'un mois"</string> + <plurals name="num_seconds_ago"> + <item quantity="one" msgid="4869870056547896011">"il y a 1 seconde"</item> + <item quantity="other" msgid="3903706804349556379">"Il y a <xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="num_minutes_ago"> + <item quantity="one" msgid="3306787433088810191">"Il y a 1 minute"</item> + <item quantity="other" msgid="2176942008915455116">"Il y a <xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="num_hours_ago"> + <item quantity="one" msgid="9150797944610821849">"Il y a 1 heure"</item> + <item quantity="other" msgid="2467273239587587569">"il y a <xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> + <plurals name="last_num_days"> + <item quantity="other" msgid="3069992808164318268">"Les <xliff:g id="COUNT">%d</xliff:g> derniers jours"</item> + </plurals> + <string name="last_month" msgid="3959346739979055432">"Le mois dernier"</string> + <string name="older" msgid="5211975022815554840">"Précédent"</string> + <plurals name="num_days_ago"> + <item quantity="one" msgid="861358534398115820">"hier"</item> + <item quantity="other" msgid="2479586466153314633">"il y a <xliff:g id="COUNT">%d</xliff:g> jours"</item> + </plurals> + <plurals name="in_num_seconds"> + <item quantity="one" msgid="2729745560954905102">"dans 1 seconde"</item> + <item quantity="other" msgid="1241926116443974687">"dans <xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="in_num_minutes"> + <item quantity="one" msgid="8793095251325200395">"dans 1 minute"</item> + <item quantity="other" msgid="3330713936399448749">"dans <xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="in_num_hours"> + <item quantity="one" msgid="7164353342477769999">"dans 1 heure"</item> + <item quantity="other" msgid="547290677353727389">"dans <xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> + <plurals name="in_num_days"> + <item quantity="one" msgid="5413088743009839518">"demain"</item> + <item quantity="other" msgid="5109449375100953247">"dans <xliff:g id="COUNT">%d</xliff:g> jours"</item> + </plurals> + <plurals name="abbrev_num_seconds_ago"> + <item quantity="one" msgid="1849036840200069118">"il y a 1 seconde"</item> + <item quantity="other" msgid="3699169366650930415">"il y a <xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="abbrev_num_minutes_ago"> + <item quantity="one" msgid="6361490147113871545">"il y a 1 min"</item> + <item quantity="other" msgid="851164968597150710">"il y a <xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="abbrev_num_hours_ago"> + <item quantity="one" msgid="4796212039724722116">"Il y a 1 h."</item> + <item quantity="other" msgid="6889970745748538901">"il y a <xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> + <plurals name="abbrev_num_days_ago"> + <item quantity="one" msgid="8463161711492680309">"hier"</item> + <item quantity="other" msgid="3453342639616481191">"il y a <xliff:g id="COUNT">%d</xliff:g> jours"</item> + </plurals> + <plurals name="abbrev_in_num_seconds"> + <item quantity="one" msgid="5842225370795066299">"dans 1 seconde"</item> + <item quantity="other" msgid="5495880108825805108">"dans <xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="abbrev_in_num_minutes"> + <item quantity="one" msgid="562786149928284878">"dans 1 minute"</item> + <item quantity="other" msgid="4216113292706568726">"dans <xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="abbrev_in_num_hours"> + <item quantity="one" msgid="3274708118124045246">"dans 1 heure"</item> + <item quantity="other" msgid="3705373766798013406">"dans <xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> + <plurals name="abbrev_in_num_days"> + <item quantity="one" msgid="2178576254385739855">"demain"</item> + <item quantity="other" msgid="2973062968038355991">"dans <xliff:g id="COUNT">%d</xliff:g> jours"</item> + </plurals> + <string name="preposition_for_date" msgid="9093949757757445117">"le <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">"en <xliff:g id="YEAR">%s</xliff:g>"</string> + <string name="day" msgid="8144195776058119424">"Jour"</string> + <string name="days" msgid="4774547661021344602">"jours"</string> + <string name="hour" msgid="2126771916426189481">"heure"</string> + <string name="hours" msgid="894424005266852993">"heures"</string> + <string name="minute" msgid="9148878657703769868">"min"</string> + <string name="minutes" msgid="5646001005827034509">"min"</string> + <string name="second" msgid="3184235808021478">"s"</string> + <string name="seconds" msgid="3161515347216589235">"s"</string> + <string name="week" msgid="5617961537173061583">"semaine"</string> + <string name="weeks" msgid="6509623834583944518">"semaines"</string> + <string name="year" msgid="4001118221013892076">"an"</string> + <string name="years" msgid="6881577717993213522">"ans"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 seconde"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minute"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g>minutes"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 heure"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> + <string name="VideoView_error_title" msgid="3534509135438353077">"Problème vidéo"</string> + <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Impossible de lire cette vidéo en continu sur cet appareil."</string> + <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Impossible de lire la vidéo."</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">"midi"</string> + <string name="Noon" msgid="3342127745230013127">"Midi"</string> + <string name="midnight" msgid="7166259508850457595">"minuit"</string> + <string name="Midnight" msgid="5630806906897892201">"Minuit"</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">"Tout sélectionner"</string> + <string name="cut" msgid="3092569408438626261">"Couper"</string> + <string name="copy" msgid="2681946229533511987">"Copier"</string> + <string name="paste" msgid="5629880836805036433">"Coller"</string> + <string name="replace" msgid="5781686059063148930">"Remplacer..."</string> + <string name="delete" msgid="6098684844021697789">"Supprimer"</string> + <string name="copyUrl" msgid="2538211579596067402">"Copier l\'URL"</string> + <string name="selectTextMode" msgid="1018691815143165326">"Sélectionner du texte"</string> + <string name="textSelectionCABTitle" msgid="5236850394370820357">"Sélection de texte"</string> + <string name="addToDictionary" msgid="4352161534510057874">"Ajouter au dictionnaire"</string> + <string name="deleteText" msgid="6979668428458199034">"Supprimer"</string> + <string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string> + <string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string> + <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string> + <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string> + <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> en cours d\'exécution"</string> + <string name="app_running_notification_text" msgid="4653586947747330058">"Appuyez ici pour en savoir plus ou arrêter l\'application."</string> + <string name="ok" msgid="5970060430562524910">"OK"</string> + <string name="cancel" msgid="6442560571259935130">"Annuler"</string> + <string name="yes" msgid="5362982303337969312">"OK"</string> + <string name="no" msgid="5141531044935541497">"Annuler"</string> + <string name="dialog_alert_title" msgid="2049658708609043103">"Attention"</string> + <string name="loading" msgid="7933681260296021180">"Chargement en cours..."</string> + <string name="capital_on" msgid="1544682755514494298">"ACTIVÉE"</string> + <string name="capital_off" msgid="6815870386972805832">"DÉSACTIVÉE"</string> + <string name="whichApplication" msgid="4533185947064773386">"Continuer avec"</string> + <string name="alwaysUse" msgid="4583018368000610438">"Utiliser cette application par défaut pour cette action"</string> + <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Pour supprimer les valeurs par défaut, accédez à Paramètres système > Applications > Téléchargements."</string> + <string name="chooseActivity" msgid="7486876147751803333">"Sélectionnez une action"</string> + <string name="chooseUsbActivity" msgid="6894748416073583509">"Sélectionnez une application pour le périphérique de stockage USB"</string> + <string name="noApplications" msgid="2991814273936504689">"Aucune application ne peut effectuer cette action."</string> + <string name="aerr_title" msgid="1905800560317137752"></string> + <string name="aerr_application" msgid="932628488013092776">"L\'application \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêtée."</string> + <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> + <string name="anr_title" msgid="4351948481459135709"></string> + <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> + <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> + <string name="anr_application_process" msgid="8941757607340481057">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> ne répond pas. Voulez-vous quitter?"</string> + <string name="anr_process" msgid="6513209874880517125">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> + <string name="force_close" msgid="8346072094521265605">"OK"</string> + <string name="report" msgid="4060218260984795706">"Signaler"</string> + <string name="wait" msgid="7147118217226317732">"Attendre"</string> + <string name="webpage_unresponsive" msgid="3272758351138122503">"La page ne répond pas.\n \nVoulez-vous la fermer?"</string> + <string name="launch_warning_title" msgid="1547997780506713581">"Application redirigée"</string> + <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> est maintenant lancée."</string> + <string name="launch_warning_original" msgid="188102023021668683">"L\'application <xliff:g id="APP_NAME">%1$s</xliff:g> a été lancée initialement."</string> + <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Redimensionner"</string> + <string name="screen_compat_mode_show" msgid="4013878876486655892">"Toujours afficher"</string> + <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Réactivez ce mode en accédant à Paramètres système > Applications > Téléchargements"</string> + <string name="smv_application" msgid="3307209192155442829">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) a enfreint ses propres règles du mode strict."</string> + <string name="smv_process" msgid="5120397012047462446">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> a enfreint ses propres règles du mode strict."</string> + <string name="android_upgrading_title" msgid="1584192285441405746">"Mise à jour d\'Android…"</string> + <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string> + <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string> + <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string> + <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> + <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Appuyez ici pour changer d\'application."</string> + <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Changer d\'application?"</string> + <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Une autre application est déjà en cours d\'exécution. Arrêtez-la avant d\'en lancer une nouvelle."</string> + <string name="old_app_action" msgid="493129172238566282">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> + <string name="old_app_description" msgid="2082094275580358049">"Ne pas lancer la nouvelle application"</string> + <string name="new_app_action" msgid="5472756926945440706">"Démarrer <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> + <string name="new_app_description" msgid="1932143598371537340">"Arrêtez l\'ancienne application sans enregistrer."</string> + <string name="sendText" msgid="5209874571959469142">"Sélectionner une action pour le texte"</string> + <string name="volume_ringtone" msgid="6885421406845734650">"Volume de la sonnerie"</string> + <string name="volume_music" msgid="5421651157138628171">"Volume"</string> + <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Lecture via Bluetooth"</string> + <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Sonnerie silencieuse sélectionnée"</string> + <string name="volume_call" msgid="3941680041282788711">"Volume des appels entrants"</string> + <string name="volume_bluetooth_call" msgid="2002891926351151534">"Volume d\'appels entrants sur Bluetooth"</string> + <string name="volume_alarm" msgid="1985191616042689100">"Volume de l\'alarme"</string> + <string name="volume_notification" msgid="2422265656744276715">"Volume des notifications"</string> + <string name="volume_unknown" msgid="1400219669770445902">"Volume"</string> + <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Volume Bluetooth"</string> + <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Volume de la sonnerie"</string> + <string name="volume_icon_description_incall" msgid="8890073218154543397">"Volume d\'appel"</string> + <string name="volume_icon_description_media" msgid="4217311719665194215">"Volume"</string> + <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume des notifications"</string> + <string name="ringtone_default" msgid="3789758980357696936">"Sonnerie par défaut"</string> + <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Sonnerie par défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Aucune"</string> + <string name="ringtone_picker_title" msgid="3515143939175119094">"Sonneries"</string> + <string name="ringtone_unknown" msgid="5477919988701784788">"Sonnerie inconnue"</string> + <plurals name="wifi_available"> + <item quantity="one" msgid="6654123987418168693">"Réseau Wi-Fi disponible"</item> + <item quantity="other" msgid="4192424489168397386">"Réseaux Wi-Fi disponibles"</item> + </plurals> + <plurals name="wifi_available_detailed"> + <item quantity="one" msgid="1634101450343277345">"Réseau Wi-Fi ouvert disponible"</item> + <item quantity="other" msgid="7915895323644292768">"Réseaux Wi-Fi ouverts disponibles"</item> + </plurals> + <string name="wifi_available_sign_in" msgid="4029489716605255386">"Connectez-vous au réseau Wi-Fi"</string> + <string name="network_available_sign_in" msgid="8495155593358054676">"Se connecter au réseau"</string> + <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> + <skip /> + <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossible de se connecter au Wi-Fi."</string> + <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" dispose d\'une mauvaise connexion Internet."</string> + <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string> + <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Lancer le Wi-Fi Direct. Cela désactive le fonctionnement du Wi-Fi client ou via un point d\'accès."</string> + <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Impossible d\'activer le Wi-Fi Direct."</string> + <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct activé"</string> + <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Appuyez pour accéder aux paramètres."</string> + <string name="accept" msgid="1645267259272829559">"Accepter"</string> + <string name="decline" msgid="2112225451706137894">"Refuser"</string> + <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Invitation envoyée"</string> + <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Invitation à se connecter"</string> + <string name="wifi_p2p_from_message" msgid="570389174731951769">"De :"</string> + <string name="wifi_p2p_to_message" msgid="248968974522044099">"À :"</string> + <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Saisissez le NIP requis :"</string> + <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"NIP :"</string> + <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"La tablette sera déconnectée du réseau Wi-Fi tant qu\'elle sera connectée à l\'appareil \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string> + <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Le téléphone sera déconnecté du réseau Wi-Fi tant qu\'il sera connecté à l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> + <string name="select_character" msgid="3365550120617701745">"Insérer un caractère"</string> + <string name="sms_control_title" msgid="7296612781128917719">"Envoi de messages SMS"</string> + <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envoie un grand nombre de SMS. Autorisez-vous cette application à poursuivre l\'envoi des messages?"</string> + <string name="sms_control_yes" msgid="3663725993855816807">"Autoriser"</string> + <string name="sms_control_no" msgid="625438561395534982">"Refuser"</string> + <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> souhaite envoyer un message à <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string> + <string name="sms_short_code_details" msgid="3492025719868078457">"Ceci "<font fgcolor="#ffffb060">"peut entraîner des frais"</font>" sur votre compte mobile."</string> + <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Ceci entraînera des frais sur votre compte mobile."</font></string> + <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Envoyer"</string> + <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Annuler"</string> + <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Mémoriser mon choix"</string> + <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Pour modifier : Paramètres > Applications"</string> + <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Toujours autoriser"</string> + <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Ne jamais autoriser"</string> + <string name="sim_removed_title" msgid="6227712319223226185">"Carte SIM retirée"</string> + <string name="sim_removed_message" msgid="2333164559970958645">"Le réseau mobile ne sera pas disponible avant le redémarrage avec une carte SIM valide insérée."</string> + <string name="sim_done_button" msgid="827949989369963775">"Terminé"</string> + <string name="sim_added_title" msgid="3719670512889674693">"Carte SIM ajoutée."</string> + <string name="sim_added_message" msgid="6599945301141050216">"Redémarrez votre appareil pour accéder au réseau mobile."</string> + <string name="sim_restart_button" msgid="4722407842815232347">"Recommencer"</string> + <string name="time_picker_dialog_title" msgid="8349362623068819295">"Définir l\'heure"</string> + <string name="date_picker_dialog_title" msgid="5879450659453782278">"Définir la date"</string> + <string name="date_time_set" msgid="5777075614321087758">"Paramètres"</string> + <string name="date_time_done" msgid="2507683751759308828">"Terminé"</string> + <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NOUVEAU"</font>" :"</string> + <string name="perms_description_app" msgid="5139836143293299417">"Fourni par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string> + <string name="perm_costs_money" msgid="4902470324142151116">"cela peut engendrer des frais"</string> + <string name="usb_storage_activity_title" msgid="4465055157209648641">"Mémoire de stockage de masse USB"</string> + <string name="usb_storage_title" msgid="5901459041398751495">"USB connectée"</string> + <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Vous êtes connecté à votre ordinateur via un câble USB. Appuyez sur le bouton ci-dessous pour copier des fichiers de votre ordinateur vers la mémoire de stockage USB de votre appareil Android, ou inversement."</string> + <string name="usb_storage_message" product="default" msgid="805351000446037811">"Vous êtes connecté à votre ordinateur via un câble USB. Appuyez sur le bouton ci-dessous pour copier des fichiers de votre ordinateur vers la carte SD de votre appareil Android, ou inversement."</string> + <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activer la mémoire de stockage USB"</string> + <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"Un problème est survenu lors de l\'utilisation de votre mémoire de stockage USB comme périphérique de stockage de masse."</string> + <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"Un problème est survenu lors de l\'utilisation de votre carte SD comme périphérique de stockage de masse USB."</string> + <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB connectée"</string> + <string name="usb_storage_notification_message" msgid="939822783828183763">"Appuyez ici pour copier des fichiers depuis votre ordinateur ou vers celui-ci."</string> + <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Désactiver la mémoire de stockage USB"</string> + <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Appuyez ici pour désactiver la mémoire de stockage USB."</string> + <string name="usb_storage_stop_title" msgid="660129851708775853">"Mémoire de stockage USB en cours d\'utilisation"</string> + <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"Avant de désactiver la mémoire de stockage USB, veuillez désinstaller (\"éjecter\") de votre ordinateur la mémoire de stockage USB de l\'appareil Android."</string> + <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"Avant de désactiver la mémoire de stockage USB, veuillez désinstaller (\"éjecter\") de votre ordinateur la carte SD de votre appareil Android."</string> + <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Désactiver la mémoire de stockage USB"</string> + <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"Un problème est survenu lors de la désactivation de la mémoire de stockage USB. Assurez-vous que l\'hôte USB a bien été désinstallé, puis réessayez."</string> + <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Activer la mémoire de stockage USB"</string> + <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Si vous activez la mémoire de stockage USB, certaines applications en cours d\'utilisation vont être fermées et risquent de rester indisponibles jusqu\'à ce que la mémoire de stockage USB soit désactivée."</string> + <string name="dlg_error_title" msgid="7323658469626514207">"Échec du fonctionnement de la mémoire de stockage USB."</string> + <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> + <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Connecté en tant qu\'appareil multimédia"</string> + <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Connecté en tant qu\'appareil photo"</string> + <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connecté en tant que programme d\'installation"</string> + <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connecté à un accessoire USB"</string> + <string name="usb_notification_message" msgid="2290859399983720271">"Appuyez ici pour accéder aux autres options USB."</string> + <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"Formater mémoire?"</string> + <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"Formater la carte SD?"</string> + <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Tous les fichiers stockés sur la mémoire de stockage USB vont être effacés. Cette action est irréversible."</string> + <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Toutes les données stockées sur votre carte seront perdues."</string> + <string name="extmedia_format_button_format" msgid="4131064560127478695">"Mise en forme"</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB connecté"</string> + <string name="adb_active_notification_message" msgid="1016654627626476142">"Appuyez pour désactiver le débogage USB."</string> + <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string> + <string name="configure_input_methods" msgid="9091652157722495116">"Configurer les modes de saisie"</string> + <string name="use_physical_keyboard" msgid="6203112478095117625">"Clavier physique"</string> + <string name="hardware" msgid="7517821086888990278">"Matériel"</string> + <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Sélectionnez la disposition du clavier"</string> + <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Appuyez ici pour sélectionner une disposition de clavier."</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>"candidats"</u></string> + <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Préparation de la mémoire de stockage USB"</string> + <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Préparation de la carte SD"</string> + <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Recherche d\'erreurs en cours"</string> + <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Mémoire de stockage USB vide"</string> + <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Carte SD vide"</string> + <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"La mémoire de stockage USB est vide, ou son système de fichiers n\'est pas compatible."</string> + <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"La carte SD est vide, ou son système de fichiers n\'est pas compatible."</string> + <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Mémoire de stockage USB endommagée"</string> + <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Carte SD endommagée"</string> + <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"La mémoire de stockage USB est endommagée. Veuillez essayer de la reformater."</string> + <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"La carte SD est endommagée. Veuillez tenter de la reformater."</string> + <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Mémoire de stockage USB retirée inopinément"</string> + <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Carte SD retirée inopinément"</string> + <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Désinstaller la mémoire de stockage USB avant de la retirer pour éviter toute perte de données."</string> + <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Désactivez la carte SD avant de la retirer pour éviter toute perte de données."</string> + <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"La mémoire de stockage USB peut être retirée en toute sécurité."</string> + <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"La carte SD peut être retirée en toute sécurité"</string> + <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Vous pouvez retirer la mémoire de stockage USB en toute sécurité."</string> + <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Vous pouvez retirer la carte SD en toute sécurité."</string> + <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Mémoire de stockage USB retirée"</string> + <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Carte SD retirée"</string> + <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Mémoire de stockage USB retirée. Insérez un nouveau support."</string> + <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"La carte SD a été retirée. Insérez-en une autre."</string> + <string name="activity_list_empty" msgid="1675388330786841066">"Aucune activité correspondante trouvée."</string> + <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"mettre à jour les données statistiques du composant"</string> + <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Permet à l\'application de modifier les statistiques d\'utilisation des composants collectées. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_copyProtectedData" msgid="4341036311211406692">"copier du contenu"</string> + <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Permet à l\'application d\'invoquer le service de conteneur par défaut pour copier du contenu. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string> + <string name="permlab_route_media_output" msgid="1642024455750414694">"Diriger la sortie multimédia"</string> + <string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet à une application de diriger la sortie multimédia vers d\'autres appareils externes."</string> + <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Accéder au stockage sécurisé keyguard"</string> + <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permet à une application d\'accéder au stockage sécurisé keyguard."</string> + <string name="permlab_control_keyguard" msgid="172195184207828387">"Contrôler l\'affichage et le masquage de la protection des touches"</string> + <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Permet à une application de contrôler la protection des touches."</string> + <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Appuyer deux fois pour régler le zoom"</string> + <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Impossible d\'ajouter le widget."</string> + <string name="ime_action_go" msgid="8320845651737369027">"Aller"</string> + <string name="ime_action_search" msgid="658110271822807811">"Recherche"</string> + <string name="ime_action_send" msgid="2316166556349314424">"Envoyer"</string> + <string name="ime_action_next" msgid="3138843904009813834">"Suivante"</string> + <string name="ime_action_done" msgid="8971516117910934605">"Terminé"</string> + <string name="ime_action_previous" msgid="1443550039250105948">"Précédente"</string> + <string name="ime_action_default" msgid="2840921885558045721">"Exécuter"</string> + <string name="dial_number_using" msgid="5789176425167573586">"Composer le numéro\nen utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string> + <string name="create_contact_using" msgid="4947405226788104538">"Ajouter un contact\nen utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string> + <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Les applications suivantes demandent l\'autorisation d\'accéder à votre compte à partir de maintenant."</string> + <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Voulez-vous autoriser cette demande?"</string> + <string name="grant_permissions_header_text" msgid="6874497408201826708">"Demande d\'accès"</string> + <string name="allow" msgid="7225948811296386551">"Autoriser"</string> + <string name="deny" msgid="2081879885755434506">"Refuser"</string> + <string name="permission_request_notification_title" msgid="6486759795926237907">"Autorisation demandée"</string> + <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"Autorisation demandée\npour le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\""</string> + <string name="input_method_binding_label" msgid="1283557179944992649">"Mode de saisie"</string> + <string name="sync_binding_label" msgid="3687969138375092423">"Synchroniser"</string> + <string name="accessibility_binding_label" msgid="4148120742096474641">"Accessibilité"</string> + <string name="wallpaper_binding_label" msgid="1240087844304687662">"Fond d\'écran"</string> + <string name="chooser_wallpaper" msgid="7873476199295190279">"Changer de fond d\'écran"</string> + <string name="notification_listener_binding_label" msgid="2014162835481906429">"Outil d\'écoute des notifications"</string> + <string name="vpn_title" msgid="19615213552042827">"VPN activé"</string> + <string name="vpn_title_long" msgid="6400714798049252294">"VPN activé par <xliff:g id="APP">%s</xliff:g>"</string> + <string name="vpn_text" msgid="3011306607126450322">"Appuyez ici pour gérer le réseau."</string> + <string name="vpn_text_long" msgid="6407351006249174473">"Connecté à <xliff:g id="SESSION">%s</xliff:g>. Appuyez ici pour gérer le réseau."</string> + <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string> + <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string> + <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du VPN permanent"</string> + <string name="vpn_lockdown_config" msgid="6415899150671537970">"Appuyer pour configurer"</string> + <string name="upload_file" msgid="2897957172366730416">"Choisir un fichier"</string> + <string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string> + <string name="reset" msgid="2448168080964209908">"Réinitialiser"</string> + <string name="submit" msgid="1602335572089911941">"Envoyer"</string> + <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode Voiture activé"</string> + <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Appuyez ici pour quitter le mode Voiture."</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string> + <string name="tethered_notification_message" msgid="6857031760103062982">"Appuyez pour configurer."</string> + <string name="back_button_label" msgid="2300470004503343439">"Précédent"</string> + <string name="next_button_label" msgid="1080555104677992408">"Suivante"</string> + <string name="skip_button_label" msgid="1275362299471631819">"Passer"</string> + <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilisation élevée des données mobiles"</string> + <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Appuyez ici pour en savoir plus sur la consommation des données mobiles."</string> + <string name="throttled_notification_title" msgid="6269541897729781332">"Quota utilisation données dépassé"</string> + <string name="throttled_notification_message" msgid="5443457321354907181">"Appuyez ici pour en savoir plus sur la consommation des données mobiles."</string> + <string name="no_matches" msgid="8129421908915840737">"Aucune partie"</string> + <string name="find_on_page" msgid="1946799233822820384">"Rechercher sur la page"</string> + <plurals name="matches_found"> + <item quantity="one" msgid="8167147081136579439">"1 correspondance"</item> + <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g>"</item> + </plurals> + <string name="action_mode_done" msgid="7217581640461922289">"Terminé"</string> + <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"Désinstallation de la mémoire de stockage USB en cours…"</string> + <string name="progress_unmounting" product="default" msgid="1327894998409537190">"Désinstallation de la carte SD en cours…"</string> + <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"Effacement de la mémoire de stockage USB en cours…"</string> + <string name="progress_erasing" product="default" msgid="6596988875507043042">"Effacement de la carte SD en cours…"</string> + <string name="format_error" product="nosdcard" msgid="6299769563624776948">"Impossible d\'effacer la mémoire de stockage USB."</string> + <string name="format_error" product="default" msgid="7315248696644510935">"Impossible d\'effacer la carte SD."</string> + <string name="media_bad_removal" msgid="7960864061016603281">"La carte SD a été retirée sans avoir été désinstallée."</string> + <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Vérification de la mémoire de stockage USB en cours"</string> + <string name="media_checking" product="default" msgid="7334762503904827481">"Vérification de la carte SD en cours"</string> + <string name="media_removed" msgid="7001526905057952097">"La carte SD a été retirée."</string> + <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"La mémoire de stockage USB est en cours d\'utilisation par l\'ordinateur."</string> + <string name="media_shared" product="default" msgid="5706130568133540435">"La carte SD est en cours d\'utilisation par un ordinateur."</string> + <string name="media_unknown_state" msgid="729192782197290385">"État du support externe inconnu"</string> + <string name="share" msgid="1778686618230011964">"Partager"</string> + <string name="find" msgid="4808270900322985960">"Trouver"</string> + <string name="websearch" msgid="4337157977400211589">"Recherche Web"</string> + <string name="find_next" msgid="5742124618942193978">"Rechercher suivante"</string> + <string name="find_previous" msgid="2196723669388360506">"Rechercher précédent"</string> + <string name="gpsNotifTicker" msgid="5622683912616496172">"Demande de position de <xliff:g id="NAME">%s</xliff:g>"</string> + <string name="gpsNotifTitle" msgid="5446858717157416839">"Demande de position"</string> + <string name="gpsNotifMessage" msgid="1374718023224000702">"Demande de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> + <string name="gpsVerifYes" msgid="2346566072867213563">"Oui"</string> + <string name="gpsVerifNo" msgid="1146564937346454865">"Non"</string> + <string name="sync_too_many_deletes" msgid="5296321850662746890">"Le nombre maximal de suppressions a été atteint."</string> + <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> éléments vont être supprimés lors de la synchronisation <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> pour le compte <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Voulez-vous continuer?"</string> + <string name="sync_really_delete" msgid="2572600103122596243">"Supprimer les éléments"</string> + <string name="sync_undo_deletes" msgid="2941317360600338602">"Annuler les suppressions"</string> + <string name="sync_do_nothing" msgid="3743764740430821845">"Ne rien faire pour l\'instant"</string> + <string name="choose_account_label" msgid="5655203089746423927">"Sélectionner un compte"</string> + <string name="add_account_label" msgid="2935267344849993553">"Ajouter un compte"</string> + <string name="add_account_button_label" msgid="3611982894853435874">"Ajouter un compte"</string> + <string name="number_picker_increment_button" msgid="2412072272832284313">"Augmenter"</string> + <string name="number_picker_decrement_button" msgid="476050778386779067">"Diminuer"</string> + <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> appuyez de manière prolongée."</string> + <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Faites glisser vers le haut pour augmenter et vers le bas pour diminuer."</string> + <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Minute suivante"</string> + <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Minute précédente"</string> + <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Heure suivante"</string> + <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Heure précédente"</string> + <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Définir la valeur PM"</string> + <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Définir la valeur AM"</string> + <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Mois suivant"</string> + <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Mois précédent"</string> + <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Jour suivant"</string> + <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Jour précédent"</string> + <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Année suivante"</string> + <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Année précédente"</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="activitychooserview_choose_application" msgid="2125168057199941199">"Sélectionnez une application"</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> + <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="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_target_unlock_tablet" msgid="3833195335629795055">"Faites glisser votre doigt pour déverrouiller l\'appareil."</string> + <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Branchez des écouteurs pour entendre l\'énoncé des touches lors de la saisie du mot de passe."</string> + <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Point."</string> + <string name="action_bar_home_description" msgid="5293600496601490216">"Revenir à l\'accueil"</string> + <string name="action_bar_up_description" msgid="2237496562952152589">"Revenir en haut de la page"</string> + <string name="action_menu_overflow_description" msgid="2295659037509008453">"Plus d\'options"</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">"Mémoire de stockage interne"</string> + <string name="storage_sd_card" msgid="3282948861378286745">"Carte SD"</string> + <string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string> + <string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifier"</string> + <string name="data_usage_warning_title" msgid="1955638862122232342">"Avertissement utilisation données"</string> + <string name="data_usage_warning_body" msgid="2814673551471969954">"Appuyez pour conso/paramètres"</string> + <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Données 2G-3G désactivées"</string> + <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Données 4G désactivées"</string> + <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Données mobiles désactivées"</string> + <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi désactivé"</string> + <string name="data_usage_limit_body" msgid="3317964706973601386">"Appuyez ici pour réactiver."</string> + <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Quota de données 2G-3G dépassé"</string> + <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Quota de données 4G dépassé"</string> + <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota utilisation données dépassé"</string> + <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Quota de données Wi-Fi dépassé"</string> + <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée."</string> + <string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string> + <string name="data_usage_restricted_body" msgid="6741521330997452990">"Appuyez pour suppr. restriction."</string> + <string name="ssl_certificate" msgid="6510040486049237639">"Certificat de sécurité"</string> + <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ce certificat est valide."</string> + <string name="issued_to" msgid="454239480274921032">"Émis à :"</string> + <string name="common_name" msgid="2233209299434172646">"Nom commun :"</string> + <string name="org_name" msgid="6973561190762085236">"Organisation :"</string> + <string name="org_unit" msgid="7265981890422070383">"Unité organisationnelle :"</string> + <string name="issued_by" msgid="2647584988057481566">"Émis par :"</string> + <string name="validity_period" msgid="8818886137545983110">"Validité :"</string> + <string name="issued_on" msgid="5895017404361397232">"Émis le :"</string> + <string name="expires_on" msgid="3676242949915959821">"Expire le :"</string> + <string name="serial_number" msgid="758814067660862493">"Numéro de série :"</string> + <string name="fingerprints" msgid="4516019619850763049">"Empreintes :"</string> + <string name="sha256_fingerprint" msgid="4391271286477279263">"Empreinte SHA-256 :"</string> + <string name="sha1_fingerprint" msgid="7930330235269404581">"Empreinte SHA-1 :"</string> + <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tout afficher"</string> + <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Sélectionnez une activité"</string> + <string name="share_action_provider_share_with" msgid="5247684435979149216">"Partagez avec"</string> + <string name="status_bar_device_locked" msgid="3092703448690669768">"Appareil verrouillé"</string> + <string name="list_delimeter" msgid="3975117572185494152">", "</string> + <string name="sending" msgid="3245653681008218030">"Envoi…"</string> + <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string> + <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> + <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> + <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Tablette"</string> + <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Téléphone"</string> + <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Oreillettes"</string> + <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Haut-parleurs de la station d\'accueil"</string> + <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string> + <string name="default_audio_route_category_name" msgid="3722811174003886946">"Système"</string> + <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Audio Bluetooth"</string> + <string name="wireless_display_route_description" msgid="9070346425023979651">"Affichage sans fil"</string> + <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Terminé"</string> + <string name="media_route_button_content_description" msgid="5758553567065145276">"Sortie multimédia"</string> + <string name="media_route_status_scanning" msgid="7279908761758293783">"Analyse en cours..."</string> + <string name="media_route_status_connecting" msgid="6422571716007825440">"Connexion en cours..."</string> + <string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string> + <string name="media_route_status_not_available" msgid="6739899962681886401">"Indisponible"</string> + <string name="media_route_status_in_use" msgid="4533786031090198063">"En cours d\'utilisation"</string> + <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Écran intégré"</string> + <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Écran HDMI"</string> + <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <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> ppp"</string> + <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sécurisé"</string> + <string name="wifi_display_notification_title" msgid="2223050649240326557">"L\'affichage sans fil est connecté."</string> + <string name="wifi_display_notification_message" msgid="4498802012464170685">"Cet écran s\'affiche sur un autre appareil."</string> + <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Déconnecter"</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">%1$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_password_wrong_pin_code" msgid="1139324887413846912">"NIP erroné."</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="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Augmenter le volume au-dessus du niveau recommandé?\nL\'écoute à un volume élevé pendant des périodes prolongées peut endommager votre audition."</string> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Pour activer l\'accessibilité, appuyez de manière prolongée avec deux doigts."</string> + <string name="accessibility_enabled" msgid="1381972048564547685">"L\'accessibilité a bien été activée."</string> + <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilité annulée."</string> + <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="owner_name" msgid="2716755460376028154">"Propriétaire"</string> + <string name="error_message_title" msgid="4510373083082500195">"Erreur"</string> + <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Les comptes des profils en accès limité ne sont pas compatibles avec cette application."</string> + <string name="app_not_found" msgid="3429141853498927379">"Aucune application trouvée pour gérer cette action."</string> + <string name="revoke" msgid="5404479185228271586">"Révoquer"</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">"Lettre"</string> + <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Government Letter"</string> + <string name="mediaSize_na_legal" msgid="6697982988283823150">"Légal"</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">"Annulé"</string> + <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erreur lors de l\'écriture du contenu"</string> + <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Saisissez le NIP"</string> + <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"NIP actuel"</string> + <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nouveau NIP"</string> + <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirmer le nouveau NIP"</string> + <string name="restr_pin_create_pin" msgid="8017600000263450337">"Créez un NIP pour modifier les restrictions"</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Les NIP ne correspondent pas. Essayez à nouveau."</string> + <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string> + <plurals name="restr_pin_countdown"> + <item quantity="one" msgid="4835639969503729874">"NIP erroné. Essayez à nouveau dans 1 seconde."</item> + <item quantity="other" msgid="8030607343223287654">"NIP erroné. Réessayez dans <xliff:g id="COUNT">%d</xliff:g> secondes."</item> + </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Gliss. doigt sur côté écr. aff. barre"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Faites glisser votre doigt à partir d\'un côté de l\'écran pour afficher la barre système"</string> +</resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 9103e58..763fbac 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN erroné. Réessayez dans 1 seconde."</item> <item quantity="other" msgid="8030607343223287654">"PIN erroné. Réessayez dans <xliff:g id="COUNT">%d</xliff:g> secondes."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Faire glisser côté pour voir barre."</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Faites glisser le doigt à partir d\'un côté de l\'écran pour afficher la barre système."</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 07376ef..9b4d892 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -125,7 +125,7 @@ <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="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> @@ -846,10 +846,10 @@ <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_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> @@ -1161,8 +1161,8 @@ <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> + <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> @@ -1499,10 +1499,10 @@ <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_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> @@ -1579,4 +1579,6 @@ <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-hr/strings.xml b/core/res/res/values-hr/strings.xml index 4cea5a6..f9a6fec 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN nije točan. Ponovite za 1 s."</item> <item quantity="other" msgid="8030607343223287654">"PIN nije točan. Ponovite za <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Prijeđite po rubu za prikaz trake"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Prijeđite prstom od ruba zaslona da bi se prikazala traka sustava"</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 5e0fbc2..b8aca5c 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Helytelen PIN kód. Próbálja újra 1 másodperc múlva."</item> <item quantity="other" msgid="8030607343223287654">"Helytelen PIN kód. Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Csúsztatás a képernyő szélén a sávhoz"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Csúsztassa ujját a képernyő szélétől a rendszersáv megjelenítéséhez"</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..fd50852 --- /dev/null +++ b/core/res/res/values-hy/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<Անանուն>"</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_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">"Մաքրել լռելյայնը Համակարգի կարգավորումներ > Ծրագրեր >Ներբեռնված էջից:"</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 Ծրագրեր > Ներբեռնումներ:"</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-ը ուղարկում է մեծ թվով 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g>-ը</b> ուզում է հաղորդագրություն ուղարկել <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g>-ին</b>:"</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">"Խնդիր է ծագել ձեր 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">"Սահող բռնակ: Հպել & պահել:"</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 1df979b..5194ac8 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -625,7 +625,7 @@ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"akses uji coba ke penyimpanan yang dilindungi"</string> <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Memungkinkan aplikasi menguji izin penyimpanan USB yang akan tersedia di perangkat mendatang."</string> <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Memungkinkan aplikasi menguji izin untuk kartu SD yang akan tersedia pada perangkat yang akan datang."</string> - <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ubah/hapus konten pympanan USB"</string> + <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ubah/hapus isi penyimpanan USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"mengubah atau menghapus konten kartu SD Anda"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Mengizinkan apl menulis ke penyimpanan USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Memungkinkan apl menulis ke kartu SD."</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN salah. Coba lagi dalam 1 detik."</item> <item quantity="other" msgid="8030607343223287654">"PIN salah. Coba lagi dalam <xliff:g id="COUNT">%d</xliff:g> detik."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Gesek tepi layar untuk membuka bilah"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Gesek dari bagian tepi layar untuk membuka bilah sistem"</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 82cb917..dfac858 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN errato. Riprova tra 1 s."</item> <item quantity="other" msgid="8030607343223287654">"PIN errato. Riprova tra <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Scorri bordo schermo per visual. barra"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Fai scorrere il dito dal bordo dello schermo per visualizzare la barra di sistema"</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index cef252a..9bc828e 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1579,4 +1579,6 @@ <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-ja/strings.xml b/core/res/res/values-ja/strings.xml index de0369c..3a3d1e8 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -451,7 +451,7 @@ <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="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> @@ -1579,4 +1579,6 @@ <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-ka/strings.xml b/core/res/res/values-ka/strings.xml new file mode 100644 index 0000000..a72ebad --- /dev/null +++ b/core/res/res/values-ka/strings.xml @@ -0,0 +1,1584 @@ +<?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> + <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">"ნაგულისხმევი პარამეტრების წაშლა სისტემის პარამეტრებში > აპებში > ჩამოტვირთულებში."</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">"ხელახალი გააქტიურება განყოფილებაში: სისტემის პარამეტრები > აპები > ჩამოტვირთულები."</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>აგზავნის დიდი რაოდენობის 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> სურს შეტყობინების გაგზავნა <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>-ისთვის."</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">"ანგარიშის დამატება &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">"გასრიალებით მართვა. შეეხეთ & არ აუშვათ."</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/strings.xml b/core/res/res/values-km/strings.xml new file mode 100644 index 0000000..9c48eed --- /dev/null +++ b/core/res/res/values-km/strings.xml @@ -0,0 +1,1584 @@ +<?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">"កូដ 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> + <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">"សម្អាតលំនាំដើមក្នុងការកំណត់ប្រព័ន្ធ > កម្មវិធី > ទាញយក។"</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">"បើកវាឡើងវិញក្នុងការកំណត់ប្រព័ន្ធ > កម្មវិធី > ទាញយក។"</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> កំពុងផ្ញើសារ 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចង់ផ្ញើសារទៅ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ។"</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">"បានដកស៊ីមកាតចេញ"</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">"គ្រប់គ្រងការរុញ។ ប៉ះ & សង្កត់។"</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 6477258..3576d18 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1579,4 +1579,6 @@ <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/packages/SystemUI/res/values-sw600dp-port/refs.xml b/core/res/res/values-land/refs.xml index 62fb77d..cda38cf 100644 --- a/packages/SystemUI/res/values-sw600dp-port/refs.xml +++ b/core/res/res/values-land/refs.xml @@ -16,5 +16,5 @@ */ --> <resources> - <item type="string" name="hiding_navigation_confirmation_message">@string/hiding_navigation_confirmation_message_long</item> -</resources> + <item type="string" name="transient_navigation_confirmation">@string/transient_navigation_confirmation_long</item> +</resources>
\ No newline at end of file diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml new file mode 100644 index 0000000..d853a50 --- /dev/null +++ b/core/res/res/values-lo/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<ບໍ່ມີຊື່>"</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> + <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">"ລຶບລ້າງຄ່າເລີ່ມຕົ້ນ ໃນ ການຕັ້ງຄ່າລະບົບ > ແອັບຯ > ດາວໂຫລດແລ້ວ."</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">"ເປີດການເຮັດວຽກນີ້ຄືນໄດ້ໃນ ການຕັ້ງຄ່າລະບົບ > ແອັບຯ > ດາວໂຫລດແລ້ວ"</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ກຳລັງສົ່ງຂໍ້ຄວາມ 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ຕ້ອງການສົ່ງຂໍ້ຄວາມຫາ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</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 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 1158a26..cfe8a1c 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -314,7 +314,7 @@ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"neleisti perjungti programų"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Neleidžiama naudotojui perjungti į kitą programą."</string> <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"gauti esamos programos informaciją"</string> - <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Savininkui leidžiama gauti privačią informaciją apie dabartinę programą ir paslaugas, naudojamas ekrano priekiniame plane."</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Savininkui leidžiama gauti privačios informacijos apie dabartinę programą ir paslaugas, naudojamas ekrano priekiniame plane."</string> <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"stebėti ir valdyti visų programų paleidimą"</string> <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Leidžiama programai stebėti ir valdyti, kaip sistema paleidžia veiklą. Kenkėjiškos programos gali visiškai pažeisti sistemą. Šis leidimas reikalingas tik kuriant ir jo niekada nereikia naudojant įprastai."</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"siųsti pašalinto paketo perdavimą"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Netinkamas PIN kodas. Band. po 1 sek."</item> <item quantity="other" msgid="8030607343223287654">"Netinkamas PIN kodas. Band. po <xliff:g id="COUNT">%d</xliff:g> sek."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Perbr. ekr. kr., kad atsir. juost."</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Perbraukite iš ekrano krašto, kad atsirastų sistemos juosta"</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 12acf7a..3fdcde2 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN nav pareizs. Mēģiniet pēc 1 s."</item> <item quantity="other" msgid="8030607343223287654">"PIN nav pareizs. Mēģiniet pēc <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Velciet no malas, lai atvērtu joslu"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Velciet no ekrāna malas, lai atvērtu sistēmas joslu."</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..8ed4dca --- /dev/null +++ b/core/res/res/values-mn/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<Гарчиггүй>"</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_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">"Систем тохиргоо > Апп > Татаж авсан хэсгийн үндсэн утгуудыг цэвэрлэх"</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">"Энийг Системийн тохиргоо > Апп > Татаж авсан дотроос дахин идэвхтэй болгох боломжтой."</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> их хэмжээний 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> нь <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> уруу мессеж илгээх гэж байна."</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-р холбогдсон байна. Хэрэв та өөрийн компьютер болон өөрийн Андройдын 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/strings.xml b/core/res/res/values-ms/strings.xml index bb12579..6fac0d9 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -654,7 +654,7 @@ <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 pemerhantian tentang keadaan rangkaian. Tidak sekali-kali diperlukan untuk apl biasa."</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> @@ -1579,4 +1579,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 e55e6db..9b9d58e 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Feil PIN-kode. Prøv på nytt om 1 sekund."</item> <item quantity="other" msgid="8030607343223287654">"Feil PIN-kode. Prøv på nytt om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Sveip på kanten av skjermen for å få frem feltet"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sveip fra kanten på skjermen for å få frem systemfeltet"</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..7504236 --- /dev/null +++ b/core/res/res/values-ne/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<बिना शीर्षक>"</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> + <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">"प्रणाली सेटिङहरूमा पूर्वनिर्धारितलाई हटाउनुहोस् > अनुप्रयोगहरू > डाउनलोड।"</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">"प्रणाली सेटिङहरूमा यसलाई पुनःसक्षम गराउनुहोस् > अनुप्रयोगहरू > डाउनलोड गरेको।"</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ले धरै संख्यामा 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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> के तपाईँ सन्देश पठाउन चाहुनु हुन्छ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</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 मार्फत जडान हुनुभयो। तलको बटन टच गर्नुहोस् यदि तपाईं आफ्नो कम्प्युटर र एन्ड्रोइडको 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">"धिसार्ने ह्यान्डल। छुनुहोस् & समाउनुहोस्।"</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 d48ccb8..c219fde 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Onjuiste pincode. Probeer het over één seconde opnieuw."</item> <item quantity="other" msgid="8030607343223287654">"Onjuiste pincode. Probeer het over <xliff:g id="COUNT">%d</xliff:g> seconden opnieuw."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Veeg vanaf de rand voor de balk"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Veeg vanaf de rand van het scherm om de systeembalk weer te geven"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 297bc53..7f67e82 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Nieprawidłowy PIN. Spróbuj ponownie za 1 s."</item> <item quantity="other" msgid="8030607343223287654">"Nieprawidłowy PIN. Spróbuj ponownie za <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Przesuń palcem od krawędzi ekranu, by odkryć pasek"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Przesuń palcem od krawędzi ekranu, by odkryć pasek systemu"</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 00eb416..70bfdc3 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorreto. Tente novamente em 1 seg."</item> <item quantity="other" msgid="8030607343223287654">"PIN incorreto. Tente novamente em <xliff:g id="COUNT">%d</xliff:g> seg."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Desliz. da extr. do ecrã p/ revelar barra"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Deslize da extremidade do ecrã para revelar a barra do sistema"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e5285b1..1973d86 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -289,7 +289,7 @@ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Permite que o aplicativo ative a depuração para outro aplicativo. Aplicativos maliciosos podem usar esse recurso para cancelar outros aplicativos."</string> <string name="permlab_changeConfiguration" msgid="4162092185124234480">"alterar configurações de exibição do sistema"</string> <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Permite que o aplicativo altere a configuração atual, como o local ou o tamanho da fonte."</string> - <string name="permlab_enableCarMode" msgid="5684504058192921098">"ativar o modo de carro"</string> + <string name="permlab_enableCarMode" msgid="5684504058192921098">"ativar o modo carro"</string> <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Permite que o aplicativo ative o modo Carro."</string> <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"fechar outros aplicativos"</string> <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que o aplicativo encerre processos em segundo plano de outros aplicativos. Pode ser que outros aplicativos parem de funcionar."</string> @@ -1321,7 +1321,7 @@ <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string> <string name="reset" msgid="2448168080964209908">"Redefinir"</string> <string name="submit" msgid="1602335572089911941">"Enviar"</string> - <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo de carro ativado"</string> + <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo carro ativado"</string> <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toque para sair do modo Carro."</string> <string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string> <string name="tethered_notification_message" msgid="6857031760103062982">"Toque para configurar."</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorreto. Tente novamente em 1 segundo."</item> <item quantity="other" msgid="8030607343223287654">"PIN incorreto. Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Deslize a borda da tela para ver a barra"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Deslize a partir da borda da tela ver a barra do sistema"</string> </resources> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 363fb94..7afb03e 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -2592,4 +2592,8 @@ <skip /> <!-- no translation found for restr_pin_countdown:one (4835639969503729874) --> <!-- no translation found for restr_pin_countdown:other (8030607343223287654) --> + <!-- no translation found for transient_navigation_confirmation (4907844043611123426) --> + <skip /> + <!-- no translation found for transient_navigation_confirmation_long (8061685920508086697) --> + <skip /> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 6fbecc8..31cb5b3 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -314,7 +314,7 @@ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"împiedicare comutare între aplicaţii"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Împiedică trecerea utilizatorului la o altă aplicaţie."</string> <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"obținere informații despre aplicația curentă"</string> - <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Permite titularului să recupereze informații private despre aplicația și serviciile curente în prim-planul ecranului."</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Permite titularului să afișeze informații private despre aplicația și serviciile curente în prim-planul ecranului."</string> <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorizare şi control asupra lansării tuturor aplicaţiilor"</string> <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite aplicaţiei să monitorizeze şi să controleze modul în care sistemul lansează activităţi. Aplicaţiile rău intenţionate pot să compromită sistemul în întregime. Această permisiune este necesară doar pentru dezvoltare şi niciodată pentru utilizarea normală."</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"trimitere mesaj difuzat privind extragerea din pachet"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN incorect. Reîncercați în 1 sec."</item> <item quantity="other" msgid="8030607343223287654">"PIN incorect. Reîncercați în <xliff:g id="COUNT">%d</xliff:g> sec."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Glisați din margine pentru a afișa"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Glisați dinspre marginea ecranului pentru a afișa bara de sistem"</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index add1291..07ffda4 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1579,4 +1579,6 @@ <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-si/strings.xml b/core/res/res/values-si/strings.xml new file mode 100644 index 0000000..f36a83f --- /dev/null +++ b/core/res/res/values-si/strings.xml @@ -0,0 +1,1587 @@ +<?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">"<නම් යොදා නැත>"</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> + <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">"පද්ධති සැකසීම් > යෙදුම් > බාගැනීම් තුළ ඇති සුපුරුද්ද හිස් කරන්න."</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">"පද්ධති සැකසීම් තුළ මෙය නැවත ක්රියාත්මක කරන්න > යෙදුම් > බාගන්නා ලදි."</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 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">"<b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g><b> වෙත කෙටි පණිවීඩයක් යැවීමට <b><xliff:g id="APP_NAME">%1$s</xliff:g><b> කැමතිය."</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">"ඔබට මෙය සැකසීම් තුළ වෙනස්කර ගැනීම පසුව කළ හැක > යෙදුම්"</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 c33a7ea..5c4e558 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Nespr. PIN. Skús. o 1 s"</item> <item quantity="other" msgid="8030607343223287654">"Nespr. PIN. Skús. o <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Panel zobraz. prejdením okraja obr."</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Systémový panel zobrazíte posunutím cez okraj obrazovky"</string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 45cb215..2a68043 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -314,7 +314,7 @@ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"preprečevanje preklopa programov"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Uporabniku preprečuje preklop v drug program."</string> <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"pridobivanje podatkov o trenutni aplikaciji"</string> - <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Imetniku dovoli prenos zasebnih podatkov o trenutni aplikaciji in storitvah v ospredju zaslona."</string> + <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Imetniku dovoli pridobivanje zasebnih podatkov o trenutni aplikaciji in storitvah v ospredju zaslona."</string> <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"spremljanje in nadzor vseh zagonov programov"</string> <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Programu omogoča spremljanje in nadziranje načina, kako sistem zažene dejavnosti. Zlonamerni programi lahko v celoti ogrozijo varnost sistema. To dovoljenje je potrebno samo za razvoj, vendar nikoli za običajno uporabo."</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"pošiljanje oddaje brez paketa"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Napačen PIN. Poskusite znova čez eno sekundo."</item> <item quantity="other" msgid="8030607343223287654">"Napačen PIN. Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Povlecite z roba za prikaz vrstice"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistemsko vrstico prikažete tako, da povlečete z roba zaslona"</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 404590d..aa8eef3 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1579,4 +1579,6 @@ <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-sv/strings.xml b/core/res/res/values-sv/strings.xml index 221ddb6..37b98c2 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Fel pinkod. Försök igenom en sekund."</item> <item quantity="other" msgid="8030607343223287654">"Fel pinkod. Försök igenom om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Dra från kanten av skärmen om du vill visa fältet"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Dra från kanten av skärmen om du vill visa systemfältet"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 767bf44..fb98656 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -138,7 +138,7 @@ <string name="turn_on_radio" msgid="3912793092339962371">"Washa mtandao-hewa"</string> <string name="turn_off_radio" msgid="8198784949987062346">"Zima pasiwaya"</string> <string name="screen_lock" msgid="799094655496098153">"Funga skrini"</string> - <string name="power_off" msgid="4266614107412865048">"Zima simu"</string> + <string name="power_off" msgid="4266614107412865048">"Zima"</string> <string name="silent_mode_silent" msgid="319298163018473078">"Programu ya milio imezimwa"</string> <string name="silent_mode_vibrate" msgid="7072043388581551395">"Mtetemo wa programu ya milio"</string> <string name="silent_mode_ring" msgid="8592241816194074353">"Programu ya milio imewashwa"</string> @@ -153,7 +153,7 @@ <string name="global_actions" product="tablet" msgid="408477140088053665">"Chaguo za kompyuta ndogo"</string> <string name="global_actions" product="default" msgid="2406416831541615258">"Chaguo za simu"</string> <string name="global_action_lock" msgid="2844945191792119712">"Funga skrini"</string> - <string name="global_action_power_off" msgid="4471879440839879722">"Zima simu"</string> + <string name="global_action_power_off" msgid="4471879440839879722">"Zima"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Ripoti ya hitilafu"</string> <string name="bugreport_title" msgid="2667494803742548533">"Chukua ripoti ya hitilafu"</string> <string name="bugreport_message" msgid="398447048750350456">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string> @@ -560,8 +560,8 @@ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Inaruhusu programu kubadilisha wakati wa saa ya kompyuta kibao."</string> <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Inaruhusu programu kubadilisha wakati wa saa ya simu."</string> <string name="permlab_setTimeZone" msgid="2945079801013077340">"weka saa za eneo"</string> - <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Inaruhusu programu kubadilisha majira ya saa ya kompyuta kibao."</string> - <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Inaruhusu programu kubadilisha majira ya saa ya simu."</string> + <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Huruhusu programu kubadilisha saa za eneo katika kompyuta kibao."</string> + <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Huruhusu programu kubadilisha saa za eneo katika simu."</string> <string name="permlab_accountManagerService" msgid="4829262349691386986">"tenda kama Huduma ya Meneja wa Akaunti"</string> <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Huruhusu programu kupiga simu kwa Wathibitishaji Akaunti."</string> <string name="permlab_getAccounts" msgid="1086795467760122114">"pata akaunti kwenye kifaa"</string> @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"PIN sio sahihi. Jaribu tena baada ya sekunde 1."</item> <item quantity="other" msgid="8030607343223287654">"PIN sio sahihi. Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g>."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau wa mfumo"</string> </resources> diff --git a/packages/SystemUI/res/values-land/refs.xml b/core/res/res/values-sw600dp-port/refs.xml index 62fb77d..cda38cf 100644 --- a/packages/SystemUI/res/values-land/refs.xml +++ b/core/res/res/values-sw600dp-port/refs.xml @@ -16,5 +16,5 @@ */ --> <resources> - <item type="string" name="hiding_navigation_confirmation_message">@string/hiding_navigation_confirmation_message_long</item> -</resources> + <item type="string" name="transient_navigation_confirmation">@string/transient_navigation_confirmation_long</item> +</resources>
\ No newline at end of file diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 03d0907..baf9b2e 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1579,4 +1579,6 @@ <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-tl/strings.xml b/core/res/res/values-tl/strings.xml index e3f9775..42c4268 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Mali ang PIN. Subukang muli pagkalipas ng 1 segundo."</item> <item quantity="other" msgid="8030607343223287654">"Mali ang PIN. Subukang muli pagkalipas ng <xliff:g id="COUNT">%d</xliff:g> (na) segundo."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Mag-swipe sa dulo ng screen upang ipakita ang bar"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Mag-swipe mula sa dulo ng screen upang ipakita ang system bar"</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 925fea7..960c3cc 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Yanlış PIN. 1 saniye içinde tekrar deneyin."</item> <item quantity="other" msgid="8030607343223287654">"Yanlış PIN. <xliff:g id="COUNT">%d</xliff:g> saniye içinde tekrar deneyin."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Çubuğu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem çubuğunu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 41ca8c6..de4267f 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1579,4 +1579,6 @@ <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-vi/strings.xml b/core/res/res/values-vi/strings.xml index ef96b32..400ab70 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"Mã PIN không đúng. Hãy thử lại sau 1 giây nữa."</item> <item quantity="other" msgid="8030607343223287654">"Mã PIN không đúng. Hãy thử lại sau <xliff:g id="COUNT">%d</xliff:g> giây nữa."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Vuốt cạnh màn hình để hiện thanh"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Vuốt từ cạnh màn hình để hiển thị thanh hệ thống"</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index b4af5d0..847316a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1579,4 +1579,6 @@ <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-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml new file mode 100644 index 0000000..a7dd3ce --- /dev/null +++ b/core/res/res/values-zh-rHK/strings.xml @@ -0,0 +1,1584 @@ +<?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">"<未命名>"</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">"輸入 PUK2 為 SIM 卡解除封鎖。"</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">"Google Sync"</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">"漫遊 - Google Premium 合作夥伴"</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">"找不到網址。"</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">"網址無效,因此無法打開網頁。"</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">"Google Sync"</string> + <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Google Sync"</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">"讀取及寫入您的短訊、電郵和其他訊息。"</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">"存取 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">"允許應用程式接收和處理短訊。這表示應用程式可監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</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">"允許應用程式傳送短訊,但可能產生未預期的費用。惡意應用程式可能會未經您確認擅自傳送短訊,增加您的支出。"</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 卡上儲存的短訊。這項權限允許應用程式不論內容及機密程度,均可讀取所有短訊。"</string> + <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"允許應用程式讀取手機或 SIM 卡上儲存的短訊。這項權限允許應用程式不論內容及機密程度,均可讀取所有短訊。"</string> + <string name="permlab_writeSms" msgid="3216950472636214774">"編輯您的短訊 (SMS 或 MMS)"</string> + <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"允許應用程式寫入平板電腦或 SIM 卡中儲存的短訊。惡意應用程式可能會藉此刪除您的訊息。"</string> + <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"允許應用程式寫入手機或 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> + <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">"允許應用程式在收到短訊時發出通知。惡意應用程式可能會藉此偽造外來短訊。"</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">"允許應用程序略過一般程序,直接建立和管理本身的憑證 (不建議一般應用程式使用)。"</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> + <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 Display"</string> + <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"允許應用程式設定及連接 WiFi Display。"</string> + <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"控制 WiFi Display"</string> + <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"允許應用程式控制 WiFi Display 的低階功能。"</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">"允許預先安裝的系統應用程式停用相機指示燈。"</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">"允許應用程式使用裝置的電話功能。這項權限允許應用程式確定手機號碼和裝置編號、是否正在通話中,以及所撥打的對方號碼。"</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 的 Proxy 及通訊埠。惡意應用程式可能會在您不知情的情況下,監視、重新導向或修改網絡封包。"</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">"允許應用程式測試未來裝置將支援的 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 卡,請插入 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 個小工具,共 %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">"只有安裝在 /system/app 裡的程式套件才能支援 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">"允許應用程式讀取瀏覽器到訪過的所有網址記錄,以及瀏覽器的所有書籤。注意:這項權限可能不適用於第三方瀏覽器或其他具備網頁瀏覽功能的應用程式。"</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">"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">"YEAR"</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">"複製網址"</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">"前往 [系統設定] > [應用程式] > [已下載] 清除預設值。"</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">"前往 [系統設定] > [應用程式] > [下載] 重新啟用這個模式。"</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">"正在透過藍牙播放"</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 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">"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">"<b>「<xliff:g id="APP_NAME">%1$s</xliff:g>」</b>正在傳送大量短訊。您要允許這個應用程式繼續傳送短訊嗎?"</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">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 要求將訊息傳送至 <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>。"</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">"使用您的 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 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 記憶卡?"</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 卡已移除,請插入新的 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">"存取 Keyguard 安全儲存空間"</string> + <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"允許應用程式存取 Keyguard 安全儲存空間。"</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="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">"Google 網頁搜尋"</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="ACCOUNT_NAME">%3$s</xliff:g> 的 <xliff:g id="TYPE_OF_SYNC">%2$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">"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 記憶卡"</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">"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-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 062e415..d9413f8 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -314,7 +314,7 @@ <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="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> @@ -1579,4 +1579,6 @@ <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-zu/strings.xml b/core/res/res/values-zu/strings.xml index 538299b..0b03f89 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1579,4 +1579,6 @@ <item quantity="one" msgid="4835639969503729874">"I-PIN engalungile. Zama futhi esekhondini elingu-1."</item> <item quantity="other" msgid="8030607343223287654">"I-PIN engalungile. Zama futhi emasekhondini angu-<xliff:g id="COUNT">%d</xliff:g>."</item> </plurals> + <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swayipha emaphethelweni wesikrini ukuze uveze ibha"</string> + <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swayipha kusukela emaphethelweni wesikrini ukuze uveze ibha yesistimu"</string> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 721bc3f..50ea08b 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2378,6 +2378,9 @@ <!-- Set to true in all of the configurations for which this input method should be considered an option as the default. --> <attr name="isDefault" format="boolean" /> + <!-- Set to true if this input method supports ways to switch to + a next input method (e.g. a globe key.). --> + <attr name="supportsSwitchingToNextInputMethod" format="boolean" /> </declare-styleable> <!-- This is the subtype of InputMethod. Subtype can describe locales (e.g. en_US, fr_FR...) @@ -5728,6 +5731,25 @@ <declare-styleable name="SizeAdaptiveLayout" /> <!-- =============================== --> + <!-- Location package class attributes --> + <!-- =============================== --> + <eat-comment /> + + <!-- Use <code>injected-location-setting</code> as the root tag of the XML resource that + describes an injected "Location services" setting. Note that the status value (subtitle) + for the setting is specified dynamically by a subclass of SettingInjectorService. + --> + <declare-styleable name="InjectedLocationSetting"> + <!-- The user-visible name (title) of the setting. --> + <attr name="label"/> + <!-- The icon for the apps covered by the setting. Typically a generic icon for the + developer. --> + <attr name="icon"/> + <!-- The activity to launch when the setting is clicked on. --> + <attr name="settingsActivity"/> + </declare-styleable> + + <!-- =============================== --> <!-- LockPatternView class attributes --> <!-- =============================== --> <eat-comment /> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4a472fc..4116998 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -123,12 +123,8 @@ of them. This should not normally be modified. --> <bool name="config_closeDialogWhenTouchOutside">true</bool> - <!-- Device configuration indicating this is a device with limited RAM, so heavier-weight - features should be turned off. --> - <bool name="config_lowRamDevice">false</bool> - <!-- Device configuration indicating whether we should avoid using accelerated graphics - in certain places to reduce RAM footprint. This is ignored if config_lowRamDevice + in certain places to reduce RAM footprint. This is ignored if ro.config.low_ram is true (in that case this is assumed true as well). It can allow you to tune down your device's memory use without going to the point of causing applications to turn off features. --> @@ -353,6 +349,9 @@ Default value is 2 minutes. --> <integer translatable="false" name="config_wifi_driver_stop_delay">120000</integer> + <!-- Wifi driver supports batched scan --> + <bool translatable="false" name="config_wifi_batched_scan_supported">false</bool> + <!-- Flag indicating whether the we should enable the automatic brightness in Settings. Software implementation will be used if config_hardware_auto_brightness_available is not set --> <bool name="config_automatic_brightness_available">false</bool> diff --git a/core/res/res/values/donottranslate.xml b/core/res/res/values/donottranslate.xml index b49e7bd..a7288e1 100644 --- a/core/res/res/values/donottranslate.xml +++ b/core/res/res/values/donottranslate.xml @@ -24,8 +24,6 @@ <bool name="lockscreen_isPortrait">true</bool> <!-- @hide DO NOT TRANSLATE. Control aspect ratio of lock pattern --> <string name="lock_pattern_view_aspect">square</string> - <!-- @hide DO NOT TRANSLATE. Separator between the hour and minute elements in a TimePicker widget --> - <string name="time_picker_separator">:</string> <!-- @hide DO NOT TRANSLATE. ICU pattern for "Mon, 14 January" --> <string name="icu_abbrev_wday_month_day_no_year">eeeMMMMd</string> <!-- @hide DO NOT TRANSLATE. date formatting pattern for system ui.--> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 80c9184..f2ec04f 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2072,5 +2072,6 @@ <public type="attr" name="isAsciiCapable" /> <public type="attr" name="customRoots" /> <public type="attr" name="autoMirrored" /> + <public type="attr" name="supportsSwitchingToNextInputMethod" /> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 138debf..5f5564c 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1128,6 +1128,11 @@ <string name="permdesc_anyCodecForPlayback">Allows the app to use any installed media decoder to decode for playback.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. This permission allows the app to install or uninstall trusted credentials, a.k.a. CA certificates. [CHAR LIMIT=NONE] --> + <string name="permlab_manageCaCertificates">manage trusted credentials</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE]--> + <string name="permdesc_manageCaCertificates">Allows the app to install and uninstall CA certificates as trusted credentials.</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_diagnostic">read/write to resources owned by diag</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> @@ -4313,4 +4318,9 @@ <item quantity="other">Incorrect PIN. Try again in <xliff:g id="count">%d</xliff:g> seconds.</item> </plurals> + <!-- Toast bar message when hiding the transient navigation bar [CHAR LIMIT=35] --> + <string name="transient_navigation_confirmation">Swipe edge of screen to reveal bar</string> + + <!-- Longer version of toast bar message when hiding the transient navigation bar (if room) --> + <string name="transient_navigation_confirmation_long">Swipe from edge of screen to reveal system bar</string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2e05663..076922f 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -217,6 +217,7 @@ <java-symbol type="id" name="pin_new_text" /> <java-symbol type="id" name="pin_confirm_text" /> <java-symbol type="id" name="pin_error_message" /> + <java-symbol type="id" name="timePickerLayout" /> <java-symbol type="attr" name="actionModeShareDrawable" /> <java-symbol type="attr" name="alertDialogCenterButtons" /> @@ -251,7 +252,6 @@ <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" /> <java-symbol type="bool" name="config_enable_emergency_call_while_sim_locked" /> <java-symbol type="bool" name="config_enable_puk_unlock_screen" /> - <java-symbol type="bool" name="config_lowRamDevice" /> <java-symbol type="bool" name="config_mms_content_disposition_support" /> <java-symbol type="bool" name="config_showMenuShortcutsWhenKeyboardPresent" /> <java-symbol type="bool" name="config_sip_wifi_only" /> @@ -281,7 +281,8 @@ <java-symbol type="bool" name="config_speed_up_audio_on_mt_calls" /> <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="bool" name="config_forceDefaultOrientation" /> - + <java-symbol type="bool" name="config_wifi_batched_scan_supported" /> + <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_extraFreeKbytesAdjust" /> <java-symbol type="integer" name="config_extraFreeKbytesAbsolute" /> @@ -772,7 +773,6 @@ <java-symbol type="string" name="time_picker_increment_hour_button" /> <java-symbol type="string" name="time_picker_increment_minute_button" /> <java-symbol type="string" name="time_picker_increment_set_pm_button" /> - <java-symbol type="string" name="time_picker_separator" /> <java-symbol type="string" name="upload_file" /> <java-symbol type="string" name="user_switched" /> <java-symbol type="string" name="volume_alarm" /> @@ -870,6 +870,8 @@ <java-symbol type="string" name="restr_pin_enter_pin" /> <java-symbol type="string" name="write_fail_reason_cancelled" /> <java-symbol type="string" name="write_fail_reason_cannot_write" /> + <java-symbol type="string" name="transient_navigation_confirmation" /> + <java-symbol type="string" name="transient_navigation_confirmation_long" /> <java-symbol type="plurals" name="abbrev_in_num_days" /> <java-symbol type="plurals" name="abbrev_in_num_hours" /> diff --git a/core/tests/coretests/src/android/database/MatrixCursorTest.java b/core/tests/coretests/src/android/database/MatrixCursorTest.java index cdab638..fc48c17 100644 --- a/core/tests/coretests/src/android/database/MatrixCursorTest.java +++ b/core/tests/coretests/src/android/database/MatrixCursorTest.java @@ -128,6 +128,56 @@ public class MatrixCursorTest extends TestCase { } catch (IllegalArgumentException e) { /* expected */ } } + public void testRowBuilderOffer() { + MatrixCursor cursor = newMatrixCursor(); + + cursor.newRow() + .offer("float", 4.2f) + .offer("string", "foobar") + .offer("blob", new byte[] {(byte) 0xaa, (byte) 0x55}) + .offer("lolwat", "kittens"); + + cursor.newRow(); + + cursor.newRow() + .offer("string", "zero") + .offer("string", "one") + .offer("string", "two") + .offer("lolwat", "kittens"); + + assertTrue(cursor.moveToFirst()); + assertEquals("foobar", cursor.getString(0)); + assertEquals(null, cursor.getString(1)); + assertEquals(0, cursor.getShort(1)); + assertEquals(0, cursor.getInt(2)); + assertEquals(0, cursor.getLong(3)); + assertEquals(4.2f, cursor.getFloat(4)); + assertEquals(0.0d, cursor.getDouble(5)); + MoreAsserts.assertEquals(new byte[] {(byte) 0xaa, (byte) 0x55}, cursor.getBlob(6)); + + assertTrue(cursor.moveToNext()); + assertEquals(null, cursor.getString(0)); + assertEquals(0, cursor.getShort(1)); + assertEquals(0, cursor.getInt(2)); + assertEquals(0, cursor.getLong(3)); + assertEquals(0.0f, cursor.getFloat(4)); + assertEquals(0.0d, cursor.getDouble(5)); + assertEquals(null, cursor.getBlob(6)); + + assertTrue(cursor.moveToNext()); + assertEquals("two", cursor.getString(0)); + assertEquals(0, cursor.getShort(1)); + assertEquals(0, cursor.getInt(2)); + assertEquals(0, cursor.getLong(3)); + assertEquals(0.0f, cursor.getFloat(4)); + assertEquals(0.0d, cursor.getDouble(5)); + assertEquals(null, cursor.getBlob(6)); + + assertTrue(cursor.isLast()); + assertFalse(cursor.moveToNext()); + assertTrue(cursor.isAfterLast()); + } + static class NonIterableArrayList<T> extends ArrayList<T> { NonIterableArrayList() {} diff --git a/data/etc/platform.xml b/data/etc/platform.xml index ec8e7ea..1f38ddb 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -63,7 +63,14 @@ </permission> <permission name="android.permission.WRITE_EXTERNAL_STORAGE" > + <group gid="sdcard_r" /> + <group gid="sdcard_rw" /> + </permission> + + <permission name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" > + <group gid="sdcard_r" /> <group gid="sdcard_rw" /> + <group gid="sdcard_all" /> </permission> <permission name="android.permission.WRITE_MEDIA_STORAGE" > diff --git a/docs/downloads/design/Android_Design_Downloads_20130814.zip b/docs/downloads/design/Android_Design_Downloads_20130814.zip Binary files differnew file mode 100644 index 0000000..bd29000 --- /dev/null +++ b/docs/downloads/design/Android_Design_Downloads_20130814.zip diff --git a/docs/downloads/design/roboto-1.100141.zip b/docs/downloads/design/roboto-1.100141.zip Binary files differnew file mode 100644 index 0000000..93dfda7 --- /dev/null +++ b/docs/downloads/design/roboto-1.100141.zip diff --git a/docs/html/design/downloads/index.jd b/docs/html/design/downloads/index.jd index 00f4467..6d9a60d 100644 --- a/docs/html/design/downloads/index.jd +++ b/docs/html/design/downloads/index.jd @@ -4,8 +4,10 @@ page.title=Downloads <div class="layout-content-row"> <div class="layout-content-col span-9"> -<p>Want everything? We've bundled all the downloads available on Android Design into a single ZIP file. -You can also download individual files listed below.</p> +<p>Want everything? We've bundled all the downloads available on Android Design, except for the + <a href="#roboto">Roboto</a> font family, into a single ZIP file. You can also download + individual files listed below.</p> + <p>You may use these materials without restriction in your apps and to develop your apps.</p> </div> @@ -13,7 +15,7 @@ You can also download individual files listed below.</p> <p> <a class="download-button" onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'All Design Assets']);" - href="{@docRoot}downloads/design/Android_Design_Downloads_20120823.zip">Download All</a> + href="{@docRoot}downloads/design/Android_Design_Downloads_20130814.zip">Download All</a> </p> </div> @@ -83,10 +85,12 @@ modify to match your theme, plus source files.</p> <div class="layout-content-row"> <div class="layout-content-col span-5"> -<h4>Roboto</h4> +<h4 id="roboto">Roboto</h4> <p>Ice Cream Sandwich introduced a new type family named Roboto, created specifically for the requirements of UI and high-resolution screens.</p> -<p><a href="{@docRoot}design/style/typography.html#actionbar">More on Roboto</a></p> +<p><a href="{@docRoot}design/style/typography.html">More on Roboto</a></p> +<p><a href="http://www.google.com/fonts/specimen/Roboto" class="external-link">Roboto on Google Fonts</a></p> +<p><a href="http://www.google.com/fonts/specimen/Roboto+Condensed" class="external-link">Roboto Condensed on Google Fonts</a></p> </div> <div class="layout-content-col span-4"> @@ -98,7 +102,7 @@ requirements of UI and high-resolution screens.</p> <p> <a class="download-button" onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'Roboto ZIP']);" - href="{@docRoot}downloads/design/Roboto_Hinted_20120823.zip">Roboto</a> + href="{@docRoot}downloads/design/roboto-1.100141.zip">Roboto</a> <a class="download-button" onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'Roboto Specemin Book']);" href="{@docRoot}downloads/design/Roboto_Specimen_Book_20111129.pdf">Specimen Book</a> </p> diff --git a/docs/html/design/media/typography_alphas.png b/docs/html/design/media/typography_alphas.png Binary files differdeleted file mode 100644 index 4b53bd0..0000000 --- a/docs/html/design/media/typography_alphas.png +++ /dev/null diff --git a/docs/html/design/media/typography_variants.png b/docs/html/design/media/typography_variants.png Binary files differnew file mode 100644 index 0000000..9b49b20 --- /dev/null +++ b/docs/html/design/media/typography_variants.png diff --git a/docs/html/design/media/typography_variants@2x.png b/docs/html/design/media/typography_variants@2x.png Binary files differnew file mode 100644 index 0000000..13e7c4f --- /dev/null +++ b/docs/html/design/media/typography_variants@2x.png diff --git a/docs/html/design/style/typography.jd b/docs/html/design/style/typography.jd index 114d13b..818af4c 100644 --- a/docs/html/design/style/typography.jd +++ b/docs/html/design/style/typography.jd @@ -10,17 +10,25 @@ page.tags="textview","font" </div> <div class="layout-content-col span-5"> +<p> + <a class="download-button" onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'Roboto ZIP']);" + href="{@docRoot}downloads/design/roboto-1.100141.zip">Download Roboto</a> +</p> + <p>The Android design language relies on traditional typographic tools such as scale, space, rhythm, and alignment with an underlying grid. Successful deployment of these tools is essential to help users quickly understand a screen of information. To support such use of typography, Ice Cream -Sandwich introduced a new type family named Roboto, created specifically for the requirements of UI -and high-resolution screens. The current TextView framework supports regular, bold, italic, and bold -italic weights by default.</p> +Sandwich introduced a new type family named +<a href="http://www.google.com/fonts/specimen/Roboto" class="external-link">Roboto</a>, created +specifically for the requirements of UI and high-resolution screens.</p> + +<p>The current {@link android.widget.TextView} framework offers Roboto in thin, light, regular and bold +weights, along with an italic style for each weight. The framework also offers the +<a href="http://www.google.com/fonts/specimen/Roboto+Condensed" class="external-link">Roboto Condensed</a> +variant in regular and bold weights, along with an italic style for each weight.</p> - <img src="{@docRoot}design/media/typography_alphas.png"> + <img src="{@docRoot}design/media/typography_variants@2x.png" width="220"> -<p><a onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'Roboto ZIP (@typography page)']);" - href="{@docRoot}downloads/design/Roboto_Hinted_20120823.zip">Download Roboto</a></p> <p><a onClick="_gaq.push(['_trackEvent', 'Design', 'Download', 'Roboto Specimen Booke (@typography page)']);" href="{@docRoot}downloads/design/Roboto_Specimen_Book_20111129.pdf">Specimen Book</a></p> diff --git a/docs/html/google/gcm/adv.jd b/docs/html/google/gcm/adv.jd index 567b12c..1360624 100644 --- a/docs/html/google/gcm/adv.jd +++ b/docs/html/google/gcm/adv.jd @@ -22,12 +22,7 @@ page.title=GCM Advanced Topics </ol> </li> <li><a href="#retry">Automatic Retry Using Exponential Back-Off</a></li> -<li><a href="#unreg">Unregistration</a> - <ol> - <li><a href="#unreg-why">Why you should rarely unregister</a></li> - <li><a href="#unreg-how">How unregistration works</a></li> - </ol> -</li> +<li><a href="#unreg">How Unregistration Works</a></li> <li><a href="#collapsible">Send-to-Sync vs. Messages with Payload</a> <ol> <li><a href="#s2s">Send-to-sync messages</a></li> @@ -36,8 +31,7 @@ page.title=GCM Advanced Topics </ol> </li> <li><a href="#ttl">Setting an Expiration Date for a Message</a> </li> -<li><a href="#throttling"></a><a href="#multi-senders">Receiving Messages from -Multiple Senders</a></li> +<li><a href="#throttling"></a><a href="#multi-senders">Receiving Messages from Multiple Senders</a></li> </ol> </div> @@ -48,56 +42,17 @@ Multiple Senders</a></li> <h2 id="msg-lifetime">Lifetime of a Message</h2> -<p>When a 3rd-party server posts a message to GCM and receives a message ID back, -it does not mean that the message was already delivered to the device. Rather, it -means that it was accepted for delivery. What happens to the message after it is -accepted depends on many factors.</p> +<p>When a 3rd-party server posts a message to GCM and receives a message ID back, it does not mean that the message was already delivered to the device. Rather, it means that it was accepted for delivery. What happens to the message after it is accepted depends on many factors.</p> +<p>In the best-case scenario, if the device is connected to GCM, the screen is on, and there are no throttling restrictions (see <a href="#throttling">Throttling</a>), the message will be delivered right away.</p> +<p>If the device is connected but idle, the message will still be +delivered right away unless the <code>delay_while_idle</code> flag is set to true. Otherwise, it will be stored in the GCM servers until the device is awake. And that's where the <code>collapse_key</code> flag plays a role: if there is already a message with the same collapse key (and registration ID) stored and waiting for delivery, the old message will be discarded and the new message will take its place (that is, the old message will be collapsed by the new one). However, if the collapse key is not set, both the new and old messages are stored for future delivery.</p> -<p>In the best-case scenario, if the device is connected to GCM, the screen is on, -and there are no throttling restrictions (see <a href="#throttling">Throttling</a>), -the message will be delivered right away.</p> +<p class="note"><strong>Note:</strong> There is a limit on how many messages can be stored without collapsing. That limit is currently 100. If the limit is reached, all stored messages are discarded. Then when the device is back online, it receives a special message indicating that the limit was reached. The application can then handle the situation properly, typically by requesting a full sync.</p> -<p>If the device is connected but idle, the message will still be -delivered right away unless the <code>delay_while_idle</code> flag is set to true. -Otherwise, it will be stored in the GCM servers until the device is awake. And -that's where the <code>collapse_key</code> flag plays a role: if there is already -a message with the same collapse key (and registration ID) stored and waiting for -delivery, the old message will be discarded and the new message will take its place -(that is, the old message will be collapsed by the new one). However, if the collapse -key is not set, both the new and old messages are stored for future delivery. -Collapsible messages are also called <a href="#s2s">send-to-sync messages</a>.</p> - -<p class="note"><strong>Note:</strong> There is a limit on how many messages can -be stored without collapsing. That limit is currently 100. If the limit is reached, -all stored messages are discarded. Then when the device is back online, it receives -a special message indicating that the limit was reached. The application can then -handle the situation properly, typically by requesting a full sync. -<br><br> -Likewise, there is a limit on how many <code>collapse_key</code>s you can have for -a particular device. GCM allows a maximum of 4 different collapse keys to be used -by the GCM server per device -any given time. In other words, the GCM server can simultaneously store 4 different -send-to-sync messages, each with a different collapse key. If you exceed this number -GCM will only keep 4 collapse keys, with no guarantees about which ones they will be. -See <a href="#s2s">Send-to-sync messages</a> for more information. -</p> - -<p>If the device is not connected to GCM, the message will be stored until a -connection is established (again respecting the collapse key rules). When a connection -is established, GCM will deliver all pending messages to the device, regardless of -the <code>delay_while_idle</code> flag. If the device never gets connected again -(for instance, if it was factory reset), the message will eventually time out and -be discarded from GCM storage. The default timeout is 4 weeks, unless the -<code>time_to_live</code> flag is set.</p> - -<p>Finally, when GCM attempts to deliver a message to the device and the -application was uninstalled, GCM will discard that message right away and -invalidate the registration ID. Future attempts to send a message to that device -will get a <code>NotRegistered</code> error. See <a href="#unreg"> -How Unregistration Works</a> for more information.</p> -<p>Although is not possible to track the status of each individual message, the -Google APIs Console stats are broken down by messages sent to device, messages -collapsed, and messages waiting for delivery.</p> +<p>If the device is not connected to GCM, the message will be stored until a connection is established (again respecting the collapse key rules). When a connection is established, GCM will deliver all pending messages to the device, regardless of the <code>delay_while_idle</code> flag. If the device never gets connected again (for instance, if it was factory reset), the message will eventually time out and be discarded from GCM storage. The default timeout is 4 weeks, unless the <code>time_to_live</code> flag is set.</p> + +<p>Finally, when GCM attempts to deliver a message to the device and the application was uninstalled, GCM will discard that message right away and invalidate the registration ID. Future attempts to send a message to that device will get a <code>NotRegistered</code> error. See <a href="#unreg">How Unregistration Works</a> for more information.</p> +<p>Although is not possible to track the status of each individual message, the Google APIs Console stats are broken down by messages sent to device, messages collapsed, and messages waiting for delivery.</p> <h2 id="throttling">Throttling</h2> <p>To prevent abuse (such as sending a flood of messages to a device) and @@ -119,112 +74,107 @@ belonging to a non-throttled category by GCM for network and battery efficiency reasons.</p> <h2 id="reg-state">Keeping the Registration State in Sync</h2> -<p>Whenever the application registers as described in -<a href="{@docRoot}google/gcm/client.html">Implementing GCM Client</a>, -it should save the registration ID for future use, pass it to the -3rd-party server to complete the registration, and keep track of -whether the server completed the registration. If the server fails -to complete the registration, it should try again or unregister from GCM.</p> - +<p>Whenever the application receives a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with a <code>registration_id</code> extra, it should save the ID for future use, pass it to the 3rd-party server to complete the registration, and keep track of whether the server completed the registration. If the server fails to complete the registration, it should try again or unregister from GCM.</p> <p>There are also two other scenarios that require special care:</p> <ul> <li>Application update</li> <li>Backup and restore </li> </ul> -<p>When an application is updated, it should invalidate its existing registration -ID, as it is not guaranteed to work with the new version. Because there is no -lifecycle method called when the application is updated, the best way to achieve -this validation is by storing the current application version when a registration -ID is stored. Then when the application is started, compare the stored value with -the current application version. If they do not match, invalidate the stored data -and start the registration process again.</p> - -<p>Similarly, you should not save the registration ID when an application is -backed up. This is because the registration ID could become invalid by the time -the application is restored, which would put the application in an invalid state -(that is, the application thinks it is registered, but the server and GCM do not -store that registration ID anymore—thus the application will not get more -messages).</p> +<p>When an application is updated, it should invalidate its existing registration ID, as it is not guaranteed to work with the new version. Because there is no lifecycle method called when the application is updated, the best way to achieve this validation is by storing the current application version when a registration ID is stored. Then when the application is started, compare the stored value with the current application version. If they do not match, invalidate the stored data and start the registration process again.</p> + +<p>Similarly, you should not save the registration ID when an application is backed up. This is because the registration ID could become invalid by the time the application is restored, which would put the application in an invalid state (that is, the application thinks it is registered, but the server and GCM do not store that registration ID anymore—thus the application will not get more messages).</p> <h3 id="canonical">Canonical IDs</h3> -<p>On the server side, as long as the application is behaving well, everything -should work normally. However, if a bug in the application triggers multiple -registrations for the same device, it can be hard to reconcile state and you might -end up with duplicate messages.</p> -<p>GCM provides a facility called "canonical registration IDs" to easily -recover from these situations. A canonical registration ID is defined to be the ID -of the last registration requested by your application. This is the ID that the -server should use when sending messages to the device.</p> -<p>If later on you try to send a message using a different registration ID, GCM -will process the request as usual, but it will include the canonical registration -ID in the <code>registration_id</code> field of the response. Make sure to replace -the registration ID stored in your server with this canonical ID, as eventually -the ID you're using will stop working.</p> +<p>On the server side, as long as the application is behaving well, everything should work normally. However, if a bug in the application triggers multiple registrations for the same device, it can be hard to reconcile state and you might end up with duplicate messages.</p> +<p>GCM provides a facility called "canonical registration IDs" to easily recover from these situations. A canonical registration ID is defined to be the ID of the last registration requested by your application. This is the ID that the server should use when sending messages to the device.</p> +<p>If later on you try to send a message using a different registration ID, GCM will process the request as usual, but it will include the canonical registration ID in the <code>registration_id</code> field of the response. Make sure to replace the registration ID stored in your server with this canonical ID, as eventually the ID you're using will stop working.</p> <h2 id="retry">Automatic Retry Using Exponential Back-Off</h2> -<p>When registration or unregistration fails, the app should retry the failed operation.</p> -<p>In the simplest case, if your application attempts to register and GCM is not a -fundamental part of the application, the application could simply ignore the error -and try to register again the next time it starts. Otherwise, it should retry the -previous operation using exponential back-off. In exponential back-off, each time -there is a failure, it should wait twice the previous amount of time before trying -again. If the register (or unregister) operation was synchronous, it could be retried -in a simple loop. However, since it is asynchronous, the best approach is to schedule -a {@link android.app.PendingIntent} to retry the operation. - -<h2 id="unreg">Unregistration</h2> - -<p>This section explains when you should unregister in GCM and what happens -when you do.</p> - -<h3 id="unreg-why">Why you should rarely unregister</h3> - -<p>A registration ID (regID) represents a particular Android application running -on a particular device. You should only need to unregister in rare cases, such as -if you want an app to stop receiving messages, or if you suspect that the regID has -been compromised. In general, though, once an app has a regID, you shouldn't need -to change it.</p> - -<p>In particular, you should never unregister your app as a mechanism for -logout or for switching between users, for the following reasons:</p> +<p>When the application receives a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with the <code>error</code> extra set as <code>SERVICE_NOT_AVAILABLE</code>, it should retry the failed operation (register or unregister).</p> +<p>In the simplest case, if your application just calls <code>register</code> and GCM is not a fundamental part of the application, the application could simply ignore the error and try to register again the next time it starts. Otherwise, it should retry the previous operation using exponential back-off. In exponential back-off, each time there is a failure, it should wait twice the previous amount of time before trying again. If the register (or unregister) operation was synchronous, it could be retried in a simple loop. However, since it is asynchronous, the best approach is to schedule a pending intent to retry the operation. The following steps describe how to implement this in the <code>MyIntentService</code> example used above:</p> +<ol> + <li> Create a random token to verify the origin of the retry intent: -<ul> - <li>A regID maps an app to a device. It isn't associated with a particular - logged in user. If you unregister and then re-register, GCM may return the same - ID or a different ID—there's no guarantee either way.</li> - - <li>Unregistration may take up to 5 minutes to propagate.</li> - <li>After unregistration, re-registration may again take up to 5 minutes to -propagate. During this time messages may be rejected due to the state of being -unregistered, and after all this, messages may still go to the wrong user.</li> -</ul> +<pre class="prettyprint pretty-java">private static final String TOKEN = + Long.toBinaryString(new Random().nextLong()); +</pre> + <li> Change the <code>handleRegistration()</code> method so it creates the pending intent when appropriate:</li> + +<pre class="prettyprint pretty-java">... +if (error != null) { + if ("SERVICE_NOT_AVAILABLE".equals(error)) { + long backoffTimeMs = // get back-off time from shared preferences + long nextAttempt = SystemClock.elapsedRealtime() + backoffTimeMs; + Intent retryIntent = new Intent("com.example.gcm.intent.RETRY"); + retryIntent.putExtra("token", TOKEN); + PendingIntent retryPendingIntent = + PendingIntent.getBroadcast(context, 0, retryIntent, 0); + AlarmManager am = (AlarmManager) + context.getSystemService(Context.ALARM_SERVICE); + am.set(AlarmManager.ELAPSED_REALTIME, nextAttempt, retryPendingIntent); + backoffTimeMs *= 2; // Next retry should wait longer. + // update back-off time on shared preferences + } else { + // Unrecoverable error, log it + Log.i(TAG, "Received error: " + error); +} +...</pre> +<p> The back-off time is stored in a shared preference. This ensures that it is persistent across multiple activity launches. The name of the intent does not matter, as long as the same intent is used in the following steps.</p></li> + + <li> Change the <code>onHandleIntent()</code> method adding an <code>else if</code> case for the retry intent:</li> + +<pre class="prettyprint pretty-java">... +} else if (action.equals("com.example.gcm.intent.RETRY")) { + String token = intent.getStringExtra("token"); + // make sure intent was generated by this class, not by a malicious app + if (TOKEN.equals(token)) { + String registrationId = // get from shared properties + if (registrationId != null) { + // last operation was attempt to unregister; send UNREGISTER intent again + } else { + // last operation was attempt to register; send REGISTER intent again + } +} +...</pre> + + <li> Create a new instance of <code>MyReceiver</code> in your activity:</li> + +<pre class="prettyprint pretty-java">private final MyBroadcastReceiver mRetryReceiver = new MyBroadcastReceiver(); +</pre> -<p>The solution is to manage your own mapping between users, the regID, and -individual messages:</p> + <li>In the activity's <code>onCreate()</code> method, register the new instance to receive the <code>com.example.gcm.intent.RETRY</code> intent: + <pre class="prettyprint pretty-java">... +IntentFilter filter = new IntentFilter("com.example.gcm.intent.RETRY"); +filter.addCategory(getPackageName()); +registerReceiver(mRetryReceiver, filter); +...</pre> -<ul> - <li>Your app server should maintain a mapping between the current user -and the regID. This should include information about which user is supposed to -receive a particular message.</li> - <li>The app running on the device should check to ensure that messages it -receives match the logged in user.</li> -</ul> +<p class="note"><strong>Note:</strong> You must dynamically create a new instance of the broadcast receiver since the one defined by the manifest can only receive intents with the <code>com.google.android.c2dm.permission.SEND</code> permission. The permission <code>com.google.android.c2dm.permission.SEND</code> is a system permission and as such it cannot be granted to a regular application.</p> +</li> -<h3 id="unreg-how">How unregistration works</h3> + <li>In the activity's <code>onDestroy()</code> method, unregister the broadcast receiver:</li> -<p>An application can be automatically unregistered after it is uninstalled from -the device. However, this process does not happens right away, as Android does not -provide an uninstall callback. What happens in this scenario is as follows:</p> +<pre class="prettyprint pretty-java">unregisterReceiver(mRetryReceiver);</pre> +</ol> +<h2 id="unreg">How Unregistration Works</h2> +<p>There are two ways to unregister a device from GCM: manually and automatically.</p> +<p>An Android application can manually unregister itself by issuing a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, which is useful when the application offers a logoff feature (so it can unregister on logoff and register again on logon). See the <a href="gcm.html#unregistering">Architectural Overview</a> for more discussion of this topic. This is the sequence of events when an application unregisters itself:</p> +<ol> + <li> The application issues a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, passing the package name as an extra.</li> + <li>When the GCM server is done with the unregistration, it sends a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with the <code>unregistered</code> extra set.</li> + <li>The application then must contact the 3rd-party server so it can remove the registration ID.</li> + <li>The application should also clear its registration ID. + </li> +</ol> +<p>An application can be automatically unregistered after it is uninstalled from the device. However, this process does not happens right away, as Android does not provide an uninstall callback. What happens in this scenario is as follows:</p> <ol> <li>The end user uninstalls the application.</li> <li>The 3rd-party server sends a message to GCM server.</li> <li>The GCM server sends the message to the device.</li> - <li>The GCM client receives the message and queries Package Manager about -whether there are broadcast receivers configured to receive it, which returns -<code>false</code>. + <li>The GCM client receives the message and queries Package Manager about whether there are broadcast receivers configured to receive it, which returns <code>false</code>. </li> <li>The GCM client informs the GCM server that the application was uninstalled.</li> <li>The GCM server marks the registration ID for deletion.</li> @@ -234,16 +184,9 @@ whether there are broadcast receivers configured to receive it, which returns </li> </ol> -<p class ="note"><strong>Note:</strong> The GCM client is the Google Cloud -Messaging framework present on the device.</p> +<p class ="note"><strong>Note:</strong> The GCM client is the Google Cloud Messaging framework present on the device.</p> -<p>Note that it might take a while for the registration ID be completely removed -from GCM. Thus it is possible that messages sent during step 7 above gets a valid -message ID as response, even though the message will not be delivered to the device. -Eventually, the registration ID will be removed and the server will get a -<code>NotRegistered</code> error, without any further action being required from -the 3rd-party server (this scenario happens frequently while an application is -being developed and tested).</p> +<p>Note that it might take a while for the registration ID be completely removed from GCM. Thus it is possible that messages sent during step 7 above gets a valid message ID as response, even though the message will not be delivered to the device. Eventually, the registration ID will be removed and the server will get a <code>NotRegistered</code> error, without any further action being required from the 3rd-party server (this scenario happens frequently while an application is being developed and tested).</p> <h2 id="collapsible">Send-to-Sync vs. Messages with Payload</h2> @@ -253,45 +196,17 @@ being developed and tested).</p> <li>By default, it is stored by GCM for 4 weeks.</li> </ul> -<p>But despite these similarities, messages can behave very differently depending -on their particular settings. One major distinction between messages is whether -they are collapsed (where each new message replaces the preceding message) or not -collapsed (where each individual message is delivered). Every message sent in GCM -is either a "send-to-sync" (collapsible) message or a "message with -payload" (non-collapsible message). These concepts are described in more -detail in the following sections.</p> +<p>But despite these similarities, messages can behave very differently depending on their particular settings. One major distinction between messages is whether they are collapsed (where each new message replaces the preceding message) or not collapsed (where each individual message is delivered). Every message sent in GCM is either a "send-to-sync" (collapsible) message or a "message with payload" (non-collapsible message). These concepts are described in more detail in the following sections.</p> <h3 id="s2s"><strong>Send-to-sync messages</strong></h3> -<p>A send-to-sync (collapsible) message is often a "tickle" that tells -a mobile application to sync data from the server. For example, suppose you have -an email application. When a user receives new email on the server, the server -pings the mobile application with a "New mail" message. This tells the -application to sync to the server to pick up the new email. The server might send -this message multiple times as new mail continues to accumulate, before the application -has had a chance to sync. But if the user has received 25 new emails, there's no -need to preserve every "New mail" message. One is sufficient. Another -example would be a sports application that updates users with the latest score. -Only the most recent message is relevant, so it makes sense to have each new -message replace the preceding message. </p> - -<p>The email and sports applications are cases where you would probably use the -GCM <code>collapse_key</code> parameter. A <em>collapse key</em> is an arbitrary -string that is used to collapse a group of like messages when the device is offline, -so that only the most recent message gets sent to the client. For example, -"New mail," "Updates available," and so on</p> -<p>GCM allows a maximum of 4 different collapse keys to be used by the GCM server -at any given time. In other words, the GCM server can simultaneously store 4 -different send-to-sync messages per device, each with a different collapse key. -For example, Device A can have A1, A2, A3, and A4. Device B can have B1, B2, B3, -and B4, and so on. If you exceed this number GCM will only keep 4 collapse keys, with no -guarantees about which ones they will be.</p> +<p>A send-to-sync (collapsible) message is often a "tickle" that tells a mobile application to sync data from the server. For example, suppose you have an email application. When a user receives new email on the server, the server pings the mobile application with a "New mail" message. This tells the application to sync to the server to pick up the new email. The server might send this message multiple times as new mail continues to accumulate, before the application has had a chance to sync. But if the user has received 25 new emails, there's no need to preserve every "New mail" message. One is sufficient. Another example would be a sports application that updates users with the latest score. Only the most recent message is relevant, so it makes sense to have each new message replace the preceding message. </p> + +<p>The email and sports applications are cases where you would probably use the GCM <code>collapse_key</code> parameter. A <em>collapse key</em> is an arbitrary string that is used to collapse a group of like messages when the device is offline, so that only the most recent message gets sent to the client. For example, "New mail," "Updates available," and so on</p> +<p>GCM allows a maximum of 4 different collapse keys to be used by the GCM server at any given time. In other words, the GCM server can simultaneously store 4 different send-to-sync messages, each with a different collapse key. If you exceed this number GCM will only keep 4 collapse keys, with no guarantees about which ones they will be.</p> <h3 id="payload">Messages with payload</h3> -<p>Unlike a send-to-sync message, every "message with payload" -(non-collapsible message) is delivered. The payload the message contains can be -up to 4kb. For example, here is a JSON-formatted message in an IM application in -which spectators are discussing a sporting event:</p> +<p>Unlike a send-to-sync message, every "message with payload" (non-collapsible message) is delivered. The payload the message contains can be up to 4kb. For example, here is a JSON-formatted message in an IM application in which spectators are discussing a sporting event:</p> <pre class="prettyprint pretty-json">{ "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", @@ -302,42 +217,19 @@ which spectators are discussing a sporting event:</p> }, }</pre> -<p>A "message with payload" is not simply a "ping" to the -mobile application to contact the server to fetch data. In the aforementioned IM -application, for example, you would want to deliver every message, because every -message has different content. To specify a non-collapsible message, you simply -omit the <code>collapse_key</code> parameter. Thus GCM will send each message -individually. Note that the order of delivery is not guaranteed.</p> - -<p>GCM will store up to 100 non-collapsible messages. After that, all messages -are discarded from GCM, and a new message is created that tells the client how -far behind it is. The message is delivered through a regular -<code>com.google.android.c2dm.intent.RECEIVE</code> intent, with the following -extras:</p> +<p>A "message with payload" is not simply a "ping" to the mobile application to contact the server to fetch data. In the aforementioned IM application, for example, you would want to deliver every message, because every message has different content. To specify a non-collapsible message, you simply omit the <code>collapse_key</code> parameter. Thus GCM will send each message individually. Note that the order of delivery is not guaranteed.</p> +<p>GCM will store up to 100 non-collapsible messages. After that, all messages are discarded from GCM, and a new message is created that tells the client how far behind it is. The message is delivered through a regular <code>com.google.android.c2dm.intent.RECEIVE</code> intent, with the following extras:</p> <ul> - <li> <code>message_type</code>—The value is always the string -"deleted_messages".</li> - <li><code>total_deleted</code>—The value is a string with the number of -deleted messages.</li> + <li> <code>message_type</code>—The value is always the string "deleted_messages".</li> + <li><code>total_deleted</code>—The value is a string with the number of deleted messages.</li> </ul> -<p>The application should respond by syncing with the server to recover the -discarded messages. </p> +<p>The application should respond by syncing with the server to recover the discarded messages. </p> <h3 id="which">Which should I use?</h3> - <p>If your application does not need to use non-collapsible messages, collapsible -messages are a better choice from a performance standpoint, because they put less -of a burden on the device battery. However, if you use collapsible messages, remember that -<strong>GCM only allows a maximum of 4 different collapse keys to be used by the GCM server -per device at any given time</strong>. You must not exceed this number, or it could cause -unpredictable consequences.</p> + <p>If your application does not need to use non-collapsible messages, collapsible messages are a better choice from a performance standpoint, because they put less of a burden on the device battery.</p> <h2 dir="ltr" id="ttl">Setting an Expiration Date for a Message</h2> -<p>The Time to Live (TTL) feature lets the sender specify the maximum lifespan -of a message using the <code>time_to_live</code> parameter in the send request. -The value of this parameter must be a duration from 0 to 2,419,200 seconds, and -it corresponds to the maximum period of time for which GCM will store and try to -deliver the message. Requests that don't contain this field default to the maximum -period of 4 weeks.</p> +<p>The Time to Live (TTL) feature lets the sender specify the maximum lifespan of a message using the <code>time_to_live</code> parameter in the send request. The value of this parameter must be a duration from 0 to 2,419,200 seconds, and it corresponds to the maximum period of time for which GCM will store and try to deliver the message. Requests that don't contain this field default to the maximum period of 4 weeks.</p> <p>Here are some possible uses for this feature:</p> <ul> <li>Video chat incoming calls</li> @@ -345,29 +237,9 @@ period of 4 weeks.</p> <li>Calendar events</li> </ul> <h3 id="bg">Background </h3> -<p>GCM will usually deliver messages immediately after they are sent. However, -this might not always be possible. For example, the device could be turned off, -offline, or otherwise unavailable. In other cases, the sender itself might request -that messages not be delivered until the device becomes active by using the -<code>delay_while_idle</code> flag. Finally, GCM might intentionally delay messages -to prevent an application from consuming excessive resources and negatively -impacting battery life.</p> - -<p>When this happens, GCM will store the message and deliver it as soon as it's -feasible. While this is fine in most cases, there are some applications for which -a late message might as well never be delivered. For example, if the message is -an incoming call or video chat notification, it will only be meaningful for a -small period of time before the call is terminated. Or if the message is an -invitation to an event, it will be useless if received after the event has ended.</p> - -<p>Another advantage of specifying the expiration date for a message is that GCM -will never throttle messages with a <code>time_to_live</code> value of 0 seconds. -In other words, GCM will guarantee best effort for messages that must be delivered -"now or never." Keep in mind that a <code>time_to_live</code> value of -0 means messages that can't be delivered immediately will be discarded. However, -because such messages are never stored, this provides the best latency for -sending notifications.</p> - +<p>GCM will usually deliver messages immediately after they are sent. However, this might not always be possible. For example, the device could be turned off, offline, or otherwise unavailable. In other cases, the sender itself might request that messages not be delivered until the device becomes active by using the <code>delay_while_idle</code> flag. Finally, GCM might intentionally delay messages to prevent an application from consuming excessive resources and negatively impacting battery life.</p> +<p>When this happens, GCM will store the message and deliver it as soon as it's feasible. While this is fine in most cases, there are some applications for which a late message might as well never be delivered. For example, if the message is an incoming call or video chat notification, it will only be meaningful for a small period of time before the call is terminated. Or if the message is an invitation to an event, it will be useless if received after the event has ended.</p> +<p>Another advantage of specifying the expiration date for a message is that GCM will never throttle messages with a <code>time_to_live</code> value of 0 seconds. In other words, GCM will guarantee best effort for messages that must be delivered "now or never." Keep in mind that a <code>time_to_live</code> value of 0 means messages that can't be delivered immediately will be discarded. However, because such messages are never stored, this provides the best latency for sending notifications.</p> <p>Here is an example of a JSON-formatted request that includes TTL:</p> <pre class="prettyprint pretty-json"> { @@ -384,23 +256,9 @@ sending notifications.</p> <h2 id="multi-senders">Receiving Messages from Multiple Senders</h2> - -<p>GCM allows multiple parties to send messages to the same application. For -example, suppose your application is an articles aggregator with multiple -contributors, and you want each of them to be able to send a message when they -publish a new article. This message might contain a URL so that the application -can download the article. Instead of having to centralize all sending activity in -one location, GCM gives you the ability to let each of these contributors send -its own messages.</p> - -<p>To make this possible, all you need to do is have each sender generate its own -project number. Then include those IDs in the sender field, separated by commas, -when requesting a registration. Finally, share the registration ID with your -partners, and they'll be able to send messages to your application using their -own authentication keys.</p> -<p>This code snippet illustrates this feature. Senders are passed as an intent -extra in a comma-separated list:</p> - +<p>GCM allows multiple parties to send messages to the same application. For example, suppose your application is an articles aggregator with multiple contributors, and you want each of them to be able to send a message when they publish a new article. This message might contain a URL so that the application can download the article. Instead of having to centralize all sending activity in one location, GCM gives you the ability to let each of these contributors send its own messages.</p> +<p>To make this possible, all you need to do is have each sender generate its own project number. Then include those IDs in the sender field, separated by commas, when requesting a registration. Finally, share the registration ID with your partners, and they'll be able to send messages to your application using their own authentication keys.</p> +<p>This code snippet illustrates this feature. Senders are passed as an intent extra in a comma-separated list:</p> <pre class="prettyprint pretty-java">Intent intent = new Intent(GCMConstants.INTENT_TO_GCM_REGISTRATION); intent.setPackage(GSF_PACKAGE); intent.putExtra(GCMConstants.EXTRA_APPLICATION_PENDING_INTENT, @@ -411,3 +269,4 @@ ontext.startService(intent); </pre> <p>Note that there is limit of 100 multiple senders.</p> + diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd index 244278e..0cadbd2 100644 --- a/docs/html/google/gcm/ccs.jd +++ b/docs/html/google/gcm/ccs.jd @@ -1,96 +1,93 @@ -page.title=GCM Cloud Connection Server (XMPP) +page.title=GCM Cloud Connection Server @jd:body <div id="qv-wrapper"> <div id="qv"> +<h2>Quickview</h2> + +<ul> +<li>Get an introduction to key CCS terms and concepts.</li> +<li>Learn how to send and receive both upstream and downstream messages in CCS.</li> +</ul> + <h2>In this document</h2> <ol class="toc"> + <li><a href="#gcm">CCS vs. GCM HTTP</a> </li> <li><a href="#usage">How to Use CCS</a> - <ol class="toc"> - <li><a href="#auth">Authentication</a></li> - </ol> - </li> - <li><a href="#format">Message Format</a> - <ol class="toc"> - <li><a href="#request">Request format</a></li> - <li><a href="#response">Response format</a></li> - </ol> - </li> - <li><a href="#upstream">Upstream Messages</a> </li> - <li><a href="#flow">Flow Control</a> </li> - <li><a href="#implement">Implementing an XMPP-based App Server</a> - <ol class="toc"> - <li><a href="#smack">Java sample using the Smack library</a></li> - <li><a href="#python">Python sample</a></li> + <ol> + <li><a href="#send_msg">Sending Messages</a></li> + <li><a href="#format">Message Format</a></li> + <li><a href="#msg_examples">Message Examples</a></li> </ol> </li> + <li><a href="#flow">Flow Control</a> </li> </ol> <h2>See Also</h2> <ol class="toc"> -<li><a href="{@docRoot}google/play-services/gcm/http.html">HTTP</a></li> <li><a href="{@docRoot}google/play-services/gcm/gs.html">Getting Started</a></li> -<li><a href="{@docRoot}google/play-services/gcm/server.html">Implementing GCM Server</a></li> -<li><a href="{@docRoot}google/play-services/gcm/client.html">Implementing GCM Client</a></li> -<li><a href="https://services.google.com/fb/forms/gcm/" class="external-link" -target="_android">CCS and User Notifications Signup Form</a></li> +<li><a href="https://services.google.com/fb/forms/gcm/" class="external-link" target="_android">CCS and User Notifications Signup Form</a></li> </ol> </div> </div> -<p class="note"><strong>Note:</strong> To try out this feature, sign up using -<a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> +<p class="note"><strong>Note:</strong> To try out this feature, sign up using <a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> -<p>The GCM Cloud Connection Server (CCS) is a connection server based on XMPP. -CCS allows 3rd-party app servers (which you're -responsible for implementing) to communicate -with Android devices by establishing a persistent TCP connection with Google -servers using the XMPP protocol. This communication is asynchronous and bidirectional.</p> -<p>You can continue to use the HTTP request mechanism to send messages to GCM -servers, side-by-side with CCS which uses XMPP. Some of the benefits of CCS include:</p> +<p>The GCM Cloud Connection Server (CCS) allows third party servers to communicate with Android devices by establishing a persistent TCP connection with Google servers using the XMPP protocol. This communication is asynchronous and bidirectional.</p> +<p>You can continue to use the HTTP request mechanism to send messages to GCM servers, side-by-side with CCS which uses XMPP. Some of the benefits of CCS include:</p> <ul> - <li>The asynchronous nature of XMPP allows you to send more messages with fewer -resources.</li> - <li>Communication is bidirectional—not only can the server send messages -to the device, but the device can send messages back to the server.</li> -<li>You can send messages back using the same connection used for receiving, -thereby improving battery life.</li> + <li>The asynchronous nature of XMPP allows you to send more messages with fewer resources.</li> + <li>Communication is bidirectional—not only can the server send messages to the device, but the device can send messages back to the server.</li> +<li>You can send messages back using the same connection used for receiving, thereby improving battery life.</li> </ul> -<p>The upstream messaging (device-to-cloud) feature of CCS is part of the Google -Play services platform. Upstream messaging is available through the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> -APIs. For examples, see -<a href="#implement">Implementing an XMPP-based App Server</a>.</p> +<p>The upstream messaging (device-to-cloud) feature of CCS is part of the Google Play services platform. Upstream messaging is available through the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs. To use upstream messaging and the new streamlined registration process, you must <a href="{@docRoot}google/play-services/setup.html">set up</a> the Google Play services SDK.</p> -<p class="note"><strong>Note:</strong> See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message -parameters and which connection server(s) supports them.</p> +<p class="note"><strong>Note:</strong> For an example of an XMPP server, see <a href="server.html#xmpp">GCM Server</a>. + +<h2 id="gcm">CCS vs. GCM HTTP</h2> + +<p>CCS messaging differs from GCM HTTP messaging in the following ways:</p> +<ul> + <li>Upstream/Downstream messages + <ul> + <li>GCM HTTP: Downstream only: cloud-to-device. </li> + <li>CCS: Upstream and downstream (device-to-cloud, cloud-to-device). </li> + </ul> + </li> + <li>Asynchronous messaging + <ul> + <li>GCM HTTP: 3rd-party servers send messages as HTTP POST requests and wait for a response. This mechanism is synchronous and causes the sender to block before sending another message.</li> + <li>CCS: 3rd-party servers connect to Google infrastructure using a persistent XMPP connection and send/receive messages to/from all their devices at full line speed. CCS sends acknowledgements or failure notifications (in the form of special ACK and NACK JSON-encoded XMPP messages) asynchronously.</li> + </ul> + </li> + <li>JSON + <ul> + <li>GCM HTTP: JSON messages sent as HTTP POST.</li> + <li>CCS: JSON messages encapsulated in XMPP messages.</li> + </ul> + </li> +</ul> +<p>This document describes how to use CCS. For general concepts and information on how to use GCM HTTP, see the <a href="gcm.html">GCM Architectural Overview</a>.</p> <h2 id="usage">How to Use CCS</h2> -<p>GCM Cloud Connection Server (CCS) is an XMPP endpoint, running on -{@code http://gcm.googleapis.com} port 5235.</p> +<p>GCM Cloud Connection Server (CCS) is an XMPP endpoint, running on {@code http://gcm.googleapis.com} port 5235.</p> -<p>CCS requires a Transport Layer Security (TLS) connection. That means the XMPP -client must initiate a TLS connection. -For example in Java, you would call {@code setSocketFactory(SSLSocketFactory)}.</p> +<p>CCS requires a Transport Layer Security (TLS) connection. That means the XMPP client must initiate a TLS connection. +For example in smack, you would call {@code setSocketFactory(SSLSocketFactory)}, similar to “old style SSL” XMPP connections and https.</p> -<p>CCS requires a SASL PLAIN authentication mechanism using -{@code <your_GCM_Sender_Id>@gcm.googleapis.com} (GCM sender ID) and the -API key as the password, where the sender ID and API key are the same as described -in <a href="gs.html">Getting Started</a>.</p> +<p>CCS requires a SASL PLAIN authentication mechanism using {@code <your_GCM_Sender_Id>@gcm.googleapis.com} (GCM sender ID) and the API key as the password, where the sender ID and API key are the same as described in <a href="gs.html">Getting Started</a>.</p> <p> You can use most XMPP libraries to interact with CCS.</p> -<h3 id="auth">Authentication</h3> +<h3 id="send_msg">Sending messages</h3> <p>The following snippets illustrate how to perform authentication in CCS.</p> <h4>Client</h4> @@ -111,13 +108,13 @@ in <a href="gs.html">Getting Started</a>.</p> <h4>Client</h4> <pre><auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb +mRyb2lkLmNvbQAxMjYyMDAzNDc5FzNAcHJvamVjdHMtZ2EtLmFuZHJvaWQuY29tAEFJe mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth> </pre> - <h4>Server</h4> <pre><success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/></pre> -<h2 id="format">Message Format</h2> +<h3 id="format">Message Format</h3> <p>CCS uses normal XMPP <code><message></code> stanzas. The body of the message must be: </p> <pre> @@ -126,42 +123,25 @@ mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth> </gcm> </pre> -<p>The JSON payload for server-to-device is similar to what the GCM http endpoint -uses, with these exceptions:</p> +<p>The JSON payload for server-to-device is similar to what the GCM http endpoint uses, with these exceptions:</p> <ul> <li>There is no support for multiple recipients.</li> <li>{@code to} is used instead of {@code registration_ids}.</li> - <li>CCS adds the field {@code message_id}, which is required. This ID uniquely -identifies the message in an XMPP connection. The ACK or NACK from CCS uses the -{@code message_id} to identify a message sent from 3rd-party app servers to CCS. -Therefore, it's important that this {@code message_id} not only be unique, but -always present.</li> + <li>CCS adds the field {@code message_id}, which is required. This ID uniquely identifies the message in an XMPP connection. The ACK or NACK from CCS uses the {@code message_id} to identify a message sent from 3rd-party servers to CCS. Therefore, it's important that this {@code message_id} not only be unique, but always present.</li> -<li>For ACK/NACK messages that are special control messages, you also need to -include a {@code message_type} field in the JSON message. The value can be either -'ack' or 'nack'. For example: + <li>For ACK/NACK messages that are special control messages, you also need to include a {@code message_type} field in the JSON message. For example: -<pre>message_type = ('ack');</pre> +<pre>message_type = ('ack' OR 'nack');</pre> </li> </ul> -<p>For each device message your app server receives from CCS, it needs to send -an ACK message. -It never needs to send a NACK message. If you don't send an ACK for a message, -CCS will just resend it. +<p>For each message a device sends to the server, you need to send an ACK message. You never need to send a NACK message. If you don't send an ACK for a message, CCS will just resend it. </p> -<p>CCS also sends an ACK or NACK for each server-to-device message. If you do not -receive either, it means that the TCP connection was closed in the middle of the -operation and your server needs to resend the messages. See -<a href="#flow">Flow Control</a> for details. +<p>CCS also sends an ACK or NACK for each server-to-device message. If you do not receive either, it means that the TCP connection was closed in the middle of the operation and your server needs to resend the messages. </p> -<p class="note"><strong>Note:</strong> See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message -parameters and which connection server(s) supports them.</p> +<h3 id="msg_examples">Message Examples</h3> -<h3 id="request">Request format</h3> - -<p>Here is an XMPP stanza containing the JSON message from a 3rd-party app server to CCS: +<p>Here is an XMPP stanza containing the JSON message from a 3rd-party server to CCS: </p> <pre><message id=""> @@ -180,15 +160,7 @@ parameters and which connection server(s) supports them.</p> </message> </pre> -<h3 id="response">Response format</h3> - -<p>A CCS response can have 3 possible forms. The first one is a regular 'ack' -message. But when the response contains an error, there are 2 -different forms the message can take, described below.</p> - -<h4 id="ack">ACK message</h4> - -<p>Here is an XMPP stanza containing the ACK/NACK message from CCS to 3rd-party app server: +<p>Here is an XMPP stanza containing the ACK/NACK message from CCS to 3rd-party server: </p> <pre><message id=""> <gcm xmlns="google:mobile:data"> @@ -199,138 +171,24 @@ different forms the message can take, described below.</p> } </gcm> </message> -</pre> - -<h4 id="nack">NACK message</h4> - -<p>A NACK error is a regular XMPP message in which the {@code message_type} status -message is "nack". A NACK message contains:</p> -<ul> -<li>Nack error code.</li> -<li>Nack error description.</li> -</ul> - -<p>Below are some examples.</p> - -<p>Bad registration:</p> -<pre><message> - <data:gcm xmlns:data="google:mobile:data"> - { - "error":"BAD_REGISTRATION", // error code - "message_id":"msgId1", - "from":"PA91bHFOtaQGSwupt5l1og", - "message_type":"nack" - } - </data:gcm> -</message></pre> - -<p>Invalid "time to live":</p> - -<pre><message> - <data:gcm xmlns:data="google:mobile:data"> - { - "error":"InvalidJson : INVALID_TTL : Invalid value (-1) for \"time_to_live\": must be between 0 and \"2419200\"\n", - "message_id":"msgId1", - "from":"APA91bHFOtaQGSwupt5l1og", - "message_type":"nack" - } - </data:gcm> -</message></pre> -<p>JSON type error:</p> - -<pre><message> - <data:gcm xmlns:data="google:mobile:data"> +<message id=""> + <gcm xmlns="google:mobile:data"> { - "error":"InvalidJson : JSON_TYPE_ERROR : Field \"delay_while_idle\" must be a JSON java.lang.Boolean: not-boolean-user-supplied-value\n", - "message_id":"msgId1", - "from":"APA91bHFOtaQGSwupt5l1og", - "message_type":"nack" + "from":"REGID", + "message_id":"m-1366082849205" + "error": ERROR_CODE, + "message_type":"nack" } - </data:gcm> -</message></pre> - - -<p>The following table lists some of the more common NACK error codes.</p> - -<p class="table-caption" id="table1"> - <strong>Table 1.</strong> NACK error codes.</p> - -<table border="1"> -<tr> -<th>Error Code</th> -<th>Description</th> -</tr> -<tr> -<td>{@code BAD_REGISTRATION}</td> -<td>The device has a registration ID, but it's invalid.</td> -</tr> -<tr> -<td>{@code DEVICE_UNREGISTERED}</td> -<td>The device is not registered.</td> -</tr> -<tr> -<td>{@code INTERNAL_SERVER_ERROR}</td> -<td>The server encountered an error while trying to process the request.</td> -</tr> -<tr> -<td>{@code SERVICE_UNAVAILABLE}</td> -<td>The CCS connection server is temporarily unavailable, try again later -(using exponential backoff, etc.).</td> -</tr> -<tr> -<td>{@code BAD_ACK}</td> -<td>The ACK message is improperly formed.</td> -</tr> -<tr> -<td>{@code AUTHENTICATION_FAILED}</td> -<td>This is a 401 error indicating that there was an error authenticating the sender account.</td> -</tr> -<tr> -<td>{@code INVALID_TTL}</td> -<td>There was an error in the supplied "time to live" value.</td> -</tr> -<tr> -<td>{@code JSON_TYPE_ERROR}</td> -<td>There was an error in the supplied JSON data type.</td> -</tr> -</table> - -<h4 id="stanza">Stanza error</h4> - -<p>You can also get a stanza error in certain cases. -A stanza error contains:</p> -<ul> -<li>Stanza error code.</li> -<li>Stanza error description (free text).</li> -</ul> -<p>For example:</p> - -<pre><message id="3" type="error" to="123456789@gcm.googleapis.com/ABC"> - <gcm xmlns="google:mobile:data"> - {"random": "text"} </gcm> - <error code="400" type="modify"> - <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/> - <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"> - InvalidJson: JSON_PARSING_ERROR : Missing Required Field: message_id\n - </text> - </error> </message> </pre> +<h4>Upstream Messages</h4> -<h2 id="upstream">Upstream Messages</h2> +<p>Using CCS and the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">GoogleCloudMessaging</a> API, you can send messages from a user's device to the cloud.</p> -<p>Using CCS and the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> -API, you can send messages from a user's device to the cloud.</p> - -<p>Here is how you send an upstream message using the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> -API. For a complete example, see <a href="client.html">Implementing GCM Client</a>:</p> +<p>Here is how you send an upstream message using the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">GoogleCloudMessaging</a> API. For a complete example, see <a href="gs.html#gs_example">Getting Started</a>:</p> <pre>GoogleCloudMessaging gcm = GoogleCloudMessaging.get(context); String GCM_SENDER_ID = "Your-Sender-ID"; @@ -340,15 +198,12 @@ Bundle data = new Bundle(); // Bundle data consists of a key-value pair data.putString("hello", "world"); // "time to live" parameter -// This is optional. It specifies a value in seconds up to 4 weeks. int ttl = [0 seconds, 4 weeks] gcm.send(GCM_SENDER_ID + "@gcm.googleapis.com", id, ttl, data); </pre> -<p>This call generates the necessary XMPP stanza for sending the upstream message. -The message goes from the app on the device to CCS to the 3rd-party app server. -The stanza has the following format:</p> +<p>This call generates the necessary XMPP stanza for sending the upstream message. The message goes from the app on the device to CCS to the 3rd-party server. The stanza has the following format:</p> <pre><message id=""> <gcm xmlns="google:mobile:data"> @@ -364,8 +219,7 @@ The stanza has the following format:</p> </gcm> </message></pre> -<p>Here is the format of the ACK expected by CCS from 3rd-party app servers in -response to the above message:</p> +<p>Here is the format of the ACK expected by CCS from 3rd-party servers in response to the above message:</p> <pre><message id=""> <gcm xmlns="google:mobile:data"> @@ -377,478 +231,13 @@ response to the above message:</p> </gcm> </message></pre> -<h2 id="flow">Flow Control</h2> -<p>Every message sent to CCS receives either an ACK or a NACK response. Messages -that haven't received one of these responses are considered pending. If the pending -message count reaches 1000, the 3rd-party app server should stop sending new messages -and wait for CCS to acknowledge some of the existing pending messages as illustrated in -figure 1:</p> +<h2 id="flow">Flow Control</h2> -<img src="{@docRoot}images/gcm/CCS-ack.png"> +<p>Every message sent to CCS receives either an ACK or a NACK response. Messages that haven't received one of these responses are considered pending. If the pending message count reaches 1000, the 3rd-party server should stop sending new messages and wait for CCS to acknowledge some of the existing pending messages.</p> -<p class="img-caption"> - <strong>Figure 1.</strong> Message/ack flow. -</p> +<p>Conversely, to avoid overloading the 3rd-party server, CCS will stop sending if there are too many unacknowledged messages. Therefore, the 3rd-party server should "ACK" received messages as soon as possible to maintain a constant flow of incoming messages. The aforementioned pending message limit doesn't apply to these ACKs. Even if the pending message count reaches 1000, the 3rd-party server should continue sending ACKs to avoid blocking delivery of new messages.</p> -<p>Conversely, to avoid overloading the 3rd-party app server, CCS will stop sending -if there are too many unacknowledged messages. Therefore, the 3rd-party app server -should "ACK" upstream messages, received from the client application via CCS, as soon as possible -to maintain a constant flow of incoming messages. The aforementioned pending message limit doesn't -apply to these ACKs. Even if the pending message count reaches 1000, the 3rd-party app server -should continue sending ACKs for messages received from CCS to avoid blocking delivery of new -upstream messages.</p> - -<p>ACKs are only valid within the context of one connection. If the connection is -closed before a message can be ACKed, the 3rd-party app server should wait for CCS -to resend the upstream message before ACKing it again. Similarly, all pending messages for which an -ACK/NACK was not received from CCS before the connection was closed should be sent again. +<p>ACKs are only valid within the context of one connection. If the connection is closed before a message can be ACKed, the 3rd-party server should wait for CCS to resend the message before ACKing it again. </p> -<h2 id="implement">Implementing an XMPP-based App Server</h2> - -<p>This section gives examples of implementing an app server that works with CCS. -Note that a full GCM implementation requires a client-side implementation, in -addition to the server. For more information, see <a href="client.html"> -Implementing GCM Client</a>.</a> - -<h3 id="smack">Java sample using the Smack library</h3> - -<p>Here is a sample app server written in Java, using the -<a href="http://www.igniterealtime.org/projects/smack/">Smack</a> library.</p> - -<pre>import org.jivesoftware.smack.ConnectionConfiguration; -import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; -import org.jivesoftware.smack.ConnectionListener; -import org.jivesoftware.smack.PacketInterceptor; -import org.jivesoftware.smack.PacketListener; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.filter.PacketTypeFilter; -import org.jivesoftware.smack.packet.DefaultPacketExtension; -import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smack.packet.Packet; -import org.jivesoftware.smack.packet.PacketExtension; -import org.jivesoftware.smack.provider.PacketExtensionProvider; -import org.jivesoftware.smack.provider.ProviderManager; -import org.jivesoftware.smack.util.StringUtils; -import org.json.simple.JSONValue; -import org.json.simple.parser.ParseException; -import org.xmlpull.v1.XmlPullParser; - -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.net.ssl.SSLSocketFactory; -/** - * Sample Smack implementation of a client for GCM Cloud Connection Server. - * - * <p>For illustration purposes only. - */ -public class SmackCcsClient { - - Logger logger = Logger.getLogger("SmackCcsClient"); - - public static final String GCM_SERVER = "gcm.googleapis.com"; - public static final int GCM_PORT = 5235; - - public static final String GCM_ELEMENT_NAME = "gcm"; - public static final String GCM_NAMESPACE = "google:mobile:data"; - - static Random random = new Random(); - XMPPConnection connection; - ConnectionConfiguration config; - - /** - * XMPP Packet Extension for GCM Cloud Connection Server. - */ - class GcmPacketExtension extends DefaultPacketExtension { - String json; - - public GcmPacketExtension(String json) { - super(GCM_ELEMENT_NAME, GCM_NAMESPACE); - this.json = json; - } - - public String getJson() { - return json; - } - - @Override - public String toXML() { - return String.format("<%s xmlns=\"%s\">%s</%s>", GCM_ELEMENT_NAME, - GCM_NAMESPACE, json, GCM_ELEMENT_NAME); - } - - @SuppressWarnings("unused") - public Packet toPacket() { - return new Message() { - // Must override toXML() because it includes a <body> - @Override - public String toXML() { - - StringBuilder buf = new StringBuilder(); - buf.append("<message"); - if (getXmlns() != null) { - buf.append(" xmlns=\"").append(getXmlns()).append("\""); - } - if (getLanguage() != null) { - buf.append(" xml:lang=\"").append(getLanguage()).append("\""); - } - if (getPacketID() != null) { - buf.append(" id=\"").append(getPacketID()).append("\""); - } - if (getTo() != null) { - buf.append(" to=\"").append(StringUtils.escapeForXML(getTo())).append("\""); - } - if (getFrom() != null) { - buf.append(" from=\"").append(StringUtils.escapeForXML(getFrom())).append("\""); - } - buf.append(">"); - buf.append(GcmPacketExtension.this.toXML()); - buf.append("</message>"); - return buf.toString(); - } - }; - } - } - - public SmackCcsClient() { - // Add GcmPacketExtension - ProviderManager.getInstance().addExtensionProvider(GCM_ELEMENT_NAME, - GCM_NAMESPACE, new PacketExtensionProvider() { - - @Override - public PacketExtension parseExtension(XmlPullParser parser) - throws Exception { - String json = parser.nextText(); - GcmPacketExtension packet = new GcmPacketExtension(json); - return packet; - } - }); - } - - /** - * Returns a random message id to uniquely identify a message. - * - * <p>Note: - * This is generated by a pseudo random number generator for illustration purpose, - * and is not guaranteed to be unique. - * - */ - public String getRandomMessageId() { - return "m-" + Long.toString(random.nextLong()); - } - - /** - * Sends a downstream GCM message. - */ - public void send(String jsonRequest) { - Packet request = new GcmPacketExtension(jsonRequest).toPacket(); - connection.sendPacket(request); - } - - /** - * Handles an upstream data message from a device application. - * - * <p>This sample echo server sends an echo message back to the device. - * Subclasses should override this method to process an upstream message. - */ - public void handleIncomingDataMessage(Map<String, Object> jsonObject) { - String from = jsonObject.get("from").toString(); - - // PackageName of the application that sent this message. - String category = jsonObject.get("category").toString(); - - // Use the packageName as the collapseKey in the echo packet - String collapseKey = "echo:CollapseKey"; - @SuppressWarnings("unchecked") - Map<String, String> payload = (Map<String, String>) jsonObject.get("data"); - payload.put("ECHO", "Application: " + category); - - // Send an ECHO response back - String echo = createJsonMessage(from, getRandomMessageId(), payload, collapseKey, null, false); - send(echo); - } - - /** - * Handles an ACK. - * - * <p>By default, it only logs a {@code INFO} message, but subclasses could override it to - * properly handle ACKS. - */ - public void handleAckReceipt(Map<String, Object> jsonObject) { - String messageId = jsonObject.get("message_id").toString(); - String from = jsonObject.get("from").toString(); - logger.log(Level.INFO, "handleAckReceipt() from: " + from + ", messageId: " + messageId); - } - - /** - * Handles a NACK. - * - * <p>By default, it only logs a {@code INFO} message, but subclasses could override it to - * properly handle NACKS. - */ - public void handleNackReceipt(Map<String, Object> jsonObject) { - String messageId = jsonObject.get("message_id").toString(); - String from = jsonObject.get("from").toString(); - logger.log(Level.INFO, "handleNackReceipt() from: " + from + ", messageId: " + messageId); - } - - /** - * Creates a JSON encoded GCM message. - * - * @param to RegistrationId of the target device (Required). - * @param messageId Unique messageId for which CCS will send an "ack/nack" (Required). - * @param payload Message content intended for the application. (Optional). - * @param collapseKey GCM collapse_key parameter (Optional). - * @param timeToLive GCM time_to_live parameter (Optional). - * @param delayWhileIdle GCM delay_while_idle parameter (Optional). - * @return JSON encoded GCM message. - */ - public static String createJsonMessage(String to, String messageId, Map<String, String> payload, - String collapseKey, Long timeToLive, Boolean delayWhileIdle) { - Map<String, Object> message = new HashMap<String, Object>(); - message.put("to", to); - if (collapseKey != null) { - message.put("collapse_key", collapseKey); - } - if (timeToLive != null) { - message.put("time_to_live", timeToLive); - } - if (delayWhileIdle != null && delayWhileIdle) { - message.put("delay_while_idle", true); - } - message.put("message_id", messageId); - message.put("data", payload); - return JSONValue.toJSONString(message); - } - - /** - * Creates a JSON encoded ACK message for an upstream message received from an application. - * - * @param to RegistrationId of the device who sent the upstream message. - * @param messageId messageId of the upstream message to be acknowledged to CCS. - * @return JSON encoded ack. - */ - public static String createJsonAck(String to, String messageId) { - Map<String, Object> message = new HashMap<String, Object>(); - message.put("message_type", "ack"); - message.put("to", to); - message.put("message_id", messageId); - return JSONValue.toJSONString(message); - } - - /** - * Connects to GCM Cloud Connection Server using the supplied credentials. - * - * @param username GCM_SENDER_ID@gcm.googleapis.com - * @param password API Key - * @throws XMPPException - */ - public void connect(String username, String password) throws XMPPException { - config = new ConnectionConfiguration(GCM_SERVER, GCM_PORT); - config.setSecurityMode(SecurityMode.enabled); - config.setReconnectionAllowed(true); - config.setRosterLoadedAtLogin(false); - config.setSendPresence(false); - config.setSocketFactory(SSLSocketFactory.getDefault()); - - // NOTE: Set to true to launch a window with information about packets sent and received - config.setDebuggerEnabled(true); - - // -Dsmack.debugEnabled=true - XMPPConnection.DEBUG_ENABLED = true; - - connection = new XMPPConnection(config); - connection.connect(); - - connection.addConnectionListener(new ConnectionListener() { - - @Override - public void reconnectionSuccessful() { - logger.info("Reconnecting.."); - } - - @Override - public void reconnectionFailed(Exception e) { - logger.log(Level.INFO, "Reconnection failed.. ", e); - } - - @Override - public void reconnectingIn(int seconds) { - logger.log(Level.INFO, "Reconnecting in %d secs", seconds); - } - - @Override - public void connectionClosedOnError(Exception e) { - logger.log(Level.INFO, "Connection closed on error."); - } - - @Override - public void connectionClosed() { - logger.info("Connection closed."); - } - }); - - // Handle incoming packets - connection.addPacketListener(new PacketListener() { - - @Override - public void processPacket(Packet packet) { - logger.log(Level.INFO, "Received: " + packet.toXML()); - Message incomingMessage = (Message) packet; - GcmPacketExtension gcmPacket = - (GcmPacketExtension) incomingMessage.getExtension(GCM_NAMESPACE); - String json = gcmPacket.getJson(); - try { - @SuppressWarnings("unchecked") - Map<String, Object> jsonObject = - (Map<String, Object>) JSONValue.parseWithException(json); - - // present for "ack"/"nack", null otherwise - Object messageType = jsonObject.get("message_type"); - - if (messageType == null) { - // Normal upstream data message - handleIncomingDataMessage(jsonObject); - - // Send ACK to CCS - String messageId = jsonObject.get("message_id").toString(); - String from = jsonObject.get("from").toString(); - String ack = createJsonAck(from, messageId); - send(ack); - } else if ("ack".equals(messageType.toString())) { - // Process Ack - handleAckReceipt(jsonObject); - } else if ("nack".equals(messageType.toString())) { - // Process Nack - handleNackReceipt(jsonObject); - } else { - logger.log(Level.WARNING, "Unrecognized message type (%s)", - messageType.toString()); - } - } catch (ParseException e) { - logger.log(Level.SEVERE, "Error parsing JSON " + json, e); - } catch (Exception e) { - logger.log(Level.SEVERE, "Couldn't send echo.", e); - } - } - }, new PacketTypeFilter(Message.class)); - - - // Log all outgoing packets - connection.addPacketInterceptor(new PacketInterceptor() { - @Override - public void interceptPacket(Packet packet) { - logger.log(Level.INFO, "Sent: {0}", packet.toXML()); - } - }, new PacketTypeFilter(Message.class)); - - connection.login(username, password); - } - - public static void main(String [] args) { - final String userName = "Your GCM Sender Id" + "@gcm.googleapis.com"; - final String password = "API Key"; - - SmackCcsClient ccsClient = new SmackCcsClient(); - - try { - ccsClient.connect(userName, password); - } catch (XMPPException e) { - e.printStackTrace(); - } - - // Send a sample hello downstream message to a device. - String toRegId = "RegistrationIdOfTheTargetDevice"; - String messageId = ccsClient.getRandomMessageId(); - Map<String, String> payload = new HashMap<String, String>(); - payload.put("Hello", "World"); - payload.put("CCS", "Dummy Message"); - payload.put("EmbeddedMessageId", messageId); - String collapseKey = "sample"; - Long timeToLive = 10000L; - Boolean delayWhileIdle = true; - ccsClient.send(createJsonMessage(toRegId, messageId, payload, collapseKey, - timeToLive, delayWhileIdle)); - } -}</pre> -<h3 id="python">Python sample</h3> - -<p>Here is an example of a CCS app server written in Python. This sample echo -server sends an initial message, and for every upstream message received, it sends -a dummy response back to the application that sent the upstream message. This -example illustrates how to connect, send, and receive GCM messages using XMPP. It -shouldn't be used as-is on a production deployment.</p> - -<pre> -#!/usr/bin/python -import sys, json, xmpp, random, string - -SERVER = 'gcm.googleapis.com' -PORT = 5235 -USERNAME = "Your GCM Sender Id" -PASSWORD = "API Key" -REGISTRATION_ID = "Registration Id of the target device" - -unacked_messages_quota = 1000 -send_queue = [] - -# Return a random alphanumerical id -def random_id(): - rid = '' - for x in range(8): rid += random.choice(string.ascii_letters + string.digits) - return rid - -def message_callback(session, message): - global unacked_messages_quota - gcm = message.getTags('gcm') - if gcm: - gcm_json = gcm[0].getData() - msg = json.loads(gcm_json) - if not msg.has_key('message_type'): - # Acknowledge the incoming message immediately. - send({'to': msg['from'], - 'message_type': 'ack', - 'message_id': msg['message_id']}) - # Queue a response back to the server. - if msg.has_key('from'): - # Send a dummy echo response back to the app that sent the upstream message. - send_queue.append({'to': msg['from'], - 'message_id': random_id(), - 'data': {'pong': 1}}) - elif msg['message_type'] == 'ack' or msg['message_type'] == 'nack': - unacked_messages_quota += 1 - -def send(json_dict): - template = ("<message><gcm xmlns='google:mobile:data'>{1}</gcm></message>") - client.send(xmpp.protocol.Message( - node=template.format(client.Bind.bound[0], json.dumps(json_dict)))) - -def flush_queued_messages(): - global unacked_messages_quota - while len(send_queue) and unacked_messages_quota > 0: - send(send_queue.pop(0)) - unacked_messages_quota -= 1 - -client = xmpp.Client('gcm.googleapis.com', debug=['socket']) -client.connect(server=(SERVER,PORT), secure=1, use_srv=False) -auth = client.auth(USERNAME, PASSWORD) -if not auth: - print 'Authentication failed!' - sys.exit(1) - -client.RegisterHandler('message', message_callback) - -send_queue.append({'to': REGISTRATION_ID, - 'message_id': 'reg_id', - 'data': {'message_destination': 'RegId', - 'message_id': random_id()}}) - -while True: - client.Process(1) - flush_queued_messages()</pre> diff --git a/docs/html/google/gcm/client.jd b/docs/html/google/gcm/client.jd index df357a2..7604932 100644 --- a/docs/html/google/gcm/client.jd +++ b/docs/html/google/gcm/client.jd @@ -1,663 +1,24 @@ -page.title=Implementing GCM Client +page.title=GCM Client page.tags="cloud","push","messaging" @jd:body <div id="qv-wrapper"> <div id="qv"> - -<h2>In this document</h2> - -<ol class="toc"> -<li><a href="#play-services">Set Up Google Play Services</a></li> -<li><a href="#manifest">Edit Your Application's Manifest</a></li> -<li><a href="#app">Write Your Application</a> - <ol class="toc"> - <li><a href="#sample-play">Check for Google Play Services APK</a></li> - <li><a href="#sample-register">Register for GCM</a></li> - <li><a href="#sample-send">Send a message</a></li> - <li><a href="#sample-receive">Receive a message</a></li> - </ol> - <li><a href="#run">Running the Sample</a></li> - <li><a href="#stats">Viewing Statistics</a></li> -</li> - -</ol> - <h2>See Also</h2> <ol class="toc"> <li><a href="gs.html">Getting Started</a></li> -<li><a href="server.html">Implementing GCM Server</a></li> +<li><a href="server.html">GCM Server</a></li> </ol> </div> </div> -<p>A GCM client is a GCM-enabled app that runs on an Android device. To write your -client code, we recommend that you use the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> APIs. -The client helper library that was offered in previous versions of GCM still works, -but it has been superseded by the more efficient -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> APIs.</p> - -<p>A full GCM implementation requires both a client implementation and a server -implementation. For more -information about implementing the server side, see <a href="server.html"> -Implementing GCM Server</a>.</p> - -<p>The following sections walk you through the steps involved in writing a GCM -client-side application. Your client app can be arbitrarily complex, but at bare -minimum, a GCM client app must include code to register (and thereby get a -registration ID), and a broadcast receiver to receive messages sent by GCM. -</p> - -<h2 id="play-services">Step 1: Set Up Google Play Services</h2> - -<p>To write your client application, use the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> API. -To use this API, you must set up your project to use the Google Play services SDK, -as described in <a href="/google/play-services/setup.html">Setup Google Play -Services SDK</a>.</p> - -<p class="note"><strong>Caution:</strong> When you add the Play Services library to -your project, be sure to add it <em>with resources</em>, as described in -<a href="{@docRoot}google/play-services/setup.html#Setup"> -Setup Google Play Services SDK</a>. The key point is that you must -<em>reference</em> the library—simply adding a {@code .jar} file to -your Eclipse project will not work. You must follow the directions -for referencing a library, or your app won't be able to access -the library's resources, and it won't run properly. -If you're using Android Studio, this is the string to add to the -{@code dependency} section of your application's {@code build.gradle} file:</p> - -<pre>dependencies { - compile: "com.google.android.gms:play-services:3.1.+" -} -</pre> - - -<h2 id="manifest">Step 2: Edit Your Application's Manifest</h2> - -<p>Add the following to your application's manifest:</p> -<ul> - <li>The <code>com.google.android.c2dm.permission.RECEIVE</code> permission so -the Android application can register and receive messages.</li> - <li>The <code>android.permission.INTERNET</code> permission so the Android -application can send the registration ID to the 3rd party server.</li> - <li>The <code>android.permission.GET_ACCOUNTS</code> permission as GCM requires -a Google account (necessary only if if the device is running a version lower than -Android 4.0.4)</li> - <li>The <code>android.permission.WAKE_LOCK</code> permission so the application -can keep the processor from sleeping when a message is received. Optional—use -only if the app wants to keep the device from sleeping.</li> - <li>An <code>applicationPackage + ".permission.C2D_MESSAGE"</code> -permission to prevent other Android applications from registering and receiving -the Android application's messages. The permission name must exactly match this -pattern—otherwise the Android application will not receive the messages.</li> - <li>A receiver for <code>com.google.android.c2dm.intent.RECEIVE</code>, with -the category set -as <code>applicationPackage</code>. The receiver should require the -<code>com.google.android.c2dm.SEND</code> permission, so that only the GCM -Framework can send a message to it. If your app uses an {@link android.app.IntentService} -(not required, but a common pattern), this receiver should be an instance of -{@link android.support.v4.content.WakefulBroadcastReceiver}. -A {@link android.support.v4.content.WakefulBroadcastReceiver} takes care of -creating and managing a -<a href="{@docRoot}reference/android/os/PowerManager.html#PARTIAL_WAKE_LOCK"> -partial wake lock</a> for your app.</li> - -<li>A {@link android.app.Service} (typically an {@link android.app.IntentService}) -to which the {@link android.support.v4.content.WakefulBroadcastReceiver} passes off -the work of handling the GCM message, while ensuring that the device does not -go back to sleep in the process. Including an {@link android.app.IntentService} is -optional—you could choose to process your messages in a regular -{@link android.content.BroadcastReceiver} instead, but realistically, most apps will -use a {@link android.app.IntentService}. -</li> - <li>If the GCM feature is critical to the Android application's function, be sure to -set <code>android:minSdkVersion="8"</code> or higher in the manifest. This -ensures that the Android application cannot be installed in an environment in which it -could not run properly. </li> -</ul> - -<p>Here are excerpts from a sample manifest that supports GCM:</p> - -<pre class="prettyprint pretty-xml"> -<manifest package="com.example.gcm" ...> - - <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> - <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.GET_ACCOUNTS" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> - - <permission android:name="com.example.gcm.permission.C2D_MESSAGE" - android:protectionLevel="signature" /> - <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> - - <application ...> - <receiver - android:name=".GcmBroadcastReceiver" - android:permission="com.google.android.c2dm.permission.SEND" > - <intent-filter> - <action android:name="com.google.android.c2dm.intent.RECEIVE" /> - <category android:name="com.example.gcm" /> - </intent-filter> - </receiver> - <service android:name=".GcmIntentService" /> - </application> - -</manifest> -</pre> - -<h2 id="app"> Step 3: Write Your Application</h2> - -<p>Finally, write your application. This section features a sample client -application that illustrates how to use the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> APIs. The sample consists of a main activity -({@code DemoActivity}), a {@link android.support.v4.content.WakefulBroadcastReceiver} -({@code GcmBroadcastReceiver}), and an {@link android.app.IntentService} -({@code GcmIntentService}). You can find the complete source code for this sample at the -<a href="http://code.google.com/p/gcm">open source site</a>.</p> - -<p>Note the following:</p> - -<ul> - <li>Among other things, the sample illustrates registration and upstream -(device-to-cloud) messaging. Upstream messaging only applies to apps that are running against a -<a href="ccs.html">CCS</a> (XMPP) server; HTTP-based servers don't support upstream messaging.</li> - <li>The <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> - {@code GoogleCloudMessaging}</a> -registration APIs replace the old registration process, which was based on the -now-obsolete client helper library. While the old registration process still works, -we encourage you to use the newer -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> -registration APIs, regardless of your underlying server.</li> -</ul> - -<h3 id="sample-play">Check for Google Play Services APK</h3> - -<p>As described in <a href="{@docRoot}google/play-services/setup.html"> -Setup Google Play Services SDK</a>, apps that rely on the Play Services SDK -should always check the device for a compatible Google Play services APK before -accessing Google Play services features. In the sample app this check is done in -two places: in the main activity's {@code onCreate()} method, and in its -{@code onResume()} method. The check in {@code onCreate()} ensures that the app -can't be used without a successful check. The check in {@code onResume()} ensures -that if the user returns to the running app through some other means, such as -through the back button, the check is still performed. If the -device doesn't have a compatible Google Play services APK, your app can call -{@code GooglePlayServicesUtil.getErrorDialog()} to allow users to download the -APK from the Google Play Store or enable it in the device's system settings. -For example:</p> - -<pre>private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; -... -@Override -public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.main); - mDisplay = (TextView) findViewById(R.id.display); - - context = getApplicationContext(); - - // Check device for Play Services APK. - if (checkPlayServices()) { - // If this check succeeds, proceed with normal processing. - // Otherwise, prompt user to get valid Play Services APK. - ... - } -} - -// You need to do the Play Services APK check here too. -@Override -protected void onResume() { - super.onResume(); - checkPlayServices(); -} - -/** - * Check the device to make sure it has the Google Play Services APK. If - * it doesn't, display a dialog that allows users to download the APK from - * the Google Play Store or enable it in the device's system settings. - */ -private boolean checkPlayServices() { - int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); - if (resultCode != ConnectionResult.SUCCESS) { - if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { - GooglePlayServicesUtil.getErrorDialog(resultCode, this, - PLAY_SERVICES_RESOLUTION_REQUEST).show(); - } else { - Log.i(TAG, "This device is not supported."); - finish(); - } - return false; - } - return true; -}</pre> - -<h3 id="sample-register">Register for GCM</h3> -<p>An Android application needs to register with GCM servers before it can receive -messages. When an app registers, it receives a registration ID, which it can then -store for future use. In the following snippet the {@code onCreate()} method in the sample app's -main activity checks to see if the app is already registered with GCM and with -the server:</p> - -<pre>/** - * Main UI for the demo app. - */ -public class DemoActivity extends Activity { - - public static final String EXTRA_MESSAGE = "message"; - public static final String PROPERTY_REG_ID = "registration_id"; - private static final String PROPERTY_APP_VERSION = "appVersion"; - private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; - - /** - * Substitute you own sender ID here. This is the project number you got - * from the API Console, as described in "Getting Started." - */ - String SENDER_ID = "Your-Sender-ID"; - - /** - * Tag used on log messages. - */ - static final String TAG = "GCMDemo"; - - TextView mDisplay; - GoogleCloudMessaging gcm; - AtomicInteger msgId = new AtomicInteger(); - SharedPreferences prefs; - Context context; - - String regid; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); +<p>A GCM client is a GCM-enabled app that runs on an Android device. To write your client code, we recommend that you use the new <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs. The client helper library that was offered in previous versions of GCM still works, but it has been superseded by the more efficient <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs.</p> - setContentView(R.layout.main); - mDisplay = (TextView) findViewById(R.id.display); +<p>A full GCM implementation requires both a client implementation and a server-side implementation. For a step-by-step guide to creating a complete sample implementation that includes both client and server, see <a href="gs.html">Getting Started</a>. </p> - context = getApplicationContext(); - - // Check device for Play Services APK. If check succeeds, proceed with - // GCM registration. - if (checkPlayServices()) { - gcm = GoogleCloudMessaging.getInstance(this); - regid = getRegistrationId(context); - - if (regid.isEmpty()) { - registerInBackground(); - } - } else { - Log.i(TAG, "No valid Google Play Services APK found."); - } - } -... -}</pre> - -<p>The app calls {@code getRegistrationId()} to see whether there is an existing -registration ID stored in shared preferences:</p> - -<pre>/** - * Gets the current registration ID for application on GCM service. - * <p> - * If result is empty, the app needs to register. - * - * @return registration ID, or empty string if there is no existing - * registration ID. - */ -private String getRegistrationId(Context context) { - final SharedPreferences prefs = getGCMPreferences(context); - String registrationId = prefs.getString(PROPERTY_REG_ID, ""); - if (registrationId.isEmpty()) { - Log.i(TAG, "Registration not found."); - return ""; - } - // Check if app was updated; if so, it must clear the registration ID - // since the existing regID is not guaranteed to work with the new - // app version. - int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); - int currentVersion = getAppVersion(context); - if (registeredVersion != currentVersion) { - Log.i(TAG, "App version changed."); - return ""; - } - return registrationId; -} -... -/** - * @return Application's {@code SharedPreferences}. - */ -private SharedPreferences getGCMPreferences(Context context) { - // This sample app persists the registration ID in shared preferences, but - // how you store the regID in your app is up to you. - return getSharedPreferences(DemoActivity.class.getSimpleName(), - Context.MODE_PRIVATE); -}</pre> - -<p>If the registration ID doesn't exist or the app was updated, -{@code getRegistrationId()} returns an empty string -to indicate that the app needs to get a new regID. {@code getRegistrationId()} calls -the following method to check the app version:</p> - -<pre>/** - * @return Application's version code from the {@code PackageManager}. - */ -private static int getAppVersion(Context context) { - try { - PackageInfo packageInfo = context.getPackageManager() - .getPackageInfo(context.getPackageName(), 0); - return packageInfo.versionCode; - } catch (NameNotFoundException e) { - // should never happen - throw new RuntimeException("Could not get package name: " + e); - } -}</pre> - - -<p>If there isn't a valid existing registration ID, {@code DemoActivity} calls the -following {@code registerInBackground()} method to register. Note that because the GCM -methods {@code register()} and {@code unregister()} are blocking, this has to -take place on a background thread. This sample uses {@link android.os.AsyncTask} -to accomplish this:</p> - -<pre> -/** - * Registers the application with GCM servers asynchronously. - * <p> - * Stores the registration ID and app versionCode in the application's - * shared preferences. - */ -private void registerInBackground() { - new AsyncTask<Void, Void, String>() { - @Override - protected String doInBackground(Void... params) { - String msg = ""; - try { - if (gcm == null) { - gcm = GoogleCloudMessaging.getInstance(context); - } - regid = gcm.register(SENDER_ID); - msg = "Device registered, registration ID=" + regid; - - // You should send the registration ID to your server over HTTP, - // so it can use GCM/HTTP or CCS to send messages to your app. - // The request to your server should be authenticated if your app - // is using accounts. - sendRegistrationIdToBackend(); - - // For this demo: we don't need to send it because the device - // will send upstream messages to a server that echo back the - // message using the 'from' address in the message. - - // Persist the regID - no need to register again. - storeRegistrationId(context, regid); - } catch (IOException ex) { - msg = "Error :" + ex.getMessage(); - // If there is an error, don't just keep trying to register. - // Require the user to click a button again, or perform - // exponential back-off. - } - return msg; - } - - @Override - protected void onPostExecute(String msg) { - mDisplay.append(msg + "\n"); - } - }.execute(null, null, null); - ... - /** - * Sends the registration ID to your server over HTTP, so it can use GCM/HTTP - * or CCS to send messages to your app. Not needed for this demo since the - * device sends upstream messages to a server that echoes back the message - * using the 'from' address in the message. - */ - private void sendRegistrationIdToBackend() { - // Your implementation here. - } -}</pre> - -<p>After registering, the app calls {@code storeRegistrationId()} to store the -registration ID in shared preferences for future use. This is just one way of -persisting a regID. You might choose to use a different approach in your app:</p> - -<pre>/** - * Stores the registration ID and app versionCode in the application's - * {@code SharedPreferences}. - * - * @param context application's context. - * @param regId registration ID - */ -private void storeRegistrationId(Context context, String regId) { - final SharedPreferences prefs = getGCMPreferences(context); - int appVersion = getAppVersion(context); - Log.i(TAG, "Saving regId on app version " + appVersion); - SharedPreferences.Editor editor = prefs.edit(); - editor.putString(PROPERTY_REG_ID, regId); - editor.putInt(PROPERTY_APP_VERSION, appVersion); - editor.commit(); -}</pre> - -<h3 id="sample-send">Send a message</h3> -<p>When the user clicks the app's <strong>Send</strong> button, the app sends an -upstream message using the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> APIs. In order to receive the upstream message, -your server should be connected to CCS. You can use one of the demo servers in -<a href="ccs.html#implement">Implementing an XMPP-based App Server</a> to run the sample and connect -to CCS.</p> - -<pre>public void onClick(final View view) { - if (view == findViewById(R.id.send)) { - new AsyncTask<Void, Void, String>() { - @Override - protected String doInBackground(Void... params) { - String msg = ""; - try { - Bundle data = new Bundle(); - data.putString("my_message", "Hello World"); - data.putString("my_action", - "com.google.android.gcm.demo.app.ECHO_NOW"); - String id = Integer.toString(msgId.incrementAndGet()); - gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data); - msg = "Sent message"; - } catch (IOException ex) { - msg = "Error :" + ex.getMessage(); - } - return msg; - } - - @Override - protected void onPostExecute(String msg) { - mDisplay.append(msg + "\n"); - } - }.execute(null, null, null); - } else if (view == findViewById(R.id.clear)) { - mDisplay.setText(""); - } -}</pre> - -<h3 id="sample-receive">Receive a message</h3> - -<p>As described above in <a href="#manifest">Step 2</a>, the app includes a -{@link android.support.v4.content.WakefulBroadcastReceiver} for the <code>com.google.android.c2dm.intent.RECEIVE</code> -intent. A broadcast receiver is the mechanism GCM uses to deliver messages. When {@code onClick()} -calls {@code gcm.send()}, it triggers the broadcast receiver's {@code onReceive()} -method, which has the responsibility of making sure that the GCM message gets handled.</p> -<p>A {@link android.support.v4.content.WakefulBroadcastReceiver} is a special type of -broadcast receiver that takes care of -creating and managing a -<a href="{@docRoot}reference/android/os/PowerManager.html#PARTIAL_WAKE_LOCK"> -partial wake lock</a> for your app. -It passes off the work of processing the GCM message to a -{@link android.app.Service} (typically an -{@link android.app.IntentService}), while ensuring that the device does not -go back to sleep in the transition. If you don't hold a wake lock while transitioning -the work to a service, you are effectively allowing the device to go back to sleep before -the work completes. The net result is that the app might not finish processing -the GCM message until some arbitrary point in the future, which is not what you want.</p> - -<p class="note"><strong>Note:</strong> Using {@link android.support.v4.content.WakefulBroadcastReceiver} -is not a requirement. If you have a relatively simple app that doesn't require -a service, you can intercept the GCM message in a regular {@link android.content.BroadcastReceiver} -and do your processing there. Once you get the intent that GCM passes into -your broadcast receiver's {@code onReceive()} method, what you do with it -is up to you.</p> - -<p>This snippet starts {@code GcmIntentService} with the method -{@link android.support.v4.content.WakefulBroadcastReceiver#startWakefulService startWakefulService()}. -This method is comparable to {@link android.content.Context#startService startService()}, except that -the {@link android.support.v4.content.WakefulBroadcastReceiver} is holding a -wake lock when the service starts. The intent that is passed with -{@link android.support.v4.content.WakefulBroadcastReceiver#startWakefulService startWakefulService()} -holds an extra identifying the wake lock:</p> - - -<pre>public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - // Explicitly specify that GcmIntentService will handle the intent. - ComponentName comp = new ComponentName(context.getPackageName(), - GcmIntentService.class.getName()); - // Start the service, keeping the device awake while it is launching. - startWakefulService(context, (intent.setComponent(comp))); - setResultCode(Activity.RESULT_OK); - } -}</pre> - -<p>The intent service shown below does the actual work of handling the GCM -message. When the service is finished, it calls -{@link android.support.v4.content.WakefulBroadcastReceiver#completeWakefulIntent GcmBroadcastReceiver.completeWakefulIntent()} -to release the wake lock. The -{@link android.support.v4.content.WakefulBroadcastReceiver#completeWakefulIntent completeWakefulIntent()} -method has as its parameter the same intent that was -passed in from the {@link android.support.v4.content.WakefulBroadcastReceiver}. -</p> - -<p>This snippet processes the GCM message based on message type, and posts the -result in a notification. But what you do with GCM messages in your app is up to -you—the possibilities are endless. For example, the message might be a ping, -telling the app to sync to a server to retrieve new content, or it might be a -chat message that you display in the UI.</p> - -<pre> -public class GcmIntentService extends IntentService { - public static final int NOTIFICATION_ID = 1; - private NotificationManager mNotificationManager; - NotificationCompat.Builder builder; - - public GcmIntentService() { - super("GcmIntentService"); - } - - @Override - protected void onHandleIntent(Intent intent) { - Bundle extras = intent.getExtras(); - GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); - // The getMessageType() intent parameter must be the intent you received - // in your BroadcastReceiver. - String messageType = gcm.getMessageType(intent); - - if (!extras.isEmpty()) { // has effect of unparcelling Bundle - /* - * Filter messages based on message type. Since it is likely that GCM - * will be extended in the future with new message types, just ignore - * any message types you're not interested in, or that you don't - * recognize. - */ - if (GoogleCloudMessaging. - MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { - sendNotification("Send error: " + extras.toString()); - } else if (GoogleCloudMessaging. - MESSAGE_TYPE_DELETED.equals(messageType)) { - sendNotification("Deleted messages on server: " + - extras.toString()); - // If it's a regular GCM message, do some work. - } else if (GoogleCloudMessaging. - MESSAGE_TYPE_MESSAGE.equals(messageType)) { - // This loop represents the service doing some work. - for (int i=0; i<5; i++) { - Log.i(TAG, "Working... " + (i+1) - + "/5 @ " + SystemClock.elapsedRealtime()); - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - } - Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); - // Post notification of received message. - sendNotification("Received: " + extras.toString()); - Log.i(TAG, "Received: " + extras.toString()); - } - } - // Release the wake lock provided by the WakefulBroadcastReceiver. - GcmBroadcastReceiver.completeWakefulIntent(intent); - } - - // Put the message into a notification and post it. - // This is just one simple example of what you might choose to do with - // a GCM message. - private void sendNotification(String msg) { - mNotificationManager = (NotificationManager) - this.getSystemService(Context.NOTIFICATION_SERVICE); - - PendingIntent contentIntent = PendingIntent.getActivity(this, 0, - new Intent(this, DemoActivity.class), 0); - - NotificationCompat.Builder mBuilder = - new NotificationCompat.Builder(this) - .setSmallIcon(R.drawable.ic_stat_gcm) - .setContentTitle("GCM Notification") - .setStyle(new NotificationCompat.BigTextStyle() - .bigText(msg)) - .setContentText(msg); - - mBuilder.setContentIntent(contentIntent); - mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); - } -}</pre> - -<h2 id="run">Running the Sample</h2> - -<p>To run the sample:</p> - -<ol> - <li>Follow the instructions in <a href="gs.html">Getting Started</a> to get your sender ID and - API key.</li> - <li>Implement your client app, as described in this document. You can find the complete source - code for the client app at the <a href="http://code.google.com/p/gcm">open source site</a>.</li> - <li>Run one of the demo servers (Java or Python) provided in -<a href="ccs.html#implement">Implementing an XMPP-based App Server</a>. Whichever demo server you - choose, don't forget to edit its code before running it to supply -your sender ID and API key. -</li> - -</ol> - -<h2 id="stats">Viewing Statistics</h2> - -<p>To view statistics and any error messages for your GCM applications:</p> -<ol> - <li> Go to the <code><a href="http://play.google.com/apps/publish">Developer Console</a></code>.</li> - <li>Login with your developer account. - <p>You will see a page that has a list of all of your apps.</p></li> - <li> Click on the "statistics" link next to the app for which you -want to view GCM stats. - <p>Now you are on the statistics page.</p> </li> - <li>Go to the drop-down menu and select the GCM metric you want to view. - </li> -</ol> -<p class="note"><strong>Note:</strong> Stats on the Google API Console are not -enabled for GCM. You must use the <a href="http://play.google.com/apps/publish">Developer Console</a>.</p> +<p> diff --git a/docs/html/google/gcm/gcm.jd b/docs/html/google/gcm/gcm.jd index 3c80b5f..ceb82b0 100644 --- a/docs/html/google/gcm/gcm.jd +++ b/docs/html/google/gcm/gcm.jd @@ -1,23 +1,48 @@ -page.title=Overview +page.title=GCM Architectural Overview @jd:body <div id="qv-wrapper"> <div id="qv"> +<h2>Quickview</h2> + +<ul> +<li>Get an introduction to key GCM terms and concepts.</li> +<li>Learn the basic features of a GCM application.</li> +<li>Understand the role of the 3rd-party application server, and how to send messages and process results.</li> +</ul> + + <h2>In this document</h2> <ol class="toc"> - <li><a href="#key">Key Concepts</a></li> - <li><a href="#arch">Architectural Overview</a></li> - <li><a href="#lifecycle">Lifecycle Flow</a> + <li><a href="#intro">Introduction</a> </li> + <li><a href="#arch">Architectural Overview</a> + <ol> + <li><a href="#lifecycle">Lifecycle Flow</a></li> + <ol> + <li><a href="#register">Enable GCM</a></li> + <li><a href="#push-process">Send a message</a></li> + <li><a href="#receiving">Receive a message</a></li> + </ol> + <li><a href="#user">What Does the User See?</a></li> + </ol> + </li> + <li><a href="#server">Role of the 3rd-party Application Server</a> <ol class="toc"> - <li><a href="#register">Enable GCM</a></li> - <li><a href="#push-process">Send a message</a></li> - <li><a href="#receiving">Receive a message</a></li> + <li><a href="#send-msg">Sending Messages</a> + <ol> + <li><a href="#request">Request format</a></li> + <li><a href="#response">Response format</a></li> + </ol> + </li> </ol> + <li><a href="#stats">Viewing Statistics</a> </li> </ol> + + </div> </div> @@ -25,15 +50,24 @@ page.title=Overview developers send data from servers to their Android applications on Android devices, and upstream messages from the user's device back to the cloud. This could be a lightweight message telling the Android application -that there is new data to be fetched from the server (for instance, a "new email" -notification informing the application that it is out of sync with the back end), -or it could be a message containing up to 4kb of payload +that there is new data to be fetched from the server (for instance, a movie +uploaded by a friend), or it could be a message containing up to 4kb of payload data (so apps like instant messaging can consume the message directly). The GCM service handles all aspects of queueing of messages and delivery to the target Android application running on the target device.</p> + +<p>GCM introduces GCM Cloud Connection Server (CCS), which you can use +in tandem with GCM HTTP service/endpoint/APIs. +CCS uses XMPP, and it offers asynchronous, bidirectional +messaging. For more information, see +<a href="ccs.html">GCM Cloud Connection Server</a>. + <p class="note"> To jump right into using GCM with your Android - applications, see <a href="gs.html">Getting Started</a>.</p> + applications, see the instructions in <a href="gs.html">Getting Started</a>.</p> + + +<h2 id="intro">Introduction</h2> <p>Here are the primary characteristics of Google Cloud Messaging (GCM):</p> @@ -41,11 +75,9 @@ Messaging (GCM):</p> <ul> <li>It allows 3rd-party application servers to send messages to their Android applications.</li> - <li>Using the <a href="ccs.html">GCM Cloud Connection Server</a>, you can receive -upstream messages from the user's device.</li> + <li>Using the <a href="ccs.html">GCM Cloud Connection Server</a>, you can receive upstream messages from the user's device.</li> <li>An Android application on an Android device doesn't need to be running to receive -messages. The system will wake up the Android application via Intent broadcast -when the message arrives, as long as the application is set up with the proper +messages. The system will wake up the Android application via Intent broadcast when the message arrives, as long as the application is set up with the proper broadcast receiver and permissions.</li> <li>It does not provide any built-in user interface or other handling for message data. GCM simply passes raw message data received straight to the @@ -53,67 +85,57 @@ Android application, which has full control of how to handle it. For example, t application might post a notification, display a custom user interface, or silently sync data.</li> <li>It requires devices running Android 2.2 or higher that also have the -Google Play Store application installed, or or an emulator running Android 2.2 -with Google APIs. However, you are not limited to deploying your +Google Play Store application installed, or or an emulator running Android 2.2 with Google APIs. However, you are not limited to deploying your Android applications through Google Play Store.</li> - <li>It uses an existing connection for Google services. For pre-3.0 devices, -this requires users to -set up their Google account on their mobile devices. A Google account is not a -requirement on devices running Android 4.0.4 or higher.</li> + <li>It uses an existing connection for Google services. For pre-3.0 devices, this requires users to +set up their Google account on their mobile devices. A Google account is not a requirement on devices running Android 4.0.4 or higher.</li> </ul> - -<h2 id="key">Key Concepts</h2> - +<h2 id="arch">Architectural Overview</h2> +<p>This section gives an overview of how GCM works. </p> <p>This table summarizes the key terms and concepts involved in GCM. It is divided into these categories:</p> <ul> - <li><strong>Components</strong> — The entities that play a primary role in + <li><strong>Components</strong> — The physical entities that play a role in GCM.</li> <li><strong>Credentials</strong> — The IDs and tokens that are used in different stages of GCM to ensure that all parties have been authenticated, and that the message is going to the correct place.</li> </ul> -<p class="table-caption" id="table1"> - <strong>Table 1.</strong> GCM components and credentials.</p> - <table> <tr> <th colspan="2">Components</th> </tr> <tr> - <td width="165"><strong>Client App</strong></td> - <td width="1176">The GCM-enabled Android application that is running on a - device. This must be a 2.2 Android device that has Google Play Store installed, and it must -have at least one logged in Google account if the device is running a version -lower than Android 4.0.4. Alternatively, for testing you can use an emulator -running Android 2.2 with Google APIs.</td> + <td width="165"><strong>Mobile Device</strong></td> + <td width="1176">The device that is running an Android application that uses +GCM. This must be a 2.2 Android device that has Google Play Store installed, and it must +have at least one logged in Google account if the device is running a version lower than Android 4.0.4. Alternatively, for testing you can use an emulator running Android 2.2 with Google APIs.</td> </tr> <tr> <td><strong>3rd-party Application Server</strong></td> - <td>An application server that you write as part of implementing -GCM. The 3rd-party application server sends data to an -Android application on the device via the GCM connection server.</td> + <td>An application server that developers set up as part of implementing +GCM in their applications. The 3rd-party application server sends data to an +Android application on the device via the GCM server.</td> </tr> <tr> - <td><strong>GCM Connection Servers</strong></td> - <td>The Google-provided servers involved in taking messages from the 3rd-party + <td><strong>GCM Servers</strong></td> + <td>The Google servers involved in taking messages from the 3rd-party application server and sending them to the device. </td> </tr> <tr> - <th colspan="2">Credentials</th> + <th colspan="2"><strong>Credentials</strong></th> </tr> <tr> <td><strong>Sender ID</strong></td> - <td>A project number you acquire from the API console, as described in -<a href="gs.html#create-proj">Getting Started</a>. The sender -ID is used in the <a href="#register">registration process</a> to identify a -3rd-party application server that is permitted to send messages to the device.</td> + <td>A project number you acquire from the API console, as described in <a href="gs.html#create-proj">Getting Started</a>. The sender +ID is used in the <a href="#registering">registration process</a> to identify an +Android application that is permitted to send messages to the device.</td> </tr> <tr> <td><strong>Application ID</strong></td> <td>The Android application that is registering to receive messages. The Android application -is identified by the package name from the <a href="client.html#manifest">manifest</a>. +is identified by the package name from the <a href="#manifest">manifest</a>. This ensures that the messages are targeted to the correct Android application.</td> </tr> <tr> @@ -136,8 +158,7 @@ which would cause delivery errors. </tr> <tr> <td><strong>Google User Account</strong></td> - <td>For GCM to work, the mobile device must include at least one Google -account if the device is running a version lower than Android 4.0.4.</td> + <td>For GCM to work, the mobile device must include at least one Google account if the device is running a version lower than Android 4.0.4.</td> </tr> <tr> <td><strong>Sender Auth Token</strong></td> @@ -146,46 +167,25 @@ server that gives the application server authorized access to Google services. The API key is included in the header of POST requests that send messages.</td> </tr> -</table> - -<h2 id="arch">Architectural Overview</h2> - -<p>A GCM implementation includes a Google-provided -connection server, a 3rd-party app server that interacts with the connection -server, and a GCM-enabled client app running on an Android device:</p> - -<img src="{@docRoot}images/gcm/GCM-arch.png"> + <tr> + <td><strong>Notification Key</strong></td> + <td>Part of the user notifications feature, which provides a mapping between a user and instances of an app running on multiple devices owned by the user. The {@code notification_key} is the token that GCM uses to fan out notifications to all devices whose registration IDs are associated with the key. For more discussion of this topic, see <a href="notifications.html">User Notifications</a>.</td> + </tr> -<p class="img-caption"> - <strong>Figure 1.</strong> GCM Architecture. -</p> +<tr> + <td><strong>Notification Key Name</strong></td> + <td>Part of the user notifications feature. The {@code notification_key_name} is a name or identifier (can be a username for a 3rd-party app) that is unique to a given user. It is used by third parties to group together registration IDs for a single user. For more discussion of this topic, see <a href="notifications.html">User Notifications</a>.</td> + </tr> -<p>This is how these components interact:</p> -<ul> - <li>Google-provided <strong>GCM Connection Servers</strong> take messages from -a 3rd-party application server and send these messages to a -GCM-enabled Android application (the "client app") running on a device. -Currently Google provides connection servers for <a href="http.html">HTTP</a> -and <a href="ccs.html">XMPP</a>.</li> - <li>The <strong>3rd-Party Application Server</strong> is a component that you -implement to work with your chosen GCM connection server(s). App servers send -messages to a GCM connection server; the connection server enqueues and stores the -message, and then sends it to the device when the device is online. -For more information, see <a href="server.html">Implementing GCM Server</a>.</li> - <li>The <strong>Client App</strong> is a GCM-enabled Android application running -on a device. To receive GCM messages, this app must register with GCM and get a -registration ID. If you are using the <a href="ccs.html">XMPP</a> (CCS) connection -server, the client app can send "upstream" messages back to the connection server. -For more information on how to implement the client app, see -<a href="client.html">Implementing GCM Client</a>.</li> -</ul> +</table> -<h2 id="lifecycle">Lifecycle Flow</h2> +<h3 id="lifecycle">Lifecycle Flow</h3> <ul> <li><a href="#register">Enable GCM</a>. An Android application running on a mobile device registers to receive messages.</li> - + <li><a href="notifications.html">User Notifications</a>. A 3rd-party server can optionally group multiple registration IDs +in a {@code notification_key} to send messages to multiple devices owned by a single user.</li> <li><a href="#push-process">Send a message</a>. A 3rd-party application server sends messages to the device.</li> <li><a href="#receiving">Receive a message</a>. An Android application @@ -194,18 +194,62 @@ receives a message from a GCM server.</li> <p>These processes are described in more detail below.</p> -<h3 id="register">Enable GCM</h3> +<h4 id="register">Enable GCM</h4> + +<p>This is the sequence of events that occurs when an Android application +running on a mobile device registers to receive messages:<span +class="red-text"></span></p> -<p>The first time the Android application needs to use the messaging service, it -calls the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> method {@code register()}, as discussed in -<a href="client.html">Implementing GCM Client</a>. -The {@code register()} method returns a registration ID. The Android -application should store this ID for later use (for instance, -to check in <code>onCreate()</code> if it is already registered). +<ol> + <li>The first time the Android application needs to use the messaging service, it +fires off a registration Intent to a GCM server. + <p>This registration Intent +(<code>com.google.android.c2dm.intent.REGISTER</code>) includes the sender ID, and the Android application ID.</p> +<p class="note"><strong>Note:</strong> Because there is no lifecycle method that is called when the application is run for +the first time, the registration intent should be sent on <code>onCreate()</code>, but only if the application is not registered yet. </p> + </li> + <li>If the registration is successful, the GCM server broadcasts a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent which gives the Android application a registration +ID. + <p>The Android application should store this ID for later use (for instance, to check on <code>onCreate()</code> if it is already registered). +Note that Google may periodically refresh the registration ID, so you should design your Android application +with the understanding that the <code>com.google.android.c2dm.intent.REGISTRATION</code> intent may be called +multiple times. Your Android application needs to be able to respond +accordingly.</p></li> + <li>To complete the registration, the Android application sends the registration ID to +the application server. The application server typically stores the registration +ID in a database. </li> +</ol> + +<p>The registration ID lasts until the Android application explicitly unregisters +itself, or until Google refreshes the registration ID for your Android application.</p> + +<p class="note"><strong>Note:</strong> When users uninstall an application, it is not automatically unregistered on GCM. It is only unregistered when the GCM server tries to send a message to the device and the device answers that the application is uninstalled or it does not have a broadcast receiver configured to receive <code>com.google.android.c2dm.intent.RECEIVE</code> intents. At that point, your server should mark the device as unregistered (the server will receive a <code><a href="#unreg_device">NotRegistered</a></code> error).</p> + <p> +Note that it might take a few minutes for the registration ID to be completely removed from the GCM server. So if the 3rd-party server sends a message during this time, it will get a valid message ID, even though the message will not be delivered to the device.</p> + + + -<h3 id="push-process">Send a message</h3> +<h4 id="push-process">Send a Message</h4> + +<p>For an application server to send a message to an Android application, the following things must be in +place:</p> + +<ul> + <li>The Android application has stored a target that it can specify as the recipient of a message. This can be one of the following: + <ul> + <li>A single registration ID (or an array of registration IDs) that allows the app to receive messages +for a particular device.</li> + <li>A {@code notification_key} and corresponding {@code notification_key_name}, used to map a single user to multiple registration IDs. For more discussion of this topic, see <a href="notifications.html">User Notifications</a>.</li> + </ul> + </li> + +<li>An API key. This is something that the developer must have already +set up on the application server for the Android application (for more discussion, see +<a href="#server">Role of the 3rd-party Application Server</a>). Now it will +get used to send messages to the device. </li> +</ul> <p>Here is the sequence of events that occurs when the application server sends a message:</p> @@ -220,14 +264,13 @@ Android application via Intent broadcast with proper permissions, so that only t targeted Android application gets the message. This wakes the Android application up. The Android application does not need to be running beforehand to receive the message.</li> <li>The Android application processes the message. If the Android application is doing -non-trivial processing, you may want to grab a -{@link android.os.PowerManager.WakeLock} and do any processing in a service.</li> +non-trivial processing, you may want to grab a {@link android.os.PowerManager.WakeLock} and do any processing in a Service.</li> </ol> <p> An Android application can unregister GCM if it no longer wants to receive messages.</p> -<h3 id="receiving">Receive a message</h3> +<h4 id="receiving">Receive a Message</h4> <p>This is the sequence of events that occurs when an Android application installed on a mobile device receives a message:</p> @@ -239,8 +282,482 @@ pairs from the message payload, if any.</li> in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of extras.</li> <li>The Android application extracts the raw data -from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent -by key and processes the data.</li> +from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent by key and processes the data.</li> +</ol> + +<h3 id="user">What Does the User See?</h3> + +<p>When mobile device users install Android applications that include GCM, the Google Play Store will inform them that the Android application +includes GCM. They must approve the use of this feature to install the +Android application. </p> + + +<h2 id="server">Role of the 3rd-party Application Server</h2> + +<p>Before you can write client Android applications that use the GCM feature, you must +have an application server that meets the following criteria:</p> + +<ul> + <li>Able to communicate with your client.</li> + <li>Able to fire off HTTPS requests to the GCM server.</li> + <li>Able to handle requests and resend them as needed, using <a href="http://en.wikipedia.org/wiki/Exponential_backoff">exponential back-off.</a></li> + <li>Able to store the API key and client registration IDs. The +API key is included in the header of POST requests that send +messages.</li> +</ul> + +<h3 id="send-msg">Sending Messages</h3> +<p>This section describes how the 3rd-party application server sends messages to one or more mobile devices. Note the following:</p> +<ul> + <li>A 3rd-party application server can either send messages to a single device or to multiple devices. A message sent to multiple devices simultaneously is called a <em>multicast message</em>.</li> + <li>To send a single message to multiple devices owned by a single user, you can use a {@code notification_key}, as described in <a href="notifications.html">User Notifications</a>. + + <li>You have 2 choices in how you construct requests and responses: plain text or JSON.</li> + <li>However, to send multicast messages, you must use JSON. Plain text will not work.</li> +</ul> +<p>Before the 3rd-party application server can send a message to an + Android application, it must have received a registration ID from it.</p> +<h4 id="request">Request format</h4> +<p>To send a message, the application server issues a POST request to <code>https://android.googleapis.com/gcm/send</code>.</p> +<p>A message request is made of 2 parts: HTTP header and HTTP body.</p> + +<p>The HTTP header must contain the following headers:</p> +<ul> + <li><code>Authorization</code>: key=YOUR_API_KEY</li> + <li><code>Content-Type</code>: <code>application/json</code> for JSON; <code>application/x-www-form-urlencoded;charset=UTF-8</code> for plain text. + </li> +</ul> + +<p>For example: +</p> +<pre>Content-Type:application/json +Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA + +{ + "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."], + "data" : { + ... + }, +}</pre> +<p class="note"> + <p><strong>Note:</strong> If <code>Content-Type</code> is omitted, the format is assumed to be plain text.</p> +</p> + +<p>The HTTP body content depends on whether you're using JSON or plain text. For JSON, it must contain a string representing a JSON object with the following fields:</p> +<table> + <tr> + <th>Field</th> + <th>Description</th> + </tr> + <tr> + <td><code>registration_ids</code></td> + <td>A string array with the list of devices (registration IDs) receiving the message. It must contain at least 1 and at most 1000 registration IDs. To send a multicast message, you must use JSON. For sending a single message to a single device, you could use a JSON object with just 1 registration id, or plain text (see below). A request must include a recipient—this can be either a registration ID, an array of registration IDs, or a {@code notification_key}.</td> + </tr> + <tr> + <td><code>notification_key</code></td> + <td>A string that maps a single user to multiple registration IDs associated with that user. This +allows a 3rd-party server to send a single message to multiple app instances (typically on multiple devices) owned by a single user. A 3rd-party server can use {@code notification_key} as the target for a message instead of an individual registration ID (or array of registration IDs). The maximum number of members allowed for a {@code notification_key} is 10. For more discussion of this topic, see <a href="notifications.html">User Notifications</a>. Optional.</td> + </tr> + +<tr> + <td><code>notification_key_name</code></td> + <td>A name or identifier (can be a username for a 3rd-party app) that is unique to a given user. It is used by 3rd parties to group together registration IDs for a single user. The <code>notification_key_name</code> should be uniquely named per app in case you have multiple apps for the same project ID. This ensures that notifications only go to the intended target app. For more discussion of this topic, see <a href="notifications.html">User Notifications</a>.</td> + </tr> + + <tr> + <td><code>collapse_key</code></td> + <td>An arbitrary string (such as "Updates Available") that is used to collapse a group of like messages +when the device is offline, so that only the last message gets sent to the +client. This is intended to avoid sending too many messages to the phone when it +comes back online. Note that since there is no guarantee of the order in which +messages get sent, the "last" message may not actually be the last +message sent by the application server. See <a href="adv.html#collapsible">Advanced Topics</a> for more discussion of this topic. Optional.</td> + </tr> + <tr> + <td><code>data</code></td> + <td>A JSON object whose fields represents the key-value pairs of the message's payload data. If present, the payload data it will be +included in the Intent as application data, with the key being the extra's name. For instance, <code>"data":{"score":"3x1"}</code> would result in an intent extra named <code>score</code> whose value is the string <code>3x1</code>. + +There is no limit on the number of key/value pairs, though there is a limit on the total size of the message (4kb). The values could be any JSON object, but we recommend using strings, since the values will be converted to strings in the GCM server anyway. If you want to include objects or other non-string data types (such as integers or booleans), you have to do the conversion to string yourself. Also note that the key cannot be a reserved word (<code>from</code> or any word starting with <code>google.</code>). To complicate things slightly, there are some reserved words (such as <code>collapse_key</code>) that are technically allowed in payload data. However, if the request also contains the word, the value in the request will overwrite the value in the payload data. Hence using words that are defined as field names in this table is not recommended, even in cases where they are technically allowed. Optional.</td> + + + </tr> + <tr> + <td><code>delay_while_idle</code></td> + <td>If included, indicates that the message should not be sent immediately +if the device is idle. The server will wait for the device to become active, and +then only the last message for each <code>collapse_key</code> value will be +sent. Optional. The default value is <code>false</code>, and must be a JSON boolean.</td> + </tr> + <tr> + <td><code>time_to_live</code></td> + <td>How long (in seconds) the message should be kept on GCM storage if the device is offline. Optional (default time-to-live is 4 weeks, and must be set as a JSON number).</td> + </tr> +<tr> + <td><code>restricted_package_name</code></td> + <td>A string containing the package name of your application. When set, messages will only be sent to registration IDs that match the package name. Optional. + </td> +</tr> +<tr> + <td><code>dry_run</code></td> + <td>If included, allows developers to test their request without actually sending a message. Optional. The default value is <code>false</code>, and must be a JSON boolean. + </td> +</tr> +</table> + +<p>If you are using plain text instead of JSON, the message fields must be set as HTTP parameters sent in the body, and their syntax is slightly different, as described below: +<table> + <tr> + <th>Field</th> + <th>Description</th> + </tr> + <tr> + <td><code>registration_id</code></td> + <td>Must contain the registration ID of the single device receiving the message. Required.</td> + </tr> + <tr> + <td><code>collapse_key</code></td> + <td>Same as JSON (see previous table). Optional.</td> + </tr> + <tr> + <td><code>data.<key></code></td> + + <td>Payload data, expressed as parameters prefixed with <code>data.</code> and suffixed as the key. For instance, a parameter of <code>data.score=3x1</code> would result in an intent extra named <code>score</code> whose value is the string <code>3x1</code>. There is no limit on the number of key/value parameters, though there is a limit on the total size of the message. Also note that the key cannot be a reserved word (<code>from</code> or any word starting with +<code>google.</code>). To complicate things slightly, there are some reserved words (such as <code>collapse_key</code>) that are technically allowed in payload data. However, if the request also contains the word, the value in the request will overwrite the value in the payload data. Hence using words that are defined as field names in this table is not recommended, even in cases where they are technically allowed. Optional.</td> + + </tr> + <tr> + <td><code>delay_while_idle</code></td> + <td>Should be represented as <code>1</code> or <code>true</code> for <code>true</code>, anything else for <code>false</code>. Optional. The default value is <code>false</code>.</td> + </tr> + <tr> + <td><code>time_to_live</code></td> + <td>Same as JSON (see previous table). Optional.</td> + </tr> +<tr> + <td><code>restricted_package_name</code></td> + <td>Same as JSON (see previous table). Optional. + </td> +</tr> +<tr> + <td><code>dry_run</code></td> + <td>Same as JSON (see previous table). Optional. + </td> +</tr> +</table> + +<p>If you want to test your request (either JSON or plain text) without delivering the message to the devices, you can set an optional HTTP or JSON parameter called <code>dry_run</code> with the value <code>true</code>. The result will be almost identical to running the request without this parameter, except that the message will not be delivered to the devices. Consequently, the response will contain fake IDs for the message and multicast fields (see <a href="#response">Response format</a>).</p> + + <h4 id="example-requests">Example requests</h4> + <p>Here is the smallest possible request (a message without any parameters and just one recipient) using JSON:</p> + <pre class="prettyprint pretty-json">{ "registration_ids": [ "42" ] }</pre> + + <p>And here the same example using plain text:</p> + <pre class="prettyprint">registration_id=42</pre> + + <p> Here is a message with a payload and 6 recipients:</p> + <pre class="prettyprint pretty-HTML">{ "data": { + "score": "5x1", + "time": "15:10" + }, + "registration_ids": ["4", "8", "15", "16", "23", "42"] +}</pre> + <p>Here is a message with all optional fields set and 6 recipients:</p> + <pre class="prettyprint pretty-json">{ "collapse_key": "score_update", + "time_to_live": 108, + "delay_while_idle": true, + "data": { + "score": "4x8", + "time": "15:16.2342" + }, + "registration_ids":["4", "8", "15", "16", "23", "42"] +}</pre> + <p>And here is the same message using plain-text format (but just 1 recipient): </p> + + <pre class="prettyprint">collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42 + </pre> + +<p class="note"><strong>Note:</strong> If your organization has a firewall +that restricts the traffic to or +from the Internet, you need to configure it to allow connectivity with GCM in order for +your Android devices to receive messages. +The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but +it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should allow +your firewall to accept outgoing connections to all IP addresses +contained in the IP blocks listed in Google's ASN of 15169.</p> + + +<h4 id="response">Response format</h4> + +<p>There are two possible outcomes when trying to send a message:</p> +<ul> + <li>The message is processed successfully.</li> + <li>The GCM server rejects the request.</li> +</ul> + +<p>When the message is processed successfully, the HTTP response has a 200 status and the body contains more information about the status of the message (including possible errors). When the request is rejected, +the HTTP response contains a non-200 status code (such as 400, 401, or 503).</p> + +<p>The following table summarizes the statuses that the HTTP response header might contain. Click the troubleshoot link for advice on how to deal with each type of error.</p> +<table border=1> + <tr> + <th>Response</th> + <th>Description</th> + </tr> + <tr> + <td>200</td> + <td>Message was processed successfully. The response body will contain more details about the message status, but its format will depend whether the request was JSON or plain text. See <a href="#success">Interpreting a success response</a> for more details.</td> + </tr> + <tr> + <td>400</td> + <td><span id="internal-source-marker_0.2">Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields (for instance, passing a string where a number was expected). The exact failure reason is described in the response and the problem should be addressed before the request can be retried.</td> + </tr> + <tr> + <td>401</td> + <td>There was an error authenticating the sender account. <a href="#auth_error">Troubleshoot</a></td> + </tr> + <tr> + <td>5xx</td> + <td>Errors in the 500-599 range (such as 500 or 503) indicate that there was an internal error in the GCM server while trying to process the request, or that the server is temporarily unavailable (for example, because of timeouts). Sender must retry later, honoring any <code>Retry-After</code> header included in the response. Application servers must implement exponential back-off. <a href="#internal_error">Troubleshoot</a></td> + </tr> +</table> + +<h4 id="success">Interpreting a success response</h4> +<p>When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:</p> +<table> + <tr> + <th>Field</th> + <th>Description</th> + </tr> + <tr> + <td><code>multicast_id</code></td> + <td>Unique ID (number) identifying the multicast message.</td> + </tr> + <tr> + <td><code>success</code></td> + <td>Number of messages that were processed without an error.</td> + </tr> + <tr> + <td><code>failure</code></td> + <td>Number of messages that could not be processed.</td> + </tr> + <tr> + <td><code>canonical_ids</code></td> + <td>Number of results that contain a canonical registration ID. See <a href="adv.html#canonical">Advanced Topics</a> for more discussion of this topic.</td> + </tr> + <tr> + <td><code>results</code></td> + <td>Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields:<br> + <ul> + <li><code>message_id</code>: String representing the message when it was successfully processed.</li> + <li><code>registration_id</code>: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request. + </li> + <li><code>error</code>: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried).</li> + </ul></td> + </tr> +</table> +<p>If the value of <code>failure</code> and <code>canonical_ids</code> is 0, it's not necessary to parse the remainder of the response. Otherwise, we recommend that you iterate through the results field and do the following for each object in that list:</p> +<ul> + <li>If <code>message_id</code> is set, check for <code>registration_id</code>: + <ul> + <li>If <code>registration_id</code> is set, replace the original ID with the new value (canonical ID) in your server database. Note that the original ID is not part of the result, so you need to obtain it from the list of <code>registration_ids</code> passed in the request (using the same index).</li> + </ul> + </li> + <li>Otherwise, get the value of <code>error</code>: + <ul> + <li>If it is <code>Unavailable</code>, you could retry to send it in another request.</li> + <li>If it is <code>NotRegistered</code>, you should remove the registration ID from your server database because the application was uninstalled from the device or it does not have a broadcast receiver configured to receive <code>com.google.android.c2dm.intent.RECEIVE</code> intents.</li> + <li>Otherwise, there is something wrong in the registration ID passed in the request; it is probably a non-recoverable error that will also require removing the registration from the server database. See <a href="#error_codes">Interpreting an error response</a> for all possible error values.</li> + </ul> + </li> +</ul> + +<p>When a plain-text request is successful (HTTP status code 200), the response body contains 1 or 2 lines in the form of key/value pairs. +The first line is always available and its content is either <code>id=<em>ID of sent message</em></code> or <code>Error=<em>GCM error code</em></code>. The second line, if available, +has the format of <code>registration_id=<em>canonical ID</em></code>. The second line is optional, and it can only be sent if the first line is not an error. We recommend handling the plain-text response in a similar way as handling the JSON response:</p> +<ul> + <li>If first line starts with <code>id</code>, check second line: + <ul> + <li>If second line starts with <code>registration_id</code>, gets its value and replace the registration IDs in your server database.</li> + </ul> + </li> + <li>Otherwise, get the value of <code>Error</code>: + <ul> + <li>If it is <code>NotRegistered</code>, remove the registration ID from your server database.</li> + <li>Otherwise, there is probably a non-recoverable error (<strong>Note: </strong>Plain-text requests will never return <code>Unavailable</code> as the error code, they would have returned a 500 HTTP status instead).</li> + </ul> + </li> +</ul> + +<h4 id="error_codes">Interpreting an error response</h4> +<p>Here are the recommendations for handling the different types of error that might occur when trying to send a message to a device:</p> + +<dl> +<dt id="missing_reg"><strong>Missing Registration ID</strong></dt> +<dd>Check that the request contains a registration ID (either in the <code>registration_id</code> parameter in a plain text message, or in the <code>registration_ids</code> field in JSON). +<br/>Happens when error code is <code>MissingRegistration</code>.</dd> + +<dt id="invalid_reg"><strong>Invalid Registration ID</strong></dt> +<dd>Check the formatting of the registration ID that you pass to the server. Make sure it matches the registration ID the phone receives in the <code>com.google.android.c2dm.intent.REGISTRATION</code> intent and that you're not truncating it or adding additional characters. +<br/>Happens when error code is <code>InvalidRegistration</code>.</dd> + +<dt id="mismatched_sender"><strong>Mismatched Sender</strong></dt> +<dd>A registration ID is tied to a certain group of senders. When an application registers for GCM usage, it must specify which senders are allowed to send messages. Make sure you're using one of those when trying to send messages to the device. If you switch to a different sender, the existing registration IDs won't work. +Happens when error code is <code>MismatchSenderId</code>.</dd> + +<dt id="unreg_device"><strong>Unregistered Device</strong></dt> +<dd>An existing registration ID may cease to be valid in a number of scenarios, including: +<ul> + <li>If the application manually unregisters by issuing a <span class="prettyprint pretty-java"><code>com.google.android.c2dm.intent.UNREGISTER</code></span><code> </code>intent.</li> + <li>If the application is automatically unregistered, which can happen (but is not guaranteed) if the user uninstalls the application.</li> + <li>If the registration ID expires. Google might decide to refresh registration IDs. </li> + <li>If the application is updated but the new version does not have a broadcast receiver configured to receive <code>com.google.android.c2dm.intent.RECEIVE</code> intents.</li> +</ul> +For all these cases, you should remove this registration ID from the 3rd-party server and stop using it to send +messages. +<br/>Happens when error code is <code>NotRegistered</code>.</dd> + +<dt id="big_msg"><strong>Message Too Big</strong></dt> + <dd>The total size of the payload data that is included in a message can't exceed 4096 bytes. Note that this includes both the size of the keys as well as the values. +<br/>Happens when error code is <code>MessageTooBig</code>.</dd> + +<dt id="invalid_datakey"><strong>Invalid Data Key</strong></dt> +<dd>The payload data contains a key (such as <code>from</code> or any value prefixed by <code>google.</code>) that is used internally by GCM in the <code>com.google.android.c2dm.intent.RECEIVE</code> Intent and cannot be used. Note that some words (such as <code>collapse_key</code>) are also used by GCM but are allowed in the payload, in which case the payload value will be overridden by the GCM value. +<br /> +Happens when the error code is <code>InvalidDataKey</code>.</dd> + +<dt id="ttl_error"><strong>Invalid Time To Live</strong></dt> + <dd>The value for the Time to Live field must be an integer representing a duration in seconds between 0 and 2,419,200 (4 weeks). Happens when error code is <code>InvalidTtl</code>. +</dd> + + <dt id="auth_error"><strong>Authentication Error</strong></dt> + <dd>The sender account that you're trying to use to send a message couldn't be authenticated. Possible causes are: <ul> +<li>Authorization header missing or with invalid syntax.</li> +<li>Invalid project number sent as key.</li> +<li>Key valid but with GCM service disabled.</li> +<li>Request originated from a server not whitelisted in the Server Key IPs.</li> + +</ul> +Check that the token you're sending inside the <code>Authorization</code> header is the correct API key associated with your project. You can check the validity of your API key by running the following command:<br/> + +<pre># api_key=YOUR_API_KEY + +# curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}"</pre> + + + +If you receive a 401 HTTP status code, your API key is not valid. Otherwise you should see something like this:<br/> + +<pre> +{"multicast_id":6782339717028231855,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} +</pre> +If you want to confirm the validity of a registration ID, you can do so by replacing "ABC" with the registration ID. +<br/> +Happens when the HTTP status code is 401. + + <dt id="timeout"><strong>Timeout</strong></dt> + +<dd>The server couldn't process the request in time. You should retry the +same request, but you MUST obey the following requirements: + +<ul> + +<li>Honor the <code>Retry-After</code> header if it's included in the response from the GCM server.</li> + + +<li>Implement exponential back-off in your retry mechanism. This means an +exponentially increasing delay after each failed retry (e.g. if you waited one +second before the first retry, wait at least two second before the next one, +then 4 seconds and so on). If you're sending multiple messages, delay each one +independently by an additional random amount to avoid issuing a new request for +all messages at the same time.</li> + + +Senders that cause problems risk being blacklisted. +<br /> +Happens when the HTTP status code is between 501 and 599, or when the <code>error</code> field of a JSON object in the results array is <code>Unavailable</code>. +</dd> + +<dt id="internal_error"><strong>Internal Server Error</strong></dt> + +<dd> +The server encountered an error while trying to process the request. You +could retry the same request (obeying the requirements listed in the <a href="#timeout">Timeout</a> +section), but if the error persists, please report the problem in the <a href="https://groups.google.com/forum/?fromgroups#!forum/android-gcm">android-gcm group</a>. +<br /> +Happens when the HTTP status code is 500, or when the <code>error</code> field of a JSON +object in the results array is <code>InternalServerError</code>. +</dd> + +<dt id="restricted_package_name"><strong>Invalid Package Name</strong></dt> + +<dd> +A message was addressed to a registration ID whose package name did not match the value passed in the request. Happens when error code is +<code>InvalidPackageName</code>. +</dd> + + +</dl> +<h4>Example responses</h4> +<p>This section shows a few examples of responses indicating messages that were processed successfully. See <a href="#example-requests">Example requests</a> for the requests these responses are based on.</p> +<p> Here is a simple case of a JSON message successfully sent to one recipient without canonical IDs in the response:</p> +<pre class="prettyprint pretty-json">{ "multicast_id": 108, + "success": 1, + "failure": 0, + "canonical_ids": 0, + "results": [ + { "message_id": "1:08" } + ] +}</pre> + +<p>Or if the request was in plain-text format:</p> +<pre class="prettyprint">id=1:08 +</pre> + +<p>Here are JSON results for 6 recipients (IDs 4, 8, 15, 16, 23, and 42 respectively) with 3 messages successfully processed, 1 canonical registration ID returned, and 3 errors:</p> +<pre class="prettyprint pretty-json">{ "multicast_id": 216, + "success": 3, + "failure": 3, + "canonical_ids": 1, + "results": [ + { "message_id": "1:0408" }, + { "error": "Unavailable" }, + { "error": "InvalidRegistration" }, + { "message_id": "1:1516" }, + { "message_id": "1:2342", "registration_id": "32" }, + { "error": "NotRegistered"} + ] +} +</pre> +<p> In this example:</p> +<ul> + <li>First message: success, not required.</li> + <li>Second message: should be resent (to registration ID 8).</li> + <li>Third message: had an unrecoverable error (maybe the value got corrupted in the database).</li> + <li>Fourth message: success, nothing required.</li> + <li>Fifth message: success, but the registration ID should be updated in the server database (from 23 to 32).</li> + <li>Sixth message: registration ID (42) should be removed from the server database because the application was uninstalled from the device.</li> +</ul> +<p>Or if just the 4th message above was sent using plain-text format:</p> +<pre class="prettyprint">Error=InvalidRegistration +</pre> +<p>If the 5th message above was also sent using plain-text format:</p> +<pre class="prettyprint">id=1:2342 +registration_id=32 +</pre> + +<h3 id="stats">Viewing Statistics</h3> + +<p>To view statistics and any error messages for your GCM applications:</p> +<ol> + <li> Go to the <code><a href="http://play.google.com/apps/publish">Developer Console</a></code>.</li> + <li>Login with your developer account. + <p>You will see a page that has a list of all of your apps.</p></li> + <li> Click on the "statistics" link next to the app for which you want to view GCM stats. + <p>Now you are on the statistics page.</p> </li> + <li>Go to the drop-down menu and select the GCM metric you want to view. + </li> </ol> +<p class="note"><strong>Note:</strong> Stats on the Google API Console are not enabled for GCM. You must use the <a href="http://play.google.com/apps/publish">Developer Console</a>.</p> diff --git a/docs/html/google/gcm/gs.jd b/docs/html/google/gcm/gs.jd index f6b7ebe..8ceea0cc 100644 --- a/docs/html/google/gcm/gs.jd +++ b/docs/html/google/gcm/gs.jd @@ -1,4 +1,4 @@ -page.title=Getting Started +page.title=Getting Started with GCM page.tags="cloud","push","messaging" @jd:body @@ -12,7 +12,8 @@ page.tags="cloud","push","messaging" <li><a href="#create-proj">Creating a Google API Project</a></li> <li><a href="#gcm-service">Enabling the GCM Service</a></li> <li><a href="#access-key">Obtaining an API Key</a></li> -<li><a href="#next">Next Steps</a></li> +<li><a href="#client">Writing a Client App</a></li> +<li><a href="#server">Writing the Server Code</a></li> </ol> <h2>See Also</h2> @@ -25,12 +26,12 @@ page.tags="cloud","push","messaging" </div> </div> -<p>This document tells you how to get started setting up a GCM +<p>The sections below guide you through the process of setting up a GCM implementation. -Before you begin, make sure to <a href="/google/play-services/setup.html">set up -the Google Play Services SDK</a>. You need this SDK to use the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> methods.</p> +Before you start, make sure to <a href="/google/play-services/setup.html">set up +the Google Play Services SDK</a>. You need this SDK to use the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> methods.</p> + +<p>Note that a full GCM implementation requires a server-side implementation, in addition to the client implementation in your app. This document offers a complete example that includes both the client and server.</p> <h2 id="create-proj">Creating a Google API project</h2> @@ -40,17 +41,13 @@ the Google Play Services SDK</a>. You need this SDK to use the </li> <li>If you haven't created an API project yet, this page will prompt you to do so: <p><img src="{@docRoot}images/gcm/gcm-create-api-proj.png" class="screenshot" /></p> -<p class="note"><strong>Note:</strong> If you already have existing projects, -the first page you see will be the <strong>Dashboard</strong> page. From there -you can create a new project by opening the project drop-down menu (upper left corner) -and choosing <strong>Other projects > Create</strong>.</p></li> +<p class="note"><strong>Note:</strong> If you already have existing projects, the first page you see will be the <strong>Dashboard</strong> page. From there you can create a new project by opening the project drop-down menu (upper left corner) and choosing <strong>Other projects > Create</strong>.</p></li> <li> Click <strong>Create project</strong>. Your browser URL will change to something like:</li> <pre> https://code.google.com/apis/console/#project:<strong>4815162342</strong></pre> - <li> Take note of the value after <code>#project:</code> (4815162342 in this -example). This is your project number, and it will be used later on as the GCM sender ID.</li> + <li> Take note of the value after <code>#project:</code> (4815162342 in this example). This is your project number, and it will be used later on as the GCM sender ID.</li> </ol> <h2 id="gcm-service">Enabling the GCM Service</h2> @@ -64,53 +61,463 @@ example). This is your project number, and it will be used later on as the GCM s <h2 id="access-key">Obtaining an API Key</h2> <p>To obtain an API key:</p> <ol> - <li> In the main Google APIs Console page, select <strong>API Access</strong>. -You will see a screen that resembles the following:</li> + <li> In the main Google APIs Console page, select <strong>API Access</strong>. You will see a screen that resembles the following:</li><br /> + +<img src="{@docRoot}images/gcm/gcm-api-access.png" style="width:400px;padding:4px;margin-bottom:0em;"> -<img src="{@docRoot}images/gcm/gcm-api-access.png" style="width:400px;padding:4px;"> - <li>Click <strong>Create new Server key</strong>. Either a server key or a -browser key should work. The advantage to using a server key is that it allows -you to whitelist IP addresses. The following screen appears:</li> + <li>Click <strong>Create new Server key</strong>. Either a server key or a browser key should work. The advantage to using a server key is that it allows you to whitelist IP addresses. The following screen appears:</li><br /> -<img src="{@docRoot}images/gcm/gcm-config-server-key.png" style="width:400px;padding:4px;"> +<img src="{@docRoot}images/gcm/gcm-config-server-key.png" style="width:400px;padding:4px;margin-bottom:0em;"> - <li>Click <strong>Create</strong>:</li> + <li>Click <strong>Create</strong>:</li><br /> -<img src="{@docRoot}images/gcm/gcm-api-key.png" style="width:400px;padding:4px;"> +<img src="{@docRoot}images/gcm/gcm-api-key.png" style="width:400px;padding:4px;margin-bottom:0em;"> </ol> -<p> Take note of the <strong>API key</strong> value (<code>YourKeyWillBeShownHere</code>) -in this example, as it will be used later on.</p> -<p class="note"><strong>Note:</strong> If you need to rotate the key, click -<strong>Generate new key</strong>. A new key will be created while the old one -will still be active for up to 24 hours. If you want to get rid of the old key -immediately (for example, if you feel it was compromised), click <strong>Delete key</strong>.</p> +<p> Take note of the <strong>API key</strong> value (<code>YourKeyWillBeShownHere</code>) in this example, as it will be used later on.</p> +<p class="note"><strong>Note:</strong> If you need to rotate the key, click <strong>Generate new key</strong>. A new key will be created while the old one will still be active for up to 24 hours. If you want to get rid of the old key immediately (for example, if you feel it was compromised), click <strong>Delete key</strong>.</p> -<h2 id="next">Next Steps</h2> +<p>The following sections walk you through the steps of creating client and server-side code.</p> -<p>Once you've finished the tasks listed above, you're ready to start -implementing GCM. Here is an overview of the basic steps:</p> +<h2 id="client">Writing a Client App</h2> + +<p>This section walks you through the steps involved in writing a client-side application—that is, the GCM-enabled application that runs on an Android device. This client sample is designed to work in conjunction with the server code shown in <a href="#server">Writing the Server Code</a>, below.</p> + + + +<h3 id="manifest">Step 1: Edit Your App's Manifest</h3> +<ul> + <li>The <code>com.google.android.c2dm.permission.RECEIVE</code> permission so the Android application can register and receive messages.</li> + <li>The <code>android.permission.INTERNET</code> permission so the Android application can send the registration ID to the 3rd party server.</li> + <li>The <code>android.permission.GET_ACCOUNTS</code> permission as GCM requires a Google account (necessary only if if the device is running a version lower than Android 4.0.4)</li> + <li>The <code>android.permission.WAKE_LOCK</code> permission so the application can keep the processor from sleeping when a message is received. Optional—use only if the app wants to keep the device from sleeping.</li> + <li>An <code>applicationPackage + ".permission.C2D_MESSAGE"</code> permission to prevent other Android applications from registering and receiving the Android application's +messages. The permission name must exactly match this pattern—otherwise the Android application will not receive the messages.</li> + <li>A receiver for <code>com.google.android.c2dm.intent.RECEIVE</code>, with the category set +as <code>applicationPackage</code>. The receiver should require the <code>com.google.android.c2dm.SEND</code> permission, so that only the GCM +Framework can send a message to it. Note that the receiving +of messages is implemented as an <a href="{@docRoot}guide/components/intents-filters.html">intent</a>.</li> + <li>An intent service to handle the intents received by the broadcast receiver. Optional.</li> + <li>If the GCM feature is critical to the Android application's function, be sure to +set <code>android:minSdkVersion="8"</code> in the manifest. This +ensures that the Android application cannot be installed in an environment in which it +could not run properly. </li> +</ul> + +<p>Here are excerpts from a manifest that supports GCM:</p> + +<pre class="prettyprint pretty-xml"> +<manifest package="com.example.gcm" ...> + + <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> + + <permission android:name="com.example.gcm.permission.C2D_MESSAGE" + android:protectionLevel="signature" /> + <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> + + <application ...> + <receiver + android:name=".MyBroadcastReceiver" + android:permission="com.google.android.c2dm.permission.SEND" > + <intent-filter> + <action android:name="com.google.android.c2dm.intent.RECEIVE" /> + <category android:name="com.example.gcm" /> + </intent-filter> + </receiver> + <service android:name=".MyIntentService" /> + </application> + +</manifest> +</pre> + + +<h3 id="register">Step 2: Register for GCM</h3> + +<p>An Android application running on a mobile device registers to receive messages by calling +the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> method +<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html#register">{@code register(senderID...)}</a>. +This method registers the application for GCM and returns the registration ID. This streamlined approach replaces the previous +GCM registration process. See the example below for details.</p> + +<h3 id="app"> Step 3: Write Your Application</h3> + +<p>Finally, write your application. GCM offers a variety of ways to get the job done:</p> + +<ul> + <li>For your messaging server, you can either use the new <a href="ccs.html">GCM Cloud Connection Server</a> (CCS), the older <a href="gcm.html">GCM HTTP server</a>, or both in tandem. For more discussion, see see <a href="server.html">GCM Server</a>.</li> + <li>To write your client application (that is, the GCM-enabled app that runs on an Android device), use the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs as shown below. Don't forget to set up your project to use the Google Play services SDK as described in <a href="/google/play-services/setup.html">Setup Google Play Services SDK</a>.</li> +</ul> +</li> + +</ul> + +<h4 id="example">Example</h4> + +<p>Here is a sample client application that illustrates how to use the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs. The sample consists of a main activity ({@code DemoActivity}) and a broadcast receiver ({@code GcmBroadcastReceiver}). You can use this client sample code in conjunction with the server code shown in <a href="#server">Writing the Server Code</a>.</p> + +<p>Note the following:</p> + +<ul> + <li>The sample primarily illustrates two things: registration, and upstream messaging. Upstream messaging only applies to apps that are running against a <a href="ccs.html">CCS</a> server; HTTP-based servers don't support upstream messaging.</li> + <li>The <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> registration APIs replace the old registration process, which was based on the now-obsolete client helper library. While the old registration process still works, we encourage you to use the newer <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> registration APIs, regardless of your underlying server.</li> +</ul> + +<h5>Registering</h5> +<p>An Android application needs to register with GCM servers before it can receive messages. So in its {@code onCreate()} method, {@code DemoActivity} checks to see whether the app is registered with GCM and with the server:</p> + +<pre>/** + * Main UI for the demo app. + */ +public class DemoActivity extends Activity { + + public static final String EXTRA_MESSAGE = "message"; + public static final String PROPERTY_REG_ID = "registration_id"; + private static final String PROPERTY_APP_VERSION = "appVersion"; + private static final String PROPERTY_ON_SERVER_EXPIRATION_TIME = + "onServerExpirationTimeMs"; + /** + * Default lifespan (7 days) of a reservation until it is considered expired. + */ + public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7; + + /** + * Substitute you own sender ID here. + */ + String SENDER_ID = "Your-Sender-ID"; + + /** + * Tag used on log messages. + */ + static final String TAG = "GCMDemo"; + + TextView mDisplay; + GoogleCloudMessaging gcm; + AtomicInteger msgId = new AtomicInteger(); + SharedPreferences prefs; + Context context; + + String regid; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.main); + mDisplay = (TextView) findViewById(R.id.display); + + context = getApplicationContext(); + regid = getRegistrationId(context); + + if (regid.length() == 0) { + registerBackground(); + } + gcm = GoogleCloudMessaging.getInstance(this); + } +... +}</pre> + +<p>The app calls {@code getRegistrationId()} to see whether there is an existing registration ID stored in shared preferences:</p> + +<pre>/** + * Gets the current registration id for application on GCM service. + * <p> + * If result is empty, the registration has failed. + * + * @return registration id, or empty string if the registration is not + * complete. + */ +private String getRegistrationId(Context context) { + final SharedPreferences prefs = getGCMPreferences(context); + String registrationId = prefs.getString(PROPERTY_REG_ID, ""); + if (registrationId.length() == 0) { + Log.v(TAG, "Registration not found."); + return ""; + } + // check if app was updated; if so, it must clear registration id to + // avoid a race condition if GCM sends a message + int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); + int currentVersion = getAppVersion(context); + if (registeredVersion != currentVersion || isRegistrationExpired()) { + Log.v(TAG, "App version changed or registration expired."); + return ""; + } + return registrationId; +} + +... + +/** + * @return Application's {@code SharedPreferences}. + */ +private SharedPreferences getGCMPreferences(Context context) { + return getSharedPreferences(DemoActivity.class.getSimpleName(), + Context.MODE_PRIVATE); +}</pre> + +<p>If the registration ID doesn't exist, or the app was updated, or the registration ID has expired, {@code getRegistrationId()} returns an empty string to indicate that the app needs to get a new regID. {@code getRegistrationId()} calls the following methods to check the app version and whether the regID has expired:</p> + +<pre>/** + * @return Application's version code from the {@code PackageManager}. + */ +private static int getAppVersion(Context context) { + try { + PackageInfo packageInfo = context.getPackageManager() + .getPackageInfo(context.getPackageName(), 0); + return packageInfo.versionCode; + } catch (NameNotFoundException e) { + // should never happen + throw new RuntimeException("Could not get package name: " + e); + } +} + +/** + * Checks if the registration has expired. + * + * <p>To avoid the scenario where the device sends the registration to the + * server but the server loses it, the app developer may choose to re-register + * after REGISTRATION_EXPIRY_TIME_MS. + * + * @return true if the registration has expired. + */ +private boolean isRegistrationExpired() { + final SharedPreferences prefs = getGCMPreferences(context); + // checks if the information is not stale + long expirationTime = + prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1); + return System.currentTimeMillis() > expirationTime; +}</pre> + + +<p>If there isn't a valid existing registration ID, {@code DemoActivity} calls the following {@code registerBackground()} method to register. Note that because GCM methods are blocking, this has to take place on a background thread. This sample uses {@link android.os.AsyncTask} to accomplish this:</p> + +<pre> +/** + * Registers the application with GCM servers asynchronously. + * <p> + * Stores the registration id, app versionCode, and expiration time in the + * application's shared preferences. + */ +private void registerBackground() { + new AsyncTask<Void, Void, String>() { + @Override + protected String doInBackground(Void... params) { + String msg = ""; + try { + if (gcm == null) { + gcm = GoogleCloudMessaging.getInstance(context); + } + regid = gcm.register(SENDER_ID); + msg = "Device registered, registration id=" + regid; + + // You should send the registration ID to your server over HTTP, + // so it can use GCM/HTTP or CCS to send messages to your app. + + // For this demo: we don't need to send it because the device + // will send upstream messages to a server that echo back the message + // using the 'from' address in the message. + + // Save the regid - no need to register again. + setRegistrationId(context, regid); + } catch (IOException ex) { + msg = "Error :" + ex.getMessage(); + } + return msg; + } + + @Override + protected void onPostExecute(String msg) { + mDisplay.append(msg + "\n"); + } + }.execute(null, null, null); +}</pre> + +<p>After registering, the app calls {@code setRegistrationId()} to store the registration ID in shared preferences for future use:</p> + +<pre>/** + * Stores the registration id, app versionCode, and expiration time in the + * application's {@code SharedPreferences}. + * + * @param context application's context. + * @param regId registration id + */ +private void setRegistrationId(Context context, String regId) { + final SharedPreferences prefs = getGCMPreferences(context); + int appVersion = getAppVersion(context); + Log.v(TAG, "Saving regId on app version " + appVersion); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(PROPERTY_REG_ID, regId); + editor.putInt(PROPERTY_APP_VERSION, appVersion); + long expirationTime = System.currentTimeMillis() + REGISTRATION_EXPIRY_TIME_MS; + + Log.v(TAG, "Setting registration expiry time to " + + new Timestamp(expirationTime)); + editor.putLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, expirationTime); + editor.commit(); +}</pre> + +<h5>Sending a message</h5> +<p>When the user clicks the app's <strong>Send</strong> button, the app sends an upstream message using the new <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">{@code GoogleCloudMessaging}</a> APIs. In order to receive the upstream message, your server should be connected to CCS. You can use the code shown in <a href="#server">Writing the Server Code</a> as a sample XMPP client to connect to CCS.</p> + +<pre>public void onClick(final View view) { + if (view == findViewById(R.id.send)) { + new AsyncTask<Void, Void, String>() { + @Override + protected String doInBackground(Void... params) { + String msg = ""; + try { + Bundle data = new Bundle(); + data.putString("hello", "World"); + String id = Integer.toString(msgId.incrementAndGet()); + gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data); + msg = "Sent message"; + } catch (IOException ex) { + msg = "Error :" + ex.getMessage(); + } + return msg; + } + + @Override + protected void onPostExecute(String msg) { + mDisplay.append(msg + "\n"); + } + }.execute(null, null, null); + } else if (view == findViewById(R.id.clear)) { + mDisplay.setText(""); + } +}</pre> + +<p>As described above in <a href="#manifest">Step 1</a>, the app includes a broadcast receiver for the <code>com.google.android.c2dm.intent.RECEIVE</code> intent. This is the mechanism GCM uses to deliver messages. When {@code onClick()} calls {@code gcm.send()}, it triggers the broadcast receiver's {@code onReceive()} method, which has the responsibility of handling the GCM message. In this sample the receiver's {@code onReceive()} method calls {@code sendNotification()} to put the message into a notification:</p> + +<pre>/** + * Handling of GCM messages. + */ +public class GcmBroadcastReceiver extends BroadcastReceiver { + static final String TAG = "GCMDemo"; + public static final int NOTIFICATION_ID = 1; + private NotificationManager mNotificationManager; + NotificationCompat.Builder builder; + Context ctx; + @Override + public void onReceive(Context context, Intent intent) { + GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); + ctx = context; + String messageType = gcm.getMessageType(intent); + if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { + sendNotification("Send error: " + intent.getExtras().toString()); + } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { + sendNotification("Deleted messages on server: " + + intent.getExtras().toString()); + } else { + sendNotification("Received: " + intent.getExtras().toString()); + } + setResultCode(Activity.RESULT_OK); + } + + // Put the GCM message into a notification and post it. + private void sendNotification(String msg) { + mNotificationManager = (NotificationManager) + ctx.getSystemService(Context.NOTIFICATION_SERVICE); + + PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, + new Intent(ctx, DemoActivity.class), 0); + + NotificationCompat.Builder mBuilder = + new NotificationCompat.Builder(ctx) + .setSmallIcon(R.drawable.ic_stat_gcm) + .setContentTitle("GCM Notification") + .setStyle(new NotificationCompat.BigTextStyle() + .bigText(msg)) + .setContentText(msg); + + mBuilder.setContentIntent(contentIntent); + mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); + } +}</pre> + +<h2 id="server">Writing the Server Code</h2> + +<p>Here is an example of a CCS server written in Python. You can use this in conjunction with the sample client code shown above. This sample echo server sends an initial message, and for every upstream message received, it sends a dummy response back to the application that sent the upstream message. This example illustrates how to connect, +send, and receive GCM messages using XMPP. It shouldn't be used as-is +on a production deployment. For examples of HTTP-based servers, see <a href="server.html">GCM Server</a>.</p> + +<pre> +#!/usr/bin/python +import sys, json, xmpp, random, string + +SERVER = 'gcm.googleapis.com' +PORT = 5235 +USERNAME = '' +PASSWORD = '' +REGISTRATION_ID = '' + +unacked_messages_quota = 1000 +send_queue = [] + +# Return a random alphanumerical id +def random_id(): + rid = '' + for x in range(8): rid += random.choice(string.ascii_letters + string.digits) + return rid + +def message_callback(session, message): + global unacked_messages_quota + gcm = message.getTags('gcm') + if gcm: + gcm_json = gcm[0].getData() + msg = json.loads(gcm_json) + if not msg.has_key('message_type'): + # Acknowledge the incoming message immediately. + send({'to': msg['from'], + 'message_type': 'ack', + 'message_id': msg['message_id']}) + # Queue a response back to the server. + if msg.has_key('from'): + # Send a dummy echo response back to the app that sent the upstream message. + send_queue.append({'to': msg['from'], + 'message_id': random_id(), + 'data': {'pong': 1}}) + elif msg['message_type'] == 'ack' or msg['message_type'] == 'nack': + unacked_messages_quota += 1 + +def send(json_dict): + template = ("<message><gcm xmlns='google:mobile:data'>{1}</gcm></message>") + client.send(xmpp.protocol.Message( + node=template.format(client.Bind.bound[0], json.dumps(json_dict)))) + +def flush_queued_messages(): + global unacked_messages_quota + while len(send_queue) and unacked_messages_quota > 0: + send(send_queue.pop(0)) + unacked_messages_quota -= 1 + +client = xmpp.Client('gcm.googleapis.com', debug=['socket']) +client.connect(server=(SERVER,PORT), secure=1, use_srv=False) +auth = client.auth(USERNAME, PASSWORD) +if not auth: + print 'Authentication failed!' + sys.exit(1) + +client.RegisterHandler('message', message_callback) + +send_queue.append({'to': REGISTRATION_ID, + 'message_id': 'reg_id', + 'data': {'message_destination': 'RegId', + 'message_id': random_id()}}) + +while True: + client.Process(1) + flush_queued_messages()</pre> -<ol> - <li>Decide which Google-provided GCM connection server you want to use— - <a href="http.html">HTTP</a> or <a href="ccs.html">XMPP</a> (CCS). GCM connection servers -take messages from a 3rd-party application -server (written by you) and send them to a GCM-enabled Android application (the -"client app," also written by you) running on a device. </li> - <li>Implement an application server (the "3rd-party application server") to interact -with your chosen GCM connection server. The app server sends data to a -GCM-enabled Android client application via the GCM connection server. For more -information about implementing the server side, see <a href="server.html"> -Implementing GCM Server</a>.</li> -<li>Write your client app. This is the GCM-enabled Android application that runs -on a device. See <a href="client.html">Implementing GCM Client</a> for more information.</li> -</ol> diff --git a/docs/html/google/gcm/http.jd b/docs/html/google/gcm/http.jd deleted file mode 100644 index b8d8659..0000000 --- a/docs/html/google/gcm/http.jd +++ /dev/null @@ -1,618 +0,0 @@ -page.title=GCM HTTP Connection Server -@jd:body - -<div id="qv-wrapper"> -<div id="qv"> - - -<h2>In this document</h2> - -<ol class="toc"> - <li><a href="#auth">Authentication</a> </li> - <li><a href="#request">Request Format</a> </li> - <li><a href="#response">Response Format</a> - <ol class="toc"> - <li><a href="#success">Interpreting a success response</a> - <li><a href="#error_codes">Interpreting an error response</a> - <li><a href="#example-responses">Example responses</a> - </ol> - </li> - <li><a href="#app-server">Implementing an HTTP-Based App Server</a> -</ol> - -<h2>See Also</h2> - -<ol class="toc"> -<li><a href="gs.html">Getting Started</a></li> -<li><a href="client.html">Implementing GCM Client</a></li> -<li><a href="ccs.html">Cloud Connection Server</a></li> - - -</ol> - -</div> -</div> - -<p>This document describes the GCM HTTP connection server. Connection servers -are the Google-provided servers that take messages from the 3rd-party -application server and sending them to the device.</p> - - - -<p class="note"><strong>Note:</strong> See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message -parameters and which connection server(s) supports them.</p> - - -<h2 id="auth">Authentication</h2> - -<p>To send a message, the application server issues a POST request to -<code>https://android.googleapis.com/gcm/send</code>.</p> -<p>A message request is made of 2 parts: HTTP header and HTTP body.</p> - -<p>The HTTP header must contain the following headers:</p> -<ul> - <li><code>Authorization</code>: key=YOUR_API_KEY</li> - <li><code>Content-Type</code>: <code>application/json</code> for JSON; <code>application/x-www-form-urlencoded;charset=UTF-8</code> for plain text. - </li> -</ul> - -<p>For example: -</p> -<pre>Content-Type:application/json -Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA - -{ - "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."], - "data" : { - ... - }, -}</pre> -<p class="note"> - <p><strong>Note:</strong> If <code>Content-Type</code> is omitted, the format -is assumed to be plain text.</p> -</p> - -<p>The HTTP body content depends on whether you're using JSON or plain text. -See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the -parameters your JSON or plain text message can contain.</p> - - - <h2 id="request">Request Format</h2> - <p>Here is the smallest possible request (a message without any parameters and -just one recipient) using JSON:</p> - <pre class="prettyprint pretty-json">{ "registration_ids": [ "42" ] }</pre> - - <p>And here the same example using plain text:</p> - <pre class="prettyprint">registration_id=42</pre> - - <p> Here is a message with a payload and 6 recipients:</p> - <pre class="prettyprint pretty-HTML">{ "data": { - "score": "5x1", - "time": "15:10" - }, - "registration_ids": ["4", "8", "15", "16", "23", "42"] -}</pre> - <p>Here is a message with all optional fields set and 6 recipients:</p> - <pre class="prettyprint pretty-json">{ "collapse_key": "score_update", - "time_to_live": 108, - "delay_while_idle": true, - "data": { - "score": "4x8", - "time": "15:16.2342" - }, - "registration_ids":["4", "8", "15", "16", "23", "42"] -}</pre> - <p>And here is the same message using plain-text format (but just 1 recipient): </p> - - <pre class="prettyprint">collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42 - </pre> - -<p class="note"><strong>Note:</strong> If your organization has a firewall -that restricts the traffic to or -from the Internet, you need to configure it to allow connectivity with GCM in order for -your Android devices to receive messages. -The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but -it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should allow -your firewall to accept outgoing connections to all IP addresses -contained in the IP blocks listed in Google's ASN of 15169.</p> - - - -<h2 id="response">Response format</h2> - -<p>There are two possible outcomes when trying to send a message:</p> -<ul> - <li>The message is processed successfully.</li> - <li>The GCM server rejects the request.</li> -</ul> - -<p>When the message is processed successfully, the HTTP response has a 200 status -and the body contains more information about the status of the message -(including possible errors). When the request is rejected, -the HTTP response contains a non-200 status code (such as 400, 401, or 503).</p> - -<p>The following table summarizes the statuses that the HTTP response header might -contain. Click the troubleshoot link for advice on how to deal with each type of -error.</p> -<table border=1> - <tr> - <th>Response</th> - <th>Description</th> - </tr> - <tr> - <td>200</td> - <td>Message was processed successfully. The response body will contain more -details about the message status, but its format will depend whether the request -was JSON or plain text. See <a href="#success">Interpreting a success response</a> -for more details.</td> - </tr> - <tr> - <td>400</td> - <td><span id="internal-source-marker_0.2">Only applies for JSON requests. -Indicates that the request could not be parsed as JSON, or it contained invalid -fields (for instance, passing a string where a number was expected). The exact -failure reason is described in the response and the problem should be addressed -before the request can be retried.</td> - </tr> - <tr> - <td>401</td> - <td>There was an error authenticating the sender account. -<a href="#auth_error">Troubleshoot</a></td> - </tr> - <tr> - <td>5xx</td> - <td>Errors in the 500-599 range (such as 500 or 503) indicate that there wa -an internal error in the GCM server while trying to process the request, or that -the server is temporarily unavailable (for example, because of timeouts). Sender -must retry later, honoring any <code>Retry-After</code> header included in the -response. Application servers must implement exponential back-off. -<a href="#internal_error">Troubleshoot</a></td> - </tr> -</table> - -<h3 id="success">Interpreting a success response</h3> -<p>When a JSON request is successful (HTTP status code 200), the response body -contains a JSON object with the following fields:</p> -<table> - <tr> - <th>Field</th> - <th>Description</th> - </tr> - <tr> - <td><code>multicast_id</code></td> - <td>Unique ID (number) identifying the multicast message.</td> - </tr> - <tr> - <td><code>success</code></td> - <td>Number of messages that were processed without an error.</td> - </tr> - <tr> - <td><code>failure</code></td> - <td>Number of messages that could not be processed.</td> - </tr> - <tr> - <td><code>canonical_ids</code></td> - <td>Number of results that contain a canonical registration ID. See -<a href="adv.html#canonical">Advanced Topics</a> for more discussion of this topic.</td> - </tr> - <tr> - <td><code>results</code></td> - <td>Array of objects representing the status of the messages processed. The -objects are listed in the same order as the request (i.e., for each registration -ID in the request, its result is listed in the same index in the response) and -they can have these fields:<br> - <ul> - <li><code>message_id</code>: String representing the message when it was -successfully processed.</li> - <li><code>registration_id</code>: If set, means that GCM processed the -message but it has another canonical registration ID for that device, so sender -should replace the IDs on future requests (otherwise they might be rejected). -This field is never set if there is an error in the request. - </li> - <li><code>error</code>: String describing an error that occurred while -processing the message for that recipient. The possible values are the same as -documented in the above table, plus "Unavailable" (meaning GCM servers -were busy and could not process the message for that particular recipient, so -it could be retried).</li> - </ul></td> - </tr> -</table> -<p>If the value of <code>failure</code> and <code>canonical_ids</code> is 0, it's -not necessary to parse the remainder of the response. Otherwise, we recommend -that you iterate through the results field and do the following for each object -in that list:</p> -<ul> - <li>If <code>message_id</code> is set, check for <code>registration_id</code>: - <ul> - <li>If <code>registration_id</code> is set, replace the original ID with -the new value (canonical ID) in your server database. Note that the original ID -is not part of the result, so you need to obtain it from the list of -code>registration_ids</code> passed in the request (using the same index).</li> - </ul> - </li> - <li>Otherwise, get the value of <code>error</code>: - <ul> - <li>If it is <code>Unavailable</code>, you could retry to send it in another -request.</li> - <li>If it is <code>NotRegistered</code>, you should remove the registration -ID from your server database because the application was uninstalled from the -device or it does not have a broadcast receiver configured to receive -<code>com.google.android.c2dm.intent.RECEIVE</code> intents.</li> - <li>Otherwise, there is something wrong in the registration ID passed in -the request; it is probably a non-recoverable error that will also require removing -the registration from the server database. See <a href="#error_codes">Interpreting -an error response</a> for all possible error values.</li> - </ul> - </li> -</ul> - -<p>When a plain-text request is successful (HTTP status code 200), the response -body contains 1 or 2 lines in the form of key/value pairs. -The first line is always available and its content is either <code>id=<em>ID of -sent message</em></code> or <code>Error=<em>GCM error code</em></code>. The second -line, if available, -has the format of <code>registration_id=<em>canonical ID</em></code>. The second -line is optional, and it can only be sent if the first line is not an error. We -recommend handling the plain-text response in a similar way as handling the -JSON response:</p> -<ul> - <li>If first line starts with <code>id</code>, check second line: - <ul> - <li>If second line starts with <code>registration_id</code>, gets its value -and replace the registration IDs in your server database.</li> - </ul> - </li> - <li>Otherwise, get the value of <code>Error</code>: - <ul> - <li>If it is <code>NotRegistered</code>, remove the registration ID from -your server database.</li> - <li>Otherwise, there is probably a non-recoverable error (<strong>Note: -</strong>Plain-text requests will never return <code>Unavailable</code> as the -error code, they would have returned a 500 HTTP status instead).</li> - </ul> - </li> -</ul> - -<h3 id="error_codes">Interpreting an error response</h3> -<p>Here are the recommendations for handling the different types of error that -might occur when trying to send a message to a device:</p> - -<dl> -<dt id="missing_reg"><strong>Missing Registration ID</strong></dt> -<dd>Check that the request contains a registration ID (either in the -<code>registration_id</code> parameter in a plain text message, or in the -<code>registration_ids</code> field in JSON). -<br/>Happens when error code is <code>MissingRegistration</code>.</dd> - -<dt id="invalid_reg"><strong>Invalid Registration ID</strong></dt> -<dd>Check the formatting of the registration ID that you pass to the server. Make -sure it matches the registration ID the phone receives in the -<code>com.google.android.c2dm.intent.REGISTRATION</code> intent and that you're -not truncating it or adding additional characters. -<br/>Happens when error code is <code>InvalidRegistration</code>.</dd> - -<dt id="mismatched_sender"><strong>Mismatched Sender</strong></dt> -<dd>A registration ID is tied to a certain group of senders. When an application -registers for GCM usage, it must specify which senders are allowed to send messages. -Make sure you're using one of those when trying to send messages to the device. -If you switch to a different sender, the existing registration IDs won't work. -Happens when error code is <code>MismatchSenderId</code>.</dd> - -<dt id="unreg_device"><strong>Unregistered Device</strong></dt> -<dd>An existing registration ID may cease to be valid in a number of scenarios, including: -<ul> - <li>If the application manually unregisters by issuing a -<span class="prettyprint pretty-java"> -<code>com.google.android.c2dm.intent.UNREGISTER</code></span><code> -</code>intent.</li> - <li>If the application is automatically unregistered, which can happen -(but is not guaranteed) if the user uninstalls the application.</li> - <li>If the registration ID expires. Google might decide to refresh registration -IDs. </li> - <li>If the application is updated but the new version does not have a broadcast -receiver configured to receive <code>com.google.android.c2dm.intent.RECEIVE</code> -intents.</li> -</ul> -For all these cases, you should remove this registration ID from the 3rd-party -server and stop using it to send -messages. -<br/>Happens when error code is <code>NotRegistered</code>.</dd> - -<dt id="big_msg"><strong>Message Too Big</strong></dt> - <dd>The total size of the payload data that is included in a message can't -exceed 4096 bytes. Note that this includes both the size of the keys as well -as the values. -<br/>Happens when error code is <code>MessageTooBig</code>.</dd> - -<dt id="invalid_datakey"><strong>Invalid Data Key</strong></dt> -<dd>The payload data contains a key (such as <code>from</code> or any value -prefixed by <code>google.</code>) that is used internally by GCM in the -<code>com.google.android.c2dm.intent.RECEIVE</code> Intent and cannot be used. -Note that some words (such as <code>collapse_key</code>) are also used by GCM -but are allowed in the payload, in which case the payload value will be -overridden by the GCM value. -<br /> -Happens when the error code is <code>InvalidDataKey</code>.</dd> - -<dt id="ttl_error"><strong>Invalid Time To Live</strong></dt> - <dd>The value for the Time to Live field must be an integer representing -a duration in seconds between 0 and 2,419,200 (4 weeks). Happens when error code -is <code>InvalidTtl</code>. -</dd> - - <dt id="auth_error"><strong>Authentication Error</strong></dt> - <dd>The sender account that you're trying to use to send a message couldn't be -authenticated. Possible causes are: <ul> -<li>Authorization header missing or with invalid syntax.</li> -<li>Invalid project number sent as key.</li> -<li>Key valid but with GCM service disabled.</li> -<li>Request originated from a server not whitelisted in the Server Key IPs.</li> - -</ul> -Check that the token you're sending inside the <code>Authorization</code> header -is the correct API key associated with your project. You can check the validity -of your API key by running the following command:<br/> - -<pre># api_key=YOUR_API_KEY - -# curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}"</pre> - - - -If you receive a 401 HTTP status code, your API key is not valid. Otherwise you -should see something like this:<br/> - -<pre> -{"multicast_id":6782339717028231855,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} -</pre> -If you want to confirm the validity of a registration ID, you can do so by -replacing "ABC" with the registration ID. -<br/> -Happens when the HTTP status code is 401. - - <dt id="timeout"><strong>Timeout</strong></dt> - -<dd>The server couldn't process the request in time. You should retry the -same request, but you MUST obey the following requirements: - -<ul> - -<li>Honor the <code>Retry-After</code> header if it's included in the response -from the GCM server.</li> - - -<li>Implement exponential back-off in your retry mechanism. This means an -exponentially increasing delay after each failed retry (e.g. if you waited one -second before the first retry, wait at least two second before the next one, -then 4 seconds and so on). If you're sending multiple messages, delay each one -independently by an additional random amount to avoid issuing a new request for -all messages at the same time.</li> - - -Senders that cause problems risk being blacklisted. -<br /> -Happens when the HTTP status code is between 501 and 599, or when the -<code>error</code> field of a JSON object in the results array is <code>Unavailable</code>. -</dd> - -<dt id="internal_error"><strong>Internal Server Error</strong></dt> - -<dd> -The server encountered an error while trying to process the request. You -could retry the same request (obeying the requirements listed in the <a href="#timeout">Timeout</a> -section), but if the error persists, please report the problem in the -<a href="https://groups.google.com/forum/?fromgroups#!forum/android-gcm">android-gcm group</a>. -<br /> -Happens when the HTTP status code is 500, or when the <code>error</code> field of a JSON -object in the results array is <code>InternalServerError</code>. -</dd> - -<dt id="restricted_package_name"><strong>Invalid Package Name</strong></dt> - -<dd> -A message was addressed to a registration ID whose package name did not match -the value passed in the request. Happens when error code is -<code>InvalidPackageName</code>. -</dd> -</dl> - -<h3 id="example-responses">Example responses</h3> -<p>This section shows a few examples of responses indicating messages that were -processed successfully. See <a href="#request">Request Format</a> for -the requests these responses are based on.</p> -<p> Here is a simple case of a JSON message successfully sent to one recipient -without canonical IDs in the response:</p> -<pre class="prettyprint pretty-json">{ "multicast_id": 108, - "success": 1, - "failure": 0, - "canonical_ids": 0, - "results": [ - { "message_id": "1:08" } - ] -}</pre> - -<p>Or if the request was in plain-text format:</p> -<pre class="prettyprint">id=1:08 -</pre> - -<p>Here are JSON results for 6 recipients (IDs 4, 8, 15, 16, 23, and 42 respectively) -with 3 messages successfully processed, 1 canonical registration ID returned, -and 3 errors:</p> -<pre class="prettyprint pretty-json">{ "multicast_id": 216, - "success": 3, - "failure": 3, - "canonical_ids": 1, - "results": [ - { "message_id": "1:0408" }, - { "error": "Unavailable" }, - { "error": "InvalidRegistration" }, - { "message_id": "1:1516" }, - { "message_id": "1:2342", "registration_id": "32" }, - { "error": "NotRegistered"} - ] -} -</pre> -<p> In this example:</p> -<ul> - <li>First message: success, not required.</li> - <li>Second message: should be resent (to registration ID 8).</li> - <li>Third message: had an unrecoverable error (maybe the value got corrupted -in the database).</li> - <li>Fourth message: success, nothing required.</li> - <li>Fifth message: success, but the registration ID should be updated in the -server database (from 23 to 32).</li> - <li>Sixth message: registration ID (42) should be removed from the server database -because the application was uninstalled from the device.</li> -</ul> -<p>Or if just the 4th message above was sent using plain-text format:</p> -<pre class="prettyprint">Error=InvalidRegistration -</pre> -<p>If the 5th message above was also sent using plain-text format:</p> -<pre class="prettyprint">id=1:2342 -registration_id=32 -</pre> - - -<h2 id="app-server">Implementing an HTTP-Based App Server</h2> - -<p>This section gives examples of implementing an app server that works with the -GCM HTTP connection server. Note that a full GCM implementation requires a -client-side implementation, in addition to the server.</a> - - -<p>Requirements</p> -<p>For the web server:</p> -<ul> - <li> <a href="http://ant.apache.org/">Ant 1.8</a> (it might work with earlier versions, but it's not guaranteed).</li> - <li>One of the following: - <ul> - <li>A running web server compatible with Servlets API version 2.5, such as -<a href="http://tomcat.apache.org/">Tomcat 6</a> or <a href="http://jetty.codehaus.org/">Jetty</a>, or</li> - <li><a href="http://code.google.com/appengine/">Java App Engine SDK</a> -version 1.6 or later.</li> - </ul> - </li> - <li>A Google account registered to use GCM.</li> - <li>The API key for that account.</li> -</ul> -<p>For the Android application:</p> -<ul> - <li>Emulator (or device) running Android 2.2 with Google APIs.</li> - <li>The Google API project number of the account registered to use GCM.</li> -</ul> - -<h3 id="gcm-setup">Setting Up GCM</h3> -<p>Before proceeding with the server and client setup, it's necessary to register -a Google account with the Google API Console, enable Google Cloud Messaging in GCM, -and obtain an API key from the <a href="https://code.google.com/apis/console"> -Google API Console</a>.</p> -<p>For instructions on how to set up GCM, see <a href="gs.html">Getting Started</a>.</p> - - -<h3 id="server-setup">Setting Up an HTTP Server</h3> -<p>This section describes the different options for setting up an HTTP server.</p> - -<h4 id="webserver-setup">Using a standard web server</h4> -<p>To set up the server using a standard, servlet-compliant web server:</p> -<ol> - <li>From the <a href="http://code.google.com/p/gcm">open source site</a>, -download the following directories: <code>gcm-server</code>, -<code>samples/gcm-demo-server</code>, and <code>samples/gcm-demo-appengine</code>.</p> - - - <li>In a text editor, edit the <code>samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key</code> and replace the existing text with the API key obtained above.</li> - <li>In a shell window, go to the <code>samples/gcm-demo-server</code> directory.</li> - <li>Generate the server's WAR file by running <code>ant war</code>:</li> - - <pre class="prettyprint">$ ant war - -Buildfile:build.xml - -init: - [mkdir] Created dir: build/classes - [mkdir] Created dir: dist - -compile: - [javac] Compiling 6 source files to build/classes - -war: - [war] Building war: <strong>dist/gcm-demo.war</strong> - -BUILD SUCCESSFUL -Total time: 0 seconds -</pre> - - <li>Deploy the <code>dist/gcm-demo.war</code> to your running server. For instance, if you're using Jetty, copy <code>gcm-demo.war</code> to the <code>webapps</code> directory of the Jetty installation.</li> - <li>Open the server's main page in a browser. The URL depends on the server you're using and your machine's IP address, but it will be something like <code>http://192.168.1.10:8080/gcm-demo/home</code>, where <code>gcm-demo</code> is the application context and <code>/home</code> is the path of the main servlet. - - </li> -</ol> -<p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> on Linux or MacOS, or <code>ipconfig</code> on Windows. </p> - -<p> You server is now ready.</p> - -<h4 id="appengine-setup">Using App Engine for Java</h4> - -<p>To set up the server using a standard App Engine for Java:</p> -<ol> - <li>Get the files from the <a href="http://code.google.com/p/gcm">open source -site</a>, as described above.</p> - </li> - <li>In a text editor, edit -<code>samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java</code> -and replace the existing text with the API key obtained above. - - <p class="note"><strong>Note:</strong> The API key value set in that class will -be used just once to create a persistent entity on App Engine. If you deploy -the application, you can use App Engine's <code>Datastore Viewer</code> to change -it later.</p> - - </li> - <li>In a shell window, go to the <code>samples/gcm-demo-appengine</code> directory.</li> - <li>Start the development App Engine server by <code>ant runserver</code>, -using the <code>-Dsdk.dir</code> to indicate the location of the App Engine SDK -and <code>-Dserver.host</code> to set your server's hostname or IP address:</li> - -<pre class="prettyprint"> -$ ant -Dsdk.dir=/opt/google/appengine-java-sdk runserver -Dserver.host=192.168.1.10 -Buildfile: gcm-demo-appengine/build.xml - -init: - [mkdir] Created dir: gcm-demo-appengine/dist - -copyjars: - -compile: - -datanucleusenhance: - [enhance] DataNucleus Enhancer (version 1.1.4) : Enhancement of classes - [enhance] DataNucleus Enhancer completed with success for 0 classes. Timings : input=28 ms, enhance=0 ms, total=28 ms. Consult the log for full details - [enhance] DataNucleus Enhancer completed and no classes were enhanced. Consult the log for full details - -runserver: - [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.jetty.JettyLogger info - [java] INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger - [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml - [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/appengine-web.xml - [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml - [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/web.xml - [java] Jun 15, 2012 8:46:09 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized - [java] SEVERE: Created fake key. Please go to App Engine admin console, change its value to your API Key (the entity type is 'Settings' and its field to be changed is 'ApiKey'), then restart the server! - [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start - [java] INFO: The server is running at http://192.168.1.10:8080/ - [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start - [java] INFO: The admin console is running at http://192.168.1.10:8080/_ah/admin -</pre> - - <li>Open the server's main page in a browser. The URL depends on the server -you're using and your machine's IP address, but it will be something like -<code>http://192.168.1.10:8080/home</code>, where <code>/home</code> -is the path of the main servlet.</li> - - <p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> -on Linux or MacOS, or <code>ipconfig</code> on Windows.</p> - -</ol> -<p> You server is now ready.</p> diff --git a/docs/html/google/gcm/notifications.jd b/docs/html/google/gcm/notifications.jd index 43a7368..5171850 100644 --- a/docs/html/google/gcm/notifications.jd +++ b/docs/html/google/gcm/notifications.jd @@ -14,15 +14,14 @@ page.title=User Notifications <h2>In this document</h2> <ol class="toc"> - <li><a href="#request">Request Format</a></li> - <li><a href="#create">Generate a Notification Key</a></li> - <li><a href="#add">Add Registration IDs</a></li> - <li><a href="#remove">Remove Registration IDs</a></li> - <li><a href="#upstream">Send Upstream Messages</a></li> - <li><a href="#response">Response Formats</a> - <ol class="toc"> - <li><a href="#response-create">Create/add/remove operations</a> - <li><a href="#response-send">Send operations</a> + <li><a href="#what">What are User Notifications?</a> </li> + <li><a href="#examples">Examples</a> + <ol> + <li><a href="#create">Generate a notification key</a></li> + <li><a href="#add">Add registration IDs</a></li> + <li><a href="#remove">Remove registration IDs</a></li> + <li><a href="#upstream">Send upstream messages</a></li> + <li><a href="#response">Response formats</a></li> </ol> </li> </ol> @@ -39,51 +38,32 @@ page.title=User Notifications <p class="note"><strong>Note:</strong> To try out this feature, sign up using <a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> +<p>The upstream messaging (device-to-cloud) feature described in this document is part of the Google Play services platform. Upstream messaging is available through the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">GoogleCloudMessaging</a> APIs. To use upstream messaging and the new streamlined registration process, you must <a href="{@docRoot}google/play-services/setup.html">set up</a> the Google Play services SDK.</p> -<p>With user notifications, 3rd-party app servers can send a single message to -multiple instance of an app running on devices owned by a single user. This feature -is called <em>user notifications</em>. User notifications make it possible for every -app instance that a user owns to reflect the latest messaging state. For example:</p> +<h2 id="what">What are User Notifications?</h2> - <ul> - <li>If a message has been handled on one device, the GCM message on the other -devices are dismissed. For example, if a user has handled a calendar notification -on one device, the notification will go away on the user's other devices.</li> - - <li>If a message has not been delivered yet to a device and but it has been handled, -the GCM server removes it from the unsent queue for the other devices.</li> +<p>Third party servers can send a single message to multiple instance of an app running on devices owned by a single user. This feature is called <em>user notifications</em>. User notifications make it possible for every app instance that a user owns to reflect the latest messaging state. For example:</p> - <li>Likewise, a device can send messages to the {@code notification_key}, which -is the token that GCM uses to fan out notifications to all devices whose -registration IDs are associated with the key.</li> + <ul> + <li>If a message has been handled on one device, the GCM message on the other devices are dismissed. For example, if a user has handled a calendar notification on one device, the notification will go away on the user's other devices.</li> + <li>If a message has not been delivered yet to a device and but it has been handled, the GCM server removes it from the unsent queue for the other devices.</li> + <li>Likewise, a device can send messages to the {@code notification_key}, which is the token that GCM uses to fan out notifications to all devices whose registration IDs are associated with the key.</li> </ul> -<p>The way this works is that during registration, the 3rd-party server requests -a {@code notification_key}. The {@code notification_key} maps a particular user -to all of the user's associated registration IDs (a regID represents a particular -Android application running on a particular device). Then instead of sending one -message to one regID at a time, the 3rd-party server can send a message to to the -{@code notification_key}, which then sends the message to all of the user's regIDs.</p> - -<p class="note"><strong>Note:</strong> A notification dismissal message is like any -other upstream message, meaning that it will be delivered to the other devices that -belong to the specified {@code notification_key}. You should design your app to -handle cases where the app receives a dismissal message, but has not yet displayed -the notification that is being dismissed. You can solve this by caching the dismissal -and then reconciling it with the corresponding notification. +<p>The way this works is that during registration, the 3rd-party server requests a {@code notification_key}. The {@code notification_key} maps a particular user to all of the user's associated registration IDs (a regID represents a particular Android application running on a particular device). Then instead of sending one message to one regID at a time, the 3rd-party server can send a message to to the {@code notification_key}, which then sends the message to all of the user's regIDs.</p> + +<p class="note"><strong>Note:</strong> A notification dismissal message is like any other upstream message, meaning that it will be delivered to the other devices that belong to the specified {@code notification_key}. You should design your app to handle cases where the app receives a dismissal message, but has not yet displayed the notification that is being dismissed. You can solve this by caching the dismissal and then reconciling it with the corresponding notification. </p> -<p>You can use this feature with either the <a href="ccs.html">XMPP</a> (CCS) or -<a href="http.html">HTTP</a> connection server.</p> +<p>You can use this feature with either the new <a href="ccs.html">GCM Cloud Connection Server</a> (CCS), or the older <a href="gcm.html">GCM HTTP server</a>.</p> + +<h3 id="examples">Examples</h3> -<p>The examples below show you how to perform generate/add/remove operations, -and how to send upstream messages. For generate/add/remove operations, the -message body is JSON.</p> +<p>The examples in this section show you how to perform generate/add/remove operations, and how to send upstream messages. For generate/add/remove operations, the message body is JSON.</p> -<h2 id="request">Request Format</h2> -<p>To send a message, the application server issues a POST request to -<code>https://android.googleapis.com/gcm/notification</code>.</p> +<h4 id="request">Request format</h4> +<p>To send a message, the application server issues a POST request to <code>https://android.googleapis.com/gcm/notification</code>.</p> <p>Here is the HTTP request header you should use for all create/add/remove operations:</p> @@ -92,22 +72,12 @@ Header : "project_id": <projectID> Header: "Authorization", "key=API_KEY" </pre> -<h2 id="create">Generate a Notification Key</h2> +<h4 id="create">Generate a notification key</h4> -<p>This example shows how to create a new <code>notification_key</code> for a -<code>notification_key_name</code> called <code>appUser-Chris</code>. -The {@code notification_key_name} is a name or identifier (can be a username for -a 3rd-party app) that is unique to a given user. It is used by third parties to -group together registration IDs for a single user. Note that <code>notification_key_name</code> -and <code>notification_key</code> are unique to a group of registration IDs. It is also -important that <code>notification_key_name</code> be uniquely named per app in case -you have multiple apps for the same project ID. This ensures that notifications -only go to the intended target app.</p> +<p>This example shows how to create a new <code>notification_key</code> for a <code>notification_key_name</code> called <code>appUser-Chris</code>. The {@code notification_key_name} is a name or identifier (can be a username for a 3rd-party app) that is unique to a given user. It is used by third parties to group together registration IDs for a single user. Note that <code>notification_key_name</code> and <code>notification_key</code> are unique to a group of registration IDs. It is also important that <code>notification_key_name</code> be uniquely named per app in case you have multiple apps for the same project ID. This ensures that notifications only go to the intended target app.</p> -<p>A create operation returns a token (<code>notification_key</code>). Third parties -must save this token (as well as its mapping to the <code>notification_key_name</code>) -to use in subsequent operations:</p> +<p>A create operation returns a token (<code>notification_key</code>). Third parties must save this token (as well as its mapping to the <code>notification_key_name</code>) to use in subsequent operations:</p> <pre>request: { @@ -116,14 +86,11 @@ to use in subsequent operations:</p> "registration_ids": ["4", "8", "15", "16", "23", "42"] }</pre> -<h2 id="add">Add Registration IDs</h2> +<h4 id="add">Add registration IDs</h4> -<p>This example shows how to add registration IDs for a given notification key. -The maximum number of members allowed for a {@code notification_key} is 10.</p> +<p>This example shows how to add registration IDs for a given notification key. The maximum number of members allowed for a {@code notification_key} is 10.</p> -<p>Note that the <code>notification_key_name</code> is not strictly required for -adding/removing regIDs. But including it protects you against accidentally using -the incorrect <code>notification_key</code>.</p> +<p>Note that the <code>notification_key_name</code> is not strictly required for adding/removing regIDs. But including it protects you against accidentally using the incorrect <code>notification_key</code>.</p> <pre>request: { @@ -133,7 +100,7 @@ the incorrect <code>notification_key</code>.</p> "registration_ids": ["4", "8", "15", "16", "23", "42"] }</pre> -<h2 id="remove">Remove Registration IDs</h2> +<h4 id="remove">Remove registration IDs</h4> <p>This example shows how to remove registration IDs for a given notification key:</p> <pre>request: @@ -144,14 +111,9 @@ the incorrect <code>notification_key</code>.</p> "registration_ids": ["4", "8", "15", "16", "23", "42"] }</pre> -<h2 id="upstream">Send Upstream Messages</h2> +<h4 id="upstream">Send upstream messages</h4> -<p>To send an upstream (device-to-cloud) message, you must use the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> API. Specifying a {@code notification_key} as the target -for an upstream message allows a user on one device to send a message to other -devices in the notification group—for example, to dismiss a notification. -Here is an example that shows targeting a {@code notification_key}:</p> +<p>To send an upstream (device-to-cloud) message, you must use the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html">GoogleCloudMessaging</a> API. Specifying a {@code notification_key} as the target for an upstream message allows a user on one device to send a message to other devices in the notification group—for example, to dismiss a notification. Here is an example that shows targeting a {@code notification_key}:</p> <pre>GoogleCloudMessaging gcm = GoogleCloudMessaging.get(context); String to = NOTIFICATION_KEY; @@ -163,21 +125,17 @@ data.putString("hello", "world"); gcm.send(to, id, data); </pre> -<p>This call generates the necessary XMPP stanza for sending the message. The -Bundle data consists of a key-value pair.</p> +<p>This call generates the necessary XMPP stanza for sending the message. The Bundle data consists of a key-value pair.</p> -<p>For a complete example, see <a href="client.html">Implementing GCM Client</a>. +<p>For a complete example, see <a href="gs.html#gs_example">Getting Started</a>. -<h2 id="response">Response Formats</h2> +<h4 id="response">Response formats</h4> -<p>This section shows examples of the responses that can be returned for -notification key operations.</p> +<p>This section shows examples of the responses that can be returned for notification key operations.</p> -<h3 id="response-create">Create/add/remove operations</h3> +<h5>Response for create/add/remove operations</h5> -<p>When you make a request to create a {@code notification_key} or to add/remove its -regIDs, a successful response always returns the <code>notification_key</code>. -his is the {@code notification_key} you will use for sending messages:</p> +<p>When you make a request to create a {@code notification_key} or to add/remove its the wayregIDs, a successful response always returns the <code>notification_key</code>. This is the {@code notification_key} you will use for sending messages:</p> <pre>HTTP status: 200 { @@ -185,23 +143,18 @@ his is the {@code notification_key} you will use for sending messages:</p> }</pre> -<h3 id="response-send">Send operations</h3> +<h5>Response for send operations</h5> -<p>For a send operation that has a {@code notification_key} as its target, the -possible responses are success, partial success, and failure.</p> +<p>For a send operation that has a {@code notification_key} as its target, the possible responses are success, partial success, and failure.</p> -<p>Here is an example of "success"—the {@code notification_key} has 2 regIDs -associated with it, and the message was successfully sent to both of them:</p> +<p>Here is an example of "success"—the {@code notification_key} has 2 regIDs associated with it, and the message was successfully sent to both of them:</p> <pre>{ "success": 2, "failure": 0 }</pre> -<p>Here is an example of "partial success"—the {@code notification_key} has -3 regIDs associated with it. The message was successfully send to 1 of the regIDs, -but not to the other 2. The response message lists the regIDs that failed to -receive the message:</p> +<p>Here is an example of "partial success"—the {@code notification_key} has 3 regIDs associated with it. The message was successfully send to 1 of the regIDs, but not to the other 2. The response message lists the regIDs that failed to receive the message:</p> <pre>{ "success":1, @@ -212,9 +165,7 @@ receive the message:</p> ] }</pre> -<p>In the case of failure, the response has HTTP code 503 and no JSON. When a message -fails to be delivered to one or more of the regIDs associated with a {@code notification_key}, -the 3rd-party server should retry.</p> +<p>In the case of failure, the response has HTTP code 503 and no JSON. When a message fails to be delivered to one or more of the regIDs associated with a {@code notification_key}, the 3rd-party server should retry.</p> diff --git a/docs/html/google/gcm/server.jd b/docs/html/google/gcm/server.jd index b5e6b48..92a1531 100644 --- a/docs/html/google/gcm/server.jd +++ b/docs/html/google/gcm/server.jd @@ -1,34 +1,36 @@ -page.title=Implementing GCM Server +page.title=GCM Server @jd:body <div id="qv-wrapper"> <div id="qv"> +<h2>Quickview</h2> + +<ul> +<li>Understand how to set up the server side of a GCM app.</li> +<li>Become familiar with the <a href="{@docRoot}reference/com/google/android/gcm/server/package-summary.html">GCM server helper library</a>.</li> +</ul> + + <h2>In this document</h2> -<ol class="toc"> - <li><a href="#choose">Choosing a GCM Connection Server</a></li> - <li><a href="#role">Role of the 3rd-party Application Server</a></li> - <li><a href="#send-msg">Sending Messages</a> - <ol class="toc"> - - <li><a href="#target">Target</a></li> - <li><a href="#payload">Payload</a></li> - <li><a href="#params">Message parameters</a> +<ol> + <li><a href="#requirements">Requirements</a> </li> + <li><a href="#gcm-setup">Setting Up GCM</a></li> + <li><a href="#server-setup">Setting Up an HTTP Server</a> + <ol> + <li><a href="#webserver-setup">Using a standard web server</a></li> + <li><a href="#appengine-setup">Using App Engine for Java</a></li> </ol> - </li> - <li><a href="#receive">Receiving Messages</a> </li> </li> - </ol> <h2>See Also</h2> <ol class="toc"> <li><a href="gs.html">Getting Started</a></li> -<li><a href="client.html">Implementing GCM Client</a></li> -<li><a href="ccs.html">Cloud Connection Server (XMPP)</a></li> -<li><a href="http.html">HTTP Connection Server</a></li> +<li><a href="client.html">GCM Client</a></li> +<li><a href="ccs.html">Cloud Connection Server</a></li> </ol> @@ -37,342 +39,122 @@ page.title=Implementing GCM Server </div> -<p>The server side of GCM consists of 2 components:</p> -<ul> -<li>Google-provided <strong>GCM Connection Servers</strong> -take messages from a 3rd-party application server and send them to a GCM-enabled -Android application (the "client app") running on a device. For example, -Google provides connection servers for <a href="{@docRoot}google/gcm/http.html"> -HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">CCS</a> (XMPP).</li> -<li>A <strong>3rd-party application server</strong> that you must implement. This application -server sends data to a GCM-enabled Android application via the chosen GCM connection server.</li> -</ul> -</p> -<p>Here are the basic steps you follow to implement your 3rd-party app server:</p> +<p>This document gives examples of GCM server-side code for HTTP. For an example of an XMPP server (<a href="ccs.html">Cloud Connection Server</a>), see <a href="gs.html#server">Getting Started</a>. Note that a full GCM implementation requires a client-side implementation, in addition to the server. For a complete working example that includes client and server-side code, see <a href="gs.html">Getting Started</a>.</a> + +<h2 id="requirements">Requirements</h2> +<p>For the web server:</p> <ul> - <li>Decide which GCM connection server(s) you want to use. Note that if you want to use - upstream messaging from your client applications, you must use CCS. For a more detailed - discussion of this, see <a href="#choose"> - Choosing a GCM Connection Server</a>.</li> - <li>Decide how you want to implement your app server. For example: - <ul> - <li>If you decide to use the HTTP connection server, you can use the -GCM server helper library and demo app to help in implementing your app server.</li> - <li>If you decide to use the XMPP connection server, you can use -the provided Python or Java <a href="http://www.igniterealtime.org/projects/smack/"> -Smack</a> demo apps as a starting point.</li> - <li>Note that Google AppEngine does not support connections to CCS.</li> - </ul> - </li> + <li> <a href="http://ant.apache.org/">Ant 1.8</a> (it might work with earlier versions, but it's not guaranteed).</li> + <li>One of the following: + <ul> + <li>A running web server compatible with Servlets API version 2.5, such as <a href="http://tomcat.apache.org/">Tomcat 6</a> or <a href="http://jetty.codehaus.org/">Jetty</a>, or</li> + <li><a href="http://code.google.com/appengine/">Java App Engine SDK</a> version 1.6 or later.</li> </ul> </li> + <li>A Google account registered to use GCM.</li> + <li>The API key for that account.</li> </ul> +<p>For the Android application:</p> +<ul> + <li>Emulator (or device) running Android 2.2 with Google APIs.</li> + <li>The Google API project number of the account registered to use GCM.</li> +</ul> +<h2 id="gcm-setup">Setting Up GCM</h2> +<p>Before proceeding with the server and client setup, it's necessary to register a Google account with the Google API Console, enable Google Cloud Messaging in GCM, and obtain an API key from the <a href="https://code.google.com/apis/console">Google API Console</a>.</p> +<p>For instructions on how to set up GCM, see <a href="gs.html">Getting Started</a>.</p> -<p>A full GCM implementation requires both a client implementation and a server -implementation. For more -information about implementing the client side, see <a href="client.html"> -Implementing GCM Client</a>.</p> -<h2 id="choose">Choosing a GCM Connection Server</h2> +<h2 id="server-setup">Setting Up an HTTP Server</h2> +<p>This section describes the different options for setting up an HTTP server.</p> +<h3 id="webserver-setup">Using a standard web server</h3> +<p>To set up the server using a standard, servlet-compliant web server:</p> +<ol> + <li>From the <a href="http://code.google.com/p/gcm">open source site</a>, download the following directories: <code>gcm-server</code>, <code>samples/gcm-demo-server</code>, and <code>samples/gcm-demo-appengine</code>.</p> -<p>Currently GCM provides two connection servers: <a href="{@docRoot}google/gcm/http.html"> -HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">CCS</a> (XMPP). You can use them -separately or in tandem. CCS messaging differs from GCM HTTP messaging in the following ways:</p> -<ul> - <li>Upstream/Downstream messages - <ul> - <li>GCM HTTP: Downstream only: cloud-to-device. </li> - <li>CCS: Upstream and downstream (device-to-cloud, cloud-to-device). </li> - </ul> - </li> - <li>Asynchronous messaging - <ul> - <li>GCM HTTP: 3rd-party app servers send messages as HTTP POST requests and -wait for a response. This mechanism is synchronous and causes the sender to block -before sending another message.</li> - <li>CCS: 3rd-party app servers connect to Google infrastructure using a -persistent XMPP connection and send/receive messages to/from all their devices -at full line speed. CCS sends acknowledgment or failure notifications (in the -form of special ACK and NACK JSON-encoded XMPP messages) asynchronously.</li> - </ul> - </li> - <li>JSON - <ul> - <li>GCM HTTP: JSON messages sent as HTTP POST.</li> - <li>CCS: JSON messages encapsulated in XMPP messages.</li> - </ul> - </li> -</ul> + <li>In a text editor, edit the <code>samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key</code> and replace the existing text with the API key obtained above.</li> + <li>In a shell window, go to the <code>samples/gcm-demo-server</code> directory.</li> + <li>Generate the server's WAR file by running <code>ant war</code>:</li> + + <pre class="prettyprint">$ ant war -<h2 id="role">Role of the 3rd-party Application Server</h2> +Buildfile:build.xml -<p>Before you can write client Android applications that use the GCM feature, you must -have an application server that meets the following criteria:</p> +init: + [mkdir] Created dir: build/classes + [mkdir] Created dir: dist -<ul> - <li>Able to communicate with your client.</li> - <li>Able to fire off properly formatted requests to the GCM server.</li> - <li>Able to handle requests and resend them as needed, using -<a href="http://en.wikipedia.org/wiki/Exponential_backoff">exponential back-off.</a></li> - <li>Able to store the API key and client registration IDs. The -API key is included in the header of POST requests that send -messages.</li> - <li>Able to store the API key and client registration IDs.</li> - <li>Able to generate message IDs to uniquely identify each message it sends.</li> -</ul> +compile: + [javac] Compiling 6 source files to build/classes -<h2 id="send-msg">Sending Messages</h2> +war: + [war] Building war: <strong>dist/gcm-demo.war</strong> -<p>Here is the general sequence of events that occurs when a 3rd-party application -server sends a message:</p> -<ol> - <li>The application server sends a message to GCM servers.</li> - <li>Google enqueues and stores the message in case the device is offline.</li> - <li>When the device is online, Google sends the message to the device.</li> - <li>On the device, the system broadcasts the message to the specified Android -application via Intent broadcast with proper permissions, so that only the targeted -ndroid application gets the message. This wakes the Android application up. -The Android application does not need to be running beforehand to receive the message.</li> - <li>The Android application processes the message. </li> +BUILD SUCCESSFUL +Total time: 0 seconds +</pre> + + <li>Deploy the <code>dist/gcm-demo.war</code> to your running server. For instance, if you're using Jetty, copy <code>gcm-demo.war</code> to the <code>webapps</code> directory of the Jetty installation.</li> + <li>Open the server's main page in a browser. The URL depends on the server you're using and your machine's IP address, but it will be something like <code>http://192.168.1.10:8080/gcm-demo/home</code>, where <code>gcm-demo</code> is the application context and <code>/home</code> is the path of the main servlet. + + </li> </ol> +<p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> on Linux or MacOS, or <code>ipconfig</code> on Windows. </p> -<p>The following sections describe the basic requirements for -sending messages.</p> +<p> You server is now ready.</p> -<h3 id="target">Target</h3> -<p>Required. When your app server sends a message in GCM, it must specify a target.</p> -<p>For HTTP you must specify the target as one of:</p> -<ul> -<li><code>registration_ids</code>: For sending to 1 more more devices (up to 1000). -When you send a message to multiple registration IDs, that is called a multicast message.</li> -<li><code>notification_key</code>: For sending to multiple devices owned by a single user.</li> -</ul> -<p>For CCS (XMPP):</p> -<ul> -<li>You must specify the target as the "to" field, where the "to" -field may contain a single registration ID or a notification key. -CCS does not support multicast messaging.</li> -</ul> -<h3 id="payload">Payload</h3> -<p>Optional. If you are including a payload in the message, you use the <code>data</code> -parameter to include the payload. This applies for both HTTP and CCS.</p> - -<h3 id="params">Message parameters</h3> - -<p>The following table lists the parameters that a 3rd-party app server might -include in the JSON messages it sends to a connection server. See the "Where Supported" -column for information about which connection servers support that particular -parameter.</p> - -<p class="table-caption" id="table1"> - <strong>Table 1.</strong> Message parameters.</p> - -<table> - <tr> - <th>Field</th> - <th>Description</th> -<th>Where Supported</th> -</tr> - <td><code>to</code></td> -<td>In CCS, used in place of <code>registration_ids</code> to specify the -recipient of a message. Its value must be a registration ID. -The value is a string. Required.</td> -<td>CCS</td> -</tr> -<tr> -<td><code>message_id</code></td> -<td>In CCS, uniquely identifies a message in an XMPP connection. The value is a -string that uniquely identifies the associated message. The value is a string. Required.</td> -<td>CCS</td> -</tr> -<tr> -<td><code>message_type</code></td> -<td>In CCS, indicates a special status message, typically sent by the system. -However, your app server also uses this parameter to send an 'ack' or 'nack' -message back to the CCS connection server. For more discussion of this topic, see -<a href="ccs.html">Cloud Connection Server</a>. The value is a string. Optional.</td> -<td>CCS</td> -<tr> - <td><code>registration_ids</code></td> - <td>A string array with the list of devices (registration IDs) receiving the -message. It must contain at least 1 and at most 1000 registration IDs. To send a -multicast message, you must use JSON. For sending a single message to a single -device, you could use a JSON object with just 1 registration id, or plain text -(see below). A request must include a recipient—this can be either a -registration ID, an array of registration IDs, or a {@code notification_key}. -Required.</td> -<td>HTTP</td> -</tr> - <tr> - <td><code>notification_key</code></td> - <td>A string that maps a single user to multiple registration IDs associated -with that user. This allows a 3rd-party server to send a single message to -multiple app instances (typically on multiple devices) owned by a single user. -A 3rd-party server can use {@code notification_key} as the target for a message -instead of an individual registration ID (or array of registration IDs). The maximum -number of members allowed for a {@code notification_key} is 10. For more discussion -of this topic, see <a href="notifications.html">User Notifications</a>. Optional. -</td> -<td style="width:100px">HTTP. This feature is supported in CCS, but you use it by -specifying a notification key in the "to" field.</td> -</tr> - <tr> - <td><code>collapse_key</code></td> - <td>An arbitrary string (such as "Updates Available") that is used -to collapse a group of like messages -when the device is offline, so that only the last message gets sent to the -client. This is intended to avoid sending too many messages to the phone when it -comes back online. Note that since there is no guarantee of the order in which -messages get sent, the "last" message may not actually be the last -message sent by the application server. Collapse keys are also called -<a href="#s2s">send-to-sync messages</a>. -<br> -<strong>Note:</strong> GCM allows a maximum of 4 different collapse keys to be -used by the GCM server -at any given time. In other words, the GCM server can simultaneously store 4 -different send-to-sync messages per device, each with a different collapse key. -If you exceed -this number GCM will only keep 4 collapse keys, with no guarantees about which -ones they will be. See <a href="adv.html#collapsible">Advanced Topics</a> for more -discussion of this topic. Optional.</td> -<td>CCS, HTTP</td> -</tr> - <tr> - <td><code>data</code></td> - <td>A JSON object whose fields represents the key-value pairs of the message's -payload data. If present, the payload data it will be -included in the Intent as application data, with the key being the extra's name. -For instance, <code>"data":{"score":"3x1"}</code> would result in an intent extra -named <code>score</code> whose value is the string <code>3x1</code>. -There is no limit on the number of key/value pairs, though there is a limit on -the total size of the message (4kb). The values could be any JSON object, but we -recommend using strings, since the values will be converted to strings in the GCM -server anyway. If you want to include objects or other non-string data types -(such as integers or booleans), you have to do the conversion to string yourself. -Also note that the key cannot be a reserved word (<code>from</code> or any word -starting with <code>google.</code>). To complicate things slightly, there are -some reserved words (such as <code>collapse_key</code>) that are technically -allowed in payload data. However, if the request also contains the word, the -value in the request will overwrite the value in the payload data. Hence using -words that are defined as field names in this table is not recommended, even in -cases where they are technically allowed. Optional.</td> -<td>CCS, HTTP</td> -</tr> - <tr> - <td><code>delay_while_idle</code></td> - <td>If included, indicates that the message should not be sent immediately -if the device is idle. The server will wait for the device to become active, and -then only the last message for each <code>collapse_key</code> value will be -sent. The default value is <code>false</code>, and must be a JSON boolean. Optional.</td> -<td>CCS, HTTP</td> -</tr> - <tr> - <td><code>time_to_live</code></td> - <td>How long (in seconds) the message should be kept on GCM storage if the -device is offline. Optional (default time-to-live is 4 weeks, and must be set as -a JSON number).</td> -<td>CCS, HTTP</td> -</tr> -<tr> - <td><code>restricted_package_name</code></td> - <td>A string containing the package name of your application. When set, messages -will only be sent to registration IDs that match the package name. Optional. - </td> -<td>HTTP</td> -</tr> -<tr> - <td><code>dry_run</code></td> - <td>If included, allows developers to test their request without actually -sending a message. Optional. The default value is <code>false</code>, and must -be a JSON boolean. - </td> -<td>HTTP</td> -</tr> -</table> - -<p>If you want to test your request (either JSON or plain text) without delivering -the message to the devices, you can set an optional HTTP or JSON parameter called -<code>dry_run</code> with the value <code>true</code>. The result will be almost -identical to running the request without this parameter, except that the message -will not be delivered to the devices. Consequently, the response will contain fake -IDs for the message and multicast fields.</p> - -<h3 id="plain-text">Plain text (HTTP only)</h3> - -<p>If you are using plain text instead of JSON, the message fields must be set as -HTTP parameters sent in the body, and their syntax is slightly different, as -described below: -<table> - <tr> - <th>Field</th> - <th>Description</th> - </tr> - <tr> - <td><code>registration_id</code></td> - <td>Must contain the registration ID of the single device receiving the message. -Required.</td> - </tr> - <tr> - <td><code>collapse_key</code></td> - <td>Same as JSON (see previous table). Optional.</td> - </tr> - <tr> - <td><code>data.<key></code></td> - - <td>Payload data, expressed as parameters prefixed with <code>data.</code> and -suffixed as the key. For instance, a parameter of <code>data.score=3x1</code> would -result in an intent extra named <code>score</code> whose value is the string -<code>3x1</code>. There is no limit on the number of key/value parameters, though -there is a limit on the total size of the message. Also note that the key cannot -be a reserved word (<code>from</code> or any word starting with -<code>google.</code>). To complicate things slightly, there are some reserved words -(such as <code>collapse_key</code>) that are technically allowed in payload data. -However, if the request also contains the word, the value in the request will -overwrite the value in the payload data. Hence using words that are defined as -field names in this table is not recommended, even in cases where they are -technically allowed. Optional.</td> - - </tr> - <tr> - <td><code>delay_while_idle</code></td> - <td>Should be represented as <code>1</code> or <code>true</code> for -<code>true</code>, anything else for <code>false</code>. Optional. The default -value is <code>false</code>.</td> - </tr> - <tr> - <td><code>time_to_live</code></td> - <td>Same as JSON (see previous table). Optional.</td> - </tr> -<tr> - <td><code>restricted_package_name</code></td> - <td>Same as JSON (see previous table). Optional. - </td> -</tr> -<tr> - <td><code>dry_run</code></td> - <td>Same as JSON (see previous table). Optional. - </td> -</tr> -</table> - -<h2 id="receive">Receiving Messages</h2> - -<p>This is the sequence of events that occurs when an Android application -installed on a mobile device receives a message:</p> +<h3 id="appengine-setup">Using App Engine for Java</h3> +<p>To set up the server using a standard App Engine for Java:</p> <ol> - <li>The system receives the incoming message and extracts the raw key/value -pairs from the message payload, if any.</li> - <li>The system passes the key/value pairs to the targeted Android application -in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of -extras.</li> - <li>The Android application extracts the raw data -from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent -by key and processes the data.</li> + <li>Get the files from the <a href="http://code.google.com/p/gcm">open source site</a>, as described above.</p> + </li> + <li>In a text editor, edit <code>samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java</code> and replace the existing text with the API key obtained above. + + <p class="note"><strong>Note:</strong> The API key value set in that class will be used just once to create a persistent entity on App Engine. If you deploy the application, you can use App Engine's <code>Datastore Viewer</code> to change it later.</p> + + </li> + <li>In a shell window, go to the <code>samples/gcm-demo-appengine</code> directory.</li> + <li>Start the development App Engine server by <code>ant runserver</code>, using the <code>-Dsdk.dir</code> to indicate the location of the App Engine SDK and <code>-Dserver.host</code> to set your server's hostname or IP address:</li> + +<pre class="prettyprint"> +$ ant -Dsdk.dir=/opt/google/appengine-java-sdk runserver -Dserver.host=192.168.1.10 +Buildfile: gcm-demo-appengine/build.xml + +init: + [mkdir] Created dir: gcm-demo-appengine/dist + +copyjars: + +compile: + +datanucleusenhance: + [enhance] DataNucleus Enhancer (version 1.1.4) : Enhancement of classes + [enhance] DataNucleus Enhancer completed with success for 0 classes. Timings : input=28 ms, enhance=0 ms, total=28 ms. Consult the log for full details + [enhance] DataNucleus Enhancer completed and no classes were enhanced. Consult the log for full details + +runserver: + [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.jetty.JettyLogger info + [java] INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger + [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml + [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/appengine-web.xml + [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml + [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/web.xml + [java] Jun 15, 2012 8:46:09 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized + [java] SEVERE: Created fake key. Please go to App Engine admin console, change its value to your API Key (the entity type is 'Settings' and its field to be changed is 'ApiKey'), then restart the server! + [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start + [java] INFO: The server is running at http://192.168.1.10:8080/ + [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start + [java] INFO: The admin console is running at http://192.168.1.10:8080/_ah/admin +</pre> + + <li>Open the server's main page in a browser. The URL depends on the server you're using and your machine's IP address, but it will be something like <code>http://192.168.1.10:8080/home</code>, where <code>/home</code> is the path of the main servlet.</li> + + <p class="note"><strong>Note:</strong> You can get the IP by running <code>ifconfig</code> on Linux or MacOS, or <code>ipconfig</code> on Windows.</p> + </ol> +<p> You server is now ready.</p> + -<p>See the documentation for each connection server for more detail on how it -handles responses.</p> diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs index 7f76c12..999c44e 100644 --- a/docs/html/google/google_toc.cs +++ b/docs/html/google/google_toc.cs @@ -123,27 +123,24 @@ <span class="en">Google Cloud Messaging</span></a> </div> <ul> - <li><a href="<?cs var:toroot?>google/gcm/gcm.html"> - <span class="en">Overview</span></a> - </li> <li><a href="<?cs var:toroot?>google/gcm/gs.html"> <span class="en">Getting Started</span></a> </li> - <li><a href="<?cs var:toroot?>google/gcm/client.html"> - <span class="en">Implementing GCM Client</span></a> + <li><a href="<?cs var:toroot?>google/gcm/gcm.html"> + <span class="en">Architectural Overview</span></a> </li> - <li class="nav-section"><div class="nav-section-header"><a href="<?cs var:toroot?>google/gcm/server.html"> - <span class="en">Implementing GCM Server</span></a></div> - <ul> - <li><a href="<?cs var:toroot?>google/gcm/ccs.html"> - <span class="en">CCS (XMPP)</span></a></li> - <li><a href="<?cs var:toroot?>google/gcm/http.html"> - <span class="en">HTTP</span></a></li> - </ul> + <li><a href="<?cs var:toroot?>google/gcm/ccs.html"> + <span class="en">Cloud Connection Server</span></a> </li> <li><a href="<?cs var:toroot?>google/gcm/notifications.html"> <span class="en">User Notifications</span></a> </li> + <li><a href="<?cs var:toroot?>google/gcm/client.html"> + <span class="en">GCM Client</span></a> + </li> + <li><a href="<?cs var:toroot?>google/gcm/server.html"> + <span class="en">GCM Server</span></a> + </li> <li><a href="<?cs var:toroot?>google/gcm/adv.html"> <span class="en">Advanced Topics</span></a> </li> diff --git a/docs/html/images/gcm/CCS-ack.png b/docs/html/images/gcm/CCS-ack.png Binary files differdeleted file mode 100644 index bce2ab2..0000000 --- a/docs/html/images/gcm/CCS-ack.png +++ /dev/null diff --git a/docs/html/images/gcm/GCM-arch.png b/docs/html/images/gcm/GCM-arch.png Binary files differdeleted file mode 100644 index e8ffb15..0000000 --- a/docs/html/images/gcm/GCM-arch.png +++ /dev/null diff --git a/docs/html/samples/images/ActionBarCompat1.png b/docs/html/samples/images/ActionBarCompat1.png Binary files differnew file mode 100644 index 0000000..64d3e66 --- /dev/null +++ b/docs/html/samples/images/ActionBarCompat1.png diff --git a/docs/html/samples/images/ActionBarCompat2.png b/docs/html/samples/images/ActionBarCompat2.png Binary files differnew file mode 100644 index 0000000..04a7e6c --- /dev/null +++ b/docs/html/samples/images/ActionBarCompat2.png diff --git a/docs/html/samples/index.jd b/docs/html/samples/index.jd new file mode 100644 index 0000000..028fbe9 --- /dev/null +++ b/docs/html/samples/index.jd @@ -0,0 +1,77 @@ +page.title=Samples +header.hide=1 +@jd:body + +<style> +div.landing-cell, +div.cell-icon { + height:150px; +} +div.cell-icon { + float:left; + margin-right:20px; +} +div.cell-icon img { + margin:0; +} +</style> + +<div class="landing-banner"> + +<div class="col-6" style="min-height:0"> + <img src="{@docRoot}images/google/google-services.png" alt="" width="340" height="193" /> +</div> +<div class="col-6"> + + <h1 itemprop="name" style="margin-bottom:0;">Samples</h1> + <p itemprop="description">Some intro here. Overview of Samples, where to get them, + links to related tools and SDK, and what's new in samples. </p> + +</div> +</div> +<div> </div> + + + + +<div style="margin-top:10px"> +<div class="col-6 normal-links" style="margin-left:0"> + +<div class="landing-cell"> + <div class="cell-icon"> + <img src="{@docRoot}images/google/maps-pin.png" width="40" > + </div> + <h4><a href="{@docRoot}google/play-services/maps.html" + >Google Maps</a></h4> + <p>The power of Google Maps is available to your app + with an embeddable map view. You can customize the map with + markers and overlays, control the user's perspective, draw lines + and shapes, and much more.</p> +</div> + +</div><!-- col-6 --> + + + + +<div class="col-6" style="margin-right:0"> + +<div class="landing-cell"> + <div class="cell-icon"> + <img src="{@docRoot}images/google/iab-99c.png" width="40" /> + </div> + <h4><a href="{@docRoot}google/play/billing/index.html" + >Google Play In-App Billing</a></h4> + <p>Build an app with a steady revenue stream that keeps users engaged + by offering new content or virtual goods directly in your app. All transactions are handled + by Google Play Store for a simple user experience. + </p> +</div> + +</div><!-- col-6 --> + +</div><!-- margin wrapper --> + + + + diff --git a/docs/html/samples/samples_toc.cs b/docs/html/samples/samples_toc.cs new file mode 100644 index 0000000..14a5b0a --- /dev/null +++ b/docs/html/samples/samples_toc.cs @@ -0,0 +1,16 @@ + +<ul id="nav" class="samples-nav"> + +<script type="text/javascript"> +<!-- + buildToggleLists(); + changeNavLang(getLangPref()); +//--> +</script> + <li class="nav-section"> + <div class="nav-section-header empty"><a href="/samples/index.html"> + <span class="en">About the Samples</span></a> + </div> + </li> +</ul> + diff --git a/docs/html/tools/revisions/platforms.jd b/docs/html/tools/revisions/platforms.jd index 820edbd..7cf3735 100644 --- a/docs/html/tools/revisions/platforms.jd +++ b/docs/html/tools/revisions/platforms.jd @@ -22,20 +22,31 @@ Highlights and APIs</a></li> -<p>To develop an Android app, you must install at least one Android platform from the SDK Manager -against which you can compile your app. Often, any given version of the Android will be revised -with bug fixes or other changes, as denoted by the revision number. Below, you'll find the -release notes for each version of the platform and the subsequent revisions to the platform -version.</p> - -<p>To determine what revision of an Android platform you have installed, refer to the -<strong>Installed Packages</strong> listing in the Android +<p>This document provides information about Android platform releases. In order to compile your +application against a particular platform release, you must download and install the SDK Platform +for that release. If you want to test your application on an emulator, you must also download at +least one system image for that platform release.</p> + +<p>Each platform release includes system images that support a specific processor architecture, +such as ARM EABI, Intel x86 or MIPS. Platform releases also include a system image that contains +Google APIs. The <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> lists available +platform system images under each platform version header, for example:</p> + +<ul> + <li>ARM EABI v7a System Image</li> + <li>Intel x86 Atom System Image</li> + <li>MIPS System Image</li> + <li>Google APIs</li> +</ul> + +<p>To determine what revisions of an Android platform you have installed, refer to the +<em>Packages</em> listing in the Android <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>.</p> <p class="caution"><strong>Important:</strong> To download the most recent Android -system components from the Android SDK Manager, you must first update the SDK Tools to -revision 22 or later and restart the SDK Manager. If you do not, -the latest Android system components will not be available for download.</p> +system components from the Android SDK Manager, you must first update the SDK Tools to the +most recent release and restart the SDK Manager. If you do not, the latest Android system +components will not be available for download.</p> @@ -46,6 +57,25 @@ the latest Android system components will not be available for download.</p> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" +class="toggle-content-img" alt="" />Revision 2</a> <em>(August 2013)</em> + </p> + + <div class="toggle-content-toggleme"> + + <p>Maintenance update. The system version is 4.3.</p> + <dl> + <dt>Dependencies:</dt> + <dd>Android SDK Platform-tools r18 or higher is required.</dd> + <dd>Android SDK Tools 22.0.4 or higher is recommended.</dd> + </dl> + + </div> +</div> + +<div class="toggle-content closed"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt="" />Revision 1</a> <em>(July 2013)</em> </p> @@ -61,6 +91,39 @@ class="toggle-content-img" alt="" />Revision 1</a> <em>(July 2013)</em> </div> </div> +<h3 id="">Google APIs System Image</h3> + +<div class="toggle-content opened"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-opened.png" +class="toggle-content-img" alt="" />Revision 2</a> <em>(August 2013)</em> + </p> + + <div class="toggle-content-toggleme"> + + <p>Maintenance update. This release includes + <a href="{@docRoot}google/play-services/index.html">Google Play Services</a> version 3.2.25, + allowing you to test your application in an emulator using the latest Google Play Services.</p> + + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" +class="toggle-content-img" alt="" />Revision 1</a> <em>(July 2013)</em> + </p> + + <div class="toggle-content-toggleme"> + + <p>Initial release. This release includes + <a href="{@docRoot}google/play-services/index.html">Google Play Services</a> version 3.1.58.</p> + + </div> +</div> + + + <h2 id="4.2">Android 4.2</h2> diff --git a/graphics/java/android/graphics/Camera.java b/graphics/java/android/graphics/Camera.java index 6f71a2b..9e07bd4 100644 --- a/graphics/java/android/graphics/Camera.java +++ b/graphics/java/android/graphics/Camera.java @@ -22,6 +22,8 @@ package android.graphics; * {@link Canvas}. */ public class Camera { + private Matrix mMatrix; + /** * Creates a new camera, with empty transformations. */ @@ -147,7 +149,13 @@ public class Camera { * @param canvas The Canvas to set the transform matrix onto */ public void applyToCanvas(Canvas canvas) { - nativeApplyToCanvas(canvas.mNativeCanvas); + if (canvas.isHardwareAccelerated()) { + if (mMatrix == null) mMatrix = new Matrix(); + getMatrix(mMatrix); + canvas.concat(mMatrix); + } else { + nativeApplyToCanvas(canvas.mNativeCanvas); + } } public native float dotWithNormal(float dx, float dy, float dz); diff --git a/graphics/java/android/graphics/Matrix.java b/graphics/java/android/graphics/Matrix.java index 4e06448..32e0c01 100644 --- a/graphics/java/android/graphics/Matrix.java +++ b/graphics/java/android/graphics/Matrix.java @@ -21,9 +21,6 @@ import java.io.PrintWriter; /** * The Matrix class holds a 3x3 matrix for transforming coordinates. - * Matrix does not have a constructor, so it must be explicitly initialized - * using either reset() - to construct an identity matrix, or one of the set..() - * functions (e.g. setTranslate, setRotate, etc.). */ public class Matrix { diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index 328ac5d..9ea325a 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -443,7 +443,10 @@ public final class KeyChain { } @Override public void onServiceDisconnected(ComponentName name) {} }; - boolean isBound = context.bindService(new Intent(IKeyChainService.class.getName()), + Intent intent = new Intent(IKeyChainService.class.getName()); + ComponentName comp = intent.resolveSystemService(context.getPackageManager(), 0); + intent.setComponent(comp); + boolean isBound = context.bindService(intent, keyChainServiceConnection, Context.BIND_AUTO_CREATE); if (!isBound) { diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index df966e1..c0b3bfc 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -226,6 +226,8 @@ void Caches::terminate() { patchCache.clear(); + clearGarbage(); + mInitialized = false; } @@ -331,6 +333,11 @@ void Caches::deleteDisplayListDeferred(DisplayList* displayList) { void Caches::flush(FlushMode mode) { FLUSH_LOGD("Flushing caches (mode %d)", mode); + // We must stop tasks before clearing caches + if (mode > kFlushMode_Layers) { + tasks.stop(); + } + switch (mode) { case kFlushMode_Full: textureCache.clear(); @@ -338,13 +345,13 @@ void Caches::flush(FlushMode mode) { dropShadowCache.clear(); gradientCache.clear(); fontRenderer->clear(); + fboCache.clear(); dither.clear(); // fall through case kFlushMode_Moderate: fontRenderer->flush(); textureCache.flush(); pathCache.clear(); - tasks.stop(); // fall through case kFlushMode_Layers: layerCache.clear(); diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index cb6bb2e..22b1485 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -737,7 +737,7 @@ void FontRenderer::blurImage(uint8_t** image, int32_t width, int32_t height, int } mRsElement = RSC::Element::A_8(mRs); - mRsScript = new RSC::ScriptIntrinsicBlur(mRs, mRsElement); + mRsScript = RSC::ScriptIntrinsicBlur::create(mRs, mRsElement); } RSC::sp<const RSC::Type> t = RSC::Type::create(mRs, mRsElement, width, height, 0); @@ -749,7 +749,8 @@ void FontRenderer::blurImage(uint8_t** image, int32_t width, int32_t height, int outImage); mRsScript->setRadius(radius); - mRsScript->blur(ain, aout); + mRsScript->setInput(ain); + mRsScript->forEach(aout); // replace the original image's pointer, avoiding a copy back to the original buffer free(*image); diff --git a/location/java/android/location/IFusedGeofenceHardware.aidl b/location/java/android/location/IFusedGeofenceHardware.aidl index 9dbf1f4..d8c3585 100644 --- a/location/java/android/location/IFusedGeofenceHardware.aidl +++ b/location/java/android/location/IFusedGeofenceHardware.aidl @@ -16,8 +16,8 @@ package android.location; -import android.location.Geofence; - +import android.hardware.location.GeofenceHardwareRequestParcelable; + /** * Fused Geofence Hardware interface. * @@ -39,11 +39,9 @@ interface IFusedGeofenceHardware { /** * Adds a given list of geofences to the system. * - * @param geofenceIdsArray The list of geofence Ids to add. - * @param geofencesArray the list of geofences to add. + * @param geofenceRequestsArray The list of geofences to add. */ - // TODO: [GeofenceIntegration] GeofenceHardwareRequest is not a parcelable class exposed in aidl - void addGeofences(in int[] geofenceIdsArray, in Geofence[] geofencesArray); + void addGeofences(in GeofenceHardwareRequestParcelable[] geofenceRequestsArray); /** * Removes a give list of geofences from the system. @@ -79,7 +77,8 @@ interface IFusedGeofenceHardware { * the geofence. * @param monitorTransitions The set of transitions to monitor. * @param notificationResponsiveness The notification responsivness needed. - * @param unknownTimer The time span associated with the + * @param unknownTimer The time span associated with the. + * @param sourcesToUse The source technologies to use. * * Remarks: keep the options as separate fields to be able to leverage the class * GeofenceHardwareRequest without any changes @@ -89,5 +88,6 @@ interface IFusedGeofenceHardware { in int lastTransition, in int monitorTransitions, in int notificationResponsiveness, - in int unknownTimer); + in int unknownTimer, + in int sourcesToUse); } diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index ee748d39..c9162fe 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -146,7 +146,7 @@ public final class LocationRequest implements Parcelable { private long mExpireAt = Long.MAX_VALUE; // no expiry private int mNumUpdates = Integer.MAX_VALUE; // no expiry private float mSmallestDisplacement = 0.0f; // meters - private WorkSource mWorkSource = new WorkSource(); + private WorkSource mWorkSource = null; private boolean mHideFromAppOps = false; // True if this request shouldn't be counted by AppOps private String mProvider = LocationManager.FUSED_PROVIDER; // for deprecated APIs that explicitly request a provider @@ -498,7 +498,16 @@ public final class LocationRequest implements Parcelable { return mSmallestDisplacement; } - /** @hide */ + /** + * Sets the WorkSource to use for power blaming of this location request. + * + * <p>No permissions are required to make this call, however the LocationManager + * will throw a SecurityException when requesting location updates if the caller + * doesn't have the {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission. + * + * @param workSource WorkSource defining power blame for this location request. + * @hide + */ public void setWorkSource(WorkSource workSource) { mWorkSource = workSource; } @@ -508,7 +517,20 @@ public final class LocationRequest implements Parcelable { return mWorkSource; } - /** @hide */ + /** + * Sets whether or not this location request should be hidden from AppOps. + * + * <p>Hiding a location request from AppOps will remove user visibility in the UI as to this + * request's existence. It does not affect power blaming in the Battery page. + * + * <p>No permissions are required to make this call, however the LocationManager + * will throw a SecurityException when requesting location updates if the caller + * doesn't have the {@link android.Manifest.permission#UPDATE_APP_OPS_STATS} permission. + * + * @param hideFromAppOps If true AppOps won't keep track of this location request. + * @see android.app.AppOpsManager + * @hide + */ public void setHideFromAppOps(boolean hideFromAppOps) { mHideFromAppOps = hideFromAppOps; } @@ -564,7 +586,7 @@ public final class LocationRequest implements Parcelable { request.setHideFromAppOps(in.readInt() != 0); String provider = in.readString(); if (provider != null) request.setProvider(provider); - WorkSource workSource = in.readParcelable(WorkSource.class.getClassLoader()); + WorkSource workSource = in.readParcelable(null); if (workSource != null) request.setWorkSource(workSource); return request; } diff --git a/location/java/android/location/SettingInjectorService.java b/location/java/android/location/SettingInjectorService.java new file mode 100644 index 0000000..d410408 --- /dev/null +++ b/location/java/android/location/SettingInjectorService.java @@ -0,0 +1,181 @@ +/* + * 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.location; + +import android.app.IntentService; +import android.content.Intent; +import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.preference.Preference; +import android.util.Log; + +/** + * Dynamically specifies the summary (subtile) and enabled status of a preference injected into + * the "Settings > Location > Location services" list. + * + * The location services list is intended for use only by preferences that affect multiple apps from + * the same developer. Location settings that apply only to one app should be shown within that app, + * rather than in the system settings. + * + * To add a preference to the list, a subclass of {@link SettingInjectorService} must be declared in + * the manifest as so: + * <pre> + * <service android:name="com.example.android.injector.MyInjectorService" > + * <intent-filter> + * <action android:name="com.android.settings.InjectedLocationSetting" /> + * </intent-filter> + * + * <meta-data + * android:name="com.android.settings.InjectedLocationSetting" + * android:resource="@xml/my_injected_location_setting" /> + * </service> + * </pre> + * The resource file specifies the static data for the setting: + * <pre> + * <injected-location-setting xmlns:android="http://schemas.android.com/apk/res/android" + * android:label="@string/injected_setting_label" + * android:icon="@drawable/ic_launcher" + * android:settingsActivity="com.example.android.injector.MySettingActivity" + * /> + * </pre> + * Here: + * <ul> + * <li>label: The {@link Preference#getTitle()} value. The title should make it clear which apps + * are affected by the setting, typically by including the name of the developer. For example, + * "Acme Corp. ads preferences." </li> + * + * <li>icon: The {@link Preference#getIcon()} value. Typically this will be a generic icon for + * the developer rather than the icon for an individual app.</li> + * + * <li>settingsActivity: the activity which is launched to allow the user to modify the setting + * value The activity must be in the same package as the subclass of + * {@link SettingInjectorService}. The activity should use your own branding to help emphasize + * to the user that it is not part of the system settings.</li> + * </ul> + * + * For consistency, the label and {@link #getStatus()} values should be provided in all of the + * locales supported by the system settings app. The text should not contain offensive language. + * + * For compactness, only one copy of a given setting should be injected. If each account has a + * distinct value for the setting, then the {@link #getStatus()} value should represent a summary of + * the state across all of the accounts and {@code settingsActivity} should display the value for + * each account. + * + * Apps that violate these guidelines will be taken down from the Google Play Store and/or flagged + * as malware. + */ +// TODO: is there a public list of supported locales? +// TODO: is there a public list of guidelines for settings text? +public abstract class SettingInjectorService extends IntentService { + + /** + * Name of the bundle key for the string specifying the status of the setting (e.g., "ON" or + * "OFF"). + * + * @hide + */ + public static final String STATUS_KEY = "status"; + + /** + * Name of the bundle key for the string specifying whether the setting is currently enabled. + * + * @hide + */ + public static final String ENABLED_KEY = "enabled"; + + /** + * Name of the intent key used to specify the messenger + * + * @hide + */ + public static final String MESSENGER_KEY = "messenger"; + + private final String mLogTag; + + /** + * Constructor. + * + * @param logTag used for logging, must be less than 23 characters + */ + public SettingInjectorService(String logTag) { + super(logTag); + + // Fast fail if log tag is too long + Log.isLoggable(logTag, Log.WARN); + + mLogTag = logTag; + } + + @Override + final protected void onHandleIntent(Intent intent) { + // Get messenger first to ensure intent doesn't get messed with (in case we later decide + // to pass intent into getStatus()) + Messenger messenger = intent.getParcelableExtra(MESSENGER_KEY); + + Status status = getStatus(); + + // Send the status back to the caller via the messenger + Message message = Message.obtain(); + Bundle bundle = new Bundle(); + bundle.putString(STATUS_KEY, status.summary); + bundle.putBoolean(ENABLED_KEY, status.enabled); + message.setData(bundle); + + if (Log.isLoggable(mLogTag, Log.DEBUG)) { + Log.d(mLogTag, + "received " + intent + " and " + status + ", sending message: " + message); + } + try { + messenger.send(message); + } catch (RemoteException e) { + Log.e(mLogTag, "", e); + } + } + + /** + * Reads the status of the setting. + */ + protected abstract Status getStatus(); + + /** + * Dynamic characteristics of an injected location setting. + */ + public static final class Status { + + public final String summary; + + public final boolean enabled; + + /** + * Constructor. + * + * @param summary the {@link Preference#getSummary()} value + * @param enabled the {@link Preference#isEnabled()} value + */ + public Status(String summary, boolean enabled) { + this.summary = summary; + this.enabled = enabled; + } + + @Override + public String toString() { + return "Status{summary='" + summary + '\'' + ", enabled=" + enabled + '}'; + } + } +} diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 14cdbb7..be83581 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1316,19 +1316,6 @@ public class AudioManager { } /** - * @hide - * Signals whether remote submix audio rerouting is enabled. - */ - public void setRemoteSubmixOn(boolean on, int address) { - IAudioService service = getService(); - try { - service.setRemoteSubmixOn(on, address); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in setRemoteSubmixOn", e); - } - } - - /** * Sets audio routing to the wired headset on or off. * * @param on set <var>true</var> to route audio to/from wired @@ -2387,6 +2374,35 @@ public class AudioManager { } } + /** + * @hide + * Notifies AudioService that it is connected to an A2DP device that supports absolute volume, + * so that AudioService can send volume change events to the A2DP device, rather than handling + * them. + */ + public void avrcpSupportsAbsoluteVolume(String address, boolean support) { + IAudioService service = getService(); + try { + service.avrcpSupportsAbsoluteVolume(address, support); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in avrcpSupportsAbsoluteVolume", e); + } + } + + /** + * @hide + * Notifies AudioService of the volume set on the A2DP device as a callback, so AudioService + * is able to update the UI. + */ + public void avrcpUpdateVolume(int oldVolume, int volume) { + IAudioService service = getService(); + try { + service.avrcpUpdateVolume(oldVolume, volume); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in avrcpUpdateVolume", e); + } + } + /** * {@hide} */ diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 290866e..3478007 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -140,24 +140,22 @@ public class AudioService extends IAudioService.Stub { private static final int MSG_PERSIST_MASTER_VOLUME = 2; private static final int MSG_PERSIST_RINGER_MODE = 3; private static final int MSG_MEDIA_SERVER_DIED = 4; - private static final int MSG_MEDIA_SERVER_STARTED = 5; - private static final int MSG_PLAY_SOUND_EFFECT = 6; - private static final int MSG_BTA2DP_DOCK_TIMEOUT = 7; - private static final int MSG_LOAD_SOUND_EFFECTS = 8; - private static final int MSG_SET_FORCE_USE = 9; - private static final int MSG_BT_HEADSET_CNCT_FAILED = 10; - private static final int MSG_SET_ALL_VOLUMES = 11; - private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 12; - private static final int MSG_REPORT_NEW_ROUTES = 13; - private static final int MSG_SET_FORCE_BT_A2DP_USE = 14; - private static final int MSG_SET_RSX_CONNECTION_STATE = 15; // change remote submix connection - private static final int MSG_CHECK_MUSIC_ACTIVE = 16; - private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 17; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 18; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 19; - private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 20; - private static final int MSG_BROADCAST_BT_CONNECTION_STATE = 21; - private static final int MSG_UNLOAD_SOUND_EFFECTS = 22; + private static final int MSG_PLAY_SOUND_EFFECT = 5; + private static final int MSG_BTA2DP_DOCK_TIMEOUT = 6; + private static final int MSG_LOAD_SOUND_EFFECTS = 7; + private static final int MSG_SET_FORCE_USE = 8; + private static final int MSG_BT_HEADSET_CNCT_FAILED = 9; + private static final int MSG_SET_ALL_VOLUMES = 10; + private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 11; + private static final int MSG_REPORT_NEW_ROUTES = 12; + private static final int MSG_SET_FORCE_BT_A2DP_USE = 13; + private static final int MSG_CHECK_MUSIC_ACTIVE = 14; + private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 15; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 16; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 17; + private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 18; + private static final int MSG_BROADCAST_BT_CONNECTION_STATE = 19; + private static final int MSG_UNLOAD_SOUND_EFFECTS = 20; // start of messages handled under wakelock // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) @@ -181,8 +179,6 @@ public class AudioService extends IAudioService.Stub { // protects mRingerMode private final Object mSettingsLock = new Object(); - private boolean mMediaServerOk; - private SoundPool mSoundPool; private final Object mSoundEffectsLock = new Object(); private static final int NUM_SOUNDPOOL_CHANNELS = 4; @@ -287,23 +283,13 @@ public class AudioService extends IAudioService.Stub { public void onError(int error) { switch (error) { case AudioSystem.AUDIO_STATUS_SERVER_DIED: - if (mMediaServerOk) { - sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, - null, 1500); - mMediaServerOk = false; - } - break; - case AudioSystem.AUDIO_STATUS_OK: - if (!mMediaServerOk) { - sendMsg(mAudioHandler, MSG_MEDIA_SERVER_STARTED, SENDMSG_NOOP, 0, 0, - null, 0); - mMediaServerOk = true; - } + sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, + SENDMSG_NOOP, 0, 0, null, 0); break; default: break; } - } + } }; /** @@ -460,6 +446,12 @@ public class AudioService extends IAudioService.Stub { private final MediaFocusControl mMediaFocusControl; + // Reference to BluetoothA2dp to query for AbsoluteVolume. + private BluetoothA2dp mA2dp; + private final Object mA2dpAvrcpLock = new Object(); + // If absolute volume is supported in AVRCP device + private boolean mAvrcpAbsVolSupported = false; + /////////////////////////////////////////////////////////////////////////// // Construction /////////////////////////////////////////////////////////////////////////// @@ -494,6 +486,8 @@ public class AudioService extends IAudioService.Stub { mMediaFocusControl = new MediaFocusControl(mAudioHandler.getLooper(), mContext, /*VolumeController*/ mVolumePanel, this); + AudioSystem.setErrorCallback(mAudioSystemCallback); + boolean cameraSoundForced = mContext.getResources().getBoolean( com.android.internal.R.bool.config_camera_sound_forced); mCameraSoundForced = new Boolean(cameraSoundForced); @@ -523,15 +517,12 @@ public class AudioService extends IAudioService.Stub { createStreamStates(); readAndSetLowRamDevice(); - mMediaServerOk = true; // Call setRingerModeInt() to apply correct mute // state on streams affected by ringer mode. mRingerModeMutedStreams = 0; setRingerModeInt(getRingerMode(), false); - AudioSystem.setErrorCallback(mAudioSystemCallback); - // Register for device connection intent broadcasts. IntentFilter intentFilter = new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); @@ -901,6 +892,15 @@ public class AudioService extends IAudioService.Stub { int oldIndex = mStreamStates[streamType].getIndex(device); if (adjustVolume && (direction != AudioManager.ADJUST_SAME)) { + // Check if volume update should be send to AVRCP + synchronized (mA2dpAvrcpLock) { + if (mA2dp != null && mAvrcpAbsVolSupported) { + mA2dp.adjustAvrcpAbsoluteVolume(direction); + return; + // No need to send volume update, because we will update the volume with a + // callback from Avrcp. + } + } if ((direction == AudioManager.ADJUST_RAISE) && !checkSafeMediaVolume(streamTypeAlias, aliasIndex + step, device)) { Log.e(TAG, "adjustStreamVolume() safe volume index = "+oldIndex); @@ -998,6 +998,15 @@ public class AudioService extends IAudioService.Stub { index = rescaleIndex(index * 10, streamType, streamTypeAlias); + synchronized (mA2dpAvrcpLock) { + if (mA2dp != null && mAvrcpAbsVolSupported) { + mA2dp.setAvrcpAbsoluteVolume(index); + return; + // No need to send volume update, because we will update the volume with a + // callback from Avrcp. + } + } + flags &= ~AudioManager.FLAG_FIXED_VOLUME; if ((streamTypeAlias == AudioSystem.STREAM_MUSIC) && ((device & mFixedVolumeDevices) != 0)) { @@ -2268,21 +2277,23 @@ public class AudioService extends IAudioService.Stub { List<BluetoothDevice> deviceList; switch(profile) { case BluetoothProfile.A2DP: - BluetoothA2dp a2dp = (BluetoothA2dp) proxy; - deviceList = a2dp.getConnectedDevices(); - if (deviceList.size() > 0) { - btDevice = deviceList.get(0); - synchronized (mConnectedDevices) { - int state = a2dp.getConnectionState(btDevice); - int delay = checkSendBecomingNoisyIntent( - AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); - queueMsgUnderWakeLock(mAudioHandler, - MSG_SET_A2DP_CONNECTION_STATE, - state, - 0, - btDevice, - delay); + synchronized (mA2dpAvrcpLock) { + mA2dp = (BluetoothA2dp) proxy; + deviceList = mA2dp.getConnectedDevices(); + if (deviceList.size() > 0) { + btDevice = deviceList.get(0); + synchronized (mConnectedDevices) { + int state = mA2dp.getConnectionState(btDevice); + int delay = checkSendBecomingNoisyIntent( + AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0); + queueMsgUnderWakeLock(mAudioHandler, + MSG_SET_A2DP_CONNECTION_STATE, + state, + 0, + btDevice, + delay); + } } } break; @@ -2344,10 +2355,13 @@ public class AudioService extends IAudioService.Stub { public void onServiceDisconnected(int profile) { switch(profile) { case BluetoothProfile.A2DP: - synchronized (mConnectedDevices) { - if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) { - makeA2dpDeviceUnavailableNow( - mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); + synchronized (mA2dpAvrcpLock) { + mA2dp = null; + synchronized (mConnectedDevices) { + if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) { + makeA2dpDeviceUnavailableNow( + mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); + } } } break; @@ -2364,26 +2378,6 @@ public class AudioService extends IAudioService.Stub { } }; - /** see AudioManager.setRemoteSubmixOn(boolean on) */ - public void setRemoteSubmixOn(boolean on, int address) { - sendMsg(mAudioHandler, MSG_SET_RSX_CONNECTION_STATE, - SENDMSG_REPLACE /* replace with QUEUE when multiple addresses are supported */, - on ? 1 : 0 /*arg1*/, - address /*arg2*/, - null/*obj*/, 0/*delay*/); - } - - private void onSetRsxConnectionState(int available, int address) { - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_REMOTE_SUBMIX, - available == 1 ? - AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, - String.valueOf(address) /*device_address*/); - AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX, - available == 1 ? - AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE, - String.valueOf(address) /*device_address*/); - } - private void onCheckMusicActive() { synchronized (mSafeMediaVolumeState) { if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { @@ -3424,21 +3418,17 @@ public class AudioService extends IAudioService.Stub { break; case MSG_MEDIA_SERVER_DIED: - if (!mMediaServerOk) { + if (AudioSystem.checkAudioFlinger() != AudioSystem.AUDIO_STATUS_OK) { Log.e(TAG, "Media server died."); - // Force creation of new IAudioFlinger interface so that we are notified - // when new media_server process is back to life. - AudioSystem.setErrorCallback(mAudioSystemCallback); sendMsg(mAudioHandler, MSG_MEDIA_SERVER_DIED, SENDMSG_NOOP, 0, 0, null, 500); + break; } - break; - - case MSG_MEDIA_SERVER_STARTED: Log.e(TAG, "Media server started."); + // indicate to audio HAL that we start the reconfiguration phase after a media // server crash - // Note that MSG_MEDIA_SERVER_STARTED message is only received when the media server + // Note that we only execute this when the media server // process restarts after a crash, not the first time it is started. AudioSystem.setParameters("restarting=true"); @@ -3571,10 +3561,6 @@ public class AudioService extends IAudioService.Stub { break; } - case MSG_SET_RSX_CONNECTION_STATE: - onSetRsxConnectionState(msg.arg1/*available*/, msg.arg2/*address*/); - break; - case MSG_CHECK_MUSIC_ACTIVE: onCheckMusicActive(); break; @@ -3697,6 +3683,7 @@ public class AudioService extends IAudioService.Stub { private void onSetA2dpConnectionState(BluetoothDevice btDevice, int state) { + if (DEBUG_VOL) Log.d(TAG, "onSetA2dpConnectionState btDevice="+btDevice+" state="+state); if (btDevice == null) { return; } @@ -3704,6 +3691,20 @@ public class AudioService extends IAudioService.Stub { if (!BluetoothAdapter.checkBluetoothAddress(address)) { address = ""; } + + // Disable absolute volume, if device is disconnected + synchronized (mA2dpAvrcpLock) { + if (state == BluetoothProfile.STATE_DISCONNECTED && mAvrcpAbsVolSupported) { + mAvrcpAbsVolSupported = false; + sendMsg(mAudioHandler, + MSG_SET_DEVICE_VOLUME, + SENDMSG_QUEUE, + getDeviceForStream(AudioSystem.STREAM_MUSIC), + 0, + mStreamStates[AudioSystem.STREAM_MUSIC], + 0); + } + } synchronized (mConnectedDevices) { boolean isConnected = (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) && @@ -3754,6 +3755,31 @@ public class AudioService extends IAudioService.Stub { } } + public void avrcpSupportsAbsoluteVolume(String address, boolean support) { + // address is not used for now, but may be used when multiple a2dp devices are supported + synchronized (mA2dpAvrcpLock) { + mAvrcpAbsVolSupported = support; + if (support) { + VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC]; + int device = getDeviceForStream(AudioSystem.STREAM_MUSIC); + streamState.setIndex(streamState.getMaxIndex(), device); + sendMsg(mAudioHandler, + MSG_SET_DEVICE_VOLUME, + SENDMSG_QUEUE, + device, + 0, + streamState, + 0); + } + } + } + + public void avrcpUpdateVolume(int oldVolume, int volume) { + mStreamStates[AudioSystem.STREAM_MUSIC]. + setIndex(volume, getDeviceForStream(AudioSystem.STREAM_MUSIC)); + sendVolumeUpdate(AudioSystem.STREAM_MUSIC, oldVolume, volume, AudioManager.FLAG_SHOW_UI); + } + private boolean handleDeviceConnection(boolean connected, int device, String params) { synchronized (mConnectedDevices) { boolean isConnected = (mConnectedDevices.containsKey(device) && diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 4805da5..661b0fd 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -177,12 +177,10 @@ public class AudioSystem { synchronized (AudioSystem.class) { mErrorCallback = cb; + if (cb != null) { + cb.onError(checkAudioFlinger()); + } } - // Calling a method on AudioFlinger here makes sure that we bind to IAudioFlinger - // binder interface death. Not doing that would result in not being notified of - // media_server process death if no other method is called on AudioSystem that reaches - // to AudioFlinger. - isMicrophoneMuted(); } private static void errorCallbackFromNative(int error) @@ -404,5 +402,5 @@ public class AudioSystem public static native int getOutputLatency(int stream); public static native int setLowRamDevice(boolean isLowRamDevice); - + public static native int checkAudioFlinger(); } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index b4c8a04..d8ce36a 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -98,6 +98,10 @@ interface IAudioService { oneway void reloadAudioSettings(); + oneway void avrcpSupportsAbsoluteVolume(String address, boolean support); + + oneway void avrcpUpdateVolume(int oldVolume, int volume); + void setSpeakerphoneOn(boolean on); boolean isSpeakerphoneOn(); @@ -110,8 +114,6 @@ interface IAudioService { boolean isBluetoothA2dpOn(); - oneway void setRemoteSubmixOn(boolean on, int address); - int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb, IAudioFocusDispatcher fd, String clientId, String callingPackageName); diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index 8ddc094..f3356c9 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -20,7 +20,6 @@ import android.graphics.ImageFormat; import android.graphics.PixelFormat; import android.os.Handler; import android.os.Looper; -import android.os.Message; import android.view.Surface; import java.lang.ref.WeakReference; @@ -130,11 +129,26 @@ public final class ImageReader implements AutoCloseable { } /** - * <p>Get the next Image from the ImageReader's queue. Returns {@code null} - * if no new image is available.</p> + * <p> + * Get the next Image from the ImageReader's queue. Returns {@code null} if + * no new image is available. + * </p> + * <p> + * This operation will fail by throwing an + * {@link Surface.OutOfResourcesException OutOfResourcesException} if too + * many images have been acquired with {@link #getNextImage}. In particular + * a sequence of {@link #getNextImage} calls greater than {@link #getMaxImages} + * without calling {@link Image#close} or {@link #releaseImage} in-between + * will exhaust the underlying queue. At such a time, + * {@link Surface.OutOfResourcesException OutOfResourcesException} will be + * thrown until more images are released with {@link Image#close} or + * {@link #releaseImage}. + * </p> * * @return a new frame of image data, or {@code null} if no image data is - * available. + * available. + * @throws Surface.OutOfResourcesException if too many images are currently + * acquired */ public Image getNextImage() { SurfaceImage si = new SurfaceImage(); @@ -172,6 +186,8 @@ public final class ImageReader implements AutoCloseable { * @param listener the listener that will be run * @param handler The handler on which the listener should be invoked, or null * if the listener should be invoked on the calling thread's looper. + * + * @throws IllegalArgumentException if no handler specified and the calling thread has no looper */ public void setImageAvailableListener(OnImageAvailableListener listener, Handler handler) { mImageListener = listener; @@ -260,8 +276,9 @@ public final class ImageReader implements AutoCloseable { * Called from Native code when an Event happens. */ private static void postEventFromNative(Object selfRef) { - WeakReference weakSelf = (WeakReference)selfRef; - final ImageReader ir = (ImageReader)weakSelf.get(); + @SuppressWarnings("unchecked") + WeakReference<ImageReader> weakSelf = (WeakReference<ImageReader>)selfRef; + final ImageReader ir = weakSelf.get(); if (ir == null) { return; } diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 703eb27..f4e867e 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -564,6 +564,52 @@ final public class MediaCodec { public native final String getName(); /** + * Change a video encoder's target bitrate on the fly. The value is an + * Integer object containing the new bitrate in bps. + */ + public static final String PARAMETER_KEY_VIDEO_BITRATE = "videoBitrate"; + + /** + * Temporarily suspend/resume encoding of input data. While suspended + * input data is effectively discarded instead of being fed into the + * encoder. This parameter really only makes sense to use with an encoder + * in "surface-input" mode, as the client code has no control over the + * input-side of the encoder in that case. + * The value is an Integer object containing the value 1 to suspend + * or the value 0 to resume. + */ + public static final String PARAMETER_KEY_SUSPEND = "drop-input-frames"; + + /** + * Request that the encoder produce a sync frame "soon". + * Provide an Integer with the value 0. + */ + public static final String PARAMETER_KEY_REQUEST_SYNC_FRAME = "request-sync"; + + /** + * Communicate additional parameter changes to the component instance. + */ + public final void setParameters(Map<String, Object> params) { + if (params == null) { + return; + } + + String[] keys = new String[params.size()]; + Object[] values = new Object[params.size()]; + + int i = 0; + for (Map.Entry<String, Object> entry: params.entrySet()) { + keys[i] = entry.getKey(); + values[i] = entry.getValue(); + ++i; + } + + setParameters(keys, values); + } + + private native final void setParameters(String[] keys, Object[] values); + + /** * Get the codec info. If the codec was created by createDecoderByType * or createEncoderByType, what component is chosen is not known beforehand, * and thus the caller does not have the MediaCodecInfo. diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index aeed7d4..90c12c6 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -72,7 +72,8 @@ public final class MediaCodecInfo { /** * Encapsulates the capabilities of a given codec component. * For example, what profile/level combinations it supports and what colorspaces - * it is capable of providing the decoded data in. + * it is capable of providing the decoded data in, as well as some + * codec-type specific capability flags. * <p>You can get an instance for a given {@link MediaCodecInfo} object with * {@link MediaCodecInfo#getCapabilitiesForType getCapabilitiesForType()}, passing a MIME type. */ @@ -139,6 +140,24 @@ public final class MediaCodecInfo { * OMX_COLOR_FORMATTYPE. */ public int[] colorFormats; + + private final static int FLAG_SupportsAdaptivePlayback = (1 << 0); + private int flags; + + /** + * <b>video decoder only</b>: codec supports seamless resolution changes. + */ + public final static String FEATURE_AdaptivePlayback = "adaptive-playback"; + + /** + * Query codec feature capabilities. + */ + public final boolean isFeatureSupported(String name) { + if (name.equals(FEATURE_AdaptivePlayback)) { + return (flags & FLAG_SupportsAdaptivePlayback) != 0; + } + return false; + } }; /** diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 3fbaf69..949a42c 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -26,7 +26,7 @@ import java.util.Map; * * The format of the media data is specified as string/value pairs. * - * Keys common to all formats, <b>all keys not marked optional are mandatory</b>: + * Keys common to all audio/video formats, <b>all keys not marked optional are mandatory</b>: * * <table> * <tr><th>Name</th><th>Value Type</th><th>Description</th></tr> @@ -44,6 +44,8 @@ import java.util.Map; * for encoders, readable in the output format of decoders</b></td></tr> * <tr><td>{@link #KEY_FRAME_RATE}</td><td>Integer or Float</td><td><b>encoder-only</b></td></tr> * <tr><td>{@link #KEY_I_FRAME_INTERVAL}</td><td>Integer</td><td><b>encoder-only</b></td></tr> + * <tr><td>{@link #KEY_REPEAT_PREVIOUS_FRAME_AFTER}</td><td>Long</td><td><b>video encoder in surface-mode only</b></td></tr> + * <tr><td>{@link #KEY_PUSH_BLANK_BUFFERS_ON_STOP}</td><td>Integer(1)</td><td><b>video decoder rendering to a surface only</b></td></tr> * </table> * * Audio formats have the following keys: @@ -57,6 +59,11 @@ import java.util.Map; * <tr><td>{@link #KEY_FLAC_COMPRESSION_LEVEL}</td><td>Integer</td><td><b>encoder-only</b>, optional, if content is FLAC audio, specifies the desired compression level.</td></tr> * </table> * + * Subtitle formats have the following keys: + * <table> + * <tr><td>{@link #KEY_MIME}</td><td>String</td><td>The type of the format.</td></tr> + * <tr><td>{@link #KEY_LANGUAGE}</td><td>String</td><td>The language of the content.</td></tr> + * </table> */ public final class MediaFormat { private Map<String, Object> mMap; @@ -68,6 +75,12 @@ public final class MediaFormat { public static final String KEY_MIME = "mime"; /** + * A key describing the language of the content. + * The associated value is a string. + */ + public static final String KEY_LANGUAGE = "language"; + + /** * A key describing the sample rate of an audio format. * The associated value is an integer */ @@ -132,6 +145,24 @@ public final class MediaFormat { public static final String KEY_SLICE_HEIGHT = "slice-height"; /** + * Applies only when configuring a video encoder in "surface-input" mode. + * The associated value is a long and gives the time in microseconds + * after which the frame previously submitted to the encoder will be + * repeated (once) if no new frame became available since. + */ + public static final String KEY_REPEAT_PREVIOUS_FRAME_AFTER + = "repeat-previous-frame-after"; + + /** + * If specified when configuring a video decoder rendering to a surface, + * causes the decoder to output "blank", i.e. black frames to the surface + * when stopped to clear out any previously displayed contents. + * The associated value is an integer of value 1. + */ + public static final String KEY_PUSH_BLANK_BUFFERS_ON_STOP + = "push-blank-buffers-on-shutdown"; + + /** * A key describing the duration (in microseconds) of the content. * The associated value is a long. */ @@ -277,6 +308,23 @@ public final class MediaFormat { } /** + * Creates a minimal subtitle format. + * @param mime The mime type of the content. + * @param language The language of the content. Specify "und" if language + * information is only included in the content (similarly, if there + * are multiple language tracks in the content.) + */ + public static final MediaFormat createSubtitleFormat( + String mime, + String language) { + MediaFormat format = new MediaFormat(); + format.setString(KEY_MIME, mime); + format.setString(KEY_LANGUAGE, language); + + return format; + } + + /** * Creates a minimal video format. * @param mime The mime type of the content. * @param width The width of the content (in pixels) diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 241c7fa..946dd71 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -38,6 +38,8 @@ import android.view.SurfaceHolder; import android.graphics.Bitmap; import android.graphics.SurfaceTexture; import android.media.AudioManager; +import android.media.MediaFormat; +import android.media.SubtitleData; import java.io.File; import java.io.FileDescriptor; @@ -1335,6 +1337,7 @@ public class MediaPlayer mOnInfoListener = null; mOnVideoSizeChangedListener = null; mOnTimedTextListener = null; + mOnSubtitleDataListener = null; _release(); } @@ -1526,20 +1529,43 @@ public class MediaPlayer * ISO-639-2 language code, "und", is returned. */ public String getLanguage() { - return mLanguage; + String language = mFormat.getString(MediaFormat.KEY_LANGUAGE); + return language == null ? "und" : language; + } + + /** + * Gets the {@link MediaFormat} of the track. If the format is + * unknown or could not be determined, null is returned. + */ + public MediaFormat getFormat() { + if (mTrackType == MEDIA_TRACK_TYPE_TIMEDTEXT) { + return mFormat; + } + return null; } public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; public static final int MEDIA_TRACK_TYPE_VIDEO = 1; public static final int MEDIA_TRACK_TYPE_AUDIO = 2; public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; + /** @hide */ + public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; final int mTrackType; - final String mLanguage; + final MediaFormat mFormat; TrackInfo(Parcel in) { mTrackType = in.readInt(); - mLanguage = in.readString(); + // TODO: parcel in the full MediaFormat + String language = in.readString(); + + if (mTrackType == MEDIA_TRACK_TYPE_TIMEDTEXT) { + mFormat = MediaFormat.createSubtitleFormat( + MEDIA_MIMETYPE_TEXT_SUBRIP, language); + } else { + mFormat = new MediaFormat(); + mFormat.setString(MediaFormat.KEY_LANGUAGE, language); + } } /** @@ -1556,7 +1582,7 @@ public class MediaPlayer @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mTrackType); - dest.writeString(mLanguage); + dest.writeString(getLanguage()); } /** @@ -1891,6 +1917,7 @@ public class MediaPlayer private static final int MEDIA_TIMED_TEXT = 99; private static final int MEDIA_ERROR = 100; private static final int MEDIA_INFO = 200; + private static final int MEDIA_SUBTITLE_DATA = 201; private class EventHandler extends Handler { @@ -1970,6 +1997,18 @@ public class MediaPlayer } return; + case MEDIA_SUBTITLE_DATA: + if (mOnSubtitleDataListener == null) { + return; + } + if (msg.obj instanceof Parcel) { + Parcel parcel = (Parcel) msg.obj; + SubtitleData data = new SubtitleData(parcel); + parcel.recycle(); + mOnSubtitleDataListener.onSubtitleData(mMediaPlayer, data); + } + return; + case MEDIA_NOP: // interface test message - ignore break; @@ -2181,6 +2220,30 @@ public class MediaPlayer private OnTimedTextListener mOnTimedTextListener; + /** + * Interface definition of a callback to be invoked when a + * track has data available. + * + * @hide + */ + public interface OnSubtitleDataListener + { + public void onSubtitleData(MediaPlayer mp, SubtitleData data); + } + + /** + * Register a callback to be invoked when a track has data available. + * + * @param listener the callback that will be run + * + * @hide + */ + public void setOnSubtitleDataListener(OnSubtitleDataListener listener) + { + mOnSubtitleDataListener = listener; + } + + private OnSubtitleDataListener mOnSubtitleDataListener; /* Do not change these values without updating their counterparts * in include/media/mediaplayer.h! diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 3e688db..1d2b889 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -179,6 +179,27 @@ public class MediaRecorder * is applied. */ public static final int VOICE_COMMUNICATION = 7; + + /** + * Audio source for a submix of audio streams to be presented remotely. + * <p> + * An application can use this audio source to capture a mix of audio streams + * that should be transmitted to a remote receiver such as a Wifi display. + * While recording is active, these audio streams are redirected to the remote + * submix instead of being played on the device speaker or headset. + * </p><p> + * Certain streams are excluded from the remote submix, including + * {@link AudioManager#STREAM_RING}, {@link AudioManager#STREAM_ALARM}, + * and {@link AudioManager#STREAM_NOTIFICATION}. These streams will continue + * to be presented locally as usual. + * </p><p> + * Capturing the remote submix audio requires the + * {@link android.Manifest.permission#CAPTURE_AUDIO_OUTPUT} permission. + * This permission is reserved for use by system components and is not available to + * third-party applications. + * </p> + */ + public static final int REMOTE_SUBMIX = 8; } /** @@ -294,7 +315,7 @@ public class MediaRecorder * @see android.media.MediaRecorder.AudioSource */ public static final int getAudioSourceMax() { - return AudioSource.VOICE_COMMUNICATION; + return AudioSource.REMOTE_SUBMIX; } /** diff --git a/media/java/android/media/SubtitleData.java b/media/java/android/media/SubtitleData.java new file mode 100644 index 0000000..f552e82 --- /dev/null +++ b/media/java/android/media/SubtitleData.java @@ -0,0 +1,88 @@ +/* + * 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.media; + +import android.os.Parcel; +import android.util.Log; + +/** + * @hide + * + * Class to hold the subtitle track's data, including: + * <ul> + * <li> Track index</li> + * <li> Start time (in microseconds) of the data</li> + * <li> Duration (in microseconds) of the data</li> + * <li> A byte-array of the data</li> + * </ul> + * + * <p> To receive the subtitle data, applications need to do the following: + * + * <ul> + * <li> Select a track of type MEDIA_TRACK_TYPE_SUBTITLE with {@link MediaPlayer.selectTrack(int)</li> + * <li> Implement the {@link MediaPlayer.OnSubtitleDataListener} interface</li> + * <li> Register the {@link MediaPlayer.OnSubtitleDataListener} callback on a MediaPlayer object</li> + * </ul> + * + * @see android.media.MediaPlayer + */ +public final class SubtitleData +{ + private static final String TAG = "SubtitleData"; + + private int mTrackIndex; + private long mStartTimeUs; + private long mDurationUs; + private byte[] mData; + + public SubtitleData(Parcel parcel) { + if (!parseParcel(parcel)) { + throw new IllegalArgumentException("parseParcel() fails"); + } + } + + public int getTrackIndex() { + return mTrackIndex; + } + + public long getStartTimeUs() { + return mStartTimeUs; + } + + public long getDurationUs() { + return mDurationUs; + } + + public byte[] getData() { + return mData; + } + + private boolean parseParcel(Parcel parcel) { + parcel.setDataPosition(0); + if (parcel.dataAvail() == 0) { + return false; + } + + mTrackIndex = parcel.readInt(); + mStartTimeUs = parcel.readLong(); + mDurationUs = parcel.readLong(); + mData = new byte[parcel.readInt()]; + parcel.readByteArray(mData); + + return true; + } +} diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index cd589de..7d914d2 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -44,6 +44,9 @@ using namespace android; +static const char* const OutOfResourcesException = + "android/view/Surface$OutOfResourcesException"; + enum { IMAGE_READER_MAX_NUM_PLANES = 3, }; @@ -609,7 +612,8 @@ static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, nativeFormat = Image_getPixelFormat(env, format); sp<BufferQueue> bq = new BufferQueue(); - sp<CpuConsumer> consumer = new CpuConsumer(bq, true, maxImages); + sp<CpuConsumer> consumer = new CpuConsumer(bq, maxImages, + /*controlledByApp*/true); // TODO: throw dvm exOutOfMemoryError? if (consumer == NULL) { jniThrowRuntimeException(env, "Failed to allocate native CpuConsumer"); @@ -702,7 +706,17 @@ static jboolean ImageReader_imageSetup(JNIEnv* env, jobject thiz, status_t res = consumer->lockNextBuffer(buffer); if (res != NO_ERROR) { if (res != BAD_VALUE /*no buffers*/) { - ALOGE("%s Fail to lockNextBuffer with error: %d ", __FUNCTION__, res); + if (res == NOT_ENOUGH_DATA) { + jniThrowException(env, OutOfResourcesException, + "Too many outstanding images, close existing images" + " to be able to acquire more."); + } else { + ALOGE("%s Fail to lockNextBuffer with error: %d ", + __FUNCTION__, res); + jniThrowExceptionFmt(env, "java/lang/IllegalStateException", + "Unknown error (%d) when we tried to lock buffer.", + res); + } } return false; } @@ -714,6 +728,7 @@ static jboolean ImageReader_imageSetup(JNIEnv* env, jobject thiz, ALOGE("crop left: %d, top = %d", lt.x, lt.y); jniThrowException(env, "java/lang/UnsupportedOperationException", "crop left top corner need to at origin"); + return false; } // Check if the producer buffer configurations match what ImageReader configured. diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index ae1db87..a859506 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -310,6 +310,10 @@ status_t JMediaCodec::getName(JNIEnv *env, jstring *nameStr) const { return OK; } +status_t JMediaCodec::setParameters(const sp<AMessage> &msg) { + return mCodec->setParameters(msg); +} + void JMediaCodec::setVideoScalingMode(int mode) { if (mSurfaceTextureClient != NULL) { native_window_set_scaling_mode(mSurfaceTextureClient.get(), mode); @@ -837,6 +841,27 @@ static jobject android_media_MediaCodec_getName( return NULL; } +static void android_media_MediaCodec_setParameters( + JNIEnv *env, jobject thiz, jobjectArray keys, jobjectArray vals) { + ALOGV("android_media_MediaCodec_setParameters"); + + sp<JMediaCodec> codec = getMediaCodec(env, thiz); + + if (codec == NULL) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + return; + } + + sp<AMessage> params; + status_t err = ConvertKeyValueArraysToMessage(env, keys, vals, ¶ms); + + if (err == OK) { + err = codec->setParameters(params); + } + + throwExceptionAsNecessary(env, err); +} + static void android_media_MediaCodec_setVideoScalingMode( JNIEnv *env, jobject thiz, jint mode) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); @@ -986,6 +1011,9 @@ static JNINativeMethod gMethods[] = { { "getName", "()Ljava/lang/String;", (void *)android_media_MediaCodec_getName }, + { "setParameters", "([Ljava/lang/String;[Ljava/lang/Object;)V", + (void *)android_media_MediaCodec_setParameters }, + { "setVideoScalingMode", "(I)V", (void *)android_media_MediaCodec_setVideoScalingMode }, diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index 282d2c5..2fbbd72 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -87,6 +87,8 @@ struct JMediaCodec : public RefBase { status_t getName(JNIEnv *env, jstring *name) const; + status_t setParameters(const sp<AMessage> ¶ms); + void setVideoScalingMode(int mode); protected: diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp index 04430ec..caa594e 100644 --- a/media/jni/android_media_MediaCodecList.cpp +++ b/media/jni/android_media_MediaCodecList.cpp @@ -110,10 +110,11 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( Vector<MediaCodecList::ProfileLevel> profileLevels; Vector<uint32_t> colorFormats; + uint32_t flags; status_t err = MediaCodecList::getInstance()->getCodecCapabilities( - index, typeStr, &profileLevels, &colorFormats); + index, typeStr, &profileLevels, &colorFormats, &flags); env->ReleaseStringUTFChars(type, typeStr); typeStr = NULL; @@ -127,6 +128,9 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( env->FindClass("android/media/MediaCodecInfo$CodecCapabilities"); CHECK(capsClazz != NULL); + jfieldID flagsField = + env->GetFieldID(capsClazz, "flags", "I"); + jobject caps = env->AllocObject(capsClazz); jclass profileLevelClazz = @@ -163,6 +167,8 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( env->SetObjectField(caps, profileLevelsField, profileLevelArray); + env->SetIntField(caps, flagsField, flags); + env->DeleteLocalRef(profileLevelArray); profileLevelArray = NULL; diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index 16a1e48..60142cd 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -753,7 +753,9 @@ static jbyteArray android_media_MediaDrm_provideKeyResponse( status_t err = drm->provideKeyResponse(sessionId, response, keySetId); - throwExceptionAsNecessary(env, err, "Failed to handle key response"); + if (throwExceptionAsNecessary(env, err, "Failed to handle key response")) { + return NULL; + } return VectorToJByteArray(env, keySetId); } @@ -1104,7 +1106,9 @@ static jbyteArray android_media_MediaDrm_encryptNative( status_t err = drm->encrypt(sessionId, keyId, input, iv, output); - throwExceptionAsNecessary(env, err, "Failed to encrypt"); + if (throwExceptionAsNecessary(env, err, "Failed to encrypt")) { + return NULL; + } return VectorToJByteArray(env, output); } @@ -1132,7 +1136,9 @@ static jbyteArray android_media_MediaDrm_decryptNative( Vector<uint8_t> output; status_t err = drm->decrypt(sessionId, keyId, input, iv, output); - throwExceptionAsNecessary(env, err, "Failed to decrypt"); + if (throwExceptionAsNecessary(env, err, "Failed to decrypt")) { + return NULL; + } return VectorToJByteArray(env, output); } @@ -1160,7 +1166,9 @@ static jbyteArray android_media_MediaDrm_signNative( status_t err = drm->sign(sessionId, keyId, message, signature); - throwExceptionAsNecessary(env, err, "Failed to sign"); + if (throwExceptionAsNecessary(env, err, "Failed to sign")) { + return NULL; + } return VectorToJByteArray(env, signature); } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java index 9057f60..624bbaa 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java @@ -25,6 +25,8 @@ import android.hardware.IProCameraUser; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.ICameraDeviceUser; +import android.hardware.camera2.utils.BinderHolder; +import android.hardware.camera2.utils.CameraBinderDecorator; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; @@ -109,9 +111,11 @@ public class CameraBinderTest extends AndroidTestCase { String clientPackageName = getContext().getPackageName(); - ICamera cameraUser = mUtils.getCameraService().connect(dummyCallbacks, cameraId, - clientPackageName, - CameraBinderTestUtils.USE_CALLING_UID); + BinderHolder holder = new BinderHolder(); + CameraBinderDecorator.newInstance(mUtils.getCameraService()) + .connect(dummyCallbacks, cameraId, clientPackageName, + CameraBinderTestUtils.USE_CALLING_UID, holder); + ICamera cameraUser = ICamera.Stub.asInterface(holder.getBinder()); assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); Log.v(TAG, String.format("Camera %s connected", cameraId)); @@ -131,9 +135,11 @@ public class CameraBinderTest extends AndroidTestCase { String clientPackageName = getContext().getPackageName(); - IProCameraUser cameraUser = mUtils.getCameraService().connectPro(dummyCallbacks, - cameraId, - clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); + BinderHolder holder = new BinderHolder(); + CameraBinderDecorator.newInstance(mUtils.getCameraService()) + .connectPro(dummyCallbacks, cameraId, + clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); + IProCameraUser cameraUser = IProCameraUser.Stub.asInterface(holder.getBinder()); assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); Log.v(TAG, String.format("Camera %s connected", cameraId)); @@ -161,9 +167,11 @@ public class CameraBinderTest extends AndroidTestCase { String clientPackageName = getContext().getPackageName(); - ICameraDeviceUser cameraUser = mUtils.getCameraService().connectDevice(dummyCallbacks, - cameraId, - clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); + BinderHolder holder = new BinderHolder(); + CameraBinderDecorator.newInstance(mUtils.getCameraService()) + .connectDevice(dummyCallbacks, cameraId, + clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); + ICameraDeviceUser cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); Log.v(TAG, String.format("Camera %s connected", cameraId)); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java index bdf14ff..722087c 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java @@ -18,10 +18,11 @@ package com.android.mediaframeworktest.integration; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraMetadata; -import android.hardware.camera2.CameraPropertiesKeys; +import android.hardware.camera2.CameraProperties; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.ICameraDeviceUser; +import android.hardware.camera2.utils.BinderHolder; import android.os.RemoteException; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; @@ -39,8 +40,8 @@ public class CameraDeviceBinderTest extends AndroidTestCase { private static String TAG = "CameraDeviceBinderTest"; // Number of streaming callbacks need to check. private static int NUM_CALLBACKS_CHECKED = 10; - // Wait for capture result timeout value: 1000ms - private final static int WAIT_FOR_COMPLETE_TIMEOUT_MS = 1000; + // Wait for capture result timeout value: 1500ms + private final static int WAIT_FOR_COMPLETE_TIMEOUT_MS = 1500; private int mCameraId; private ICameraDeviceUser mCameraUser; @@ -129,8 +130,10 @@ public class CameraDeviceBinderTest extends AndroidTestCase { mMockCb = spy(dummyCallbacks); - mCameraUser = mUtils.getCameraService().connectDevice(mMockCb, mCameraId, - clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); + BinderHolder holder = new BinderHolder(); + mUtils.getCameraService().connectDevice(mMockCb, mCameraId, + clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); + mCameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser); createDefaultSurface(); @@ -268,7 +271,7 @@ public class CameraDeviceBinderTest extends AndroidTestCase { assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(info.isEmpty()); - assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS)); + assertNotNull(info.get(CameraProperties.SCALER_AVAILABLE_FORMATS)); } @SmallTest diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java index 074bfe4..2d26ac7 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java @@ -86,9 +86,9 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med private Writer mProcMemWriter; private Writer mMemWriter; - private CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CAMERA_ID); - private int mVideoWidth = mCamcorderProfile.videoFrameWidth; - private int mVideoHeight = mCamcorderProfile.videoFrameHeight; + private CamcorderProfile mCamcorderProfile; + private int mVideoWidth; + private int mVideoHeight; Camera mCamera; @@ -99,6 +99,12 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med @Override protected void setUp() throws Exception { super.setUp(); + //Check if the device support the camcorder + CamcorderProfile mCamcorderProfile = CamcorderProfile.get(CAMERA_ID); + if (mCamcorderProfile != null) { + mVideoWidth = mCamcorderProfile.videoFrameWidth; + mVideoHeight = mCamcorderProfile.videoFrameHeight; + } //Insert a 2 second before launching the test activity. This is //the workaround for the race condition of requesting the updated surface. Thread.sleep(2000); @@ -332,7 +338,7 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med // USER PID PPID VSIZE RSS WCHAN PC NAME // media 131 1 13676 4796 ffffffff 400b1bd0 S media.log // media 219 131 37768 6892 ffffffff 400b236c S /system/bin/mediaserver - String memusage = poList[2].concat("\n"); + String memusage = poList[poList.length-1].concat("\n"); return memusage; } @@ -410,59 +416,65 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med // Test case 4: Capture the memory usage after every 20 video only recorded @LargeTest public void testH263RecordVideoOnlyMemoryUsage() throws Exception { - boolean memoryResult = false; - mStartPid = getMediaserverPid(); - int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); - assertTrue("H263 video recording frame rate", frameRate != -1); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, - MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, - MediaNames.RECORDED_VIDEO_3GP, true)); - getMemoryWriteToLog(i); - writeProcmemInfo(); + if (mCamcorderProfile != null) { + boolean memoryResult = false; + mStartPid = getMediaserverPid(); + int frameRate = MediaProfileReader + .getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); + assertTrue("H263 video recording frame rate", frameRate != -1); + for (int i = 0; i < NUM_STRESS_LOOP; i++) { + assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, + MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, + MediaNames.RECORDED_VIDEO_3GP, true)); + getMemoryWriteToLog(i); + writeProcmemInfo(); + } + memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); + assertTrue("H263 record only memory test", memoryResult); } - memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); - assertTrue("H263 record only memory test", memoryResult); } // Test case 5: Capture the memory usage after every 20 video only recorded @LargeTest public void testMpeg4RecordVideoOnlyMemoryUsage() throws Exception { - boolean memoryResult = false; - - mStartPid = getMediaserverPid(); - int frameRate = MediaProfileReader.getMaxFrameRateForCodec - (MediaRecorder.VideoEncoder.MPEG_4_SP); - assertTrue("MPEG4 video recording frame rate", frameRate != -1); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, - MediaRecorder.VideoEncoder.MPEG_4_SP, MediaRecorder.OutputFormat.MPEG_4, - MediaNames.RECORDED_VIDEO_3GP, true)); - getMemoryWriteToLog(i); - writeProcmemInfo(); + if (mCamcorderProfile != null) { + boolean memoryResult = false; + mStartPid = getMediaserverPid(); + int frameRate = MediaProfileReader.getMaxFrameRateForCodec + (MediaRecorder.VideoEncoder.MPEG_4_SP); + assertTrue("MPEG4 video recording frame rate", frameRate != -1); + for (int i = 0; i < NUM_STRESS_LOOP; i++) { + assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, + MediaRecorder.VideoEncoder.MPEG_4_SP, MediaRecorder.OutputFormat.MPEG_4, + MediaNames.RECORDED_VIDEO_3GP, true)); + getMemoryWriteToLog(i); + writeProcmemInfo(); + } + memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); + assertTrue("mpeg4 record only memory test", memoryResult); } - memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); - assertTrue("mpeg4 record only memory test", memoryResult); } // Test case 6: Capture the memory usage after every 20 video and audio // recorded @LargeTest public void testRecordVideoAudioMemoryUsage() throws Exception { - boolean memoryResult = false; - - mStartPid = getMediaserverPid(); - int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); - assertTrue("H263 video recording frame rate", frameRate != -1); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, - MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, - MediaNames.RECORDED_VIDEO_3GP, false)); - getMemoryWriteToLog(i); - writeProcmemInfo(); + if (mCamcorderProfile != null) { + boolean memoryResult = false; + mStartPid = getMediaserverPid(); + int frameRate = MediaProfileReader + .getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263); + assertTrue("H263 video recording frame rate", frameRate != -1); + for (int i = 0; i < NUM_STRESS_LOOP; i++) { + assertTrue(stressVideoRecord(frameRate, mVideoWidth, mVideoHeight, + MediaRecorder.VideoEncoder.H263, MediaRecorder.OutputFormat.MPEG_4, + MediaNames.RECORDED_VIDEO_3GP, false)); + getMemoryWriteToLog(i); + writeProcmemInfo(); + } + memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); + assertTrue("H263 audio video record memory test", memoryResult); } - memoryResult = validateMemoryResult(mStartPid, mStartMemory, ENCODER_LIMIT); - assertTrue("H263 audio video record memory test", memoryResult); } // Test case 7: Capture the memory usage after every 20 audio only recorded diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 27f93c0..d79f5c6 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -4,6 +4,7 @@ <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <application + android:name=".DocumentsApplication" android:label="@string/app_label" android:supportsRtl="true"> @@ -17,13 +18,27 @@ <intent-filter android:priority="100"> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter> <intent-filter android:priority="100"> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter> + <intent-filter android:priority="100"> + <action android:name="android.intent.action.GET_CONTENT" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.OPENABLE" /> + <data android:mimeType="*/*" /> + </intent-filter> + <!-- data expected to point at existing root to manage --> + <intent-filter> + <action android:name="android.intent.action.MANAGE_DOCUMENT" /> + <category android:name="android.intent.category.DEFAULT" /> + <data android:mimeType="vnd.android.cursor.item/root" /> + </intent-filter> </activity> <activity @@ -37,6 +52,14 @@ android:authorities="com.android.documentsui.recents" android:exported="false" /> + <receiver android:name=".DocumentChangedReceiver"> + <intent-filter> + <action android:name="android.provider.action.DOCUMENT_CHANGED" /> + <data android:mimeType="vnd.android.cursor.dir/root" /> + <data android:mimeType="vnd.android.cursor.item/root" /> + </intent-filter> + </receiver> + <!-- TODO: remove when we have real clients --> <activity android:name=".TestActivity" android:enabled="false"> <intent-filter> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml index 8dbd1de..67c5954 100644 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ b/packages/DocumentsUI/res/layout/fragment_directory.xml @@ -42,4 +42,12 @@ android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:visibility="gone" /> + <Button + android:id="@+id/more" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:text="@string/more" + android:visibility="gone" /> + </FrameLayout> diff --git a/packages/DocumentsUI/res/menu/mode_directory.xml b/packages/DocumentsUI/res/menu/mode_directory.xml index 6b6d7e9..624e024 100644 --- a/packages/DocumentsUI/res/menu/mode_directory.xml +++ b/packages/DocumentsUI/res/menu/mode_directory.xml @@ -19,4 +19,14 @@ android:id="@+id/menu_open" android:title="@string/menu_open" android:showAsAction="always" /> + <item + android:id="@+id/menu_share" + android:icon="@android:drawable/ic_menu_share" + android:title="@string/menu_share" + android:showAsAction="always" /> + <item + android:id="@+id/menu_delete" + android:icon="@android:drawable/ic_menu_delete" + android:title="@string/menu_delete" + android:showAsAction="always" /> </menu> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index 84f89b4..928ba85 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -29,6 +29,8 @@ <string name="menu_open">Open</string> <string name="menu_save">Save</string> + <string name="menu_share">Share</string> + <string name="menu_delete">Delete</string> <string name="mode_selected_count"><xliff:g id="count" example="3">%1$d</xliff:g> selected</string> @@ -47,6 +49,7 @@ <string name="root_type_service">Services</string> <string name="root_type_shortcut">Shortcuts</string> <string name="root_type_device">Devices</string> + <string name="root_type_apps">More apps</string> <string name="pref_advanced_devices">Display advanced devices</string> <string name="pref_file_size">Display file size</string> @@ -54,4 +57,10 @@ <string name="empty">No items</string> + <string name="toast_no_application">Can\'t open file</string> + <string name="toast_failed_delete">Unable to delete some documents</string> + + <string name="more">More</string> + <string name="loading">Loading\u2026</string> + </resources> diff --git a/packages/DocumentsUI/res/xml/document_provider.xml b/packages/DocumentsUI/res/xml/document_provider.xml new file mode 100644 index 0000000..77891cb --- /dev/null +++ b/packages/DocumentsUI/res/xml/document_provider.xml @@ -0,0 +1,19 @@ +<?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. +--> + +<documents-provider xmlns:android="http://schemas.android.com/apk/res/android" + android:customRoots="true"> +</documents-provider> diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index 313774b..575947f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -27,8 +27,8 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.net.Uri; import android.os.Bundle; -import android.provider.DocumentsContract; import android.provider.DocumentsContract.DocumentColumns; +import android.provider.DocumentsContract.Documents; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -69,7 +69,7 @@ public class CreateDirectoryFragment extends DialogFragment { final String displayName = text1.getText().toString(); final ContentValues values = new ContentValues(); - values.put(DocumentColumns.MIME_TYPE, DocumentsContract.MIME_TYPE_DIRECTORY); + values.put(DocumentColumns.MIME_TYPE, Documents.MIME_TYPE_DIR); values.put(DocumentColumns.DISPLAY_NAME, displayName); final DocumentsActivity activity = (DocumentsActivity) getActivity(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 5a6060a..dd9aee5 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -16,17 +16,33 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE; +import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID; +import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_DATE; +import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_NAME; +import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_SIZE; + import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.app.LoaderManager.LoaderCallbacks; +import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; import android.content.Loader; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.Point; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.provider.DocumentsContract; import android.text.format.DateUtils; import android.text.format.Formatter; +import android.text.format.Time; +import android.util.Log; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.LayoutInflater; @@ -39,10 +55,12 @@ import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; +import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; import com.android.documentsui.DocumentsActivity.DisplayState; import com.android.documentsui.model.Document; @@ -50,7 +68,6 @@ import com.android.documentsui.model.Root; import com.android.internal.util.Predicate; import com.google.android.collect.Lists; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -64,6 +81,7 @@ public class DirectoryFragment extends Fragment { private View mEmptyView; private ListView mListView; private GridView mGridView; + private Button mMoreView; private AbsListView mCurrentView; @@ -75,8 +93,10 @@ public class DirectoryFragment extends Fragment { private int mType = TYPE_NORMAL; + private Point mThumbSize; + private DocumentsAdapter mAdapter; - private LoaderCallbacks<List<Document>> mCallbacks; + private LoaderCallbacks<DirectoryResult> mCallbacks; private static final String EXTRA_TYPE = "type"; private static final String EXTRA_URI = "uri"; @@ -133,18 +153,20 @@ public class DirectoryFragment extends Fragment { mGridView.setOnItemClickListener(mItemListener); mGridView.setMultiChoiceModeListener(mMultiListener); + mMoreView = (Button) view.findViewById(R.id.more); + mAdapter = new DocumentsAdapter(); final Uri uri = getArguments().getParcelable(EXTRA_URI); mType = getArguments().getInt(EXTRA_TYPE); - mCallbacks = new LoaderCallbacks<List<Document>>() { + mCallbacks = new LoaderCallbacks<DirectoryResult>() { @Override - public Loader<List<Document>> onCreateLoader(int id, Bundle args) { + public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { final DisplayState state = getDisplayState(DirectoryFragment.this); mFilter = new MimePredicate(state.acceptMimes); - final Uri contentsUri; + Uri contentsUri; if (mType == TYPE_NORMAL) { contentsUri = DocumentsContract.buildContentsUri(uri); } else if (mType == TYPE_RECENT_OPEN) { @@ -153,12 +175,16 @@ public class DirectoryFragment extends Fragment { contentsUri = uri; } + if (state.localOnly) { + contentsUri = DocumentsContract.setLocalOnly(contentsUri); + } + final Comparator<Document> sortOrder; - if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { + if (state.sortOrder == SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { sortOrder = new Document.DateComparator(); - } else if (state.sortOrder == DisplayState.SORT_ORDER_NAME) { + } else if (state.sortOrder == SORT_ORDER_NAME) { sortOrder = new Document.NameComparator(); - } else if (state.sortOrder == DisplayState.SORT_ORDER_SIZE) { + } else if (state.sortOrder == SORT_ORDER_SIZE) { sortOrder = new Document.SizeComparator(); } else { throw new IllegalArgumentException("Unknown sort order " + state.sortOrder); @@ -168,12 +194,34 @@ public class DirectoryFragment extends Fragment { } @Override - public void onLoadFinished(Loader<List<Document>> loader, List<Document> data) { - mAdapter.swapDocuments(data); + public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { + mAdapter.swapDocuments(result.contents); + + final Cursor cursor = result.cursor; + if (cursor != null && cursor.getExtras() + .getBoolean(DocumentsContract.EXTRA_HAS_MORE, false)) { + mMoreView.setText(R.string.more); + mMoreView.setVisibility(View.VISIBLE); + mMoreView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMoreView.setText(R.string.loading); + final Bundle bundle = new Bundle(); + bundle.putBoolean(DocumentsContract.EXTRA_REQUEST_MORE, true); + try { + cursor.respond(bundle); + } catch (Exception e) { + Log.w(TAG, "Failed to respond: " + e); + } + } + }); + } else { + mMoreView.setVisibility(View.GONE); + } } @Override - public void onLoaderReset(Loader<List<Document>> loader) { + public void onLoaderReset(Loader<DirectoryResult> loader) { mAdapter.swapDocuments(null); } }; @@ -186,10 +234,6 @@ public class DirectoryFragment extends Fragment { @Override public void onStart() { super.onStart(); - - final Context context = getActivity(); - getDisplayState(this).showSize = SettingsActivity.getDisplayFileSize(context); - getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks); } @@ -207,8 +251,8 @@ public class DirectoryFragment extends Fragment { mListView.smoothScrollToPosition(0); mGridView.smoothScrollToPosition(0); - mListView.setVisibility(state.mode == DisplayState.MODE_LIST ? View.VISIBLE : View.GONE); - mGridView.setVisibility(state.mode == DisplayState.MODE_GRID ? View.VISIBLE : View.GONE); + mListView.setVisibility(state.mode == MODE_LIST ? View.VISIBLE : View.GONE); + mGridView.setVisibility(state.mode == MODE_GRID ? View.VISIBLE : View.GONE); final int choiceMode; if (state.allowMultiple) { @@ -217,7 +261,9 @@ public class DirectoryFragment extends Fragment { choiceMode = ListView.CHOICE_MODE_NONE; } - if (state.mode == DisplayState.MODE_GRID) { + final int thumbSize; + if (state.mode == MODE_GRID) { + thumbSize = getResources().getDimensionPixelSize(R.dimen.grid_width); mListView.setAdapter(null); mListView.setChoiceMode(ListView.CHOICE_MODE_NONE); mGridView.setAdapter(mAdapter); @@ -225,7 +271,8 @@ public class DirectoryFragment extends Fragment { mGridView.setNumColumns(GridView.AUTO_FIT); mGridView.setChoiceMode(choiceMode); mCurrentView = mGridView; - } else if (state.mode == DisplayState.MODE_LIST) { + } else if (state.mode == MODE_LIST) { + thumbSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); mGridView.setAdapter(null); mGridView.setChoiceMode(ListView.CHOICE_MODE_NONE); mListView.setAdapter(mAdapter); @@ -234,13 +281,17 @@ public class DirectoryFragment extends Fragment { } else { throw new IllegalStateException(); } + + mThumbSize = new Point(thumbSize, thumbSize); } private OnItemClickListener mItemListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Document doc = mAdapter.getItem(position); - ((DocumentsActivity) getActivity()).onDocumentPicked(doc); + if (mFilter.apply(doc)) { + ((DocumentsActivity) getActivity()).onDocumentPicked(doc); + } } }; @@ -253,26 +304,45 @@ public class DirectoryFragment extends Fragment { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + final DisplayState state = getDisplayState(DirectoryFragment.this); + + final MenuItem open = menu.findItem(R.id.menu_open); + final MenuItem share = menu.findItem(R.id.menu_share); + final MenuItem delete = menu.findItem(R.id.menu_delete); + + final boolean manageMode = state.action == ACTION_MANAGE; + open.setVisible(!manageMode); + share.setVisible(manageMode); + delete.setVisible(manageMode); + return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (item.getItemId() == R.id.menu_open) { - final Uri uri = getArguments().getParcelable(EXTRA_URI); - final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions(); - final ArrayList<Document> docs = Lists.newArrayList(); - - final int size = checked.size(); - for (int i = 0; i < size; i++) { - if (checked.valueAt(i)) { - final Document doc = mAdapter.getItem(checked.keyAt(i)); - docs.add(doc); - } + final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions(); + final ArrayList<Document> docs = Lists.newArrayList(); + final int size = checked.size(); + for (int i = 0; i < size; i++) { + if (checked.valueAt(i)) { + final Document doc = mAdapter.getItem(checked.keyAt(i)); + docs.add(doc); } + } - ((DocumentsActivity) getActivity()).onDocumentsPicked(docs); + final int id = item.getItemId(); + if (id == R.id.menu_open) { + DocumentsActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); return true; + + } else if (id == R.id.menu_share) { + onShareDocuments(docs); + return true; + + } else if (id == R.id.menu_delete) { + onDeleteDocuments(docs); + return true; + } else { return false; } @@ -299,6 +369,58 @@ public class DirectoryFragment extends Fragment { } }; + private void onShareDocuments(List<Document> docs) { + final ArrayList<Uri> uris = Lists.newArrayList(); + for (Document doc : docs) { + uris.add(doc.uri); + } + + final Intent intent; + if (uris.size() > 1) { + intent = new Intent(Intent.ACTION_SEND_MULTIPLE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); + // TODO: find common mimetype + intent.setType("*/*"); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + } else { + intent = new Intent(Intent.ACTION_SEND); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(uris.get(0)); + } + + startActivity(intent); + } + + private void onDeleteDocuments(List<Document> docs) { + final Context context = getActivity(); + final ContentResolver resolver = context.getContentResolver(); + + boolean hadTrouble = false; + for (Document doc : docs) { + if (!doc.isDeleteSupported()) { + Log.w(TAG, "Skipping " + doc); + hadTrouble = true; + continue; + } + + try { + if (resolver.delete(doc.uri, null, null) != 1) { + Log.w(TAG, "Failed to delete " + doc); + hadTrouble = true; + } + } catch (Exception e) { + Log.w(TAG, "Failed to delete " + doc + ": " + e); + hadTrouble = true; + } + } + + if (hadTrouble) { + Toast.makeText(context, R.string.toast_failed_delete, Toast.LENGTH_SHORT).show(); + } + } + private static DisplayState getDisplayState(Fragment fragment) { return ((DocumentsActivity) fragment.getActivity()).getDisplayState(); } @@ -312,7 +434,7 @@ public class DirectoryFragment extends Fragment { public void swapDocuments(List<Document> documents) { mDocuments = documents; - if (documents != null && documents.isEmpty()) { + if (mDocuments != null && mDocuments.isEmpty()) { mEmptyView.setVisibility(View.VISIBLE); } else { mEmptyView.setVisibility(View.GONE); @@ -326,11 +448,15 @@ public class DirectoryFragment extends Fragment { final Context context = parent.getContext(); final DisplayState state = getDisplayState(DirectoryFragment.this); + final RootsCache roots = DocumentsApplication.getRootsCache(context); + final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache( + context, mThumbSize); + if (convertView == null) { final LayoutInflater inflater = LayoutInflater.from(context); - if (state.mode == DisplayState.MODE_LIST) { + if (state.mode == MODE_LIST) { convertView = inflater.inflate(R.layout.item_doc_list, parent, false); - } else if (state.mode == DisplayState.MODE_GRID) { + } else if (state.mode == MODE_GRID) { convertView = inflater.inflate(R.layout.item_doc_grid, parent, false); } else { throw new IllegalStateException(); @@ -347,11 +473,23 @@ public class DirectoryFragment extends Fragment { final TextView date = (TextView) convertView.findViewById(R.id.date); final TextView size = (TextView) convertView.findViewById(R.id.size); + final ThumbnailAsyncTask oldTask = (ThumbnailAsyncTask) icon.getTag(); + if (oldTask != null) { + oldTask.cancel(false); + } + if (doc.isThumbnailSupported()) { - // TODO: load thumbnails async - icon.setImageURI(doc.uri); + final Bitmap cachedResult = thumbs.get(doc.uri); + if (cachedResult != null) { + icon.setImageBitmap(cachedResult); + } else { + final ThumbnailAsyncTask task = new ThumbnailAsyncTask(icon, mThumbSize); + icon.setImageBitmap(null); + icon.setTag(task); + task.execute(doc.uri); + } } else { - icon.setImageDrawable(RootsCache.resolveDocumentIcon( + icon.setImageDrawable(roots.resolveDocumentIcon( context, doc.uri.getAuthority(), doc.mimeType)); } @@ -366,7 +504,7 @@ public class DirectoryFragment extends Fragment { summary.setVisibility(View.INVISIBLE); } } else if (mType == TYPE_RECENT_OPEN) { - final Root root = RootsCache.findRoot(context, doc); + final Root root = roots.findRoot(doc); icon1.setVisibility(View.VISIBLE); icon1.setImageDrawable(root.icon); summary.setText(root.getDirectoryString()); @@ -378,14 +516,15 @@ public class DirectoryFragment extends Fragment { (summary.getVisibility() == View.VISIBLE) ? View.VISIBLE : View.GONE); } - // TODO: omit year from format - date.setText(DateUtils.formatSameDayTime( - doc.lastModified, System.currentTimeMillis(), DateFormat.SHORT, - DateFormat.SHORT)); + if (doc.lastModified == -1) { + date.setText(null); + } else { + date.setText(formatTime(context, doc.lastModified)); + } if (state.showSize) { size.setVisibility(View.VISIBLE); - if (doc.isDirectory()) { + if (doc.isDirectory() || doc.size == -1) { size.setText(null); } else { size.setText(Formatter.formatFileSize(context, doc.size)); @@ -411,16 +550,69 @@ public class DirectoryFragment extends Fragment { public long getItemId(int position) { return getItem(position).uri.hashCode(); } + } + + private static class ThumbnailAsyncTask extends AsyncTask<Uri, Void, Bitmap> { + private final ImageView mTarget; + private final Point mThumbSize; + + public ThumbnailAsyncTask(ImageView target, Point thumbSize) { + mTarget = target; + mThumbSize = thumbSize; + } @Override - public boolean areAllItemsEnabled() { - return false; + protected void onPreExecute() { + mTarget.setTag(this); } @Override - public boolean isEnabled(int position) { - final Document doc = getItem(position); - return mFilter.apply(doc); + protected Bitmap doInBackground(Uri... params) { + final Context context = mTarget.getContext(); + final Uri uri = params[0]; + + Bitmap result = null; + try { + result = DocumentsContract.getThumbnail( + context.getContentResolver(), uri, mThumbSize); + if (result != null) { + final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache( + context, mThumbSize); + thumbs.put(uri, result); + } + } catch (Exception e) { + Log.w(TAG, "Failed to load thumbnail: " + e); + } + return result; + } + + @Override + protected void onPostExecute(Bitmap result) { + if (mTarget.getTag() == this) { + mTarget.setImageBitmap(result); + mTarget.setTag(null); + } + } + } + + private static String formatTime(Context context, long when) { + // TODO: DateUtils should make this easier + Time then = new Time(); + then.set(when); + Time now = new Time(); + now.setToNow(); + + int flags = DateUtils.FORMAT_NO_NOON | DateUtils.FORMAT_NO_MIDNIGHT + | DateUtils.FORMAT_ABBREV_ALL; + + if (then.year != now.year) { + flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; + } else if (then.yearDay != now.yearDay) { + flags |= DateUtils.FORMAT_SHOW_DATE; + } else { + flags |= DateUtils.FORMAT_SHOW_TIME; } + + return DateUtils.formatDateTime(context, when, flags); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 94c2b61..14d6fd5 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -26,6 +26,7 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.CancellationSignal; +import android.provider.DocumentsContract.DocumentColumns; import android.util.Log; import com.android.documentsui.model.Document; @@ -35,12 +36,22 @@ import com.google.android.collect.Lists; import libcore.io.IoUtils; import java.io.FileNotFoundException; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { +class DirectoryResult implements AutoCloseable { + Cursor cursor; + List<Document> contents = Lists.newArrayList(); + Exception e; + + @Override + public void close() throws Exception { + IoUtils.closeQuietly(cursor); + } +} + +public class DirectoryLoader extends UriDerivativeLoader<Uri, DirectoryResult> { private final int mType; private Predicate<Document> mFilter; @@ -55,43 +66,60 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { } @Override - public List<Document> loadInBackground(Uri uri, CancellationSignal signal) { - final ArrayList<Document> result = Lists.newArrayList(); + public DirectoryResult loadInBackground(Uri uri, CancellationSignal signal) { + final DirectoryResult result = new DirectoryResult(); + try { + loadInBackgroundInternal(result, uri, signal); + } catch (Exception e) { + result.e = e; + } + return result; + } - // TODO: send selection and sorting hints to backend + private void loadInBackgroundInternal( + DirectoryResult result, Uri uri, CancellationSignal signal) { final ContentResolver resolver = getContext().getContentResolver(); - final Cursor cursor = resolver.query(uri, null, null, null, null, signal); - try { - while (cursor != null && cursor.moveToNext()) { - Document doc = null; - switch (mType) { - case TYPE_NORMAL: - case TYPE_SEARCH: - doc = Document.fromDirectoryCursor(uri, cursor); - break; - case TYPE_RECENT_OPEN: - try { - doc = Document.fromRecentOpenCursor(resolver, cursor); - } catch (FileNotFoundException e) { - Log.w(TAG, "Failed to find recent: " + e); - } - break; - default: - throw new IllegalArgumentException("Unknown type"); - } - - if (doc != null && (mFilter == null || mFilter.apply(doc))) { - result.add(doc); - } + final Cursor cursor = resolver.query(uri, null, null, null, getQuerySortOrder(), signal); + result.cursor = cursor; + result.cursor.registerContentObserver(mObserver); + + while (cursor.moveToNext()) { + Document doc = null; + switch (mType) { + case TYPE_NORMAL: + case TYPE_SEARCH: + doc = Document.fromDirectoryCursor(uri, cursor); + break; + case TYPE_RECENT_OPEN: + try { + doc = Document.fromRecentOpenCursor(resolver, cursor); + } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to find recent: " + e); + } + break; + default: + throw new IllegalArgumentException("Unknown type"); + } + + if (doc != null && (mFilter == null || mFilter.apply(doc))) { + result.contents.add(doc); } - } finally { - IoUtils.closeQuietly(cursor); } if (mSortOrder != null) { - Collections.sort(result, mSortOrder); + Collections.sort(result.contents, mSortOrder); } + } - return result; + private String getQuerySortOrder() { + if (mSortOrder instanceof Document.DateComparator) { + return DocumentColumns.LAST_MODIFIED + " DESC"; + } else if (mSortOrder instanceof Document.NameComparator) { + return DocumentColumns.DISPLAY_NAME + " ASC"; + } else if (mSortOrder instanceof Document.SizeComparator) { + return DocumentColumns.SIZE + " DESC"; + } else { + return null; + } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java new file mode 100644 index 0000000..72afd9e --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java @@ -0,0 +1,38 @@ +/* + * 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.documentsui; + +import static com.android.documentsui.DocumentsActivity.TAG; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.android.documentsui.model.Root; + +/** + * Handles {@link Root} changes which invalidate cached data. + */ +public class DocumentChangedReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "Regenerating roots cache"); + DocumentsApplication.getRootsCache(context).update(); + // TODO: invalidate cached data in recents provider + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index a536acb..091737d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -16,19 +16,31 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_CREATE; +import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_GET_CONTENT; +import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE; +import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_OPEN; +import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID; +import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_DATE; + import android.app.ActionBar; import android.app.ActionBar.OnNavigationListener; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; +import android.content.ActivityNotFoundException; import android.content.ClipData; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Intent; +import android.content.pm.ResolveInfo; import android.database.Cursor; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; +import android.provider.DocumentsContract; import android.provider.DocumentsContract.DocumentColumns; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; @@ -58,9 +70,6 @@ import java.util.List; public class DocumentsActivity extends Activity { public static final String TAG = "Documents"; - public static final int ACTION_OPEN = 1; - public static final int ACTION_CREATE = 2; - private int mAction; private SearchView mSearchView; @@ -71,6 +80,8 @@ public class DocumentsActivity extends Activity { private final DisplayState mDisplayState = new DisplayState(); + private RootsCache mRoots; + /** Current user navigation stack; empty implies recents. */ private DocumentStack mStack = new DocumentStack(); /** Currently active search, overriding any stack. */ @@ -80,28 +91,38 @@ public class DocumentsActivity extends Activity { public void onCreate(Bundle icicle) { super.onCreate(icicle); + mRoots = DocumentsApplication.getRootsCache(this); + final Intent intent = getIntent(); final String action = intent.getAction(); if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) { mAction = ACTION_OPEN; - mDisplayState.allowMultiple = intent.getBooleanExtra( - Intent.EXTRA_ALLOW_MULTIPLE, false); } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) { mAction = ACTION_CREATE; - mDisplayState.allowMultiple = false; + } else if (Intent.ACTION_GET_CONTENT.equals(action)) { + mAction = ACTION_GET_CONTENT; + } else if (Intent.ACTION_MANAGE_DOCUMENT.equals(action)) { + mAction = ACTION_MANAGE; } - if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) { + // TODO: unify action in single place + mDisplayState.action = mAction; + + if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { + mDisplayState.allowMultiple = intent.getBooleanExtra( + Intent.EXTRA_ALLOW_MULTIPLE, false); + } + + if (mAction == ACTION_MANAGE) { + mDisplayState.acceptMimes = new String[] { "*/*" }; + mDisplayState.allowMultiple = true; + } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) { mDisplayState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES); } else { mDisplayState.acceptMimes = new String[] { intent.getType() }; } - if (MimePredicate.mimeMatches("image/*", mDisplayState.acceptMimes)) { - mDisplayState.mode = DisplayState.MODE_GRID; - } else { - mDisplayState.mode = DisplayState.MODE_LIST; - } + mDisplayState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); setResult(Activity.RESULT_CANCELED); setContentView(R.layout.activity); @@ -112,7 +133,18 @@ public class DocumentsActivity extends Activity { SaveFragment.show(getFragmentManager(), mimeType, title); } - RootsFragment.show(getFragmentManager()); + if (mAction == ACTION_GET_CONTENT) { + final Intent moreApps = new Intent(getIntent()); + moreApps.setComponent(null); + moreApps.setPackage(null); + RootsFragment.show(getFragmentManager(), moreApps); + } else if (mAction == ACTION_OPEN || mAction == ACTION_CREATE) { + RootsFragment.show(getFragmentManager(), null); + } + + if (mAction == ACTION_MANAGE) { + mDisplayState.sortOrder = SORT_ORDER_DATE; + } mRootsContainer = findViewById(R.id.container_roots); @@ -124,26 +156,54 @@ public class DocumentsActivity extends Activity { mDrawerLayout.setDrawerListener(mDrawerListener); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); - mDrawerLayout.openDrawer(mRootsContainer); + if (mAction == ACTION_MANAGE) { + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - // Restore last stack for calling package - // TODO: move into async loader - final String packageName = getCallingPackage(); - final Cursor cursor = getContentResolver() - .query(RecentsProvider.buildResume(packageName), null, null, null, null); - try { - if (cursor.moveToFirst()) { - final String raw = cursor.getString( - cursor.getColumnIndex(RecentsProvider.COL_PATH)); - mStack = DocumentStack.deserialize(getContentResolver(), raw); + final Uri rootUri = intent.getData(); + final String authority = rootUri.getAuthority(); + final String rootId = DocumentsContract.getRootId(rootUri); + + final Root root = mRoots.findRoot(authority, rootId); + if (root != null) { + onRootPicked(root, true); + } else { + Log.w(TAG, "Failed to find root: " + rootUri); + finish(); } - } catch (FileNotFoundException e) { - Log.w(TAG, "Failed to resume", e); - } finally { - cursor.close(); + + } else { + mDrawerLayout.openDrawer(mRootsContainer); + + // Restore last stack for calling package + // TODO: move into async loader + final String packageName = getCallingPackage(); + final Cursor cursor = getContentResolver() + .query(RecentsProvider.buildResume(packageName), null, null, null, null); + try { + if (cursor.moveToFirst()) { + final String raw = cursor.getString( + cursor.getColumnIndex(RecentsProvider.COL_PATH)); + mStack = DocumentStack.deserialize(getContentResolver(), raw); + } + } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to resume", e); + } finally { + cursor.close(); + } + + onCurrentDirectoryChanged(); } + } - onCurrentDirectoryChanged(); + @Override + public void onStart() { + super.onStart(); + + if (mAction == ACTION_MANAGE) { + mDisplayState.showSize = true; + } else { + mDisplayState.showSize = SettingsActivity.getDisplayFileSize(this); + } } private DrawerListener mDrawerListener = new DrawerListener() { @@ -180,18 +240,20 @@ public class DocumentsActivity extends Activity { final ActionBar actionBar = getActionBar(); actionBar.setDisplayShowHomeEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(true); if (mDrawerLayout.isDrawerOpen(mRootsContainer)) { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setIcon(new ColorDrawable()); - if (mAction == ACTION_OPEN) { + if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { actionBar.setTitle(R.string.title_open); } else if (mAction == ACTION_CREATE) { actionBar.setTitle(R.string.title_save); } + actionBar.setDisplayHomeAsUpEnabled(true); + mDrawerToggle.setDrawerIndicatorEnabled(true); + } else { final Root root = getCurrentRoot(); actionBar.setIcon(root != null ? root.icon : null); @@ -207,8 +269,13 @@ public class DocumentsActivity extends Activity { } if (mStack.size() > 1) { + actionBar.setDisplayHomeAsUpEnabled(true); + mDrawerToggle.setDrawerIndicatorEnabled(false); + } else if (mAction == ACTION_MANAGE) { + actionBar.setDisplayHomeAsUpEnabled(false); mDrawerToggle.setDrawerIndicatorEnabled(false); } else { + actionBar.setDisplayHomeAsUpEnabled(true); mDrawerToggle.setDrawerIndicatorEnabled(true); } } @@ -259,9 +326,10 @@ public class DocumentsActivity extends Activity { final MenuItem search = menu.findItem(R.id.menu_search); final MenuItem grid = menu.findItem(R.id.menu_grid); final MenuItem list = menu.findItem(R.id.menu_list); + final MenuItem settings = menu.findItem(R.id.menu_settings); - grid.setVisible(mDisplayState.mode != DisplayState.MODE_GRID); - list.setVisible(mDisplayState.mode != DisplayState.MODE_LIST); + grid.setVisible(mDisplayState.mode != MODE_GRID); + list.setVisible(mDisplayState.mode != MODE_LIST); final boolean searchVisible; if (mAction == ACTION_CREATE) { @@ -283,6 +351,8 @@ public class DocumentsActivity extends Activity { // TODO: close any search in-progress when hiding search.setVisible(searchVisible); + settings.setVisible(mAction != ACTION_MANAGE); + return true; } @@ -302,12 +372,14 @@ public class DocumentsActivity extends Activity { } else if (id == R.id.menu_search) { return false; } else if (id == R.id.menu_grid) { - mDisplayState.mode = DisplayState.MODE_GRID; + // TODO: persist explicit user mode for cwd + mDisplayState.mode = MODE_GRID; updateDisplayState(); invalidateOptionsMenu(); return true; } else if (id == R.id.menu_list) { - mDisplayState.mode = DisplayState.MODE_LIST; + // TODO: persist explicit user mode for cwd + mDisplayState.mode = MODE_LIST; updateDisplayState(); invalidateOptionsMenu(); return true; @@ -408,9 +480,9 @@ public class DocumentsActivity extends Activity { public Root getCurrentRoot() { final Document cwd = getCurrentDirectory(); if (cwd != null) { - return RootsCache.findRoot(this, cwd); + return mRoots.findRoot(cwd); } else { - return RootsCache.getRecentsRoot(this); + return mRoots.getRecentsRoot(); } } @@ -484,27 +556,55 @@ public class DocumentsActivity extends Activity { } } + public void onAppPicked(ResolveInfo info) { + final Intent intent = new Intent(getIntent()); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + intent.setComponent(new ComponentName( + info.activityInfo.applicationInfo.packageName, info.activityInfo.name)); + startActivity(intent); + finish(); + } + public void onDocumentPicked(Document doc) { final FragmentManager fm = getFragmentManager(); if (doc.isDirectory()) { + // TODO: query display mode user preference for this dir + if (doc.isGridPreferred()) { + mDisplayState.mode = MODE_GRID; + } else { + mDisplayState.mode = MODE_LIST; + } mStack.push(doc); onCurrentDirectoryChanged(); - } else if (mAction == ACTION_OPEN) { + } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { // Explicit file picked, return onFinished(doc.uri); } else if (mAction == ACTION_CREATE) { // Replace selected file SaveFragment.get(fm).setReplaceTarget(doc); + } else if (mAction == ACTION_MANAGE) { + // Open the document + // TODO: trampoline activity for launching downloaded APKs + final Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.setData(doc.uri); + try { + startActivity(intent); + } catch (ActivityNotFoundException ex) { + Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); + } } } public void onDocumentsPicked(List<Document> docs) { - final int size = docs.size(); - final Uri[] uris = new Uri[size]; - for (int i = 0; i < size; i++) { - uris[i] = docs.get(i).uri; + if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { + final int size = docs.size(); + final Uri[] uris = new Uri[size]; + for (int i = 0; i < size; i++) { + uris[i] = docs.get(i).uri; + } + onFinished(uris); } - onFinished(uris); } public void onSaveRequested(Document replaceTarget) { @@ -538,7 +638,7 @@ public class DocumentsActivity extends Activity { values.put(RecentsProvider.COL_PATH, rawStack); resolver.insert(RecentsProvider.buildRecentCreate(), values); - } else if (mAction == ACTION_OPEN) { + } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) { // Remember opened items for (Uri uri : uris) { values.clear(); @@ -565,21 +665,31 @@ public class DocumentsActivity extends Activity { intent.setClipData(clipData); } - // TODO: omit WRITE and PERSIST for GET_CONTENT - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); + if (mAction == ACTION_GET_CONTENT) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION + | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); + } setResult(Activity.RESULT_OK, intent); finish(); } public static class DisplayState { + public int action; public int mode = MODE_LIST; public String[] acceptMimes; public int sortOrder = SORT_ORDER_NAME; public boolean allowMultiple = false; public boolean showSize = false; + public boolean localOnly = false; + + public static final int ACTION_OPEN = 1; + public static final int ACTION_CREATE = 2; + public static final int ACTION_GET_CONTENT = 3; + public static final int ACTION_MANAGE = 4; public static final int MODE_LIST = 0; public static final int MODE_GRID = 1; diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java new file mode 100644 index 0000000..0a6cbc0 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.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 com.android.documentsui; + +import android.app.ActivityManager; +import android.app.Application; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Point; + +public class DocumentsApplication extends Application { + private RootsCache mRoots; + private Point mThumbnailsSize; + private ThumbnailCache mThumbnails; + + public static RootsCache getRootsCache(Context context) { + return ((DocumentsApplication) context.getApplicationContext()).mRoots; + } + + public static ThumbnailCache getThumbnailsCache(Context context, Point size) { + final DocumentsApplication app = (DocumentsApplication) context.getApplicationContext(); + final ThumbnailCache thumbnails = app.mThumbnails; + if (!size.equals(app.mThumbnailsSize)) { + thumbnails.evictAll(); + app.mThumbnailsSize = size; + } + return thumbnails; + } + + @Override + public void onCreate() { + final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024; + + mRoots = new RootsCache(this); + mThumbnails = new ThumbnailCache(memoryClassBytes / 4); + + final IntentFilter packageFilter = new IntentFilter(); + packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); + packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); + packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); + packageFilter.addDataScheme("package"); + registerReceiver(mPackageReceiver, packageFilter); + } + + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + + if (level >= TRIM_MEMORY_MODERATE) { + mThumbnails.evictAll(); + } else if (level >= TRIM_MEMORY_BACKGROUND) { + mThumbnails.trimToSize(mThumbnails.size() / 2); + } + } + + private BroadcastReceiver mPackageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // TODO: narrow changed/removed to only packages that have backends + mRoots.update(); + } + }; +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java index f945c6a0..a9929de 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java +++ b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java @@ -49,7 +49,9 @@ public class MimePredicate implements Predicate<Document> { } public static boolean mimeMatches(String filter, String test) { - if (filter.equals(test)) { + if (test == null) { + return false; + } else if (filter.equals(test)) { return true; } else if ("*/*".equals(filter)) { return true; diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java index 5cdc915..5466dbf 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java @@ -124,7 +124,7 @@ public class RecentsCreateFragment extends Fragment { } }; - public static class RecentsCreateLoader extends UriDerivativeLoader<List<DocumentStack>> { + public static class RecentsCreateLoader extends UriDerivativeLoader<Uri, List<DocumentStack>> { public RecentsCreateLoader(Context context) { super(context, RecentsProvider.buildRecentCreate()); } @@ -169,6 +169,7 @@ public class RecentsCreateFragment extends Fragment { @Override public View getView(int position, View convertView, ViewGroup parent) { final Context context = parent.getContext(); + final RootsCache roots = DocumentsApplication.getRootsCache(context); if (convertView == null) { final LayoutInflater inflater = LayoutInflater.from(context); @@ -180,7 +181,7 @@ public class RecentsCreateFragment extends Fragment { final View summaryList = convertView.findViewById(R.id.summary_list); final DocumentStack stack = getItem(position); - final Root root = RootsCache.findRoot(context, stack.peek()); + final Root root = roots.findRoot(stack.peek()); icon.setImageDrawable(root != null ? root.icon : null); final StringBuilder builder = new StringBuilder(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java index 5268c1d..dbcb039 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java @@ -129,11 +129,11 @@ public class RecentsProvider extends ContentProvider { switch (sMatcher.match(uri)) { case URI_RECENT_OPEN: { return db.query(TABLE_RECENT_OPEN, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, sortOrder); + buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); } case URI_RECENT_CREATE: { return db.query(TABLE_RECENT_CREATE, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, sortOrder); + buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); } case URI_RESUME: { final String packageName = uri.getPathSegments().get(1); diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index b26db3b..c3b498e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -27,6 +27,7 @@ import android.database.Cursor; import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.DocumentsContract; +import android.provider.DocumentsContract.Documents; import android.util.Log; import android.util.Pair; @@ -49,106 +50,110 @@ import java.util.List; public class RootsCache { // TODO: cache roots in local provider to avoid spinning up backends + // TODO: root updates should trigger UI refresh - private static boolean sCached = false; + private final Context mContext; /** Map from authority to cached info */ - private static HashMap<String, DocumentsProviderInfo> sProviders = Maps.newHashMap(); + private HashMap<String, DocumentsProviderInfo> mProviders = Maps.newHashMap(); /** Map from (authority+rootId) to cached info */ - private static HashMap<Pair<String, String>, Root> sRoots = Maps.newHashMap(); + private HashMap<Pair<String, String>, Root> mRoots = Maps.newHashMap(); - public static ArrayList<Root> sRootsList = Lists.newArrayList(); + public ArrayList<Root> mRootsList = Lists.newArrayList(); - private static Root sRecentsRoot; + private Root mRecentsRoot; + + public RootsCache(Context context) { + mContext = context; + update(); + } /** * Gather roots from all known storage providers. */ - private static void ensureCache(Context context) { - if (sCached) return; - sCached = true; - - sProviders.clear(); - sRoots.clear(); - sRootsList.clear(); + @GuardedBy("ActivityThread") + public void update() { + mProviders.clear(); + mRoots.clear(); + mRootsList.clear(); { // Create special root for recents - final Root root = Root.buildRecents(context); - sRootsList.add(root); - sRecentsRoot = root; + final Root root = Root.buildRecents(mContext); + mRootsList.add(root); + mRecentsRoot = root; } // Query for other storage backends - final PackageManager pm = context.getPackageManager(); + final PackageManager pm = mContext.getPackageManager(); final List<ProviderInfo> providers = pm.queryContentProviders( null, -1, PackageManager.GET_META_DATA); for (ProviderInfo providerInfo : providers) { if (providerInfo.metaData != null && providerInfo.metaData.containsKey( DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) { final DocumentsProviderInfo info = DocumentsProviderInfo.parseInfo( - context, providerInfo); + mContext, providerInfo); if (info == null) { Log.w(TAG, "Missing info for " + providerInfo); continue; } - sProviders.put(info.providerInfo.authority, info); + mProviders.put(info.providerInfo.authority, info); - // TODO: remove deprecated customRoots flag - // TODO: populate roots on background thread, and cache results - final Uri uri = DocumentsContract.buildRootsUri(providerInfo.authority); - final Cursor cursor = context.getContentResolver() - .query(uri, null, null, null, null); try { - while (cursor.moveToNext()) { - final Root root = Root.fromCursor(context, info, cursor); - sRoots.put(Pair.create(info.providerInfo.authority, root.rootId), root); - sRootsList.add(root); + // TODO: remove deprecated customRoots flag + // TODO: populate roots on background thread, and cache results + final Uri uri = DocumentsContract.buildRootsUri(providerInfo.authority); + final Cursor cursor = mContext.getContentResolver() + .query(uri, null, null, null, null); + try { + while (cursor.moveToNext()) { + final Root root = Root.fromCursor(mContext, info, cursor); + mRoots.put(Pair.create(info.providerInfo.authority, root.rootId), root); + mRootsList.add(root); + } + } finally { + cursor.close(); } - } finally { - cursor.close(); + } catch (Exception e) { + Log.w(TAG, "Failed to load some roots from " + info.providerInfo.authority + + ": " + e); } } } } @GuardedBy("ActivityThread") - public static DocumentsProviderInfo findProvider(Context context, String authority) { - ensureCache(context); - return sProviders.get(authority); + public DocumentsProviderInfo findProvider(String authority) { + return mProviders.get(authority); } @GuardedBy("ActivityThread") - public static Root findRoot(Context context, String authority, String rootId) { - ensureCache(context); - return sRoots.get(Pair.create(authority, rootId)); + public Root findRoot(String authority, String rootId) { + return mRoots.get(Pair.create(authority, rootId)); } @GuardedBy("ActivityThread") - public static Root findRoot(Context context, Document doc) { + public Root findRoot(Document doc) { final String authority = doc.uri.getAuthority(); final String rootId = DocumentsContract.getRootId(doc.uri); - return findRoot(context, authority, rootId); + return findRoot(authority, rootId); } @GuardedBy("ActivityThread") - public static Root getRecentsRoot(Context context) { - ensureCache(context); - return sRecentsRoot; + public Root getRecentsRoot() { + return mRecentsRoot; } @GuardedBy("ActivityThread") - public static Collection<Root> getRoots(Context context) { - ensureCache(context); - return sRootsList; + public Collection<Root> getRoots() { + return mRootsList; } @GuardedBy("ActivityThread") - public static Drawable resolveDocumentIcon(Context context, String authority, String mimeType) { + public Drawable resolveDocumentIcon(Context context, String authority, String mimeType) { // Custom icons take precedence - ensureCache(context); - final DocumentsProviderInfo info = sProviders.get(authority); + final DocumentsProviderInfo info = mProviders.get(authority); if (info != null) { for (Icon icon : info.customIcons) { if (MimePredicate.mimeMatches(icon.mimeType, mimeType)) { @@ -157,7 +162,7 @@ public class RootsCache { } } - if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType)) { + if (Documents.MIME_TYPE_DIR.equals(mimeType)) { return context.getResources().getDrawable(R.drawable.ic_dir); } else { final PackageManager pm = context.getPackageManager(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index 427ad42..8a48e2a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -22,8 +22,11 @@ import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Bundle; -import android.provider.DocumentsContract; +import android.provider.DocumentsContract.Roots; import android.text.format.Formatter; import android.util.Log; import android.view.LayoutInflater; @@ -41,6 +44,7 @@ import com.android.documentsui.model.Root; import com.android.documentsui.model.Root.RootComparator; import java.util.Collection; +import java.util.List; /** * Display list of known storage backend roots. @@ -50,8 +54,14 @@ public class RootsFragment extends Fragment { private ListView mList; private SectionedRootsAdapter mAdapter; - public static void show(FragmentManager fm) { + private static final String EXTRA_INCLUDE_APPS = "includeApps"; + + public static void show(FragmentManager fm, Intent includeApps) { + final Bundle args = new Bundle(); + args.putParcelable(EXTRA_INCLUDE_APPS, includeApps); + final RootsFragment fragment = new RootsFragment(); + fragment.setArguments(args); final FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.container_roots, fragment); @@ -66,14 +76,15 @@ public class RootsFragment extends Fragment { public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final Context context = inflater.getContext(); + final RootsCache roots = DocumentsApplication.getRootsCache(context); final View view = inflater.inflate(R.layout.fragment_roots, container, false); mList = (ListView) view.findViewById(android.R.id.list); - - mAdapter = new SectionedRootsAdapter(context, RootsCache.getRoots(context)); - mList.setAdapter(mAdapter); mList.setOnItemClickListener(mItemListener); + final Intent includeApps = getArguments().getParcelable(EXTRA_INCLUDE_APPS); + mAdapter = new SectionedRootsAdapter(context, roots.getRoots(), includeApps); + return view; } @@ -82,18 +93,26 @@ public class RootsFragment extends Fragment { super.onStart(); final Context context = getActivity(); - mAdapter.setShowAdvanced(SettingsActivity.getDisplayAdvancedDevices(context)); + mAdapter.updateVisible(SettingsActivity.getDisplayAdvancedDevices(context)); + mList.setAdapter(mAdapter); } private OnItemClickListener mItemListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - final Root root = (Root) mAdapter.getItem(position); - ((DocumentsActivity) getActivity()).onRootPicked(root, true); + final DocumentsActivity activity = DocumentsActivity.get(RootsFragment.this); + final Object item = mAdapter.getItem(position); + if (item instanceof Root) { + activity.onRootPicked((Root) item, true); + } else if (item instanceof ResolveInfo) { + activity.onAppPicked((ResolveInfo) item); + } else { + throw new IllegalStateException("Unknown root: " + item); + } } }; - public static class RootsAdapter extends ArrayAdapter<Root> implements SectionAdapter { + private static class RootsAdapter extends ArrayAdapter<Root> implements SectionAdapter { private int mHeaderId; public RootsAdapter(Context context, int headerId) { @@ -119,8 +138,8 @@ public class RootsFragment extends Fragment { // Device summary is always available space final String summaryText; - if ((root.rootType == DocumentsContract.ROOT_TYPE_DEVICE - || root.rootType == DocumentsContract.ROOT_TYPE_DEVICE_ADVANCED) + if ((root.rootType == Roots.ROOT_TYPE_DEVICE + || root.rootType == Roots.ROOT_TYPE_DEVICE_ADVANCED) && root.availableBytes >= 0) { summaryText = context.getString(R.string.root_available_bytes, Formatter.formatFileSize(context, root.availableBytes)); @@ -148,37 +167,94 @@ public class RootsFragment extends Fragment { } } - public static class SectionedRootsAdapter extends SectionedListAdapter { + private static class AppsAdapter extends ArrayAdapter<ResolveInfo> implements SectionAdapter { + public AppsAdapter(Context context) { + super(context, 0); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final Context context = parent.getContext(); + final PackageManager pm = context.getPackageManager(); + if (convertView == null) { + convertView = LayoutInflater.from(context) + .inflate(R.layout.item_root, parent, false); + } + + final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); + final TextView title = (TextView) convertView.findViewById(android.R.id.title); + final TextView summary = (TextView) convertView.findViewById(android.R.id.summary); + + final ResolveInfo info = getItem(position); + icon.setImageDrawable(info.loadIcon(pm)); + title.setText(info.loadLabel(pm)); + + // TODO: match existing summary behavior from disambig dialog + summary.setVisibility(View.GONE); + + return convertView; + } + + @Override + public View getHeaderView(View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_root_header, parent, false); + } + + final TextView title = (TextView) convertView.findViewById(android.R.id.title); + title.setText(R.string.root_type_apps); + + return convertView; + } + } + + private static class SectionedRootsAdapter extends SectionedListAdapter { private final RootsAdapter mServices; private final RootsAdapter mShortcuts; private final RootsAdapter mDevices; private final RootsAdapter mDevicesAdvanced; + private final AppsAdapter mApps; - public SectionedRootsAdapter(Context context, Collection<Root> roots) { + public SectionedRootsAdapter(Context context, Collection<Root> roots, Intent includeApps) { mServices = new RootsAdapter(context, R.string.root_type_service); mShortcuts = new RootsAdapter(context, R.string.root_type_shortcut); mDevices = new RootsAdapter(context, R.string.root_type_device); mDevicesAdvanced = new RootsAdapter(context, R.string.root_type_device); + mApps = new AppsAdapter(context); for (Root root : roots) { Log.d(TAG, "Found rootType=" + root.rootType); switch (root.rootType) { - case DocumentsContract.ROOT_TYPE_SERVICE: + case Roots.ROOT_TYPE_SERVICE: mServices.add(root); break; - case DocumentsContract.ROOT_TYPE_SHORTCUT: + case Roots.ROOT_TYPE_SHORTCUT: mShortcuts.add(root); break; - case DocumentsContract.ROOT_TYPE_DEVICE: + case Roots.ROOT_TYPE_DEVICE: mDevices.add(root); mDevicesAdvanced.add(root); break; - case DocumentsContract.ROOT_TYPE_DEVICE_ADVANCED: + case Roots.ROOT_TYPE_DEVICE_ADVANCED: mDevicesAdvanced.add(root); break; } } + if (includeApps != null) { + final PackageManager pm = context.getPackageManager(); + final List<ResolveInfo> infos = pm.queryIntentActivities( + includeApps, PackageManager.MATCH_DEFAULT_ONLY); + + // Omit ourselves from the list + for (ResolveInfo info : infos) { + if (!context.getPackageName().equals(info.activityInfo.packageName)) { + mApps.add(info); + } + } + } + final RootComparator comp = new RootComparator(); mServices.sort(comp); mShortcuts.sort(comp); @@ -186,7 +262,7 @@ public class RootsFragment extends Fragment { mDevicesAdvanced.sort(comp); } - public void setShowAdvanced(boolean showAdvanced) { + public void updateVisible(boolean showAdvanced) { clearSections(); if (mServices.getCount() > 0) { addSection(mServices); @@ -199,6 +275,10 @@ public class RootsFragment extends Fragment { if (devices.getCount() > 0) { addSection(devices); } + + if (mApps.getCount() > 0) { + addSection(mApps); + } } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java index 69010dd..8eb81b8 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java @@ -68,11 +68,12 @@ public class SaveFragment extends Fragment { public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final Context context = inflater.getContext(); + final RootsCache roots = DocumentsApplication.getRootsCache(context); final View view = inflater.inflate(R.layout.fragment_save, container, false); final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); - icon.setImageDrawable(RootsCache.resolveDocumentIcon( + icon.setImageDrawable(roots.resolveDocumentIcon( context, null, getArguments().getString(EXTRA_MIME_TYPE))); mDisplayName = (EditText) view.findViewById(android.R.id.title); diff --git a/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java index aacce65..088e3fa 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java +++ b/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java @@ -18,6 +18,7 @@ package com.android.documentsui; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListAdapter; @@ -41,6 +42,11 @@ public class SectionedListAdapter extends BaseAdapter { notifyDataSetChanged(); } + /** + * After mutating sections, you <em>must</em> + * {@link AdapterView#setAdapter(android.widget.Adapter)} to correctly + * recount view types. + */ public void addSection(SectionAdapter adapter) { mSections.add(adapter); notifyDataSetChanged(); @@ -117,7 +123,7 @@ public class SectionedListAdapter extends BaseAdapter { if (position == 0) { return false; } else if (position < sectionSize) { - return section.isEnabled(position); + return section.isEnabled(position - 1); } // Otherwise jump into next section diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java index a086a43..f6548e8 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java @@ -60,6 +60,7 @@ public class TestActivity extends Activity { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); if (multiple.isChecked()) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); @@ -75,6 +76,7 @@ public class TestActivity extends Activity { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); if (multiple.isChecked()) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); @@ -90,6 +92,7 @@ public class TestActivity extends Activity { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] { "text/plain", "application/msword" }); @@ -107,6 +110,7 @@ public class TestActivity extends Activity { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TITLE, "foobar.txt"); startActivityForResult(intent, 42); @@ -114,6 +118,22 @@ public class TestActivity extends Activity { }); view.addView(button); + button = new Button(context); + button.setText("GET_CONTENT */*"); + button.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + if (multiple.isChecked()) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + startActivityForResult(Intent.createChooser(intent, "Kittens!"), 42); + } + }); + view.addView(button); + mResult = new TextView(context); view.addView(mResult); @@ -131,7 +151,7 @@ public class TestActivity extends Activity { is = getContentResolver().openInputStream(uri); final int length = Streams.readFullyNoClose(is).length; Log.d(TAG, "read length=" + length); - } catch (IOException e) { + } catch (Exception e) { Log.w(TAG, "Failed to read " + uri, e); } finally { IoUtils.closeQuietly(is); diff --git a/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java b/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java new file mode 100644 index 0000000..ad7cbf6 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java @@ -0,0 +1,32 @@ +/* + * 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.documentsui; + +import android.graphics.Bitmap; +import android.net.Uri; +import android.util.LruCache; + +public class ThumbnailCache extends LruCache<Uri, Bitmap> { + public ThumbnailCache(int maxSizeBytes) { + super(maxSizeBytes); + } + + @Override + protected int sizeOf(Uri key, Bitmap value) { + return value.getByteCount(); + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java b/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java index 1b88af4..1a5bb0c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java @@ -19,7 +19,6 @@ package com.android.documentsui; import android.content.AsyncTaskLoader; import android.content.Context; import android.database.ContentObserver; -import android.net.Uri; import android.os.CancellationSignal; import android.os.OperationCanceledException; @@ -28,17 +27,16 @@ import android.os.OperationCanceledException; * changes while started, manages {@link CancellationSignal}, and caches * returned results. */ -public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { - private final ForceLoadContentObserver mObserver; - private boolean mObserving; +public abstract class UriDerivativeLoader<P, R> extends AsyncTaskLoader<R> { + final ForceLoadContentObserver mObserver; - private final Uri mUri; + private final P mParam; - private T mResult; + private R mResult; private CancellationSignal mCancellationSignal; @Override - public final T loadInBackground() { + public final R loadInBackground() { synchronized (this) { if (isLoadInBackgroundCanceled()) { throw new OperationCanceledException(); @@ -46,7 +44,7 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { mCancellationSignal = new CancellationSignal(); } try { - return loadInBackground(mUri, mCancellationSignal); + return loadInBackground(mParam, mCancellationSignal); } finally { synchronized (this) { mCancellationSignal = null; @@ -54,7 +52,7 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { } } - public abstract T loadInBackground(Uri uri, CancellationSignal signal); + public abstract R loadInBackground(P param, CancellationSignal signal); @Override public void cancelLoadInBackground() { @@ -68,12 +66,12 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { } @Override - public void deliverResult(T result) { + public void deliverResult(R result) { if (isReset()) { closeQuietly(result); return; } - T oldResult = mResult; + R oldResult = mResult; mResult = result; if (isStarted()) { @@ -85,18 +83,14 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { } } - public UriDerivativeLoader(Context context, Uri uri) { + public UriDerivativeLoader(Context context, P param) { super(context); mObserver = new ForceLoadContentObserver(); - mUri = uri; + mParam = param; } @Override protected void onStartLoading() { - if (!mObserving) { - getContext().getContentResolver().registerContentObserver(mUri, false, mObserver); - mObserving = true; - } if (mResult != null) { deliverResult(mResult); } @@ -111,7 +105,7 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { } @Override - public void onCanceled(T result) { + public void onCanceled(R result) { closeQuietly(result); } @@ -125,13 +119,10 @@ public abstract class UriDerivativeLoader<T> extends AsyncTaskLoader<T> { closeQuietly(mResult); mResult = null; - if (mObserving) { - getContext().getContentResolver().unregisterContentObserver(mObserver); - mObserving = false; - } + getContext().getContentResolver().unregisterContentObserver(mObserver); } - private void closeQuietly(T result) { + private void closeQuietly(R result) { if (result instanceof AutoCloseable) { try { ((AutoCloseable) result).close(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java index 95922b4..c0f21cb 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java @@ -21,6 +21,7 @@ import android.database.Cursor; import android.net.Uri; import android.provider.DocumentsContract; import android.provider.DocumentsContract.DocumentColumns; +import android.provider.DocumentsContract.Documents; import com.android.documentsui.RecentsProvider; @@ -87,7 +88,7 @@ public class Document { final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE); final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME); final int flags = getCursorInt(cursor, DocumentColumns.FLAGS) - & DocumentsContract.FLAG_SUPPORTS_THUMBNAIL; + & Documents.FLAG_SUPPORTS_THUMBNAIL; final String summary = getCursorString(cursor, DocumentColumns.SUMMARY); final long size = getCursorLong(cursor, DocumentColumns.SIZE); @@ -127,19 +128,27 @@ public class Document { } public boolean isCreateSupported() { - return (flags & DocumentsContract.FLAG_SUPPORTS_CREATE) != 0; + return (flags & Documents.FLAG_SUPPORTS_CREATE) != 0; } public boolean isSearchSupported() { - return (flags & DocumentsContract.FLAG_SUPPORTS_SEARCH) != 0; + return (flags & Documents.FLAG_SUPPORTS_SEARCH) != 0; } public boolean isThumbnailSupported() { - return (flags & DocumentsContract.FLAG_SUPPORTS_THUMBNAIL) != 0; + return (flags & Documents.FLAG_SUPPORTS_THUMBNAIL) != 0; } public boolean isDirectory() { - return DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType); + return Documents.MIME_TYPE_DIR.equals(mimeType); + } + + public boolean isGridPreferred() { + return (flags & Documents.FLAG_PREFERS_GRID) != 0; + } + + public boolean isDeleteSupported() { + return (flags & Documents.FLAG_SUPPORTS_DELETE) != 0; } private static String getCursorString(Cursor cursor, String columnName) { @@ -147,9 +156,19 @@ public class Document { return (index != -1) ? cursor.getString(index) : null; } + /** + * Missing or null values are returned as -1. + */ private static long getCursorLong(Cursor cursor, String columnName) { final int index = cursor.getColumnIndex(columnName); - return (index != -1) ? cursor.getLong(index) : 0; + if (index == -1) return -1; + final String value = cursor.getString(index); + if (value == null) return -1; + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + return -1; + } } private static int getCursorInt(Cursor cursor, String columnName) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Root.java b/packages/DocumentsUI/src/com/android/documentsui/model/Root.java index 0880731..23d16df 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/Root.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/Root.java @@ -24,7 +24,9 @@ import android.database.Cursor; import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.DocumentsContract; +import android.provider.DocumentsContract.Documents; import android.provider.DocumentsContract.RootColumns; +import android.provider.DocumentsContract.Roots; import com.android.documentsui.R; @@ -47,7 +49,7 @@ public class Root { final PackageManager pm = context.getPackageManager(); final Root root = new Root(); root.rootId = null; - root.rootType = DocumentsContract.ROOT_TYPE_SHORTCUT; + root.rootType = Roots.ROOT_TYPE_SHORTCUT; root.uri = null; root.icon = context.getResources().getDrawable(R.drawable.ic_dir); root.title = context.getString(R.string.root_recent); @@ -65,7 +67,7 @@ public class Root { root.rootId = cursor.getString(cursor.getColumnIndex(RootColumns.ROOT_ID)); root.rootType = cursor.getInt(cursor.getColumnIndex(RootColumns.ROOT_TYPE)); root.uri = DocumentsContract.buildDocumentUri( - info.providerInfo.authority, root.rootId, DocumentsContract.ROOT_DOC_ID); + info.providerInfo.authority, root.rootId, Documents.DOC_ID_ROOT); root.icon = info.providerInfo.loadIcon(pm); root.title = info.providerInfo.loadLabel(pm).toString(); root.availableBytes = cursor.getLong(cursor.getColumnIndex(RootColumns.AVAILABLE_BYTES)); diff --git a/packages/ExternalStorageProvider/AndroidManifest.xml b/packages/ExternalStorageProvider/AndroidManifest.xml index afdb6bb..8bd2a6d 100644 --- a/packages/ExternalStorageProvider/AndroidManifest.xml +++ b/packages/ExternalStorageProvider/AndroidManifest.xml @@ -7,7 +7,7 @@ <application android:label="@string/app_label"> <provider android:name=".ExternalStorageProvider" - android:authorities="com.android.externalstorage" + android:authorities="com.android.externalstorage.documents" android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> @@ -15,5 +15,18 @@ android:name="android.content.DOCUMENT_PROVIDER" android:resource="@xml/document_provider" /> </provider> + + <!-- TODO: remove when we have real providers --> + <provider + android:name=".CloudTestDocumentsProvider" + android:authorities="com.android.externalstorage.cloudtest" + android:grantUriPermissions="true" + android:exported="true" + android:enabled="false" + android:permission="android.permission.MANAGE_DOCUMENTS"> + <meta-data + android:name="android.content.DOCUMENT_PROVIDER" + android:resource="@xml/document_provider" /> + </provider> </application> </manifest> diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java new file mode 100644 index 0000000..119d92e --- /dev/null +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java @@ -0,0 +1,253 @@ +/* + * 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.externalstorage; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.database.MatrixCursor.RowBuilder; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.ParcelFileDescriptor; +import android.os.SystemClock; +import android.provider.DocumentsContract; +import android.provider.DocumentsContract.DocumentColumns; +import android.provider.DocumentsContract.Documents; +import android.provider.DocumentsContract.RootColumns; +import android.provider.DocumentsContract.Roots; +import android.util.Log; + +import com.google.android.collect.Lists; + +import libcore.io.IoUtils; + +import java.io.FileNotFoundException; +import java.util.List; + +public class CloudTestDocumentsProvider extends ContentProvider { + private static final String TAG = "CloudTest"; + + private static final String AUTHORITY = "com.android.externalstorage.cloudtest"; + + private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); + + private static final int URI_ROOTS = 1; + private static final int URI_ROOTS_ID = 2; + private static final int URI_DOCS_ID = 3; + private static final int URI_DOCS_ID_CONTENTS = 4; + private static final int URI_DOCS_ID_SEARCH = 5; + + static { + sMatcher.addURI(AUTHORITY, "roots", URI_ROOTS); + sMatcher.addURI(AUTHORITY, "roots/*", URI_ROOTS_ID); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*", URI_DOCS_ID); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*/contents", URI_DOCS_ID_CONTENTS); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*/search", URI_DOCS_ID_SEARCH); + } + + private static final String[] ALL_ROOTS_COLUMNS = new String[] { + RootColumns.ROOT_ID, RootColumns.ROOT_TYPE, RootColumns.ICON, RootColumns.TITLE, + RootColumns.SUMMARY, RootColumns.AVAILABLE_BYTES + }; + + private static final String[] ALL_DOCUMENTS_COLUMNS = new String[] { + DocumentColumns.DOC_ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE, + DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, DocumentColumns.FLAGS + }; + + private List<String> mKnownDocs = Lists.newArrayList("meow.png", "kittens.pdf"); + + private int mPage; + + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + switch (sMatcher.match(uri)) { + case URI_ROOTS: { + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_ROOTS_COLUMNS); + includeDefaultRoot(result); + return result; + } + case URI_ROOTS_ID: { + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_ROOTS_COLUMNS); + includeDefaultRoot(result); + return result; + } + case URI_DOCS_ID: { + final String docId = DocumentsContract.getDocId(uri); + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_DOCUMENTS_COLUMNS); + includeDoc(result, docId); + return result; + } + case URI_DOCS_ID_CONTENTS: { + final CloudCursor result = new CloudCursor( + projection != null ? projection : ALL_DOCUMENTS_COLUMNS, uri); + for (String docId : mKnownDocs) { + includeDoc(result, docId); + } + if (mPage < 3) { + result.setHasMore(); + } + result.setNotificationUri(getContext().getContentResolver(), uri); + return result; + } + default: { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } + } + } + + private void includeDefaultRoot(MatrixCursor result) { + final RowBuilder row = result.newRow(); + row.offer(RootColumns.ROOT_ID, "testroot"); + row.offer(RootColumns.ROOT_TYPE, Roots.ROOT_TYPE_SERVICE); + row.offer(RootColumns.TITLE, "_TestTitle"); + row.offer(RootColumns.SUMMARY, "_TestSummary"); + } + + private void includeDoc(MatrixCursor result, String docId) { + int flags = 0; + + final String mimeType; + if (Documents.DOC_ID_ROOT.equals(docId)) { + mimeType = Documents.MIME_TYPE_DIR; + } else { + mimeType = "application/octet-stream"; + } + + final RowBuilder row = result.newRow(); + row.offer(DocumentColumns.DOC_ID, docId); + row.offer(DocumentColumns.DISPLAY_NAME, docId); + row.offer(DocumentColumns.MIME_TYPE, mimeType); + row.offer(DocumentColumns.LAST_MODIFIED, System.currentTimeMillis()); + row.offer(DocumentColumns.FLAGS, flags); + } + + private class CloudCursor extends MatrixCursor { + private final Uri mUri; + private Bundle mExtras = new Bundle(); + + public CloudCursor(String[] columnNames, Uri uri) { + super(columnNames); + mUri = uri; + } + + public void setHasMore() { + mExtras.putBoolean(DocumentsContract.EXTRA_HAS_MORE, true); + } + + @Override + public Bundle getExtras() { + Log.d(TAG, "getExtras() " + mExtras); + return mExtras; + } + + @Override + public Bundle respond(Bundle extras) { + extras.size(); + Log.d(TAG, "respond() " + extras); + if (extras.getBoolean(DocumentsContract.EXTRA_REQUEST_MORE, false)) { + new CloudTask().execute(mUri); + } + return Bundle.EMPTY; + } + } + + private class CloudTask extends AsyncTask<Uri, Void, Void> { + @Override + protected Void doInBackground(Uri... uris) { + final Uri uri = uris[0]; + + SystemClock.sleep(1000); + + // Grab some files from the cloud + for (int i = 0; i < 5; i++) { + mKnownDocs.add("cloud-page" + mPage + "-file" + i); + } + mPage++; + + Log.d(TAG, "Loaded more; notifying " + uri); + getContext().getContentResolver().notifyChange(uri, null, false); + return null; + } + } + + private interface TypeQuery { + final String[] PROJECTION = { + DocumentColumns.MIME_TYPE }; + + final int MIME_TYPE = 0; + } + + @Override + public String getType(Uri uri) { + switch (sMatcher.match(uri)) { + case URI_ROOTS: { + return Roots.MIME_TYPE_DIR; + } + case URI_ROOTS_ID: { + return Roots.MIME_TYPE_ITEM; + } + case URI_DOCS_ID: { + final Cursor cursor = query(uri, TypeQuery.PROJECTION, null, null, null); + try { + if (cursor.moveToFirst()) { + return cursor.getString(TypeQuery.MIME_TYPE); + } else { + return null; + } + } finally { + IoUtils.closeQuietly(cursor); + } + } + default: { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } + } + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + throw new UnsupportedOperationException("Unsupported Uri " + uri); + } +} diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 5c12484..b4bf563 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -22,13 +22,15 @@ import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; +import android.database.MatrixCursor.RowBuilder; import android.net.Uri; import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.provider.BaseColumns; import android.provider.DocumentsContract; import android.provider.DocumentsContract.DocumentColumns; +import android.provider.DocumentsContract.Documents; import android.provider.DocumentsContract.RootColumns; +import android.provider.DocumentsContract.Roots; import android.util.Log; import android.webkit.MimeTypeMap; @@ -43,7 +45,7 @@ import java.util.LinkedList; public class ExternalStorageProvider extends ContentProvider { private static final String TAG = "ExternalStorage"; - private static final String AUTHORITY = "com.android.externalstorage"; + private static final String AUTHORITY = "com.android.externalstorage.documents"; // TODO: support multiple storage devices @@ -55,6 +57,14 @@ public class ExternalStorageProvider extends ContentProvider { private static final int URI_DOCS_ID_CONTENTS = 4; private static final int URI_DOCS_ID_SEARCH = 5; + static { + sMatcher.addURI(AUTHORITY, "roots", URI_ROOTS); + sMatcher.addURI(AUTHORITY, "roots/*", URI_ROOTS_ID); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*", URI_DOCS_ID); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*/contents", URI_DOCS_ID_CONTENTS); + sMatcher.addURI(AUTHORITY, "roots/*/docs/*/search", URI_DOCS_ID_SEARCH); + } + private HashMap<String, Root> mRoots = Maps.newHashMap(); private static class Root { @@ -66,20 +76,22 @@ public class ExternalStorageProvider extends ContentProvider { public File path; } - static { - sMatcher.addURI(AUTHORITY, "roots", URI_ROOTS); - sMatcher.addURI(AUTHORITY, "roots/*", URI_ROOTS_ID); - sMatcher.addURI(AUTHORITY, "roots/*/docs/*", URI_DOCS_ID); - sMatcher.addURI(AUTHORITY, "roots/*/docs/*/contents", URI_DOCS_ID_CONTENTS); - sMatcher.addURI(AUTHORITY, "roots/*/docs/*/search", URI_DOCS_ID_SEARCH); - } + private static final String[] ALL_ROOTS_COLUMNS = new String[] { + RootColumns.ROOT_ID, RootColumns.ROOT_TYPE, RootColumns.ICON, RootColumns.TITLE, + RootColumns.SUMMARY, RootColumns.AVAILABLE_BYTES + }; + + private static final String[] ALL_DOCUMENTS_COLUMNS = new String[] { + DocumentColumns.DOC_ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE, + DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, DocumentColumns.FLAGS + }; @Override public boolean onCreate() { mRoots.clear(); final Root root = new Root(); - root.rootType = DocumentsContract.ROOT_TYPE_DEVICE_ADVANCED; + root.rootType = Roots.ROOT_TYPE_DEVICE_ADVANCED; root.name = "primary"; root.title = getContext().getString(R.string.root_internal_storage); root.path = Environment.getExternalStorageDirectory(); @@ -91,64 +103,59 @@ public class ExternalStorageProvider extends ContentProvider { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - - // TODO: support custom projections - final String[] rootsProjection = new String[] { - BaseColumns._ID, RootColumns.ROOT_ID, RootColumns.ROOT_TYPE, RootColumns.ICON, - RootColumns.TITLE, RootColumns.SUMMARY, RootColumns.AVAILABLE_BYTES }; - final String[] docsProjection = new String[] { - BaseColumns._ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE, - DocumentColumns.DOC_ID, DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, - DocumentColumns.FLAGS }; - switch (sMatcher.match(uri)) { case URI_ROOTS: { - final MatrixCursor cursor = new MatrixCursor(rootsProjection); + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_ROOTS_COLUMNS); for (Root root : mRoots.values()) { - includeRoot(cursor, root); + includeRoot(result, root); } - return cursor; + return result; } case URI_ROOTS_ID: { final Root root = mRoots.get(DocumentsContract.getRootId(uri)); - final MatrixCursor cursor = new MatrixCursor(rootsProjection); - includeRoot(cursor, root); - return cursor; + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_ROOTS_COLUMNS); + includeRoot(result, root); + return result; } case URI_DOCS_ID: { final Root root = mRoots.get(DocumentsContract.getRootId(uri)); final String docId = DocumentsContract.getDocId(uri); - final MatrixCursor cursor = new MatrixCursor(docsProjection); + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_DOCUMENTS_COLUMNS); final File file = docIdToFile(root, docId); - includeFile(cursor, root, file); - return cursor; + includeFile(result, root, file); + return result; } case URI_DOCS_ID_CONTENTS: { final Root root = mRoots.get(DocumentsContract.getRootId(uri)); final String docId = DocumentsContract.getDocId(uri); - final MatrixCursor cursor = new MatrixCursor(docsProjection); + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_DOCUMENTS_COLUMNS); final File parent = docIdToFile(root, docId); for (File file : parent.listFiles()) { - includeFile(cursor, root, file); + includeFile(result, root, file); } - return cursor; + return result; } case URI_DOCS_ID_SEARCH: { final Root root = mRoots.get(DocumentsContract.getRootId(uri)); final String docId = DocumentsContract.getDocId(uri); final String query = DocumentsContract.getSearchQuery(uri).toLowerCase(); - final MatrixCursor cursor = new MatrixCursor(docsProjection); + final MatrixCursor result = new MatrixCursor( + projection != null ? projection : ALL_DOCUMENTS_COLUMNS); final File parent = docIdToFile(root, docId); final LinkedList<File> pending = new LinkedList<File>(); pending.add(parent); - while (!pending.isEmpty() && cursor.getCount() < 20) { + while (!pending.isEmpty() && result.getCount() < 20) { final File file = pending.removeFirst(); if (file.isDirectory()) { for (File child : file.listFiles()) { @@ -156,12 +163,12 @@ public class ExternalStorageProvider extends ContentProvider { } } else { if (file.getName().toLowerCase().contains(query)) { - includeFile(cursor, root, file); + includeFile(result, root, file); } } } - return cursor; + return result; } default: { throw new UnsupportedOperationException("Unsupported Uri " + uri); @@ -173,7 +180,7 @@ public class ExternalStorageProvider extends ContentProvider { String rootPath = root.path.getAbsolutePath(); final String path = file.getAbsolutePath(); if (path.equals(rootPath)) { - return DocumentsContract.ROOT_DOC_ID; + return Documents.DOC_ID_ROOT; } if (!rootPath.endsWith("/")) { @@ -187,55 +194,69 @@ public class ExternalStorageProvider extends ContentProvider { } private File docIdToFile(Root root, String docId) { - if (DocumentsContract.ROOT_DOC_ID.equals(docId)) { + if (Documents.DOC_ID_ROOT.equals(docId)) { return root.path; } else { return new File(root.path, docId); } } - private void includeRoot(MatrixCursor cursor, Root root) { - cursor.addRow(new Object[] { - root.name.hashCode(), root.name, root.rootType, root.icon, root.title, root.summary, - root.path.getFreeSpace() }); + private void includeRoot(MatrixCursor result, Root root) { + final RowBuilder row = result.newRow(); + row.offer(RootColumns.ROOT_ID, root.name); + row.offer(RootColumns.ROOT_TYPE, root.rootType); + row.offer(RootColumns.ICON, root.icon); + row.offer(RootColumns.TITLE, root.title); + row.offer(RootColumns.SUMMARY, root.summary); + row.offer(RootColumns.AVAILABLE_BYTES, root.path.getFreeSpace()); } - private void includeFile(MatrixCursor cursor, Root root, File file) { + private void includeFile(MatrixCursor result, Root root, File file) { int flags = 0; if (file.isDirectory()) { - flags |= DocumentsContract.FLAG_SUPPORTS_SEARCH; + flags |= Documents.FLAG_SUPPORTS_SEARCH; } if (file.isDirectory() && file.canWrite()) { - flags |= DocumentsContract.FLAG_SUPPORTS_CREATE; + flags |= Documents.FLAG_SUPPORTS_CREATE; } if (file.canWrite()) { - flags |= DocumentsContract.FLAG_SUPPORTS_RENAME; - flags |= DocumentsContract.FLAG_SUPPORTS_DELETE; + flags |= Documents.FLAG_SUPPORTS_WRITE; + flags |= Documents.FLAG_SUPPORTS_RENAME; + flags |= Documents.FLAG_SUPPORTS_DELETE; } final String mimeType = getTypeForFile(file); if (mimeType.startsWith("image/")) { - flags |= DocumentsContract.FLAG_SUPPORTS_THUMBNAIL; + flags |= Documents.FLAG_SUPPORTS_THUMBNAIL; } final String docId = fileToDocId(root, file); - final long id = docId.hashCode(); - final String displayName; - if (DocumentsContract.ROOT_DOC_ID.equals(docId)) { + if (Documents.DOC_ID_ROOT.equals(docId)) { displayName = root.title; } else { displayName = file.getName(); } - cursor.addRow(new Object[] { - id, displayName, file.length(), docId, mimeType, file.lastModified(), flags }); + final RowBuilder row = result.newRow(); + row.offer(DocumentColumns.DOC_ID, docId); + row.offer(DocumentColumns.DISPLAY_NAME, displayName); + row.offer(DocumentColumns.SIZE, file.length()); + row.offer(DocumentColumns.MIME_TYPE, mimeType); + row.offer(DocumentColumns.LAST_MODIFIED, file.lastModified()); + row.offer(DocumentColumns.FLAGS, flags); } @Override public String getType(Uri uri) { switch (sMatcher.match(uri)) { + case URI_ROOTS: { + return Roots.MIME_TYPE_DIR; + } + case URI_ROOTS_ID: { + return Roots.MIME_TYPE_ITEM; + } case URI_DOCS_ID: { final Root root = mRoots.get(DocumentsContract.getRootId(uri)); final String docId = DocumentsContract.getDocId(uri); @@ -249,7 +270,7 @@ public class ExternalStorageProvider extends ContentProvider { private String getTypeForFile(File file) { if (file.isDirectory()) { - return DocumentsContract.MIME_TYPE_DIRECTORY; + return Documents.MIME_TYPE_DIR; } else { return getTypeForName(file.getName()); } @@ -299,7 +320,7 @@ public class ExternalStorageProvider extends ContentProvider { values.getAsString(DocumentColumns.DISPLAY_NAME), mimeType); final File file = new File(parent, name); - if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType)) { + if (Documents.MIME_TYPE_DIR.equals(mimeType)) { if (!file.mkdir()) { return null; } @@ -359,7 +380,7 @@ public class ExternalStorageProvider extends ContentProvider { } private String validateDisplayName(String displayName, String mimeType) { - if (DocumentsContract.MIME_TYPE_DIRECTORY.equals(mimeType)) { + if (Documents.MIME_TYPE_DIR.equals(mimeType)) { return displayName; } else { // Try appending meaningful extension if needed diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml index 7d77c48..f3106da 100644 --- a/packages/Keyguard/AndroidManifest.xml +++ b/packages/Keyguard/AndroidManifest.xml @@ -38,6 +38,9 @@ <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> + <!-- Permission for the Hotword detector service --> + <uses-permission android:name="com.google.android.googlequicksearchbox.SEARCH_API" /> + <application android:label="@string/app_name" android:process="com.android.systemui" android:persistent="true" > diff --git a/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java b/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java new file mode 100644 index 0000000..94733d4 --- /dev/null +++ b/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java @@ -0,0 +1,208 @@ +/* + * 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.keyguard; + +import android.app.SearchManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.RemoteException; +import android.os.UserHandle; +import android.util.Log; + +import com.google.android.search.service.IHotwordService; +import com.google.android.search.service.IHotwordServiceCallback; + +/** + * Utility class with its callbacks to simplify usage of {@link IHotwordService}. + * + * The client is meant to be used for a single hotword detection in a session. + * start() -> stop(); client is asked to stop & disconnect from the service. + * start() -> onHotwordDetected(); client disconnects from the service automatically. + */ +public class HotwordServiceClient implements Handler.Callback { + private static final String TAG = "HotwordServiceClient"; + private static final boolean DBG = true; + private static final String ACTION_HOTWORD = + "com.google.android.search.service.IHotwordService"; + + private static final int MSG_SERVICE_CONNECTED = 0; + private static final int MSG_SERVICE_DISCONNECTED = 1; + private static final int MSG_HOTWORD_STARTED = 2; + private static final int MSG_HOTWORD_STOPPED = 3; + private static final int MSG_HOTWORD_DETECTED = 4; + + private final Context mContext; + private final Callback mClientCallback; + private final Handler mHandler; + + private IHotwordService mService; + + public HotwordServiceClient(Context context, Callback callback) { + mContext = context; + mClientCallback = callback; + mHandler = new Handler(this); + } + + public interface Callback { + void onServiceConnected(); + void onServiceDisconnected(); + void onHotwordDetectionStarted(); + void onHotwordDetectionStopped(); + void onHotwordDetected(String action); + } + + /** + * Binds to the {@link IHotwordService} and starts hotword detection + * when the service is connected. + * + * @return false if the service can't be bound to. + */ + public synchronized boolean start() { + if (mService != null) { + if (DBG) Log.d(TAG, "Multiple call to start(), service was already bound"); + return true; + } else { + // TODO: The hotword service is currently hosted within the search app + // so the component handling the assist intent should handle hotwording + // as well. + final Intent intent = + ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); + if (intent == null) { + return false; + } + + Intent hotwordIntent = new Intent(ACTION_HOTWORD); + hotwordIntent.fillIn(intent, Intent.FILL_IN_PACKAGE); + return mContext.bindService( + hotwordIntent, + mConnection, + Context.BIND_AUTO_CREATE); + } + } + + /** + * Unbinds from the the {@link IHotwordService}. + */ + public synchronized void stop() { + if (mService != null) { + mContext.unbindService(mConnection); + mService = null; + } + } + + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_SERVICE_CONNECTED: + handleServiceConnected(); + break; + case MSG_SERVICE_DISCONNECTED: + handleServiceDisconnected(); + break; + case MSG_HOTWORD_STARTED: + handleHotwordDetectionStarted(); + break; + case MSG_HOTWORD_STOPPED: + handleHotwordDetectionStopped(); + break; + case MSG_HOTWORD_DETECTED: + handleHotwordDetected((String) msg.obj); + break; + default: + if (DBG) Log.e(TAG, "Unhandled message"); + return false; + } + return true; + } + + private void handleServiceConnected() { + if (DBG) Log.d(TAG, "handleServiceConnected()"); + if (mClientCallback != null) mClientCallback.onServiceConnected(); + try { + mService.requestHotwordDetection(mServiceCallback); + } catch (RemoteException e) { + Log.e(TAG, "Exception while registering callback", e); + mHandler.sendEmptyMessage(MSG_SERVICE_DISCONNECTED); + } + } + + private void handleServiceDisconnected() { + if (DBG) Log.d(TAG, "handleServiceDisconnected()"); + mService = null; + if (mClientCallback != null) mClientCallback.onServiceDisconnected(); + } + + private void handleHotwordDetectionStarted() { + if (DBG) Log.d(TAG, "handleHotwordDetectionStarted()"); + if (mClientCallback != null) mClientCallback.onHotwordDetectionStarted(); + } + + private void handleHotwordDetectionStopped() { + if (DBG) Log.d(TAG, "handleHotwordDetectionStopped()"); + if (mClientCallback != null) mClientCallback.onHotwordDetectionStopped(); + } + + void handleHotwordDetected(final String action) { + if (DBG) Log.d(TAG, "handleHotwordDetected()"); + if (mClientCallback != null) mClientCallback.onHotwordDetected(action); + stop(); + } + + /** + * Implements service connection methods. + */ + private ServiceConnection mConnection = new ServiceConnection() { + /** + * Called when the service connects after calling bind(). + */ + public void onServiceConnected(ComponentName className, IBinder iservice) { + mService = IHotwordService.Stub.asInterface(iservice); + mHandler.sendEmptyMessage(MSG_SERVICE_CONNECTED); + } + + /** + * Called if the service unexpectedly disconnects. This indicates an error. + */ + public void onServiceDisconnected(ComponentName className) { + mService = null; + mHandler.sendEmptyMessage(MSG_SERVICE_DISCONNECTED); + } + }; + + /** + * Implements the AIDL IHotwordServiceCallback interface. + */ + private final IHotwordServiceCallback mServiceCallback = new IHotwordServiceCallback.Stub() { + + public void onHotwordDetectionStarted() { + mHandler.sendEmptyMessage(MSG_HOTWORD_STARTED); + } + + public void onHotwordDetectionStopped() { + mHandler.sendEmptyMessage(MSG_HOTWORD_STOPPED); + } + + public void onHotwordDetected(String action) { + mHandler.obtainMessage(MSG_HOTWORD_DETECTED, action).sendToTarget(); + } + }; +} diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java index 4d891be..1c658e3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java @@ -22,8 +22,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; +import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; import android.util.Slog; @@ -34,12 +37,15 @@ import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; +import com.android.keyguard.KeyguardHostView.OnDismissAction; public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView { private static final boolean DEBUG = KeyguardHostView.DEBUG; private static final String TAG = "SecuritySelectorView"; private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; + // Flag to enable/disable hotword detection on lock screen. + private static final boolean FLAG_HOTWORD = true; private KeyguardSecurityCallback mCallback; private GlowPadView mGlowPadView; @@ -51,11 +57,15 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri private LockPatternUtils mLockPatternUtils; private SecurityMessageDisplay mSecurityMessageDisplay; private Drawable mBouncerFrame; + private HotwordServiceClient mHotwordClient; OnTriggerListener mOnTriggerListener = new OnTriggerListener() { public void onTrigger(View v, int target) { final int resId = mGlowPadView.getResourceIdForTarget(target); + if (FLAG_HOTWORD) { + maybeStopHotwordDetector(); + } switch (resId) { case R.drawable.ic_action_assist_generic: Intent assistIntent = @@ -103,7 +113,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri }; - KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { + KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override public void onDevicePolicyManagerStateChanged() { @@ -114,6 +124,24 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri public void onSimStateChanged(State simState) { updateTargets(); } + + @Override + public void onPhoneStateChanged(int phoneState) { + if (FLAG_HOTWORD) { + // We need to stop the hotwording when a phone call comes in + // TODO(sansid): This is not really needed if onPause triggers + // when we navigate away from the keyguard + if (phoneState == TelephonyManager.CALL_STATE_RINGING) { + if (DEBUG) Log.d(TAG, "Stopping due to CALL_STATE_RINGING"); + maybeStopHotwordDetector(); + } + } + } + + @Override + public void onUserSwitching(int userId) { + maybeStopHotwordDetector(); + } }; private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { @@ -152,6 +180,9 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame); mBouncerFrame = bouncerFrameView.getBackground(); + if (FLAG_HOTWORD) { + mHotwordClient = new HotwordServiceClient(getContext(), mHotwordCallback); + } } public void setCarrierArea(View carrierArea) { @@ -254,12 +285,22 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri @Override public void onPause() { - KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback); + KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback); } @Override public void onResume(int reason) { - KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback); + KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback); + // TODO: Figure out if there's a better way to do it. + // Right now we don't get onPause at all, and onResume gets called + // multiple times (even when the screen is turned off with VIEW_REVEALED) + if (reason == SCREEN_ON) { + if (!KeyguardUpdateMonitor.getInstance(getContext()).isSwitchingUser()) { + maybeStartHotwordDetector(); + } + } else { + maybeStopHotwordDetector(); + } } @Override @@ -280,4 +321,83 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri KeyguardSecurityViewHelper. hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration); } + + /** + * Start the hotword detector if: + * <li> HOTWORDING_ENABLED is true and + * <li> HotwordUnlock is initialized and + * <li> TelephonyManager is in CALL_STATE_IDLE + * + * If this method is called when the screen is off, + * it attempts to stop hotwording if it's running. + */ + private void maybeStartHotwordDetector() { + if (FLAG_HOTWORD) { + if (DEBUG) Log.d(TAG, "maybeStartHotwordDetector()"); + // Don't start it if the screen is off or not showing + PowerManager powerManager = (PowerManager) getContext().getSystemService( + Context.POWER_SERVICE); + if (!powerManager.isScreenOn()) { + if (DEBUG) Log.d(TAG, "screen was off, not starting"); + return; + } + + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext()); + if (monitor.getPhoneState() != TelephonyManager.CALL_STATE_IDLE) { + if (DEBUG) Log.d(TAG, "Call underway, not starting"); + return; + } + if (!mHotwordClient.start()) { + Log.w(TAG, "Failed to start the hotword detector"); + } + } + } + + /** + * Stop hotword detector if HOTWORDING_ENABLED is true. + */ + private void maybeStopHotwordDetector() { + if (FLAG_HOTWORD) { + if (DEBUG) Log.d(TAG, "maybeStopHotwordDetector()"); + mHotwordClient.stop(); + } + } + + private final HotwordServiceClient.Callback mHotwordCallback = + new HotwordServiceClient.Callback() { + private static final String TAG = "HotwordServiceClient.Callback"; + + @Override + public void onServiceConnected() { + if (DEBUG) Log.d(TAG, "onServiceConnected()"); + } + + @Override + public void onServiceDisconnected() { + if (DEBUG) Log.d(TAG, "onServiceDisconnected()"); + } + + @Override + public void onHotwordDetectionStarted() { + if (DEBUG) Log.d(TAG, "onHotwordDetectionStarted()"); + // TODO: Change the usage of SecurityMessageDisplay to a better visual indication. + mSecurityMessageDisplay.setMessage("\"Ok Google...\"", true); + } + + @Override + public void onHotwordDetectionStopped() { + if (DEBUG) Log.d(TAG, "onHotwordDetectionStopped()"); + // TODO: Change the usage of SecurityMessageDisplay to a better visual indication. + } + + @Override + public void onHotwordDetected(String action) { + if (DEBUG) Log.d(TAG, "onHotwordDetected(" + action + ")"); + if (action != null) { + Intent intent = new Intent(action); + mActivityLauncher.launchActivity(intent, true, true, null, null); + } + mCallback.userActivity(0); + } + }; } diff --git a/core/java/android/preference/OnDependencyChangeListener.java b/packages/Keyguard/src/com/google/android/search/service/IHotwordService.aidl index ce25e34..e053d7d 100644 --- a/core/java/android/preference/OnDependencyChangeListener.java +++ b/packages/Keyguard/src/com/google/android/search/service/IHotwordService.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 The Android Open Source Project + * 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. @@ -14,19 +14,22 @@ * limitations under the License. */ -package android.preference; +package com.google.android.search.service; + +import com.google.android.search.service.IHotwordServiceCallback; /** - * Interface definition for a callback to be invoked when this - * {@link Preference} changes with respect to enabling/disabling - * dependents. + * Interface exposing hotword detector as a service. */ -interface OnDependencyChangeListener { +oneway interface IHotwordService { + /** - * Called when this preference has changed in a way that dependents should - * care to change their state. - * - * @param disablesDependent Whether the dependent should be disabled. + * Indicates a desire to start hotword detection. + * It's best-effort and the client should rely on + * the callbacks to figure out if hotwording was actually + * started or not. + * + * @param a callback to notify of hotword events. */ - void onDependencyChanged(Preference dependency, boolean disablesDependent); + void requestHotwordDetection(in IHotwordServiceCallback callback); } diff --git a/core/java/android/print/IPrinterDiscoverySessionObserver.aidl b/packages/Keyguard/src/com/google/android/search/service/IHotwordServiceCallback.aidl index a78924c..7b3765f 100644 --- a/core/java/android/print/IPrinterDiscoverySessionObserver.aidl +++ b/packages/Keyguard/src/com/google/android/search/service/IHotwordServiceCallback.aidl @@ -14,20 +14,21 @@ * limitations under the License. */ -package android.print; - -import android.print.IPrinterDiscoverySessionController; -import android.print.PrinterId; -import android.print.PrinterInfo; +package com.google.android.search.service; /** - * Interface for the observing part of a printer discovery session. - * - * @hide + * Interface implemented by users of Hotword service to get callbacks + * for hotword events. */ -oneway interface IPrinterDiscoverySessionObserver { - void setController(IPrinterDiscoverySessionController controller); - void onPrintersAdded(in List<PrinterInfo> printers); - void onPrintersRemoved(in List<PrinterId> printerIds); - void onPrintersUpdated(in List<PrinterInfo> printerIds); +oneway interface IHotwordServiceCallback { + + /** Hotword detection start/stop callbacks */ + void onHotwordDetectionStarted(); + void onHotwordDetectionStopped(); + + /** + * Called back when hotword is detected. + * The action tells the client what action to take, post hotword-detection. + */ + void onHotwordDetected(in String action); } diff --git a/packages/PrintSpooler/AndroidManifest.xml b/packages/PrintSpooler/AndroidManifest.xml index 74fd7a8..1f10af8 100644 --- a/packages/PrintSpooler/AndroidManifest.xml +++ b/packages/PrintSpooler/AndroidManifest.xml @@ -18,7 +18,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.printspooler" - android:sharedUserId="android.uid.printspooler" + android:sharedUserId="android.uid.system" android:versionName="1" android:versionCode="1" coreApp="true"> @@ -50,6 +50,13 @@ android:theme="@style/PrintJobConfigActivityTheme"> </activity> + <activity + android:name=".SelectPrinterActivity" + android:label="@string/all_printers_label" + android:theme="@style/SelectPrinterActivityTheme" + android:exported="false"> + </activity> + <receiver android:name=".NotificationController$NotificationBroadcastReceiver" android:exported="false" > diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png Binary files differnew file mode 100644 index 0000000..4b68f52 --- /dev/null +++ b/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png Binary files differnew file mode 100644 index 0000000..15ffadd --- /dev/null +++ b/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png Binary files differnew file mode 100644 index 0000000..420510e --- /dev/null +++ b/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png diff --git a/packages/PrintSpooler/res/layout/print_job_config_activity_container.xml b/packages/PrintSpooler/res/layout/print_job_config_activity_container.xml index a0c111b..7817094 100644 --- a/packages/PrintSpooler/res/layout/print_job_config_activity_container.xml +++ b/packages/PrintSpooler/res/layout/print_job_config_activity_container.xml @@ -20,9 +20,4 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:background="@color/container_background"> - - <include - layout="@layout/print_job_config_activity_content_editing"> - </include> - </FrameLayout> diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml new file mode 100644 index 0000000..f4e1853 --- /dev/null +++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml @@ -0,0 +1,29 @@ +<?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. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content"> + + <fragment + android:name="com.android.printspooler.SelectPrinterFragment" + android:id="@+id/select_printer_fragment" + android:layout_width="fill_parent" + android:layout_height="wrap_content"> + </fragment> + +</FrameLayout>
\ No newline at end of file diff --git a/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml b/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml index 002cc14..d14c064 100644 --- a/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml +++ b/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml @@ -15,7 +15,7 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" + android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingStart="8dip" android:paddingEnd="8dip" diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml new file mode 100644 index 0000000..28fbd35 --- /dev/null +++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml @@ -0,0 +1,37 @@ +<?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. +--> + +<menu xmlns:android="http://schemas.android.com/apk/res/android" > + + <item + android:id="@+id/action_search" + android:title="@string/search" + android:icon="@*android:drawable/ic_menu_search_holo_light" + android:actionViewClass="android.widget.SearchView" + android:showAsAction="ifRoom" + android:alphabeticShortcut="f" + android:imeOptions="actionSearch"> + </item> + + <item + android:id="@+id/action_add_printer" + android:title="@null" + android:icon="@drawable/ic_menu_add" + android:showAsAction="ifRoom" + android:alphabeticShortcut="a"> + </item> + +</menu> diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml index 2086f58..41fc516 100644 --- a/packages/PrintSpooler/res/values/strings.xml +++ b/packages/PrintSpooler/res/values/strings.xml @@ -58,6 +58,32 @@ <!-- Title for the temporary dialog show while an app is generating a print job. [CHAR LIMIT=30] --> <string name="generating_print_job">Generating print job</string> + <!-- Title for the save as PDF option in the printer list. [CHAR LIMIT=30] --> + <string name="save_as_pdf">Save as PDF</string> + + <!-- Title for the open all printers UI option in the printer list. [CHAR LIMIT=30] --> + <string name="all_printers">All printers\.\.\.</string> + + <!-- Title for the searching for printers option in the printer list + (only option if not printers are available). [CHAR LIMIT=40] --> + <string name="searching_for_printers">Searching for printers\.\.\.</string> + + <!-- Select printer activity --> + + <!-- Title for the share action bar menu item. [CHAR LIMIT=20] --> + <string name="search">Search</string> + + <!-- Title for the select printer activity. [CHAR LIMIT=30] --> + <string name="all_printers_label">All printers</string> + + <!-- Add printer dialog --> + + <!-- Title for the alert dialog for selecting a print service. [CHAR LIMIT=50] --> + <string name="choose_print_service">Choose print service</string> + + <!-- Title for the button to search the play store for print services. [CHAR LIMIT=50] --> + <string name="search_play_store">Search in play store</string> + <!-- Notifications --> <!-- Template for the notificaiton label for a printing print job. [CHAR LIMIT=25] --> diff --git a/packages/PrintSpooler/res/values/themes.xml b/packages/PrintSpooler/res/values/themes.xml index ab16c65..831b0ec 100644 --- a/packages/PrintSpooler/res/values/themes.xml +++ b/packages/PrintSpooler/res/values/themes.xml @@ -24,4 +24,12 @@ <item name="android:colorBackgroundCacheHint">@android:color/transparent</item> </style> + <style name="SelectPrinterActivityTheme" parent="@android:style/Theme.Holo.Light"> + <item name="android:actionBarStyle">@style/SelectPrinterActivityActionBarStyle</item> + </style> + + <style name="SelectPrinterActivityActionBarStyle" parent="@android:style/Widget.Holo.ActionBar"> + <item name="android:displayOptions">showTitle</item> + </style> + </resources> diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java new file mode 100644 index 0000000..6bad5b3 --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java @@ -0,0 +1,575 @@ +/* + * 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.printspooler; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Loader; +import android.os.AsyncTask; +import android.os.Build; +import android.print.PrinterId; +import android.print.PrinterInfo; +import android.util.ArrayMap; +import android.util.AtomicFile; +import android.util.Log; +import android.util.Slog; +import android.util.Xml; + +import com.android.internal.util.FastXmlSerializer; +import com.android.printspooler.PrintSpoolerService.PrinterDiscoverySession; + +import libcore.io.IoUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * This class is responsible for loading printers by doing discovery + * and merging the discovered printers with the previously used ones. + */ +public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { + private static final String LOG_TAG = "FusedPrintersProvider"; + + private static final boolean DEBUG = true && Build.IS_DEBUGGABLE; + + private static final double WEIGHT_DECAY_COEFFICIENT = 0.95f; + + private static final int MAX_HISTORY_LENGTH = 50; + + private static final int MAX_HISTORICAL_PRINTER_COUNT = 4; + + private final Map<PrinterId, PrinterInfo> mPrinters = + new LinkedHashMap<PrinterId, PrinterInfo>(); + + private final PersistenceManager mPersistenceManager; + + private PrinterDiscoverySession mDiscoverySession; + + private List<PrinterInfo> mFavoritePrinters; + + public FusedPrintersProvider(Context context) { + super(context); + mPersistenceManager = new PersistenceManager(context); + } + + public void addHistoricalPrinter(PrinterInfo printer) { + mPersistenceManager.addPrinterAndWritePrinterHistory(printer); + } + + public List<PrinterInfo> getPrinters() { + return new ArrayList<PrinterInfo>(mPrinters.values()); + } + + @Override + public void deliverResult(List<PrinterInfo> printers) { + if (isStarted()) { + super.deliverResult(printers); + } + } + + @Override + protected void onStartLoading() { + if (DEBUG) { + Log.i(LOG_TAG, "onStartLoading()"); + } + // The contract is that if we already have a valid, + // result the we have to deliver it immediately. + if (!mPrinters.isEmpty()) { + deliverResult(new ArrayList<PrinterInfo>(mPrinters.values())); + } + // If the data has changed since the last load + // or is not available, start a load. + if (takeContentChanged() || mPrinters.isEmpty()) { + onForceLoad(); + } + } + + @Override + protected void onStopLoading() { + if (DEBUG) { + Log.i(LOG_TAG, "onStopLoading()"); + } + onCancelLoad(); + } + + @Override + protected void onForceLoad() { + if (DEBUG) { + Log.i(LOG_TAG, "onForceLoad()"); + } + onCancelLoad(); + loadInternal(); + } + + private void loadInternal() { + if (mDiscoverySession == null) { + mDiscoverySession = new MyPrinterDiscoverySession(); + mPersistenceManager.readPrinterHistory(); + } + if (mPersistenceManager.isReadHistoryCompleted() + && !mDiscoverySession.isStarted()) { + final int favoriteCount = Math.min(MAX_HISTORICAL_PRINTER_COUNT, + mFavoritePrinters.size()); + List<PrinterId> printerIds = new ArrayList<PrinterId>(favoriteCount); + for (int i = 0; i < favoriteCount; i++) { + printerIds.add(mFavoritePrinters.get(i).getId()); + } + mDiscoverySession.startPrinterDisovery(printerIds); + } + } + + @Override + protected boolean onCancelLoad() { + if (DEBUG) { + Log.i(LOG_TAG, "onCancelLoad()"); + } + return cancelInternal(); + } + + private boolean cancelInternal() { + if (mDiscoverySession != null && mDiscoverySession.isStarted()) { + mDiscoverySession.stopPrinterDiscovery(); + return true; + } else if (mPersistenceManager.isReadHistoryInProgress()) { + return mPersistenceManager.stopReadPrinterHistory(); + } + return false; + } + + @Override + protected void onReset() { + if (DEBUG) { + Log.i(LOG_TAG, "onReset()"); + } + onStopLoading(); + mPrinters.clear(); + if (mDiscoverySession != null) { + mDiscoverySession.destroy(); + mDiscoverySession = null; + } + } + + @Override + protected void onAbandon() { + if (DEBUG) { + Log.i(LOG_TAG, "onAbandon()"); + } + onStopLoading(); + } + + public void refreshPrinter(PrinterId printerId) { + if (isStarted() && mDiscoverySession != null && mDiscoverySession.isStarted()) { + mDiscoverySession.requestPrinterUpdated(printerId); + } + } + + private final class MyPrinterDiscoverySession extends PrinterDiscoverySession { + + @Override + public void onPrintersAdded(List<PrinterInfo> printers) { + if (DEBUG) { + Log.i(LOG_TAG, "MyPrinterDiscoverySession#onPrintersAdded()"); + } + boolean printersAdded = false; + final int addedPrinterCount = printers.size(); + for (int i = 0; i < addedPrinterCount; i++) { + PrinterInfo printer = printers.get(i); + if (!mPrinters.containsKey(printer.getId())) { + mPrinters.put(printer.getId(), printer); + printersAdded = true; + } + } + if (printersAdded) { + deliverResult(new ArrayList<PrinterInfo>(mPrinters.values())); + } + } + + @Override + public void onPrintersRemoved(List<PrinterId> printerIds) { + if (DEBUG) { + Log.i(LOG_TAG, "MyPrinterDiscoverySession#onPrintersRemoved()"); + } + boolean removedPrinters = false; + final int removedPrinterCount = printerIds.size(); + for (int i = 0; i < removedPrinterCount; i++) { + PrinterId removedPrinterId = printerIds.get(i); + if (mPrinters.remove(removedPrinterId) != null) { + removedPrinters = true; + } + } + if (removedPrinters) { + deliverResult(new ArrayList<PrinterInfo>(mPrinters.values())); + } + } + + @Override + public void onPrintersUpdated(List<PrinterInfo> printers) { + if (DEBUG) { + Log.i(LOG_TAG, "MyPrinterDiscoverySession#onPrintersUpdated()"); + } + boolean updatedPrinters = false; + final int updatedPrinterCount = printers.size(); + for (int i = 0; i < updatedPrinterCount; i++) { + PrinterInfo updatedPrinter = printers.get(i); + if (mPrinters.containsKey(updatedPrinter.getId())) { + mPrinters.put(updatedPrinter.getId(), updatedPrinter); + updatedPrinters = true; + } + } + if (updatedPrinters) { + deliverResult(new ArrayList<PrinterInfo>(mPrinters.values())); + } + } + } + + private final class PersistenceManager { + private static final String PERSIST_FILE_NAME = "printer_history.xml"; + + private static final String TAG_PRINTERS = "printers"; + + private static final String TAG_PRINTER = "printer"; + private static final String TAG_PRINTER_ID = "printerId"; + + private static final String ATTR_LOCAL_ID = "localId"; + private static final String ATTR_SERVICE_NAME = "serviceName"; + + private static final String ATTR_NAME = "name"; + private static final String ATTR_DESCRIPTION = "description"; + private static final String ATTR_STATUS = "status"; + + private final AtomicFile mStatePersistFile; + + private List<PrinterInfo> mHistoricalPrinters; + + private boolean mReadHistoryCompleted; + private boolean mReadHistoryInProgress; + + private final AsyncTask<Void, Void, List<PrinterInfo>> mReadTask = + new AsyncTask<Void, Void, List<PrinterInfo>>() { + @Override + protected List<PrinterInfo> doInBackground(Void... args) { + return doReadPrinterHistory(); + } + + @Override + protected void onPostExecute(List<PrinterInfo> printers) { + if (DEBUG) { + Log.i(LOG_TAG, "read history completed"); + } + + mHistoricalPrinters = printers; + + // Compute the favorite printers. + mFavoritePrinters = computeFavoritePrinters(printers); + + // We want the first few favorite printers on top of the list. + final int favoriteCount = Math.min(mFavoritePrinters.size(), + MAX_HISTORICAL_PRINTER_COUNT); + for (int i = 0; i < favoriteCount; i++) { + PrinterInfo favoritePrinter = mFavoritePrinters.get(i); + mPrinters.put(favoritePrinter.getId(), favoritePrinter); + } + + mReadHistoryInProgress = false; + mReadHistoryCompleted = true; + + loadInternal(); + } + + private List<PrinterInfo> doReadPrinterHistory() { + FileInputStream in = null; + try { + in = mStatePersistFile.openRead(); + } catch (FileNotFoundException fnfe) { + Log.i(LOG_TAG, "No existing printer history."); + return new ArrayList<PrinterInfo>(); + } + try { + List<PrinterInfo> printers = new ArrayList<PrinterInfo>(); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, null); + parseState(parser, printers); + return printers; + } catch (IllegalStateException ise) { + Slog.w(LOG_TAG, "Failed parsing ", ise); + } catch (NullPointerException npe) { + Slog.w(LOG_TAG, "Failed parsing ", npe); + } catch (NumberFormatException nfe) { + Slog.w(LOG_TAG, "Failed parsing ", nfe); + } catch (XmlPullParserException xppe) { + Slog.w(LOG_TAG, "Failed parsing ", xppe); + } catch (IOException ioe) { + Slog.w(LOG_TAG, "Failed parsing ", ioe); + } catch (IndexOutOfBoundsException iobe) { + Slog.w(LOG_TAG, "Failed parsing ", iobe); + } finally { + IoUtils.closeQuietly(in); + } + + return Collections.emptyList(); + } + + private void parseState(XmlPullParser parser, List<PrinterInfo> outPrinters) + throws IOException, XmlPullParserException { + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.START_TAG, TAG_PRINTERS); + parser.next(); + + while (parsePrinter(parser, outPrinters)) { + // Be nice and respond to cancellation + if (isCancelled()) { + return; + } + parser.next(); + } + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_PRINTERS); + } + + private boolean parsePrinter(XmlPullParser parser, List<PrinterInfo> outPrinters) + throws IOException, XmlPullParserException { + skipEmptyTextTags(parser); + if (!accept(parser, XmlPullParser.START_TAG, TAG_PRINTER)) { + return false; + } + + String name = parser.getAttributeValue(null, ATTR_NAME); + String description = parser.getAttributeValue(null, ATTR_DESCRIPTION); + final int status = Integer.parseInt(parser.getAttributeValue(null, ATTR_STATUS)); + + parser.next(); + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.START_TAG, TAG_PRINTER_ID); + String localId = parser.getAttributeValue(null, ATTR_LOCAL_ID); + ComponentName service = ComponentName.unflattenFromString(parser.getAttributeValue( + null, ATTR_SERVICE_NAME)); + PrinterId printerId = new PrinterId(service, localId); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_PRINTER_ID); + parser.next(); + + PrinterInfo.Builder builder = new PrinterInfo.Builder(printerId, name, status); + builder.setDescription(description); + PrinterInfo printer = builder.create(); + + outPrinters.add(printer); + + if (DEBUG) { + Log.i(LOG_TAG, "[RESTORED] " + printer); + } + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_PRINTER); + + return true; + } + + private void expect(XmlPullParser parser, int type, String tag) + throws IOException, XmlPullParserException { + if (!accept(parser, type, tag)) { + throw new XmlPullParserException("Exepected event: " + type + + " and tag: " + tag + " but got event: " + parser.getEventType() + + " and tag:" + parser.getName()); + } + } + + private void skipEmptyTextTags(XmlPullParser parser) + throws IOException, XmlPullParserException { + while (accept(parser, XmlPullParser.TEXT, null) + && "\n".equals(parser.getText())) { + parser.next(); + } + } + + private boolean accept(XmlPullParser parser, int type, String tag) + throws IOException, XmlPullParserException { + if (parser.getEventType() != type) { + return false; + } + if (tag != null) { + if (!tag.equals(parser.getName())) { + return false; + } + } else if (parser.getName() != null) { + return false; + } + return true; + } + }; + + private final AsyncTask<List<PrinterInfo>, Void, Void> mWriteTask = + new AsyncTask<List<PrinterInfo>, Void, Void>() { + @Override + protected Void doInBackground(List<PrinterInfo>... printers) { + doWritePrinterHistory(printers[0]); + return null; + } + + private void doWritePrinterHistory(List<PrinterInfo> printers) { + FileOutputStream out = null; + try { + out = mStatePersistFile.startWrite(); + + XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(out, "utf-8"); + serializer.startDocument(null, true); + serializer.startTag(null, TAG_PRINTERS); + + final int printerCount = printers.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = printers.get(i); + + serializer.startTag(null, TAG_PRINTER); + + serializer.attribute(null, ATTR_NAME, printer.getName()); + serializer.attribute(null, ATTR_STATUS, String.valueOf( + printer.getStatus())); + String description = printer.getDescription(); + if (description != null) { + serializer.attribute(null, ATTR_DESCRIPTION, description); + } + + PrinterId printerId = printer.getId(); + serializer.startTag(null, TAG_PRINTER_ID); + serializer.attribute(null, ATTR_LOCAL_ID, printerId.getLocalId()); + serializer.attribute(null, ATTR_SERVICE_NAME, printerId.getServiceName() + .flattenToString()); + serializer.endTag(null, TAG_PRINTER_ID); + + serializer.endTag(null, TAG_PRINTER); + + if (DEBUG) { + Log.i(LOG_TAG, "[PERSISTED] " + printer); + } + } + + serializer.endTag(null, TAG_PRINTERS); + serializer.endDocument(); + mStatePersistFile.finishWrite(out); + + if (DEBUG) { + Log.i(LOG_TAG, "[PERSIST END]"); + } + } catch (IOException ioe) { + Slog.w(LOG_TAG, "Failed to write printer history, restoring backup.", ioe); + mStatePersistFile.failWrite(out); + } finally { + IoUtils.closeQuietly(out); + } + } + }; + + private PersistenceManager(Context context) { + mStatePersistFile = new AtomicFile(new File(context.getFilesDir(), + PERSIST_FILE_NAME)); + } + + public boolean isReadHistoryInProgress() { + return mReadHistoryInProgress; + } + + public boolean isReadHistoryCompleted() { + return mReadHistoryCompleted; + } + + public boolean stopReadPrinterHistory() { + return mReadTask.cancel(true); + } + + public void readPrinterHistory() { + if (DEBUG) { + Log.i(LOG_TAG, "read history started"); + } + mReadHistoryInProgress = true; + mReadTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + + @SuppressWarnings("unchecked") + public void addPrinterAndWritePrinterHistory(PrinterInfo printer) { + if (mHistoricalPrinters.size() >= MAX_HISTORY_LENGTH) { + mHistoricalPrinters.remove(0); + } + mHistoricalPrinters.add(printer); + mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, mHistoricalPrinters); + } + + private List<PrinterInfo> computeFavoritePrinters(List<PrinterInfo> printers) { + Map<PrinterId, PrinterRecord> recordMap = + new ArrayMap<PrinterId, PrinterRecord>(); + + // Recompute the weights. + float currentWeight = 1.0f; + final int printerCount = printers.size(); + for (int i = printerCount - 1; i >= 0; i--) { + PrinterInfo printer = printers.get(i); + // Aggregate weight for the same printer + PrinterRecord record = recordMap.get(printer.getId()); + if (record == null) { + record = new PrinterRecord(printer); + recordMap.put(printer.getId(), record); + } + record.weight += currentWeight; + currentWeight *= WEIGHT_DECAY_COEFFICIENT; + } + + // Soft the favorite printers. + List<PrinterRecord> favoriteRecords = new ArrayList<PrinterRecord>( + recordMap.values()); + Collections.sort(favoriteRecords); + + // Write the favorites to the output. + final int favoriteCount = favoriteRecords.size(); + List<PrinterInfo> favoritePrinters = new ArrayList<PrinterInfo>(favoriteCount); + for (int i = 0; i < favoriteCount; i++) { + PrinterInfo printer = favoriteRecords.get(i).printer; + favoritePrinters.add(printer); + } + + return favoritePrinters; + } + + private final class PrinterRecord implements Comparable<PrinterRecord> { + public final PrinterInfo printer; + public float weight; + + public PrinterRecord(PrinterInfo printer) { + this.printer = printer; + } + + @Override + public int compareTo(PrinterRecord another) { + return Float.floatToIntBits(another.weight) - Float.floatToIntBits(weight); + } + } + } +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 9160b7d..d3dd8c9 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -18,12 +18,17 @@ package com.android.printspooler; import android.app.Activity; import android.app.Dialog; +import android.app.LoaderManager; import android.content.Context; +import android.content.Intent; +import android.content.Loader; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.database.DataSetObserver; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -34,15 +39,15 @@ import android.os.Message; import android.os.RemoteException; import android.print.ILayoutResultCallback; import android.print.IPrintDocumentAdapter; -import android.print.IPrinterDiscoverySessionController; -import android.print.IPrinterDiscoverySessionObserver; import android.print.IWriteResultCallback; import android.print.PageRange; import android.print.PrintAttributes; import android.print.PrintAttributes.MediaSize; +import android.print.PrintAttributes.Resolution; import android.print.PrintDocumentAdapter; import android.print.PrintDocumentInfo; import android.print.PrintJobInfo; +import android.print.PrintManager; import android.print.PrinterCapabilitiesInfo; import android.print.PrinterId; import android.print.PrinterInfo; @@ -64,15 +69,23 @@ import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; +import libcore.io.IoUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -94,15 +107,32 @@ public class PrintJobConfigActivity extends Activity { public static final String EXTRA_PRINT_ATTRIBUTES = "printAttributes"; public static final String EXTRA_PRINT_JOB_ID = "printJobId"; - private static final int CONTROLLER_STATE_INITIALIZED = 1; - private static final int CONTROLLER_STATE_STARTED = 2; - private static final int CONTROLLER_STATE_LAYOUT_STARTED = 3; - private static final int CONTROLLER_STATE_LAYOUT_COMPLETED = 4; - private static final int CONTROLLER_STATE_WRITE_STARTED = 5; - private static final int CONTROLLER_STATE_WRITE_COMPLETED = 6; - private static final int CONTROLLER_STATE_FINISHED = 7; - private static final int CONTROLLER_STATE_FAILED = 8; - private static final int CONTROLLER_STATE_CANCELLED = 9; + public static final String INTENT_EXTRA_PRINTER_ID = "INTENT_EXTRA_PRINTER_ID"; + + private static final int LOADER_ID_PRINTERS_LOADER = 1; + + private static final int DEST_ADAPTER_MIN_ITEM_COUNT = 2; + private static final int DEST_ADAPTER_MAX_ITEM_COUNT = 9; + + private static final int DEST_ADAPTER_POSITION_SEARCHING_FOR_PRINTERS = 0; + private static final int DEST_ADAPTER_POSITION_SAVE_AS_PDF = 1; + + private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE; + private static final int DEST_ADAPTER_ITEM_ID_ALL_PRINTERS = Integer.MAX_VALUE - 1; + private static final int DEST_ADAPTER_ITEM_ID_SEARCHING_FOR_PRINTERS = Integer.MAX_VALUE - 2; + + private static final int ACTIVITY_REQUEST_CREATE_FILE = 1; + private static final int ACTIVITY_REQUEST_SELECT_PRINTER = 2; + + private static final int CONTROLLER_STATE_FINISHED = 1; + private static final int CONTROLLER_STATE_FAILED = 2; + private static final int CONTROLLER_STATE_CANCELLED = 3; + private static final int CONTROLLER_STATE_INITIALIZED = 4; + private static final int CONTROLLER_STATE_STARTED = 5; + private static final int CONTROLLER_STATE_LAYOUT_STARTED = 6; + private static final int CONTROLLER_STATE_LAYOUT_COMPLETED = 7; + private static final int CONTROLLER_STATE_WRITE_STARTED = 8; + private static final int CONTROLLER_STATE_WRITE_COMPLETED = 9; private static final int EDITOR_STATE_INITIALIZED = 1; private static final int EDITOR_STATE_CONFIRMED_PRINT = 2; @@ -110,6 +140,7 @@ public class PrintJobConfigActivity extends Activity { private static final int EDITOR_STATE_CANCELLED = 4; private static final int MIN_COPIES = 1; + private static final String MIN_COPIES_STRING = String.valueOf(MIN_COPIES); private static final Pattern PATTERN_DIGITS = Pattern.compile("\\d"); @@ -132,11 +163,9 @@ public class PrintJobConfigActivity extends Activity { } }; - private PrintSpooler mSpooler; private Editor mEditor; private Document mDocument; private PrintController mController; - private PrinterDiscoverySessionObserver mPrinterDiscoverySessionObserver; private int mPrintJobId; @@ -147,9 +176,6 @@ public class PrintJobConfigActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - setContentView(R.layout.print_job_config_activity_container); - - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); Bundle extras = getIntent().getExtras(); @@ -168,12 +194,17 @@ public class PrintJobConfigActivity extends Activity { mCurrPrintAttributes.copyFrom(attributes); } - mSpooler = PrintSpooler.peekInstance(); + setContentView(R.layout.print_job_config_activity_container); + + // TODO: This should be on the style + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + + mEditor = new Editor(); mDocument = new Document(); mController = new PrintController(new RemotePrintDocumentAdapter( IPrintDocumentAdapter.Stub.asInterface(mIPrintDocumentAdapter), - mSpooler.generateFileForPrintJob(mPrintJobId))); + PrintSpoolerService.peekInstance().generateFileForPrintJob(mPrintJobId))); try { mIPrintDocumentAdapter.linkToDeath(mDeathRecipient, 0); @@ -184,9 +215,6 @@ public class PrintJobConfigActivity extends Activity { mController.initialize(); mEditor.initialize(); - mPrinterDiscoverySessionObserver = new PrinterDiscoverySessionObserver(mEditor, - getMainLooper()); - mSpooler.createPrinterDiscoverySession(mPrinterDiscoverySessionObserver); } @Override @@ -194,17 +222,14 @@ public class PrintJobConfigActivity extends Activity { // We can safely do the work in here since at this point // the system is bound to our (spooler) process which // guarantees that this process will not be killed. - mPrinterDiscoverySessionObserver.close(); - mPrinterDiscoverySessionObserver.destroy(); - mPrinterDiscoverySessionObserver = null; if (mController.hasStarted()) { mController.finish(); } if (mEditor.isPrintConfirmed() && mController.isFinished()) { - mSpooler.setPrintJobState(mPrintJobId, + PrintSpoolerService.peekInstance().setPrintJobState(mPrintJobId, PrintJobInfo.STATE_QUEUED, null); } else { - mSpooler.setPrintJobState(mPrintJobId, + PrintSpoolerService.peekInstance().setPrintJobState(mPrintJobId, PrintJobInfo.STATE_CANCELED, null); } mIPrintDocumentAdapter.unlinkToDeath(mDeathRecipient, 0); @@ -315,12 +340,13 @@ public class PrintJobConfigActivity extends Activity { public void update() { if (!printAttributesChanged()) { - // If the attributes changes, then we do not do a layout but may + // If the attributes changed, then we do not do a layout but may // have to ask the app to write some pages. Hence, pretend layout // completed and nothing changed, so we handle writing as usual. handleOnLayoutFinished(mDocument.info, false, mRequestCounter.get()); } else { - mSpooler.setPrintJobAttributesNoPersistence(mPrintJobId, mCurrPrintAttributes); + PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( + mPrintJobId, mCurrPrintAttributes); mMetadata.putBoolean(PrintDocumentAdapter.METADATA_KEY_PRINT_PREVIEW, !mEditor.isPrintConfirmed()); @@ -353,15 +379,14 @@ public class PrintJobConfigActivity extends Activity { } mControllerState = CONTROLLER_STATE_LAYOUT_COMPLETED; + mEditor.updateUi(); - // If the info changed, we update the document and the print job, - // and update the UI since the the page range selection may have - // become invalid. + // If the info changed, we update the document and the print job. final boolean infoChanged = !info.equals(mDocument.info); if (infoChanged) { mDocument.info = info; - mSpooler.setPrintJobPrintDocumentInfoNoPersistence(mPrintJobId, info); - mEditor.updateUi(); + PrintSpoolerService.peekInstance().setPrintJobPrintDocumentInfoNoPersistence( + mPrintJobId, info); } // If the document info or the layout changed, then @@ -447,11 +472,13 @@ public class PrintJobConfigActivity extends Activity { if (Arrays.equals(mDocument.pages, mRequestedPages)) { // We got a document with exactly the pages we wanted. Hence, // the printer has to print all pages in the data. - mSpooler.setPrintJobPagesNoPersistence(mPrintJobId, ALL_PAGES_ARRAY); + PrintSpoolerService.peekInstance().setPrintJobPagesNoPersistence(mPrintJobId, + ALL_PAGES_ARRAY); } else if (Arrays.equals(mDocument.pages, ALL_PAGES_ARRAY)) { // We requested specific pages but got all of them. Hence, // the printer has to print only the requested pages. - mSpooler.setPrintJobPagesNoPersistence(mPrintJobId, mRequestedPages); + PrintSpoolerService.peekInstance().setPrintJobPagesNoPersistence(mPrintJobId, + mRequestedPages); } else if (PageRangeUtils.contains(mDocument.pages, mRequestedPages)) { // We requested specific pages and got more but not all pages. // Hence, we have to offset appropriately the printed pages to @@ -460,14 +487,16 @@ public class PrintJobConfigActivity extends Activity { final int offset = mDocument.pages[0].getStart() - pages[0].getStart(); PageRange[] offsetPages = Arrays.copyOf(mDocument.pages, mDocument.pages.length); PageRangeUtils.offsetStart(offsetPages, offset); - mSpooler.setPrintJobPagesNoPersistence(mPrintJobId, offsetPages); + PrintSpoolerService.peekInstance().setPrintJobPagesNoPersistence(mPrintJobId, + offsetPages); } else if (Arrays.equals(mRequestedPages, ALL_PAGES_ARRAY) && mDocument.pages.length == 1 && mDocument.pages[0].getStart() == 0 && mDocument.pages[0].getEnd() == mDocument.info.getPageCount() - 1) { // We requested all pages via the special constant and got all // of them as an explicit enumeration. Hence, the printer has // to print only the requested pages. - mSpooler.setPrintJobPagesNoPersistence(mPrintJobId, mDocument.pages); + PrintSpoolerService.peekInstance().setPrintJobPagesNoPersistence(mPrintJobId, + mDocument.pages); } else { // We did not get the pages we requested, then the application // misbehaves, so we fail quickly. @@ -478,7 +507,16 @@ public class PrintJobConfigActivity extends Activity { } if (mEditor.isDone()) { - PrintJobConfigActivity.this.finish(); + if (mEditor.isPrintingToPdf()) { + PrintJobInfo printJob = PrintSpoolerService.peekInstance() + .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY); + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); + intent.setType("application/pdf"); + intent.putExtra(Intent.EXTRA_TITLE, printJob.getLabel()); + startActivityForResult(intent, ACTIVITY_REQUEST_CREATE_FILE); + } else { + PrintJobConfigActivity.this.finish(); + } } } @@ -585,33 +623,111 @@ public class PrintJobConfigActivity extends Activity { } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case ACTIVITY_REQUEST_CREATE_FILE: { + if (data != null) { + Uri uri = data.getData(); + writePrintJobDataAndFinish(uri); + } else { + mEditor.showUi(Editor.UI_EDITING_PRINT_JOB, + new Runnable() { + @Override + public void run() { + mEditor.initialize(); + mEditor.bindUi(); + mEditor.updateUi(); + } + }); + } + } break; + + case ACTIVITY_REQUEST_SELECT_PRINTER: { + if (resultCode == RESULT_OK) { + PrinterId printerId = (PrinterId) data.getParcelableExtra( + INTENT_EXTRA_PRINTER_ID); + // TODO: Make sure the selected printer is in the shown list. + mEditor.selectPrinter(printerId); + } + } break; + } + } + + private void writePrintJobDataAndFinish(final Uri uri) { + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + InputStream in = null; + OutputStream out = null; + try { + PrintJobInfo printJob = PrintSpoolerService.peekInstance() + .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY); + if (printJob == null) { + return null; + } + File file = PrintSpoolerService.peekInstance() + .generateFileForPrintJob(mPrintJobId); + in = new FileInputStream(file); + out = getContentResolver().openOutputStream(uri); + final byte[] buffer = new byte[8192]; + while (true) { + final int readByteCount = in.read(buffer); + if (readByteCount < 0) { + break; + } + out.write(buffer, 0, readByteCount); + } + } catch (FileNotFoundException fnfe) { + Log.e(LOG_TAG, "Error writing print job data!", fnfe); + } catch (IOException ioe) { + Log.e(LOG_TAG, "Error writing print job data!", ioe); + } finally { + IoUtils.closeQuietly(in); + IoUtils.closeQuietly(out); + } + return null; + } + + @Override + public void onPostExecute(Void result) { + mEditor.cancel(); + PrintJobConfigActivity.this.finish(); + } + }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + private final class Editor { - private final EditText mCopiesEditText; + private static final int UI_NONE = 0; + private static final int UI_EDITING_PRINT_JOB = 1; + private static final int UI_GENERATING_PRINT_JOB = 2; + + private EditText mCopiesEditText; - private final TextView mRangeTitle; - private final EditText mRangeEditText; + private TextView mRangeTitle; + private EditText mRangeEditText; - private final Spinner mDestinationSpinner; - private final ArrayAdapter<SpinnerItem<PrinterInfo>> mDestinationSpinnerAdapter; + private Spinner mDestinationSpinner; + private final DestinationAdapter mDestinationSpinnerAdapter; - private final Spinner mMediaSizeSpinner; + private Spinner mMediaSizeSpinner; private final ArrayAdapter<SpinnerItem<MediaSize>> mMediaSizeSpinnerAdapter; - private final Spinner mColorModeSpinner; + private Spinner mColorModeSpinner; private final ArrayAdapter<SpinnerItem<Integer>> mColorModeSpinnerAdapter; - private final Spinner mOrientationSpinner; + private Spinner mOrientationSpinner; private final ArrayAdapter<SpinnerItem<Integer>> mOrientationSpinnerAdapter; - private final Spinner mRangeOptionsSpinner; + private Spinner mRangeOptionsSpinner; private final ArrayAdapter<SpinnerItem<Integer>> mRangeOptionsSpinnerAdapter; private final SimpleStringSplitter mStringCommaSplitter = new SimpleStringSplitter(','); - private final View mContentContainer; + private View mContentContainer; - private final Button mPrintButton; + private Button mPrintButton; private final OnItemSelectedListener mOnItemSelectedListener = new AdapterView.OnItemSelectedListener() { @@ -622,16 +738,32 @@ public class PrintJobConfigActivity extends Activity { mIgnoreNextDestinationChange = false; return; } + if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) { + mIgnoreNextDestinationChange = true; + mDestinationSpinner.setSelection(0); + Intent intent = new Intent(PrintJobConfigActivity.this, + SelectPrinterActivity.class); + startActivityForResult(intent, ACTIVITY_REQUEST_SELECT_PRINTER); + return; + } + mWaitingForPrinterCapabilities = false; mCurrPrintAttributes.clear(); - SpinnerItem<PrinterInfo> dstItem = mDestinationSpinnerAdapter.getItem(position); - if (dstItem != null) { - PrinterInfo printer = dstItem.value; - mSpooler.setPrintJobPrinterNoPersistence(mPrintJobId, printer); + PrinterInfo printer = (PrinterInfo) mDestinationSpinnerAdapter + .getItem(position); + if (printer != null) { + PrintSpoolerService.peekInstance().setPrintJobPrinterNoPersistence( + mPrintJobId, printer); PrinterCapabilitiesInfo capabilities = printer.getCapabilities(); if (capabilities == null) { List<PrinterId> printerIds = new ArrayList<PrinterId>(); printerIds.add(printer.getId()); - mPrinterDiscoverySessionObserver.requestPrinterUpdate(printer.getId()); + FusedPrintersProvider printersLoader = (FusedPrintersProvider) + (Loader<?>) getLoaderManager().getLoader( + LOADER_ID_PRINTERS_LOADER); + if (printersLoader != null) { + printersLoader.refreshPrinter(printer.getId()); + } + mWaitingForPrinterCapabilities = true; //TODO: We need a timeout for the update. } else { capabilities.getDefaults(mCurrPrintAttributes); @@ -643,6 +775,31 @@ public class PrintJobConfigActivity extends Activity { } } } + + // The printer changed so we want to start with a clean slate + // for the print options and let them be populated from the + // printer capabilities and use the printer defaults. + if (!mMediaSizeSpinnerAdapter.isEmpty()) { + mIgnoreNextMediaSizeChange = true; + mMediaSizeSpinnerAdapter.clear(); + } + if (!mColorModeSpinnerAdapter.isEmpty()) { + mIgnoreNextColorModeChange = true; + mColorModeSpinnerAdapter.clear(); + } + if (!mOrientationSpinnerAdapter.isEmpty()) { + mIgnoreNextOrientationChange = true; + mOrientationSpinnerAdapter.clear(); + } + if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { + mIgnoreNextRangeOptionChange = true; + mRangeOptionsSpinner.setSelection(0); + } + if (!TextUtils.isEmpty(mCopiesEditText.getText())) { + mIgnoreNextCopiesChange = true; + mCopiesEditText.setText(MIN_COPIES_STRING); + } + updateUi(); } else if (spinner == mMediaSizeSpinner) { if (mIgnoreNextMediaSizeChange) { @@ -728,7 +885,8 @@ public class PrintJobConfigActivity extends Activity { } mCopiesEditText.setError(null); - mSpooler.setPrintJobCopiesNoPersistence(mPrintJobId, copies); + PrintSpoolerService.peekInstance().setPrintJobCopiesNoPersistence( + mPrintJobId, copies); updateUi(); if (hadErrors && !hasErrors() && printAttributesChanged()) { @@ -805,54 +963,64 @@ public class PrintJobConfigActivity extends Activity { private boolean mIgnoreNextCopiesChange; private boolean mIgnoreNextRangeChange; - public Editor() { - // Content container - mContentContainer = findViewById(R.id.content_container); + private boolean mWaitingForPrinterCapabilities; - // Copies - mCopiesEditText = (EditText) findViewById(R.id.copies_edittext); - mCopiesEditText.setText(String.valueOf(MIN_COPIES)); - mSpooler.setPrintJobCopiesNoPersistence(mPrintJobId, MIN_COPIES); - mCopiesEditText.addTextChangedListener(mCopiesTextWatcher); - mCopiesEditText.selectAll(); + private int mCurrentUi = UI_NONE; + public Editor() { // Destination. - mDestinationSpinner = (Spinner) findViewById(R.id.destination_spinner); mDestinationSpinnerAdapter = new DestinationAdapter(); - mDestinationSpinner.setAdapter(mDestinationSpinnerAdapter); - mDestinationSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + mDestinationSpinnerAdapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + final int selectedPosition = mDestinationSpinner.getSelectedItemPosition(); + if (mDestinationSpinnerAdapter.getCount() > 0) { + // Make sure we select the first printer if we have data. + if (selectedPosition == AdapterView.INVALID_POSITION) { + mDestinationSpinner.setSelection(0); + } + } else { + // Make sure we select no printer if we have no data. + mDestinationSpinner.setSelection(AdapterView.INVALID_POSITION); + } + + // Maybe we did not have capabilities when the current printer was + // selected, but now the selected printer has capabilities. Generate + // a fake selection so the code in the selection change handling takes + // care of updating everything. This way the logic is in one place. + if (mWaitingForPrinterCapabilities) { + mWaitingForPrinterCapabilities = false; + PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem(); + if (printer != null && printer.getCapabilities() != null) { + mOnItemSelectedListener.onItemSelected(mDestinationSpinner, null, + selectedPosition, selectedPosition); + } + } + updateUi(); + } + + @Override + public void onInvalidated() { + updateUi(); + } + }); // Media size. - mMediaSizeSpinner = (Spinner) findViewById(R.id.paper_size_spinner); mMediaSizeSpinnerAdapter = new ArrayAdapter<SpinnerItem<MediaSize>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); - mMediaSizeSpinner.setAdapter(mMediaSizeSpinnerAdapter); - mMediaSizeSpinner.setOnItemSelectedListener(mOnItemSelectedListener); // Color mode. - mColorModeSpinner = (Spinner) findViewById(R.id.color_spinner); mColorModeSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); - mColorModeSpinner.setAdapter(mColorModeSpinnerAdapter); - mColorModeSpinner.setOnItemSelectedListener(mOnItemSelectedListener); // Orientation - mOrientationSpinner = (Spinner) findViewById(R.id.orientation_spinner); mOrientationSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); - mOrientationSpinner.setAdapter(mOrientationSpinnerAdapter); - mOrientationSpinner.setOnItemSelectedListener(mOnItemSelectedListener); - - // Range - mRangeTitle = (TextView) findViewById(R.id.page_range_title); - mRangeEditText = (EditText) findViewById(R.id.page_range_edittext); - mRangeEditText.addTextChangedListener(mRangeTextWatcher); // Range options - mRangeOptionsSpinner = (Spinner) findViewById(R.id.range_options_spinner); mRangeOptionsSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); @@ -865,25 +1033,26 @@ public class PrintJobConfigActivity extends Activity { mRangeOptionsSpinnerAdapter.add(new SpinnerItem<Integer>( rangeOptionsValues[i], rangeOptionsLabels[i])); } - mRangeOptionsSpinner.setAdapter(mRangeOptionsSpinnerAdapter); - if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { - mIgnoreNextRangeOptionChange = true; - mRangeOptionsSpinner.setSelection(0); - } - // Print button - mPrintButton = (Button) findViewById(R.id.print_button); - mPrintButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mEditor.confirmPrint(); - updateUi(); - mController.update(); - showGeneratingPrintJobUi(); + showUi(UI_EDITING_PRINT_JOB, null); + bindUi(); + updateUi(); + } + + public void selectPrinter(PrinterId printerId) { + final int printerCount = mDestinationSpinnerAdapter.getCount(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = (PrinterInfo) mDestinationSpinnerAdapter.getItem(i); + if (printer.getId().equals(printerId)) { + mDestinationSpinner.setSelection(i); + return; } - }); + } + } - updateUi(); + public boolean isPrintingToPdf() { + return mDestinationSpinner.getSelectedItem() + == mDestinationSpinnerAdapter.mFakePdfPrinter; } public boolean shouldCloseOnTouch(MotionEvent event) { @@ -913,19 +1082,104 @@ public class PrintJobConfigActivity extends Activity { } public boolean isShwoingGeneratingPrintJobUi() { - return (findViewById(R.id.content_generating) != null); + return (mCurrentUi == UI_GENERATING_PRINT_JOB); } - private void showGeneratingPrintJobUi() { - // Find everything we will shuffle around. - final ViewGroup contentContainer = (ViewGroup) findViewById(R.id.content_container); - final View contentEditing = contentContainer.findViewById(R.id.content_editing); - final View contentGenerating = getLayoutInflater().inflate( - R.layout.print_job_config_activity_content_generating, - contentContainer, false); + public void showUi(int ui, final Runnable postSwitchCallback) { + if (ui == UI_NONE) { + throw new IllegalStateException("cannot remove the ui"); + } + + if (mCurrentUi == ui) { + return; + } + + switch (mCurrentUi) { + case UI_NONE: { + switch (ui) { + case UI_EDITING_PRINT_JOB: { + doUiSwitch(R.layout.print_job_config_activity_content_editing); + registerPrintButtonClickListener(); + if (postSwitchCallback != null) { + postSwitchCallback.run(); + } + } break; - // Wire the cancel action. - Button cancelButton = (Button) contentGenerating.findViewById(R.id.cancel_button); + case UI_GENERATING_PRINT_JOB: { + doUiSwitch(R.layout.print_job_config_activity_content_generating); + registerCancelButtonClickListener(); + if (postSwitchCallback != null) { + postSwitchCallback.run(); + } + } break; + } + } break; + + case UI_EDITING_PRINT_JOB: { + switch (ui) { + case UI_GENERATING_PRINT_JOB: { + animateUiSwitch(R.layout.print_job_config_activity_content_generating, + new Runnable() { + @Override + public void run() { + registerCancelButtonClickListener(); + if (postSwitchCallback != null) { + postSwitchCallback.run(); + } + } + }); + } break; + } + } break; + + case UI_GENERATING_PRINT_JOB: { + switch (ui) { + case UI_EDITING_PRINT_JOB: { + animateUiSwitch(R.layout.print_job_config_activity_content_editing, + new Runnable() { + @Override + public void run() { + registerPrintButtonClickListener(); + if (postSwitchCallback != null) { + postSwitchCallback.run(); + } + } + }); + } break; + } + } break; + } + + mCurrentUi = ui; + } + + private void registerPrintButtonClickListener() { + Button printButton = (Button) findViewById(R.id.print_button); + printButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem(); + if (printer != null) { + mEditor.confirmPrint(); + mController.update(); + if (!printer.equals(mDestinationSpinnerAdapter.mFakePdfPrinter)) { + FusedPrintersProvider printersLoader = (FusedPrintersProvider) + (Loader<?>) getLoaderManager().getLoader( + LOADER_ID_PRINTERS_LOADER); + if (printersLoader != null) { + printersLoader.addHistoricalPrinter(printer); + } + } + } else { + mEditor.cancel(); + PrintJobConfigActivity.this.finish(); + } + } + }); + } + + private void registerCancelButtonClickListener() { + Button cancelButton = (Button) findViewById(R.id.cancel_button); cancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -935,24 +1189,38 @@ public class PrintJobConfigActivity extends Activity { mEditor.cancel(); } }); + } + + private void doUiSwitch(int showLayoutId) { + ViewGroup contentContainer = (ViewGroup) findViewById(R.id.content_container); + contentContainer.removeAllViews(); + getLayoutInflater().inflate(showLayoutId, contentContainer, true); + } + + private void animateUiSwitch(int showLayoutId, final Runnable postAnimateCommand) { + // Find everything we will shuffle around. + final ViewGroup contentContainer = (ViewGroup) findViewById(R.id.content_container); + final View hidingView = contentContainer.getChildAt(0); + final View showingView = getLayoutInflater().inflate(showLayoutId, + null, false); // First animation - fade out the old content. - contentEditing.animate().alpha(0.0f).withLayer().withEndAction(new Runnable() { + hidingView.animate().alpha(0.0f).withLayer().withEndAction(new Runnable() { @Override public void run() { - contentEditing.setVisibility(View.INVISIBLE); + hidingView.setVisibility(View.INVISIBLE); // Prepare the new content with correct size and alpha. - contentGenerating.setMinimumWidth(contentContainer.getWidth()); - contentGenerating.setAlpha(0.0f); + showingView.setMinimumWidth(contentContainer.getWidth()); + showingView.setAlpha(0.0f); - // Compute how to much shrink the container to fit around the new content. + // Compute how to much shrink /stretch the content. final int widthSpec = MeasureSpec.makeMeasureSpec( - contentContainer.getWidth(), MeasureSpec.AT_MOST); + contentContainer.getWidth(), MeasureSpec.UNSPECIFIED); final int heightSpec = MeasureSpec.makeMeasureSpec( - contentContainer.getHeight(), MeasureSpec.AT_MOST); - contentGenerating.measure(widthSpec, heightSpec); - final float scaleY = (float) contentGenerating.getMeasuredHeight() + contentContainer.getHeight(), MeasureSpec.UNSPECIFIED); + showingView.measure(widthSpec, heightSpec); + final float scaleY = (float) showingView.getMeasuredHeight() / (float) contentContainer.getHeight(); // Second animation - resize the container. @@ -963,10 +1231,16 @@ public class PrintJobConfigActivity extends Activity { // Swap the old and the new content. contentContainer.removeAllViews(); contentContainer.setScaleY(1.0f); - contentContainer.addView(contentGenerating); + contentContainer.addView(showingView); // Third animation - show the new content. - contentGenerating.animate().withLayer().alpha(1.0f); + showingView.animate().withLayer().alpha(1.0f).withEndAction( + new Runnable() { + @Override + public void run() { + postAnimateCommand.run(); + } + }); } }); } @@ -975,10 +1249,6 @@ public class PrintJobConfigActivity extends Activity { public void initialize() { mEditorState = EDITOR_STATE_INITIALIZED; - if (mDestinationSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) { - mIgnoreNextDestinationChange = true; - mDestinationSpinner.setSelection(AdapterView.INVALID_POSITION); - } } public boolean isCancelled() { @@ -1001,6 +1271,7 @@ public class PrintJobConfigActivity extends Activity { public void confirmPrint() { mEditorState = EDITOR_STATE_CONFIRMED_PRINT; + showUi(UI_GENERATING_PRINT_JOB, null); } public boolean isPreviewConfirmed() { @@ -1046,7 +1317,79 @@ public class PrintJobConfigActivity extends Activity { return ALL_PAGES_ARRAY; } + private void bindUi() { + if (mCurrentUi != UI_EDITING_PRINT_JOB) { + return; + } + + // Content container + mContentContainer = findViewById(R.id.content_container); + + // Copies + mCopiesEditText = (EditText) findViewById(R.id.copies_edittext); + mCopiesEditText.setText(MIN_COPIES_STRING); + mCopiesEditText.addTextChangedListener(mCopiesTextWatcher); + mCopiesEditText.selectAll(); + if (!TextUtils.equals(mCopiesEditText.getText(), MIN_COPIES_STRING)) { + mIgnoreNextCopiesChange = true; + } + PrintSpoolerService.peekInstance().setPrintJobCopiesNoPersistence( + mPrintJobId, MIN_COPIES); + + // Destination. + mDestinationSpinner = (Spinner) findViewById(R.id.destination_spinner); + mDestinationSpinner.setAdapter(mDestinationSpinnerAdapter); + mDestinationSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + if (mDestinationSpinnerAdapter.getCount() > 0) { + mIgnoreNextDestinationChange = true; + } + + // Media size. + mMediaSizeSpinner = (Spinner) findViewById(R.id.paper_size_spinner); + mMediaSizeSpinner.setAdapter(mMediaSizeSpinnerAdapter); + mMediaSizeSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + if (mMediaSizeSpinnerAdapter.getCount() > 0) { + mIgnoreNextMediaSizeChange = true; + } + + // Color mode. + mColorModeSpinner = (Spinner) findViewById(R.id.color_spinner); + mColorModeSpinner.setAdapter(mColorModeSpinnerAdapter); + mColorModeSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + if (mColorModeSpinnerAdapter.getCount() > 0) { + mIgnoreNextColorModeChange = true; + } + + // Orientation + mOrientationSpinner = (Spinner) findViewById(R.id.orientation_spinner); + mOrientationSpinner.setAdapter(mOrientationSpinnerAdapter); + mOrientationSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + if (mOrientationSpinnerAdapter.getCount() > 0) { + mIgnoreNextOrientationChange = true; + } + + // Range + mRangeTitle = (TextView) findViewById(R.id.page_range_title); + mRangeEditText = (EditText) findViewById(R.id.page_range_edittext); + mRangeEditText.addTextChangedListener(mRangeTextWatcher); + + // Range options + mRangeOptionsSpinner = (Spinner) findViewById(R.id.range_options_spinner); + mRangeOptionsSpinner.setAdapter(mRangeOptionsSpinnerAdapter); + mRangeOptionsSpinner.setOnItemSelectedListener(mOnItemSelectedListener); + if (mRangeOptionsSpinnerAdapter.getCount() > 0) { + mIgnoreNextRangeOptionChange = true; + } + + // Print button + mPrintButton = (Button) findViewById(R.id.print_button); + registerPrintButtonClickListener(); + } + public void updateUi() { + if (mCurrentUi != UI_EDITING_PRINT_JOB) { + return; + } if (isPrintConfirmed() || isPreviewConfirmed() || isCancelled()) { mDestinationSpinner.setEnabled(false); mCopiesEditText.setEnabled(false); @@ -1061,14 +1404,20 @@ public class PrintJobConfigActivity extends Activity { return; } + // If a printer with capabilities is selected, then we enabled all options. + boolean allOptionsEnabled = false; final int selectedIndex = mDestinationSpinner.getSelectedItemPosition(); + if (selectedIndex >= 0) { + Object item = mDestinationSpinnerAdapter.getItem(selectedIndex); + if (item instanceof PrinterInfo) { + PrinterInfo printer = (PrinterInfo) item; + if (printer.getCapabilities() != null) { + allOptionsEnabled = true; + } + } + } - if (selectedIndex < 0 || mDestinationSpinnerAdapter.getItem( - selectedIndex).value.getCapabilities() == null) { - - // Destination - mDestinationSpinner.setEnabled(false); - + if (!allOptionsEnabled) { String minCopiesString = String.valueOf(MIN_COPIES); if (!TextUtils.equals(mCopiesEditText.getText(), minCopiesString)) { mIgnoreNextCopiesChange = true; @@ -1121,17 +1470,10 @@ public class PrintJobConfigActivity extends Activity { mPrintButton.setEnabled(false); } else { PrintAttributes defaultAttributes = mTempPrintAttributes; - PrinterInfo printer = mDestinationSpinnerAdapter.getItem(selectedIndex).value; + PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem(); PrinterCapabilitiesInfo capabilities = printer.getCapabilities(); printer.getCapabilities().getDefaults(defaultAttributes); - // Destination - if (mDestinationSpinnerAdapter.getCount() > 1) { - mDestinationSpinner.setEnabled(true); - } else { - mDestinationSpinner.setEnabled(false); - } - // Copies mCopiesEditText.setEnabled(true); @@ -1159,9 +1501,6 @@ public class PrintJobConfigActivity extends Activity { if (mediaSizeCount <= 0) { mMediaSizeSpinner.setEnabled(false); mMediaSizeSpinner.setSelection(AdapterView.INVALID_POSITION); - } else if (mediaSizeCount == 1) { - mMediaSizeSpinner.setEnabled(false); - mMediaSizeSpinner.setSelection(0); } else { mMediaSizeSpinner.setEnabled(true); final int selectedMediaSizeIndex = Math.max(mediaSizes.indexOf( @@ -1172,6 +1511,7 @@ public class PrintJobConfigActivity extends Activity { } } } + mMediaSizeSpinner.setEnabled(true); // Color mode. final int colorModes = capabilities.getColorModes(); @@ -1210,9 +1550,6 @@ public class PrintJobConfigActivity extends Activity { if (colorModeCount <= 0) { mColorModeSpinner.setEnabled(false); mColorModeSpinner.setSelection(AdapterView.INVALID_POSITION); - } else if (colorModeCount == 1) { - mColorModeSpinner.setEnabled(false); - mColorModeSpinner.setSelection(0); } else { mColorModeSpinner.setEnabled(true); final int selectedColorModeIndex = Integer.numberOfTrailingZeros( @@ -1223,6 +1560,7 @@ public class PrintJobConfigActivity extends Activity { } } } + mColorModeSpinner.setEnabled(true); // Orientation. final int orientations = capabilities.getOrientations(); @@ -1262,9 +1600,6 @@ public class PrintJobConfigActivity extends Activity { if (orientationCount <= 0) { mOrientationSpinner.setEnabled(false); mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION); - } else if (orientationCount == 1) { - mOrientationSpinner.setEnabled(false); - mOrientationSpinner.setSelection(0); } else { mOrientationSpinner.setEnabled(true); final int selectedOrientationIndex = Integer.numberOfTrailingZeros( @@ -1276,20 +1611,25 @@ public class PrintJobConfigActivity extends Activity { } } } + mOrientationSpinner.setEnabled(true); // Range options PrintDocumentInfo info = mDocument.info; if (info != null && (info.getPageCount() > 1 || info.getPageCount() == PrintDocumentInfo.PAGE_COUNT_UNKNOWN)) { mRangeOptionsSpinner.setEnabled(true); - if (mRangeOptionsSpinner.getSelectedItemPosition() > 0 - && !mRangeEditText.isEnabled()) { - mRangeEditText.setEnabled(true); - mRangeEditText.setVisibility(View.VISIBLE); - mRangeEditText.requestFocus(); - InputMethodManager imm = (InputMethodManager) - getSystemService(INPUT_METHOD_SERVICE); - imm.showSoftInput(mRangeEditText, 0); + if (mRangeOptionsSpinner.getSelectedItemPosition() > 0) { + if (!mRangeEditText.isEnabled()) { + mRangeEditText.setEnabled(true); + mRangeEditText.setVisibility(View.VISIBLE); + mRangeEditText.requestFocus(); + InputMethodManager imm = (InputMethodManager) + getSystemService(INPUT_METHOD_SERVICE); + imm.showSoftInput(mRangeEditText, 0); + } + } else { + mRangeEditText.setEnabled(false); + mRangeEditText.setVisibility(View.INVISIBLE); } final int pageCount = mDocument.info.getPageCount(); mRangeTitle.setText(getString(R.string.label_pages, @@ -1307,6 +1647,7 @@ public class PrintJobConfigActivity extends Activity { mRangeEditText.setEnabled(false); mRangeEditText.setVisibility(View.INVISIBLE); } + mRangeOptionsSpinner.setEnabled(true); // Print/Print preview if ((mRangeOptionsSpinner.getSelectedItemPosition() == 1 @@ -1333,99 +1674,7 @@ public class PrintJobConfigActivity extends Activity { mCopiesEditText.selectAll(); mCopiesEditText.requestFocus(); } - } - } - - public void addPrinters(List<PrinterInfo> addedPrinters) { - final int addedPrinterCount = addedPrinters.size(); - for (int i = 0; i < addedPrinterCount; i++) { - PrinterInfo addedPrinter = addedPrinters.get(i); - boolean duplicate = false; - final int existingPrinterCount = mDestinationSpinnerAdapter.getCount(); - for (int j = 0; j < existingPrinterCount; j++) { - PrinterInfo existingPrinter = mDestinationSpinnerAdapter.getItem(j).value; - if (addedPrinter.getId().equals(existingPrinter.getId())) { - duplicate = true; - break; - } - } - if (!duplicate) { - mDestinationSpinnerAdapter.add(new SpinnerItem<PrinterInfo>( - addedPrinter, addedPrinter.getName())); - } else { - Log.w(LOG_TAG, "Skipping a duplicate printer: " + addedPrinter); - } - } - - if (mDestinationSpinner.getSelectedItemPosition() == AdapterView.INVALID_POSITION - && mDestinationSpinnerAdapter.getCount() > 0) { - mDestinationSpinner.setSelection(0); - } - - mEditor.updateUi(); - } - - public void removePrinters(List<PrinterId> pritnerIds) { - final int printerIdCount = pritnerIds.size(); - for (int i = 0; i < printerIdCount; i++) { - PrinterId removedPrinterId = pritnerIds.get(i); - boolean removed = false; - final int existingPrinterCount = mDestinationSpinnerAdapter.getCount(); - for (int j = 0; j < existingPrinterCount; j++) { - PrinterInfo existingPrinter = mDestinationSpinnerAdapter.getItem(j).value; - if (removedPrinterId.equals(existingPrinter.getId())) { - mDestinationSpinnerAdapter.remove(mDestinationSpinnerAdapter.getItem(j)); - removed = true; - break; - } - } - if (!removed) { - Log.w(LOG_TAG, "Ignoring not added printer with id: " + removedPrinterId); - } - } - - if (mDestinationSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION - && mDestinationSpinnerAdapter.getCount() == 0) { - mDestinationSpinner.setSelection(AdapterView.INVALID_POSITION); - } - } - - @SuppressWarnings("unchecked") - public void updatePrinters(List<PrinterInfo> pritners) { - SpinnerItem<PrinterInfo> selectedItem = - (SpinnerItem<PrinterInfo>) mDestinationSpinner.getSelectedItem(); - PrinterId selectedPrinterId = (selectedItem != null) - ? selectedItem.value.getId() : null; - - boolean updated = false; - - final int printerCount = pritners.size(); - for (int i = 0; i < printerCount; i++) { - PrinterInfo updatedPrinter = pritners.get(i); - final int existingPrinterCount = mDestinationSpinnerAdapter.getCount(); - for (int j = 0; j < existingPrinterCount; j++) { - PrinterInfo existingPrinter = mDestinationSpinnerAdapter.getItem(j).value; - if (updatedPrinter.getId().equals(existingPrinter.getId())) { - existingPrinter.copyFrom(updatedPrinter); - updated = true; - if (selectedPrinterId != null - && selectedPrinterId.equals(updatedPrinter.getId())) { - // The selected printer was updated. We simulate a fake - // selection to reuse the normal printer change handling. - mOnItemSelectedListener.onItemSelected(mDestinationSpinner, - mDestinationSpinner.getSelectedView(), - mDestinationSpinner.getSelectedItemPosition(), - mDestinationSpinner.getSelectedItemId()); - // TODO: This will reset the UI to the defaults for the - // printer. We may need to revisit this. - - } - break; - } - } - } - if (updated) { - mDestinationSpinnerAdapter.notifyDataSetChanged(); + mCopiesEditText.setEnabled(true); } } @@ -1455,10 +1704,52 @@ public class PrintJobConfigActivity extends Activity { } } - private final class DestinationAdapter extends ArrayAdapter<SpinnerItem<PrinterInfo>> { + private final class DestinationAdapter extends BaseAdapter + implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>{ + private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>(); + + public final PrinterInfo mFakePdfPrinter; public DestinationAdapter() { - super( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item); + getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this); + mFakePdfPrinter = createFakePdfPrinter(); + } + + @Override + public int getCount() { + return Math.max(Math.min(mPrinters.size(), DEST_ADAPTER_MAX_ITEM_COUNT), + DEST_ADAPTER_MIN_ITEM_COUNT); + } + + @Override + public Object getItem(int position) { + if (position == DEST_ADAPTER_POSITION_SAVE_AS_PDF) { + return mFakePdfPrinter; + } + if (!mPrinters.isEmpty()) { + if (position < DEST_ADAPTER_POSITION_SAVE_AS_PDF) { + return mPrinters.get(position); + } else if (position > DEST_ADAPTER_POSITION_SAVE_AS_PDF + && position < getCount() - 1) { + return mPrinters.get(position - 1); + } + } + return null; + } + + @Override + public long getItemId(int position) { + if (position == DEST_ADAPTER_POSITION_SAVE_AS_PDF) { + return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF; + } + if (mPrinters.isEmpty()) { + if (position == DEST_ADAPTER_POSITION_SEARCHING_FOR_PRINTERS) { + return DEST_ADAPTER_ITEM_ID_SEARCHING_FOR_PRINTERS; + } + } else if (position == getCount() - 1) { + return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS; + } + return position; } @Override @@ -1474,149 +1765,91 @@ public class PrintJobConfigActivity extends Activity { R.layout.spinner_dropdown_item, parent, false); } - PrinterInfo printerInfo = getItem(position).value; - TextView title = (TextView) convertView.findViewById(R.id.title); - title.setText(printerInfo.getName()); - - try { - TextView subtitle = (TextView) - convertView.findViewById(R.id.subtitle); - PackageManager pm = getPackageManager(); - PackageInfo packageInfo = pm.getPackageInfo( - printerInfo.getId().getServiceName().getPackageName(), 0); - subtitle.setText(packageInfo.applicationInfo.loadLabel(pm)); - subtitle.setVisibility(View.VISIBLE); - } catch (NameNotFoundException nnfe) { - /* ignore */ - } - - return convertView; - } - } - } - - private static final class PrinterDiscoverySessionObserver - extends IPrinterDiscoverySessionObserver.Stub { - private static final int MSG_SET_CONTROLLER = 1; - private static final int MSG_ON_PRINTERS_ADDED = 2; - private static final int MSG_ON_PRINTERS_REMOVED = 3; - private static final int MSG_ON_PRINTERS_UPDATED = 4; - - private Handler mHandler; - private Editor mEditor; - private IPrinterDiscoverySessionController mController; - - @SuppressWarnings("unchecked") - public PrinterDiscoverySessionObserver(Editor editor, Looper looper) { - mEditor = editor; - mHandler = new Handler(looper, null, true) { - @Override - public void handleMessage(Message message) { - switch (message.what) { - case MSG_SET_CONTROLLER: { - mController = (IPrinterDiscoverySessionController) message.obj; - // TODO: This should be cleaned up - List<PrinterId> printerIds = Collections.emptyList(); - try { - mController.open(printerIds); - } catch (RemoteException e) { - Log.e(LOG_TAG, "Error starting printer discovery"); - } - } break; - - case MSG_ON_PRINTERS_ADDED: { - List<PrinterInfo> printers = (List<PrinterInfo>) message.obj; - mEditor.addPrinters(printers); - } break; - - case MSG_ON_PRINTERS_REMOVED: { - List<PrinterId> printerIds = (List<PrinterId>) message.obj; - mEditor.removePrinters(printerIds); - } break; + CharSequence title = null; + CharSequence subtitle = null; - case MSG_ON_PRINTERS_UPDATED: { - List<PrinterInfo> printers = (List<PrinterInfo>) message.obj; - mEditor.updatePrinters(printers); - } break; + if (mPrinters.isEmpty() + && position == DEST_ADAPTER_POSITION_SEARCHING_FOR_PRINTERS) { + title = getString(R.string.searching_for_printers); + } else { + if (position == DEST_ADAPTER_POSITION_SAVE_AS_PDF) { + PrinterInfo printer = (PrinterInfo) getItem(position); + title = printer.getName(); + } else if (position == getCount() - 1) { + title = getString(R.string.all_printers); + } else { + PrinterInfo printer = (PrinterInfo) getItem(position); + title = printer.getName(); + try { + PackageInfo packageInfo = getPackageManager().getPackageInfo( + printer.getId().getServiceName().getPackageName(), 0); + subtitle = packageInfo.applicationInfo.loadLabel(getPackageManager()); + } catch (NameNotFoundException nnfe) { + /* ignore */ + } } } - }; - } - public void open(List<PrinterId> priorityList) { - if (mController != null) { - try { - mController.open(priorityList); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error closing printer discovery session", re); - } - } - } - - public void close() { - if (mController != null) { - try { - mController.close(); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error closing printer discovery session", re); - } - } - } + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(title); - public void requestPrinterUpdate(PrinterId printerId) { - if (mController != null) { - try { - mController.requestPrinterUpdate(printerId); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error requestin printer update", re); - } - } - } - - @Override - public void setController(IPrinterDiscoverySessionController controller) { - synchronized (this) { - if (mHandler != null) { - mHandler.obtainMessage(MSG_SET_CONTROLLER, controller) - .sendToTarget(); + TextView subtitleView = (TextView) convertView.findViewById(R.id.subtitle); + if (!TextUtils.isEmpty(subtitle)) { + subtitleView.setText(subtitle); + subtitleView.setVisibility(View.VISIBLE); + } else { + subtitleView.setText(null); + subtitleView.setVisibility(View.GONE); } - } - } - @Override - public void onPrintersAdded(List<PrinterInfo> printers) { - synchronized (this) { - if (mHandler != null) { - mHandler.obtainMessage(MSG_ON_PRINTERS_ADDED, printers) - .sendToTarget(); - } + return convertView; } - } - @Override - public void onPrintersRemoved(List<PrinterId> printers) { - synchronized (this) { - if (mHandler != null) { - mHandler.obtainMessage(MSG_ON_PRINTERS_REMOVED, printers) - .sendToTarget(); + @Override + public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) { + if (id == LOADER_ID_PRINTERS_LOADER) { + return new FusedPrintersProvider(PrintJobConfigActivity.this); } + return null; } - } - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - synchronized (this) { - if (mHandler != null) { - mHandler.obtainMessage(MSG_ON_PRINTERS_UPDATED, printers) - .sendToTarget(); - } + @Override + public void onLoadFinished(Loader<List<PrinterInfo>> loader, + List<PrinterInfo> printers) { + mPrinters.clear(); + mPrinters.addAll(printers); + notifyDataSetChanged(); } - } - public void destroy() { - synchronized (this) { - mHandler = null; - mEditor = null; + @Override + public void onLoaderReset(Loader<List<PrinterInfo>> loader) { + mPrinters.clear(); + notifyDataSetInvalidated(); + } + + private PrinterInfo createFakePdfPrinter() { + PrinterId printerId = new PrinterId(getComponentName(), "PDF printer"); + + PrinterCapabilitiesInfo capabilities = + new PrinterCapabilitiesInfo.Builder(printerId) + .addMediaSize(MediaSize.createMediaSize(getPackageManager(), + MediaSize.ISO_A4), true) + .addMediaSize(MediaSize.createMediaSize(getPackageManager(), + MediaSize.NA_LETTER), false) + .addResolution(new Resolution("PDF resolution", "PDF resolution", + 300, 300), true) + .setColorModes(PrintAttributes.COLOR_MODE_COLOR + | PrintAttributes.COLOR_MODE_MONOCHROME, + PrintAttributes.COLOR_MODE_COLOR) + .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT + | PrintAttributes.ORIENTATION_LANDSCAPE, + PrintAttributes.ORIENTATION_PORTRAIT) + .create(); + + return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf), + PrinterInfo.STATUS_READY) + .setCapabilities(capabilities) + .create(); } } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpooler.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpooler.java deleted file mode 100644 index 1b8b81a..0000000 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpooler.java +++ /dev/null @@ -1,979 +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.printspooler; - -import android.content.ComponentName; -import android.content.Context; -import android.os.AsyncTask; -import android.os.ParcelFileDescriptor; -import android.print.IPrintClient; -import android.print.IPrinterDiscoverySessionObserver; -import android.print.PageRange; -import android.print.PrintAttributes; -import android.print.PrintAttributes.Margins; -import android.print.PrintAttributes.MediaSize; -import android.print.PrintAttributes.Resolution; -import android.print.PrintAttributes.Tray; -import android.print.PrintDocumentInfo; -import android.print.PrintJobInfo; -import android.print.PrintManager; -import android.print.PrinterId; -import android.print.PrinterInfo; -import android.util.AtomicFile; -import android.util.Log; -import android.util.Slog; -import android.util.Xml; - -import com.android.internal.util.FastXmlSerializer; - -import libcore.io.IoUtils; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class PrintSpooler { - - private static final String LOG_TAG = "PrintSpooler"; - - private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = true; - - private static final boolean DEBUG_PERSISTENCE = true; - - private static final boolean PERSISTNECE_MANAGER_ENABLED = true; - - private static final String PRINT_FILE_EXTENSION = "pdf"; - - private static int sPrintJobIdCounter; - - private static final Object sLock = new Object(); - - private static PrintSpooler sInstance; - - private final Object mLock = new Object(); - - private final List<PrintJobInfo> mPrintJobs = new ArrayList<PrintJobInfo>(); - - private final PersistenceManager mPersistanceManager; - - private final NotificationController mNotificationController; - - private final PrintSpoolerService mService; - - public static void destroyInstance() { - synchronized (sLock) { - sInstance = null; - } - } - - public static void createInstance(PrintSpoolerService service) { - synchronized (sLock) { - sInstance = new PrintSpooler(service); - } - } - - public static PrintSpooler peekInstance() { - synchronized (sLock) { - return sInstance; - } - } - - private PrintSpooler(PrintSpoolerService service) { - mService = service; - mPersistanceManager = new PersistenceManager(service); - mNotificationController = new NotificationController(service); - synchronized (mLock) { - mPersistanceManager.readStateLocked(); - handleReadPrintJobsLocked(); - } - } - - public List<PrintJobInfo> getPrintJobInfos(ComponentName componentName, - int state, int appId) { - List<PrintJobInfo> foundPrintJobs = null; - synchronized (mLock) { - final int printJobCount = mPrintJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = mPrintJobs.get(i); - PrinterId printerId = printJob.getPrinterId(); - final boolean sameComponent = (componentName == null - || (printerId != null - && componentName.equals(printerId.getServiceName()))); - final boolean sameAppId = appId == PrintManager.APP_ID_ANY - || printJob.getAppId() == appId; - final boolean sameState = (state == printJob.getState()) - || (state == PrintJobInfo.STATE_ANY) - || (state == PrintJobInfo.STATE_ANY_VISIBLE_TO_CLIENTS - && printJob.getState() > PrintJobInfo.STATE_CREATED); - if (sameComponent && sameAppId && sameState) { - if (foundPrintJobs == null) { - foundPrintJobs = new ArrayList<PrintJobInfo>(); - } - foundPrintJobs.add(printJob); - } - } - } - return foundPrintJobs; - } - - public PrintJobInfo getPrintJobInfo(int printJobId, int appId) { - synchronized (mLock) { - final int printJobCount = mPrintJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = mPrintJobs.get(i); - if (printJob.getId() == printJobId - && (appId == PrintManager.APP_ID_ANY - || appId == printJob.getAppId())) { - return printJob; - } - } - return null; - } - } - - public PrintJobInfo createPrintJob(CharSequence label, IPrintClient client, - PrintAttributes attributes, int appId) { - synchronized (mLock) { - final int printJobId = generatePrintJobIdLocked(); - PrintJobInfo printJob = new PrintJobInfo(); - printJob.setId(printJobId); - printJob.setAppId(appId); - printJob.setLabel(label); - printJob.setAttributes(attributes); - printJob.setState(PrintJobInfo.STATE_CREATED); - - addPrintJobLocked(printJob); - - return printJob; - } - } - - private void handleReadPrintJobsLocked() { - final int printJobCount = mPrintJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = mPrintJobs.get(i); - - // Update the notification. - mNotificationController.onPrintJobStateChanged(printJob); - - switch (printJob.getState()) { - case PrintJobInfo.STATE_QUEUED: - case PrintJobInfo.STATE_STARTED: { - // We have a print job that was queued or started in the past - // but the device battery died or a crash occurred. In this case - // we assume the print job failed and let the user decide whether - // to restart the job or just - setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED, - mService.getString(R.string.no_connection_to_printer)); - } break; - } - } - } - - public void checkAllPrintJobsHandled() { - synchronized (mLock) { - if (!hasActivePrintJobsLocked()) { - notifyOnAllPrintJobsHandled(); - } - } - } - - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { - mService.createPrinterDiscoverySession(observer); - } - - private int generatePrintJobIdLocked() { - int printJobId = sPrintJobIdCounter++; - while (isDuplicatePrintJobId(printJobId)) { - printJobId = sPrintJobIdCounter++; - } - return printJobId; - } - - private boolean isDuplicatePrintJobId(int printJobId) { - final int printJobCount = mPrintJobs.size(); - for (int j = 0; j < printJobCount; j++) { - PrintJobInfo printJob = mPrintJobs.get(j); - if (printJob.getId() == printJobId) { - return true; - } - } - return false; - } - - public void writePrintJobData(final ParcelFileDescriptor fd, final int printJobId) { - final PrintJobInfo printJob; - synchronized (mLock) { - printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - } - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - FileInputStream in = null; - FileOutputStream out = null; - try { - if (printJob != null) { - File file = generateFileForPrintJob(printJobId); - in = new FileInputStream(file); - out = new FileOutputStream(fd.getFileDescriptor()); - } - final byte[] buffer = new byte[8192]; - while (true) { - final int readByteCount = in.read(buffer); - if (readByteCount < 0) { - return null; - } - out.write(buffer, 0, readByteCount); - } - } catch (FileNotFoundException fnfe) { - Log.e(LOG_TAG, "Error writing print job data!", fnfe); - } catch (IOException ioe) { - Log.e(LOG_TAG, "Error writing print job data!", ioe); - } finally { - IoUtils.closeQuietly(in); - IoUtils.closeQuietly(out); - IoUtils.closeQuietly(fd); - } - Log.i(LOG_TAG, "[END WRITE]"); - return null; - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); - } - - public File generateFileForPrintJob(int printJobId) { - return new File(mService.getFilesDir(), "print_job_" - + printJobId + "." + PRINT_FILE_EXTENSION); - } - - private void addPrintJobLocked(PrintJobInfo printJob) { - mPrintJobs.add(printJob); - if (DEBUG_PRINT_JOB_LIFECYCLE) { - Slog.i(LOG_TAG, "[ADD] " + printJob); - } - } - - private void removePrintJobLocked(PrintJobInfo printJob) { - if (mPrintJobs.remove(printJob)) { - generateFileForPrintJob(printJob.getId()).delete(); - if (DEBUG_PRINT_JOB_LIFECYCLE) { - Slog.i(LOG_TAG, "[REMOVE] " + printJob); - } - } - } - - public boolean setPrintJobState(int printJobId, int state, CharSequence error) { - boolean success = false; - - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - success = true; - - printJob.setState(state); - printJob.setFailureReason(error); - mNotificationController.onPrintJobStateChanged(printJob); - - if (DEBUG_PRINT_JOB_LIFECYCLE) { - Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob); - } - - switch (state) { - case PrintJobInfo.STATE_COMPLETED: - case PrintJobInfo.STATE_CANCELED: - removePrintJobLocked(printJob); - // $fall-through$ - case PrintJobInfo.STATE_FAILED: { - PrinterId printerId = printJob.getPrinterId(); - if (printerId != null) { - ComponentName service = printerId.getServiceName(); - if (!hasActivePrintJobsForServiceLocked(service)) { - mService.onAllPrintJobsForServiceHandled(service); - } - } - } break; - - case PrintJobInfo.STATE_QUEUED: { - mService.onPrintJobQueued(new PrintJobInfo(printJob)); - } break; - } - - if (shouldPersistPrintJob(printJob)) { - mPersistanceManager.writeStateLocked(); - } - - if (!hasActivePrintJobsLocked()) { - notifyOnAllPrintJobsHandled(); - } - } - } - - return success; - } - - public boolean hasActivePrintJobsLocked() { - final int printJobCount = mPrintJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = mPrintJobs.get(i); - if (isActiveState(printJob.getState())) { - return true; - } - } - return false; - } - - public boolean hasActivePrintJobsForServiceLocked(ComponentName service) { - final int printJobCount = mPrintJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = mPrintJobs.get(i); - if (isActiveState(printJob.getState()) - && printJob.getPrinterId().getServiceName().equals(service)) { - return true; - } - } - return false; - } - - private static boolean isActiveState(int printJobState) { - return printJobState == PrintJobInfo.STATE_CREATED - || printJobState == PrintJobInfo.STATE_QUEUED - || printJobState == PrintJobInfo.STATE_STARTED; - } - - public boolean setPrintJobTag(int printJobId, String tag) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - String printJobTag = printJob.getTag(); - if (printJobTag == null) { - if (tag == null) { - return false; - } - } else if (printJobTag.equals(tag)) { - return false; - } - printJob.setTag(tag); - if (shouldPersistPrintJob(printJob)) { - mPersistanceManager.writeStateLocked(); - } - return true; - } - } - return false; - } - - public void setPrintJobCopiesNoPersistence(int printJobId, int copies) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - printJob.setCopies(copies); - } - } - } - - public void setPrintJobPrintDocumentInfoNoPersistence(int printJobId, PrintDocumentInfo info) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - printJob.setDocumentInfo(info); - } - } - } - - public void setPrintJobAttributesNoPersistence(int printJobId, PrintAttributes attributes) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - printJob.setAttributes(attributes); - } - } - } - - public void setPrintJobPrinterNoPersistence(int printJobId, PrinterInfo printer) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - printJob.setPrinterId(printer.getId()); - printJob.setPrinterName(printer.getName()); - } - } - } - - public void setPrintJobPagesNoPersistence(int printJobId, PageRange[] pages) { - synchronized (mLock) { - PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); - if (printJob != null) { - printJob.setPages(pages); - } - } - } - - private boolean shouldPersistPrintJob(PrintJobInfo printJob) { - return printJob.getState() >= PrintJobInfo.STATE_QUEUED; - } - - private void notifyOnAllPrintJobsHandled() { - // This has to run on the tread that is persisting the current state - // since this call may result in the system unbinding from the spooler - // and as a result the spooler process may get killed before the write - // completes. - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - mService.onAllPrintJobsHandled(); - return null; - } - }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); - } - - private final class PersistenceManager { - private static final String PERSIST_FILE_NAME = "print_spooler_state.xml"; - - private static final String TAG_SPOOLER = "spooler"; - private static final String TAG_JOB = "job"; - - private static final String TAG_PRINTER_ID = "printerId"; - private static final String TAG_PAGE_RANGE = "pageRange"; - private static final String TAG_ATTRIBUTES = "attributes"; - private static final String TAG_DOCUMENT_INFO = "documentInfo"; - - private static final String ATTR_ID = "id"; - private static final String ATTR_LABEL = "label"; - private static final String ATTR_STATE = "state"; - private static final String ATTR_APP_ID = "appId"; - private static final String ATTR_USER_ID = "userId"; - private static final String ATTR_TAG = "tag"; - private static final String ATTR_COPIES = "copies"; - - private static final String TAG_MEDIA_SIZE = "mediaSize"; - private static final String TAG_RESOLUTION = "resolution"; - private static final String TAG_MARGINS = "margins"; - private static final String TAG_INPUT_TRAY = "inputTray"; - private static final String TAG_OUTPUT_TRAY = "outputTray"; - - private static final String ATTR_DUPLEX_MODE = "duplexMode"; - private static final String ATTR_COLOR_MODE = "colorMode"; - private static final String ATTR_FITTING_MODE = "fittingMode"; - private static final String ATTR_ORIENTATION = "orientation"; - - private static final String ATTR_PRINTER_NAME = "printerName"; - private static final String ATTR_SERVICE_NAME = "serviceName"; - - private static final String ATTR_WIDTH_MILS = "widthMils"; - private static final String ATTR_HEIGHT_MILS = "heightMils"; - - private static final String ATTR_HORIZONTAL_DPI = "horizontalDip"; - private static final String ATTR_VERTICAL_DPI = "verticalDpi"; - - private static final String ATTR_LEFT_MILS = "leftMils"; - private static final String ATTR_TOP_MILS = "topMils"; - private static final String ATTR_RIGHT_MILS = "rightMils"; - private static final String ATTR_BOTTOM_MILS = "bottomMils"; - - private static final String ATTR_START = "start"; - private static final String ATTR_END = "end"; - - private static final String ATTR_NAME = "name"; - private static final String ATTR_PAGE_COUNT = "pageCount"; - private static final String ATTR_CONTENT_TYPE = "contentType"; - - private final AtomicFile mStatePersistFile; - - private boolean mWriteStateScheduled; - - private PersistenceManager(Context context) { - mStatePersistFile = new AtomicFile(new File(context.getFilesDir(), - PERSIST_FILE_NAME)); - } - - public void writeStateLocked() { - if (!PERSISTNECE_MANAGER_ENABLED) { - return; - } - if (mWriteStateScheduled) { - return; - } - mWriteStateScheduled = true; - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - synchronized (mLock) { - mWriteStateScheduled = false; - doWriteStateLocked(); - } - return null; - } - }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); - } - - private void doWriteStateLocked() { - if (DEBUG_PERSISTENCE) { - Log.i(LOG_TAG, "[PERSIST START]"); - } - FileOutputStream out = null; - try { - out = mStatePersistFile.startWrite(); - - XmlSerializer serializer = new FastXmlSerializer(); - serializer.setOutput(out, "utf-8"); - serializer.startDocument(null, true); - serializer.startTag(null, TAG_SPOOLER); - - List<PrintJobInfo> printJobs = mPrintJobs; - - final int printJobCount = printJobs.size(); - for (int j = 0; j < printJobCount; j++) { - PrintJobInfo printJob = printJobs.get(j); - - final int state = printJob.getState(); - if (state < PrintJobInfo.STATE_QUEUED - || state > PrintJobInfo.STATE_CANCELED) { - continue; - } - - serializer.startTag(null, TAG_JOB); - - serializer.attribute(null, ATTR_ID, String.valueOf(printJob.getId())); - serializer.attribute(null, ATTR_LABEL, printJob.getLabel().toString()); - serializer.attribute(null, ATTR_STATE, String.valueOf(printJob.getState())); - serializer.attribute(null, ATTR_APP_ID, String.valueOf(printJob.getAppId())); - serializer.attribute(null, ATTR_USER_ID, String.valueOf(printJob.getUserId())); - String tag = printJob.getTag(); - if (tag != null) { - serializer.attribute(null, ATTR_TAG, tag); - } - serializer.attribute(null, ATTR_COPIES, String.valueOf(printJob.getCopies())); - - PrinterId printerId = printJob.getPrinterId(); - if (printerId != null) { - serializer.startTag(null, TAG_PRINTER_ID); - serializer.attribute(null, ATTR_PRINTER_NAME, printerId.getLocalId()); - serializer.attribute(null, ATTR_SERVICE_NAME, printerId.getServiceName() - .flattenToString()); - serializer.endTag(null, TAG_PRINTER_ID); - } - - PageRange[] pages = printJob.getPages(); - if (pages != null) { - for (int i = 0; i < pages.length; i++) { - serializer.startTag(null, TAG_PAGE_RANGE); - serializer.attribute(null, ATTR_START, String.valueOf( - pages[i].getStart())); - serializer.attribute(null, ATTR_END, String.valueOf( - pages[i].getEnd())); - serializer.endTag(null, TAG_PAGE_RANGE); - } - } - - PrintAttributes attributes = printJob.getAttributes(); - if (attributes != null) { - serializer.startTag(null, TAG_ATTRIBUTES); - - final int duplexMode = attributes.getDuplexMode(); - serializer.attribute(null, ATTR_DUPLEX_MODE, - String.valueOf(duplexMode)); - - final int colorMode = attributes.getColorMode(); - serializer.attribute(null, ATTR_COLOR_MODE, - String.valueOf(colorMode)); - - final int fittingMode = attributes.getFittingMode(); - serializer.attribute(null, ATTR_FITTING_MODE, - String.valueOf(fittingMode)); - - final int orientation = attributes.getOrientation(); - serializer.attribute(null, ATTR_ORIENTATION, - String.valueOf(orientation)); - - MediaSize mediaSize = attributes.getMediaSize(); - if (mediaSize != null) { - serializer.startTag(null, TAG_MEDIA_SIZE); - serializer.attribute(null, ATTR_ID, mediaSize.getId()); - serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel() - .toString()); - serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf( - mediaSize.getWidthMils())); - serializer.attribute(null, ATTR_HEIGHT_MILS,String.valueOf( - mediaSize.getHeightMils())); - serializer.endTag(null, TAG_MEDIA_SIZE); - } - - Resolution resolution = attributes.getResolution(); - if (resolution != null) { - serializer.startTag(null, TAG_RESOLUTION); - serializer.attribute(null, ATTR_ID, resolution.getId()); - serializer.attribute(null, ATTR_LABEL, resolution.getLabel() - .toString()); - serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf( - resolution.getHorizontalDpi())); - serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf( - resolution.getVerticalDpi())); - serializer.endTag(null, TAG_RESOLUTION); - } - - Margins margins = attributes.getMargins(); - if (margins != null) { - serializer.startTag(null, TAG_MARGINS); - serializer.attribute(null, ATTR_LEFT_MILS, String.valueOf( - margins.getLeftMils())); - serializer.attribute(null, ATTR_TOP_MILS, String.valueOf( - margins.getTopMils())); - serializer.attribute(null, ATTR_RIGHT_MILS, String.valueOf( - margins.getRightMils())); - serializer.attribute(null, ATTR_BOTTOM_MILS, String.valueOf( - margins.getBottomMils())); - serializer.endTag(null, TAG_MARGINS); - } - - Tray inputTray = attributes.getInputTray(); - if (inputTray != null) { - serializer.startTag(null, TAG_INPUT_TRAY); - serializer.attribute(null, ATTR_ID, inputTray.getId()); - serializer.attribute(null, ATTR_LABEL, inputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_INPUT_TRAY); - } - - Tray outputTray = attributes.getOutputTray(); - if (outputTray != null) { - serializer.startTag(null, TAG_OUTPUT_TRAY); - serializer.attribute(null, ATTR_ID, outputTray.getId()); - serializer.attribute(null, ATTR_LABEL, outputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_OUTPUT_TRAY); - } - - serializer.endTag(null, TAG_ATTRIBUTES); - } - - PrintDocumentInfo documentInfo = printJob.getDocumentInfo(); - if (documentInfo != null) { - serializer.startTag(null, TAG_DOCUMENT_INFO); - serializer.attribute(null, ATTR_NAME, documentInfo.getName()); - serializer.attribute(null, ATTR_CONTENT_TYPE, String.valueOf( - documentInfo.getContentType())); - serializer.attribute(null, ATTR_PAGE_COUNT, String.valueOf( - documentInfo.getPageCount())); - serializer.endTag(null, TAG_DOCUMENT_INFO); - } - - serializer.endTag(null, TAG_JOB); - - if (DEBUG_PERSISTENCE) { - Log.i(LOG_TAG, "[PERSISTED] " + printJob); - } - } - - serializer.endTag(null, TAG_SPOOLER); - serializer.endDocument(); - mStatePersistFile.finishWrite(out); - if (DEBUG_PERSISTENCE) { - Log.i(LOG_TAG, "[PERSIST END]"); - } - } catch (IOException e) { - Slog.w(LOG_TAG, "Failed to write state, restoring backup.", e); - mStatePersistFile.failWrite(out); - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ioe) { - /* ignore */ - } - } - } - } - - public void readStateLocked() { - if (!PERSISTNECE_MANAGER_ENABLED) { - return; - } - FileInputStream in = null; - try { - in = mStatePersistFile.openRead(); - } catch (FileNotFoundException e) { - Log.i(LOG_TAG, "No existing print spooler state."); - return; - } - try { - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(in, null); - parseState(parser); - } catch (IllegalStateException ise) { - Slog.w(LOG_TAG, "Failed parsing ", ise); - } catch (NullPointerException npe) { - Slog.w(LOG_TAG, "Failed parsing ", npe); - } catch (NumberFormatException nfe) { - Slog.w(LOG_TAG, "Failed parsing ", nfe); - } catch (XmlPullParserException xppe) { - Slog.w(LOG_TAG, "Failed parsing ", xppe); - } catch (IOException ioe) { - Slog.w(LOG_TAG, "Failed parsing ", ioe); - } catch (IndexOutOfBoundsException iobe) { - Slog.w(LOG_TAG, "Failed parsing ", iobe); - } finally { - try { - in.close(); - } catch (IOException ioe) { - /* ignore */ - } - } - } - - private void parseState(XmlPullParser parser) - throws IOException, XmlPullParserException { - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.START_TAG, TAG_SPOOLER); - parser.next(); - - while (parsePrintJob(parser)) { - parser.next(); - } - - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_SPOOLER); - } - - private boolean parsePrintJob(XmlPullParser parser) - throws IOException, XmlPullParserException { - skipEmptyTextTags(parser); - if (!accept(parser, XmlPullParser.START_TAG, TAG_JOB)) { - return false; - } - - PrintJobInfo printJob = new PrintJobInfo(); - - final int printJobId = Integer.parseInt(parser.getAttributeValue(null, ATTR_ID)); - printJob.setId(printJobId); - String label = parser.getAttributeValue(null, ATTR_LABEL); - printJob.setLabel(label); - final int state = Integer.parseInt(parser.getAttributeValue(null, ATTR_STATE)); - printJob.setState(state); - final int appId = Integer.parseInt(parser.getAttributeValue(null, ATTR_APP_ID)); - printJob.setAppId(appId); - final int userId = Integer.parseInt(parser.getAttributeValue(null, ATTR_USER_ID)); - printJob.setUserId(userId); - String tag = parser.getAttributeValue(null, ATTR_TAG); - printJob.setTag(tag); - String copies = parser.getAttributeValue(null, ATTR_COPIES); - printJob.setCopies(Integer.parseInt(copies)); - - parser.next(); - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_PRINTER_ID)) { - String localId = parser.getAttributeValue(null, ATTR_PRINTER_NAME); - ComponentName service = ComponentName.unflattenFromString(parser.getAttributeValue( - null, ATTR_SERVICE_NAME)); - printJob.setPrinterId(new PrinterId(service, localId)); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_PRINTER_ID); - parser.next(); - } - - skipEmptyTextTags(parser); - List<PageRange> pageRanges = null; - while (accept(parser, XmlPullParser.START_TAG, TAG_PAGE_RANGE)) { - final int start = Integer.parseInt(parser.getAttributeValue(null, ATTR_START)); - final int end = Integer.parseInt(parser.getAttributeValue(null, ATTR_END)); - PageRange pageRange = new PageRange(start, end); - if (pageRanges == null) { - pageRanges = new ArrayList<PageRange>(); - } - pageRanges.add(pageRange); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_PAGE_RANGE); - parser.next(); - } - if (pageRanges != null) { - PageRange[] pageRangesArray = new PageRange[pageRanges.size()]; - pageRanges.toArray(pageRangesArray); - printJob.setPages(pageRangesArray); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_ATTRIBUTES)) { - - PrintAttributes.Builder builder = new PrintAttributes.Builder(); - - String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE); - builder.setDuplexMode(Integer.parseInt(duplexMode)); - - String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE); - builder.setColorMode(Integer.parseInt(colorMode)); - - String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE); - builder.setFittingMode(Integer.parseInt(fittingMode)); - - String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION); - builder.setOrientation(Integer.parseInt(orientation)); - - parser.next(); - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_MEDIA_SIZE)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - final int widthMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_WIDTH_MILS)); - final int heightMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_HEIGHT_MILS)); - MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils); - builder.setMediaSize(mediaSize); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_MEDIA_SIZE); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_RESOLUTION)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - final int horizontalDpi = Integer.parseInt(parser.getAttributeValue(null, - ATTR_HORIZONTAL_DPI)); - final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null, - ATTR_VERTICAL_DPI)); - Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi); - builder.setResolution(resolution); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_RESOLUTION); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_MARGINS)) { - final int leftMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_LEFT_MILS)); - final int topMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_TOP_MILS)); - final int rightMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_RIGHT_MILS)); - final int bottomMils = Integer.parseInt(parser.getAttributeValue(null, - ATTR_BOTTOM_MILS)); - Margins margins = new Margins(leftMils, topMils, rightMils, bottomMils); - builder.setMargins(margins); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_MARGINS); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setInputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setOutputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY); - parser.next(); - } - - printJob.setAttributes(builder.create()); - - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_ATTRIBUTES); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_DOCUMENT_INFO)) { - String name = parser.getAttributeValue(null, ATTR_NAME); - final int pageCount = Integer.parseInt(parser.getAttributeValue(null, - ATTR_PAGE_COUNT)); - final int contentType = Integer.parseInt(parser.getAttributeValue(null, - ATTR_CONTENT_TYPE)); - PrintDocumentInfo info = new PrintDocumentInfo.Builder(name) - .setPageCount(pageCount) - .setContentType(contentType).create(); - printJob.setDocumentInfo(info); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_DOCUMENT_INFO); - parser.next(); - } - - mPrintJobs.add(printJob); - - if (DEBUG_PERSISTENCE) { - Log.i(LOG_TAG, "[RESTORED] " + printJob); - } - - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_JOB); - - return true; - } - - private void expect(XmlPullParser parser, int type, String tag) - throws IOException, XmlPullParserException { - if (!accept(parser, type, tag)) { - throw new XmlPullParserException("Exepected event: " + type - + " and tag: " + tag + " but got event: " + parser.getEventType() - + " and tag:" + parser.getName()); - } - } - - private void skipEmptyTextTags(XmlPullParser parser) - throws IOException, XmlPullParserException { - while (accept(parser, XmlPullParser.TEXT, null) - && "\n".equals(parser.getText())) { - parser.next(); - } - } - - private boolean accept(XmlPullParser parser, int type, String tag) - throws IOException, XmlPullParserException { - if (parser.getEventType() != type) { - return false; - } - if (tag != null) { - if (!tag.equals(parser.getName())) { - return false; - } - } else if (parser.getName() != null) { - return false; - } - return true; - } - } -} diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java index 4fab4f8..fda64c9 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java @@ -21,9 +21,8 @@ import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.IntentSender; -import android.os.Handler; +import android.os.AsyncTask; import android.os.IBinder; -import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -32,14 +31,38 @@ import android.print.IPrintDocumentAdapter; import android.print.IPrintSpooler; import android.print.IPrintSpoolerCallbacks; import android.print.IPrintSpoolerClient; -import android.print.IPrinterDiscoverySessionObserver; +import android.print.PageRange; import android.print.PrintAttributes; +import android.print.PrintAttributes.Margins; +import android.print.PrintAttributes.MediaSize; +import android.print.PrintAttributes.Resolution; +import android.print.PrintAttributes.Tray; +import android.print.PrintDocumentInfo; import android.print.PrintJobInfo; +import android.print.PrintManager; +import android.print.PrinterId; +import android.print.PrinterInfo; +import android.util.AtomicFile; import android.util.Log; import android.util.Slog; +import android.util.Xml; +import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import com.android.internal.util.FastXmlSerializer; +import libcore.io.IoUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; /** @@ -48,22 +71,65 @@ import java.util.List; */ public final class PrintSpoolerService extends Service { + private static final String LOG_TAG = "PrintSpoolerService"; + + private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = true; + + private static final boolean DEBUG_PERSISTENCE = true; + + private static final boolean PERSISTNECE_MANAGER_ENABLED = true; + private static final long CHECK_ALL_PRINTJOBS_HANDLED_DELAY = 5000; - private static final String LOG_TAG = "PrintSpoolerService"; + private static final String PRINT_FILE_EXTENSION = "pdf"; + + private static final Object sLock = new Object(); + + private final Object mLock = new Object(); + + private final List<PrintJobInfo> mPrintJobs = new ArrayList<PrintJobInfo>(); + + private static PrintSpoolerService sInstance; + + private static int sPrintJobIdCounter; private Intent mStartPrintJobConfigActivityIntent; private IPrintSpoolerClient mClient; - private Handler mHandler; + private HandlerCaller mHandlerCaller; + + private PersistenceManager mPersistanceManager; + + private NotificationController mNotificationController; + + private PrinterDiscoverySession mDiscoverySession; + + public static PrintSpoolerService peekInstance() { + synchronized (sLock) { + return sInstance; + } + } @Override public void onCreate() { super.onCreate(); mStartPrintJobConfigActivityIntent = new Intent(PrintSpoolerService.this, PrintJobConfigActivity.class); - mHandler = new MyHandler(getMainLooper()); + mHandlerCaller = new HandlerCaller(this, getMainLooper(), + new HandlerCallerCallback(), false); + + mPersistanceManager = new PersistenceManager(); + mNotificationController = new NotificationController(PrintSpoolerService.this); + + synchronized (mLock) { + mPersistanceManager.readStateLocked(); + handleReadPrintJobsLocked(); + } + + synchronized (sLock) { + sInstance = this; + } } @Override @@ -72,10 +138,10 @@ public final class PrintSpoolerService extends Service { @Override public void getPrintJobInfos(IPrintSpoolerCallbacks callback, ComponentName componentName, int state, int appId, int sequence) - throws RemoteException { + throws RemoteException { List<PrintJobInfo> printJobs = null; try { - printJobs = PrintSpooler.peekInstance().getPrintJobInfos( + printJobs = PrintSpoolerService.this.getPrintJobInfos( componentName, state, appId); } finally { callback.onGetPrintJobInfosResult(printJobs, sequence); @@ -87,7 +153,7 @@ public final class PrintSpoolerService extends Service { int appId, int sequence) throws RemoteException { PrintJobInfo printJob = null; try { - printJob = PrintSpooler.peekInstance().getPrintJobInfo(printJobId, appId); + printJob = PrintSpoolerService.this.getPrintJobInfo(printJobId, appId); } finally { callback.onGetPrintJobInfoResult(printJob, sequence); } @@ -98,11 +164,11 @@ public final class PrintSpoolerService extends Service { public void createPrintJob(String printJobName, IPrintClient client, IPrintDocumentAdapter printAdapter, PrintAttributes attributes, IPrintSpoolerCallbacks callback, int appId, int sequence) - throws RemoteException { + throws RemoteException { PrintJobInfo printJob = null; try { - printJob = PrintSpooler.peekInstance().createPrintJob(printJobName, client, - attributes, appId); + printJob = PrintSpoolerService.this.createPrintJob( + printJobName, client, attributes, appId); if (printJob != null) { Intent intent = mStartPrintJobConfigActivityIntent; intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_DOCUMENT_ADAPTER, @@ -113,13 +179,12 @@ public final class PrintSpoolerService extends Service { IntentSender sender = PendingIntent.getActivity( PrintSpoolerService.this, 0, intent, PendingIntent.FLAG_ONE_SHOT - | PendingIntent.FLAG_CANCEL_CURRENT).getIntentSender(); + | PendingIntent.FLAG_CANCEL_CURRENT).getIntentSender(); - SomeArgs args = SomeArgs.obtain(); - args.arg1 = client; - args.arg2 = sender; - mHandler.obtainMessage(MyHandler.MSG_START_PRINT_JOB_CONFIG_ACTIVITY, - args).sendToTarget(); + Message message = mHandlerCaller.obtainMessageOO( + HandlerCallerCallback.MSG_START_PRINT_JOB_CONFIG_ACTIVITY, + client, sender); + mHandlerCaller.executeOrSendMessage(message); } } finally { callback.onCreatePrintJobResult(printJob, sequence); @@ -127,11 +192,11 @@ public final class PrintSpoolerService extends Service { } @Override - public void setPrintJobState(int printJobId, int state, CharSequence error, + public void setPrintJobState(int printJobId, int state, String error, IPrintSpoolerCallbacks callback, int sequece) throws RemoteException { boolean success = false; try { - success = PrintSpooler.peekInstance().setPrintJobState( + success = PrintSpoolerService.this.setPrintJobState( printJobId, state, error); } finally { callback.onSetPrintJobStateResult(success, sequece); @@ -143,7 +208,7 @@ public final class PrintSpoolerService extends Service { IPrintSpoolerCallbacks callback, int sequece) throws RemoteException { boolean success = false; try { - success = PrintSpooler.peekInstance().setPrintJobTag(printJobId, tag); + success = PrintSpoolerService.this.setPrintJobTag(printJobId, tag); } finally { callback.onSetPrintJobTagResult(success, sequece); } @@ -151,60 +216,191 @@ public final class PrintSpoolerService extends Service { @Override public void writePrintJobData(ParcelFileDescriptor fd, int printJobId) { - PrintSpooler.peekInstance().writePrintJobData(fd, printJobId); + PrintSpoolerService.this.writePrintJobData(fd, printJobId); } @Override public void setClient(IPrintSpoolerClient client) { - mHandler.obtainMessage(MyHandler.MSG_SET_CLIENT, client).sendToTarget(); + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_SET_CLIENT, client); + mHandlerCaller.executeOrSendMessage(message); + } + + @Override + public void onPrintersAdded(List<PrinterInfo> printers) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_ON_PRINTERS_ADDED, printers); + mHandlerCaller.executeOrSendMessage(message); + } + + @Override + public void onPrintersRemoved(List<PrinterId> printerIds) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_ON_PRINTERS_REMOVED, printerIds); + mHandlerCaller.executeOrSendMessage(message); + } + + @Override + public void onPrintersUpdated(List<PrinterInfo> printers) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_ON_PRINTERS_UPDATED, printers); + mHandlerCaller.executeOrSendMessage(message); } }; } - public void onPrintJobQueued(PrintJobInfo printJob) { - mHandler.obtainMessage(MyHandler.MSG_ON_PRINT_JOB_QUEUED, - printJob).sendToTarget(); + public void createPrinterDiscoverySession() { + Message message = mHandlerCaller.obtainMessage( + HandlerCallerCallback.MSG_CREATE_PRINTER_DISCOVERY_SESSION); + mHandlerCaller.executeOrSendMessage(message); } - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { - mHandler.obtainMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION, - observer).sendToTarget(); + public void destroyPrinterDiscoverySession() { + Message message = mHandlerCaller.obtainMessage( + HandlerCallerCallback.MSG_DESTROY_PRINTER_DISCOVERY_SESSION); + mHandlerCaller.executeOrSendMessage(message); } - public void onAllPrintJobsForServiceHandled(ComponentName service) { - mHandler.obtainMessage(MyHandler.MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED, - service).sendToTarget(); + public void startPrinterDiscovery(List<PrinterId> priorityList) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_START_PRINTER_DISCOVERY, priorityList); + mHandlerCaller.executeOrSendMessage(message); } - public void onAllPrintJobsHandled() { - mHandler.sendEmptyMessage(MyHandler.MSG_ON_ALL_PRINT_JOBS_HANDLED); + public void stopPrinterDiscovery() { + Message message = mHandlerCaller.obtainMessage( + HandlerCallerCallback.MSG_STOP_PRINTER_DISCOVERY); + mHandlerCaller.executeOrSendMessage(message); } - private final class MyHandler extends Handler { - public static final int MSG_SET_CLIENT = 1; - public static final int MSG_START_PRINT_JOB_CONFIG_ACTIVITY = 2; - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 3; - public static final int MSG_ON_PRINT_JOB_QUEUED = 5; - public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 6; - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 7; - public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 9; + public void requestPrinterUpdate(PrinterId pritnerId) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_REQUEST_PRINTER_UPDATE, pritnerId); + mHandlerCaller.executeOrSendMessage(message); + } - public MyHandler(Looper looper) { - super(looper, null, false); - } + + private void sendOnPrintJobQueued(PrintJobInfo printJob) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_ON_PRINT_JOB_QUEUED, printJob); + mHandlerCaller.executeOrSendMessage(message); + } + + private void sendOnAllPrintJobsForServiceHandled(ComponentName service) { + Message message = mHandlerCaller.obtainMessageO( + HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED, service); + mHandlerCaller.executeOrSendMessage(message); + } + + private void sendOnAllPrintJobsHandled() { + Message message = mHandlerCaller.obtainMessage( + HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_HANDLED); + mHandlerCaller.executeOrSendMessage(message); + } + + private final class HandlerCallerCallback implements HandlerCaller.Callback { + public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1; + public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2; + public static final int MSG_START_PRINTER_DISCOVERY = 3; + public static final int MSG_STOP_PRINTER_DISCOVERY = 4; + public static final int MSG_REQUEST_PRINTER_UPDATE = 5; + + public static final int MSG_ON_PRINTERS_ADDED = 6; + public static final int MSG_ON_PRINTERS_REMOVED = 7; + public static final int MSG_ON_PRINTERS_UPDATED = 8; + + public static final int MSG_SET_CLIENT = 9; + public static final int MSG_START_PRINT_JOB_CONFIG_ACTIVITY = 10; + public static final int MSG_ON_PRINT_JOB_QUEUED = 11; + public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 12; + public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 13; + public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 14; @Override - public void handleMessage(Message message) { + @SuppressWarnings("unchecked") + public void executeMessage(Message message) { switch (message.what) { + case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { + final IPrintSpoolerClient client; + synchronized (mLock) { + client = mClient; + } + if (client != null) { + try { + client.createPrinterDiscoverySession(); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error creating printer discovery session.", re); + } + } + } break; + + case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: { + final IPrintSpoolerClient client; + synchronized (mLock) { + client = mClient; + } + if (client != null) { + try { + client.destroyPrinterDiscoverySession(); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error destroying printer discovery session.", re); + } + } + } break; + + case MSG_START_PRINTER_DISCOVERY: { + final IPrintSpoolerClient client; + synchronized (mLock) { + client = mClient; + } + if (client != null) { + List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj; + try { + client.startPrinterDiscovery(priorityList); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error starting printer discovery.", re); + } + } + } break; + + case MSG_STOP_PRINTER_DISCOVERY: { + final IPrintSpoolerClient client; + synchronized (mLock) { + client = mClient; + } + if (client != null) { + try { + client.stopPrinterDiscovery(); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error stopping printer discovery.", re); + } + } + } break; + + case MSG_REQUEST_PRINTER_UPDATE: { + final IPrintSpoolerClient client; + synchronized (mLock) { + client = mClient; + } + if (client != null) { + PrinterId printerId = (PrinterId) message.obj; + try { + client.requestPrinterUpdate(printerId); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error requesing printer update.", re); + } + } + } break; + case MSG_SET_CLIENT: { - mClient = (IPrintSpoolerClient) message.obj; - if (mClient != null) { - PrintSpooler.createInstance(PrintSpoolerService.this); - mHandler.sendEmptyMessageDelayed( - MyHandler.MSG_CHECK_ALL_PRINTJOBS_HANDLED, - CHECK_ALL_PRINTJOBS_HANDLED_DELAY); - } else { - PrintSpooler.destroyInstance(); + synchronized (mLock) { + mClient = (IPrintSpoolerClient) message.obj; + if (mClient != null) { + Message msg = mHandlerCaller.obtainMessage( + HandlerCallerCallback.MSG_CHECK_ALL_PRINTJOBS_HANDLED); + mHandlerCaller.sendMessageDelayed(msg, + CHECK_ALL_PRINTJOBS_HANDLED_DELAY); + } } } break; @@ -220,18 +416,6 @@ public final class PrintSpoolerService extends Service { } } break; - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { - IPrinterDiscoverySessionObserver observer = - (IPrinterDiscoverySessionObserver) message.obj; - if (mClient != null) { - try { - mClient.createPrinterDiscoverySession(observer); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error creating printer discovery session.", re); - } - } - } break; - case MSG_ON_PRINT_JOB_QUEUED: { PrintJobInfo printJob = (PrintJobInfo) message.obj; if (mClient != null) { @@ -266,12 +450,948 @@ public final class PrintSpoolerService extends Service { } break; case MSG_CHECK_ALL_PRINTJOBS_HANDLED: { - PrintSpooler spooler = PrintSpooler.peekInstance(); - if (spooler != null) { - spooler.checkAllPrintJobsHandled(); + checkAllPrintJobsHandled(); + } break; + + case MSG_ON_PRINTERS_ADDED: { + final PrinterDiscoverySession session; + synchronized (mLock) { + session = mDiscoverySession; + } + if (session != null) { + List<PrinterInfo> printers = (ArrayList<PrinterInfo>) message.obj; + session.onPrintersAdded(printers); + } + } break; + + case MSG_ON_PRINTERS_REMOVED: { + final PrinterDiscoverySession session; + synchronized (mLock) { + session = mDiscoverySession; + } + if (session != null) { + List<PrinterId> printerIds = (ArrayList<PrinterId>) message.obj; + session.onPrintersRemoved(printerIds); + } + } break; + + case MSG_ON_PRINTERS_UPDATED: { + final PrinterDiscoverySession session; + synchronized (mLock) { + session = mDiscoverySession; + } + if (session != null) { + List<PrinterInfo> printers = (ArrayList<PrinterInfo>) message.obj; + session.onPrintersUpdated(printers); } } break; } } } + + public List<PrintJobInfo> getPrintJobInfos(ComponentName componentName, + int state, int appId) { + List<PrintJobInfo> foundPrintJobs = null; + synchronized (mLock) { + final int printJobCount = mPrintJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = mPrintJobs.get(i); + PrinterId printerId = printJob.getPrinterId(); + final boolean sameComponent = (componentName == null + || (printerId != null + && componentName.equals(printerId.getServiceName()))); + final boolean sameAppId = appId == PrintManager.APP_ID_ANY + || printJob.getAppId() == appId; + final boolean sameState = (state == printJob.getState()) + || (state == PrintJobInfo.STATE_ANY) + || (state == PrintJobInfo.STATE_ANY_VISIBLE_TO_CLIENTS + && printJob.getState() > PrintJobInfo.STATE_CREATED); + if (sameComponent && sameAppId && sameState) { + if (foundPrintJobs == null) { + foundPrintJobs = new ArrayList<PrintJobInfo>(); + } + foundPrintJobs.add(printJob); + } + } + } + return foundPrintJobs; + } + + public PrintJobInfo getPrintJobInfo(int printJobId, int appId) { + synchronized (mLock) { + final int printJobCount = mPrintJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = mPrintJobs.get(i); + if (printJob.getId() == printJobId + && (appId == PrintManager.APP_ID_ANY + || appId == printJob.getAppId())) { + return printJob; + } + } + return null; + } + } + + public PrintJobInfo createPrintJob(String label, IPrintClient client, + PrintAttributes attributes, int appId) { + synchronized (mLock) { + final int printJobId = generatePrintJobIdLocked(); + PrintJobInfo printJob = new PrintJobInfo(); + printJob.setId(printJobId); + printJob.setAppId(appId); + printJob.setLabel(label); + printJob.setAttributes(attributes); + printJob.setState(PrintJobInfo.STATE_CREATED); + + addPrintJobLocked(printJob); + + return printJob; + } + } + + private void handleReadPrintJobsLocked() { + final int printJobCount = mPrintJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = mPrintJobs.get(i); + + // Update the notification. + mNotificationController.onPrintJobStateChanged(printJob); + + switch (printJob.getState()) { + case PrintJobInfo.STATE_QUEUED: + case PrintJobInfo.STATE_STARTED: { + // We have a print job that was queued or started in the + // past + // but the device battery died or a crash occurred. In this + // case + // we assume the print job failed and let the user decide + // whether + // to restart the job or just + setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED, + getString(R.string.no_connection_to_printer)); + } + break; + } + } + } + + public void checkAllPrintJobsHandled() { + synchronized (mLock) { + if (!hasActivePrintJobsLocked()) { + notifyOnAllPrintJobsHandled(); + } + } + } + + private void setPrinterDiscoverySessionClient(PrinterDiscoverySession session) { + synchronized (mLock) { + mDiscoverySession = session; + } + } + + private int generatePrintJobIdLocked() { + int printJobId = sPrintJobIdCounter++; + while (isDuplicatePrintJobId(printJobId)) { + printJobId = sPrintJobIdCounter++; + } + return printJobId; + } + + private boolean isDuplicatePrintJobId(int printJobId) { + final int printJobCount = mPrintJobs.size(); + for (int j = 0; j < printJobCount; j++) { + PrintJobInfo printJob = mPrintJobs.get(j); + if (printJob.getId() == printJobId) { + return true; + } + } + return false; + } + + public void writePrintJobData(final ParcelFileDescriptor fd, final int printJobId) { + final PrintJobInfo printJob; + synchronized (mLock) { + printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + } + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + FileInputStream in = null; + FileOutputStream out = null; + try { + if (printJob != null) { + File file = generateFileForPrintJob(printJobId); + in = new FileInputStream(file); + out = new FileOutputStream(fd.getFileDescriptor()); + } + final byte[] buffer = new byte[8192]; + while (true) { + final int readByteCount = in.read(buffer); + if (readByteCount < 0) { + return null; + } + out.write(buffer, 0, readByteCount); + } + } catch (FileNotFoundException fnfe) { + Log.e(LOG_TAG, "Error writing print job data!", fnfe); + } catch (IOException ioe) { + Log.e(LOG_TAG, "Error writing print job data!", ioe); + } finally { + IoUtils.closeQuietly(in); + IoUtils.closeQuietly(out); + IoUtils.closeQuietly(fd); + } + Log.i(LOG_TAG, "[END WRITE]"); + return null; + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); + } + + public File generateFileForPrintJob(int printJobId) { + return new File(getFilesDir(), "print_job_" + + printJobId + "." + PRINT_FILE_EXTENSION); + } + + private void addPrintJobLocked(PrintJobInfo printJob) { + mPrintJobs.add(printJob); + if (DEBUG_PRINT_JOB_LIFECYCLE) { + Slog.i(LOG_TAG, "[ADD] " + printJob); + } + } + + private void removePrintJobLocked(PrintJobInfo printJob) { + if (mPrintJobs.remove(printJob)) { + generateFileForPrintJob(printJob.getId()).delete(); + if (DEBUG_PRINT_JOB_LIFECYCLE) { + Slog.i(LOG_TAG, "[REMOVE] " + printJob); + } + } + } + + public boolean setPrintJobState(int printJobId, int state, String error) { + boolean success = false; + + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + success = true; + + printJob.setState(state); + printJob.setFailureReason(error); + mNotificationController.onPrintJobStateChanged(printJob); + + if (DEBUG_PRINT_JOB_LIFECYCLE) { + Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob); + } + + switch (state) { + case PrintJobInfo.STATE_COMPLETED: + case PrintJobInfo.STATE_CANCELED: + removePrintJobLocked(printJob); + // $fall-through$ + + case PrintJobInfo.STATE_FAILED: { + PrinterId printerId = printJob.getPrinterId(); + if (printerId != null) { + ComponentName service = printerId.getServiceName(); + if (!hasActivePrintJobsForServiceLocked(service)) { + sendOnAllPrintJobsForServiceHandled(service); + } + } + } break; + + case PrintJobInfo.STATE_QUEUED: { + sendOnPrintJobQueued(new PrintJobInfo(printJob)); + } break; + } + + if (shouldPersistPrintJob(printJob)) { + mPersistanceManager.writeStateLocked(); + } + + if (!hasActivePrintJobsLocked()) { + notifyOnAllPrintJobsHandled(); + } + } + } + + return success; + } + + public boolean hasActivePrintJobsLocked() { + final int printJobCount = mPrintJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = mPrintJobs.get(i); + if (isActiveState(printJob.getState())) { + return true; + } + } + return false; + } + + public boolean hasActivePrintJobsForServiceLocked(ComponentName service) { + final int printJobCount = mPrintJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = mPrintJobs.get(i); + if (isActiveState(printJob.getState()) + && printJob.getPrinterId().getServiceName().equals(service)) { + return true; + } + } + return false; + } + + private boolean isActiveState(int printJobState) { + return printJobState == PrintJobInfo.STATE_CREATED + || printJobState == PrintJobInfo.STATE_QUEUED + || printJobState == PrintJobInfo.STATE_STARTED; + } + + public boolean setPrintJobTag(int printJobId, String tag) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + String printJobTag = printJob.getTag(); + if (printJobTag == null) { + if (tag == null) { + return false; + } + } else if (printJobTag.equals(tag)) { + return false; + } + printJob.setTag(tag); + if (shouldPersistPrintJob(printJob)) { + mPersistanceManager.writeStateLocked(); + } + return true; + } + } + return false; + } + + public void setPrintJobCopiesNoPersistence(int printJobId, int copies) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + printJob.setCopies(copies); + } + } + } + + public void setPrintJobPrintDocumentInfoNoPersistence(int printJobId, PrintDocumentInfo info) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + printJob.setDocumentInfo(info); + } + } + } + + public void setPrintJobAttributesNoPersistence(int printJobId, PrintAttributes attributes) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + printJob.setAttributes(attributes); + } + } + } + + public void setPrintJobPrinterNoPersistence(int printJobId, PrinterInfo printer) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + printJob.setPrinterId(printer.getId()); + printJob.setPrinterName(printer.getName()); + } + } + } + + public void setPrintJobPagesNoPersistence(int printJobId, PageRange[] pages) { + synchronized (mLock) { + PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY); + if (printJob != null) { + printJob.setPages(pages); + } + } + } + + private boolean shouldPersistPrintJob(PrintJobInfo printJob) { + return printJob.getState() >= PrintJobInfo.STATE_QUEUED; + } + + private void notifyOnAllPrintJobsHandled() { + // This has to run on the tread that is persisting the current state + // since this call may result in the system unbinding from the spooler + // and as a result the spooler process may get killed before the write + // completes. + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + sendOnAllPrintJobsHandled(); + return null; + } + }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + + private final class PersistenceManager { + private static final String PERSIST_FILE_NAME = "print_spooler_state.xml"; + + private static final String TAG_SPOOLER = "spooler"; + private static final String TAG_JOB = "job"; + + private static final String TAG_PRINTER_ID = "printerId"; + private static final String TAG_PAGE_RANGE = "pageRange"; + private static final String TAG_ATTRIBUTES = "attributes"; + private static final String TAG_DOCUMENT_INFO = "documentInfo"; + + private static final String ATTR_ID = "id"; + private static final String ATTR_LABEL = "label"; + private static final String ATTR_STATE = "state"; + private static final String ATTR_APP_ID = "appId"; + private static final String ATTR_USER_ID = "userId"; + private static final String ATTR_TAG = "tag"; + private static final String ATTR_COPIES = "copies"; + + private static final String TAG_MEDIA_SIZE = "mediaSize"; + private static final String TAG_RESOLUTION = "resolution"; + private static final String TAG_MARGINS = "margins"; + private static final String TAG_INPUT_TRAY = "inputTray"; + private static final String TAG_OUTPUT_TRAY = "outputTray"; + + private static final String ATTR_DUPLEX_MODE = "duplexMode"; + private static final String ATTR_COLOR_MODE = "colorMode"; + private static final String ATTR_FITTING_MODE = "fittingMode"; + private static final String ATTR_ORIENTATION = "orientation"; + + private static final String ATTR_LOCAL_ID = "printerName"; + private static final String ATTR_SERVICE_NAME = "serviceName"; + + private static final String ATTR_WIDTH_MILS = "widthMils"; + private static final String ATTR_HEIGHT_MILS = "heightMils"; + + private static final String ATTR_HORIZONTAL_DPI = "horizontalDip"; + private static final String ATTR_VERTICAL_DPI = "verticalDpi"; + + private static final String ATTR_LEFT_MILS = "leftMils"; + private static final String ATTR_TOP_MILS = "topMils"; + private static final String ATTR_RIGHT_MILS = "rightMils"; + private static final String ATTR_BOTTOM_MILS = "bottomMils"; + + private static final String ATTR_START = "start"; + private static final String ATTR_END = "end"; + + private static final String ATTR_NAME = "name"; + private static final String ATTR_PAGE_COUNT = "pageCount"; + private static final String ATTR_CONTENT_TYPE = "contentType"; + + private final AtomicFile mStatePersistFile; + + private boolean mWriteStateScheduled; + + private PersistenceManager() { + mStatePersistFile = new AtomicFile(new File(getFilesDir(), + PERSIST_FILE_NAME)); + } + + public void writeStateLocked() { + if (!PERSISTNECE_MANAGER_ENABLED) { + return; + } + if (mWriteStateScheduled) { + return; + } + mWriteStateScheduled = true; + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + synchronized (mLock) { + mWriteStateScheduled = false; + doWriteStateLocked(); + } + return null; + } + }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + + private void doWriteStateLocked() { + if (DEBUG_PERSISTENCE) { + Log.i(LOG_TAG, "[PERSIST START]"); + } + FileOutputStream out = null; + try { + out = mStatePersistFile.startWrite(); + + XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(out, "utf-8"); + serializer.startDocument(null, true); + serializer.startTag(null, TAG_SPOOLER); + + List<PrintJobInfo> printJobs = mPrintJobs; + + final int printJobCount = printJobs.size(); + for (int j = 0; j < printJobCount; j++) { + PrintJobInfo printJob = printJobs.get(j); + + final int state = printJob.getState(); + if (state < PrintJobInfo.STATE_QUEUED + || state > PrintJobInfo.STATE_CANCELED) { + continue; + } + + serializer.startTag(null, TAG_JOB); + + serializer.attribute(null, ATTR_ID, String.valueOf(printJob.getId())); + serializer.attribute(null, ATTR_LABEL, printJob.getLabel().toString()); + serializer.attribute(null, ATTR_STATE, String.valueOf(printJob.getState())); + serializer.attribute(null, ATTR_APP_ID, String.valueOf(printJob.getAppId())); + serializer.attribute(null, ATTR_USER_ID, String.valueOf(printJob.getUserId())); + String tag = printJob.getTag(); + if (tag != null) { + serializer.attribute(null, ATTR_TAG, tag); + } + serializer.attribute(null, ATTR_COPIES, String.valueOf(printJob.getCopies())); + + PrinterId printerId = printJob.getPrinterId(); + if (printerId != null) { + serializer.startTag(null, TAG_PRINTER_ID); + serializer.attribute(null, ATTR_LOCAL_ID, printerId.getLocalId()); + serializer.attribute(null, ATTR_SERVICE_NAME, printerId.getServiceName() + .flattenToString()); + serializer.endTag(null, TAG_PRINTER_ID); + } + + PageRange[] pages = printJob.getPages(); + if (pages != null) { + for (int i = 0; i < pages.length; i++) { + serializer.startTag(null, TAG_PAGE_RANGE); + serializer.attribute(null, ATTR_START, String.valueOf( + pages[i].getStart())); + serializer.attribute(null, ATTR_END, String.valueOf( + pages[i].getEnd())); + serializer.endTag(null, TAG_PAGE_RANGE); + } + } + + PrintAttributes attributes = printJob.getAttributes(); + if (attributes != null) { + serializer.startTag(null, TAG_ATTRIBUTES); + + final int duplexMode = attributes.getDuplexMode(); + serializer.attribute(null, ATTR_DUPLEX_MODE, + String.valueOf(duplexMode)); + + final int colorMode = attributes.getColorMode(); + serializer.attribute(null, ATTR_COLOR_MODE, + String.valueOf(colorMode)); + + final int fittingMode = attributes.getFittingMode(); + serializer.attribute(null, ATTR_FITTING_MODE, + String.valueOf(fittingMode)); + + final int orientation = attributes.getOrientation(); + serializer.attribute(null, ATTR_ORIENTATION, + String.valueOf(orientation)); + + MediaSize mediaSize = attributes.getMediaSize(); + if (mediaSize != null) { + serializer.startTag(null, TAG_MEDIA_SIZE); + serializer.attribute(null, ATTR_ID, mediaSize.getId()); + serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel() + .toString()); + serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf( + mediaSize.getWidthMils())); + serializer.attribute(null, ATTR_HEIGHT_MILS, String.valueOf( + mediaSize.getHeightMils())); + serializer.endTag(null, TAG_MEDIA_SIZE); + } + + Resolution resolution = attributes.getResolution(); + if (resolution != null) { + serializer.startTag(null, TAG_RESOLUTION); + serializer.attribute(null, ATTR_ID, resolution.getId()); + serializer.attribute(null, ATTR_LABEL, resolution.getLabel() + .toString()); + serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf( + resolution.getHorizontalDpi())); + serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf( + resolution.getVerticalDpi())); + serializer.endTag(null, TAG_RESOLUTION); + } + + Margins margins = attributes.getMargins(); + if (margins != null) { + serializer.startTag(null, TAG_MARGINS); + serializer.attribute(null, ATTR_LEFT_MILS, String.valueOf( + margins.getLeftMils())); + serializer.attribute(null, ATTR_TOP_MILS, String.valueOf( + margins.getTopMils())); + serializer.attribute(null, ATTR_RIGHT_MILS, String.valueOf( + margins.getRightMils())); + serializer.attribute(null, ATTR_BOTTOM_MILS, String.valueOf( + margins.getBottomMils())); + serializer.endTag(null, TAG_MARGINS); + } + + Tray inputTray = attributes.getInputTray(); + if (inputTray != null) { + serializer.startTag(null, TAG_INPUT_TRAY); + serializer.attribute(null, ATTR_ID, inputTray.getId()); + serializer.attribute(null, ATTR_LABEL, inputTray.getLabel() + .toString()); + serializer.endTag(null, TAG_INPUT_TRAY); + } + + Tray outputTray = attributes.getOutputTray(); + if (outputTray != null) { + serializer.startTag(null, TAG_OUTPUT_TRAY); + serializer.attribute(null, ATTR_ID, outputTray.getId()); + serializer.attribute(null, ATTR_LABEL, outputTray.getLabel() + .toString()); + serializer.endTag(null, TAG_OUTPUT_TRAY); + } + + serializer.endTag(null, TAG_ATTRIBUTES); + } + + PrintDocumentInfo documentInfo = printJob.getDocumentInfo(); + if (documentInfo != null) { + serializer.startTag(null, TAG_DOCUMENT_INFO); + serializer.attribute(null, ATTR_NAME, documentInfo.getName()); + serializer.attribute(null, ATTR_CONTENT_TYPE, String.valueOf( + documentInfo.getContentType())); + serializer.attribute(null, ATTR_PAGE_COUNT, String.valueOf( + documentInfo.getPageCount())); + serializer.endTag(null, TAG_DOCUMENT_INFO); + } + + serializer.endTag(null, TAG_JOB); + + if (DEBUG_PERSISTENCE) { + Log.i(LOG_TAG, "[PERSISTED] " + printJob); + } + } + + serializer.endTag(null, TAG_SPOOLER); + serializer.endDocument(); + mStatePersistFile.finishWrite(out); + if (DEBUG_PERSISTENCE) { + Log.i(LOG_TAG, "[PERSIST END]"); + } + } catch (IOException e) { + Slog.w(LOG_TAG, "Failed to write state, restoring backup.", e); + mStatePersistFile.failWrite(out); + } finally { + IoUtils.closeQuietly(out); + } + } + + public void readStateLocked() { + if (!PERSISTNECE_MANAGER_ENABLED) { + return; + } + FileInputStream in = null; + try { + in = mStatePersistFile.openRead(); + } catch (FileNotFoundException e) { + Log.i(LOG_TAG, "No existing print spooler state."); + return; + } + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, null); + parseState(parser); + } catch (IllegalStateException ise) { + Slog.w(LOG_TAG, "Failed parsing ", ise); + } catch (NullPointerException npe) { + Slog.w(LOG_TAG, "Failed parsing ", npe); + } catch (NumberFormatException nfe) { + Slog.w(LOG_TAG, "Failed parsing ", nfe); + } catch (XmlPullParserException xppe) { + Slog.w(LOG_TAG, "Failed parsing ", xppe); + } catch (IOException ioe) { + Slog.w(LOG_TAG, "Failed parsing ", ioe); + } catch (IndexOutOfBoundsException iobe) { + Slog.w(LOG_TAG, "Failed parsing ", iobe); + } finally { + IoUtils.closeQuietly(in); + } + } + + private void parseState(XmlPullParser parser) + throws IOException, XmlPullParserException { + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.START_TAG, TAG_SPOOLER); + parser.next(); + + while (parsePrintJob(parser)) { + parser.next(); + } + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_SPOOLER); + } + + private boolean parsePrintJob(XmlPullParser parser) + throws IOException, XmlPullParserException { + skipEmptyTextTags(parser); + if (!accept(parser, XmlPullParser.START_TAG, TAG_JOB)) { + return false; + } + + PrintJobInfo printJob = new PrintJobInfo(); + + final int printJobId = Integer.parseInt(parser.getAttributeValue(null, ATTR_ID)); + printJob.setId(printJobId); + String label = parser.getAttributeValue(null, ATTR_LABEL); + printJob.setLabel(label); + final int state = Integer.parseInt(parser.getAttributeValue(null, ATTR_STATE)); + printJob.setState(state); + final int appId = Integer.parseInt(parser.getAttributeValue(null, ATTR_APP_ID)); + printJob.setAppId(appId); + final int userId = Integer.parseInt(parser.getAttributeValue(null, ATTR_USER_ID)); + printJob.setUserId(userId); + String tag = parser.getAttributeValue(null, ATTR_TAG); + printJob.setTag(tag); + String copies = parser.getAttributeValue(null, ATTR_COPIES); + printJob.setCopies(Integer.parseInt(copies)); + + parser.next(); + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_PRINTER_ID)) { + String localId = parser.getAttributeValue(null, ATTR_LOCAL_ID); + ComponentName service = ComponentName.unflattenFromString(parser.getAttributeValue( + null, ATTR_SERVICE_NAME)); + printJob.setPrinterId(new PrinterId(service, localId)); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_PRINTER_ID); + parser.next(); + } + + skipEmptyTextTags(parser); + List<PageRange> pageRanges = null; + while (accept(parser, XmlPullParser.START_TAG, TAG_PAGE_RANGE)) { + final int start = Integer.parseInt(parser.getAttributeValue(null, ATTR_START)); + final int end = Integer.parseInt(parser.getAttributeValue(null, ATTR_END)); + PageRange pageRange = new PageRange(start, end); + if (pageRanges == null) { + pageRanges = new ArrayList<PageRange>(); + } + pageRanges.add(pageRange); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_PAGE_RANGE); + parser.next(); + } + if (pageRanges != null) { + PageRange[] pageRangesArray = new PageRange[pageRanges.size()]; + pageRanges.toArray(pageRangesArray); + printJob.setPages(pageRangesArray); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_ATTRIBUTES)) { + + PrintAttributes.Builder builder = new PrintAttributes.Builder(); + + String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE); + builder.setDuplexMode(Integer.parseInt(duplexMode)); + + String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE); + builder.setColorMode(Integer.parseInt(colorMode)); + + String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE); + builder.setFittingMode(Integer.parseInt(fittingMode)); + + String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION); + builder.setOrientation(Integer.parseInt(orientation)); + + parser.next(); + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_MEDIA_SIZE)) { + String id = parser.getAttributeValue(null, ATTR_ID); + label = parser.getAttributeValue(null, ATTR_LABEL); + final int widthMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_WIDTH_MILS)); + final int heightMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_HEIGHT_MILS)); + MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils); + builder.setMediaSize(mediaSize); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_MEDIA_SIZE); + parser.next(); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_RESOLUTION)) { + String id = parser.getAttributeValue(null, ATTR_ID); + label = parser.getAttributeValue(null, ATTR_LABEL); + final int horizontalDpi = Integer.parseInt(parser.getAttributeValue(null, + ATTR_HORIZONTAL_DPI)); + final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null, + ATTR_VERTICAL_DPI)); + Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi); + builder.setResolution(resolution); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_RESOLUTION); + parser.next(); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_MARGINS)) { + final int leftMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_LEFT_MILS)); + final int topMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_TOP_MILS)); + final int rightMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_RIGHT_MILS)); + final int bottomMils = Integer.parseInt(parser.getAttributeValue(null, + ATTR_BOTTOM_MILS)); + Margins margins = new Margins(leftMils, topMils, rightMils, bottomMils); + builder.setMargins(margins); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_MARGINS); + parser.next(); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) { + String id = parser.getAttributeValue(null, ATTR_ID); + label = parser.getAttributeValue(null, ATTR_LABEL); + Tray tray = new Tray(id, label); + builder.setInputTray(tray); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY); + parser.next(); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) { + String id = parser.getAttributeValue(null, ATTR_ID); + label = parser.getAttributeValue(null, ATTR_LABEL); + Tray tray = new Tray(id, label); + builder.setOutputTray(tray); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY); + parser.next(); + } + + printJob.setAttributes(builder.create()); + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_ATTRIBUTES); + parser.next(); + } + + skipEmptyTextTags(parser); + if (accept(parser, XmlPullParser.START_TAG, TAG_DOCUMENT_INFO)) { + String name = parser.getAttributeValue(null, ATTR_NAME); + final int pageCount = Integer.parseInt(parser.getAttributeValue(null, + ATTR_PAGE_COUNT)); + final int contentType = Integer.parseInt(parser.getAttributeValue(null, + ATTR_CONTENT_TYPE)); + PrintDocumentInfo info = new PrintDocumentInfo.Builder(name) + .setPageCount(pageCount) + .setContentType(contentType).create(); + printJob.setDocumentInfo(info); + parser.next(); + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_DOCUMENT_INFO); + parser.next(); + } + + mPrintJobs.add(printJob); + + if (DEBUG_PERSISTENCE) { + Log.i(LOG_TAG, "[RESTORED] " + printJob); + } + + skipEmptyTextTags(parser); + expect(parser, XmlPullParser.END_TAG, TAG_JOB); + + return true; + } + + private void expect(XmlPullParser parser, int type, String tag) + throws IOException, XmlPullParserException { + if (!accept(parser, type, tag)) { + throw new XmlPullParserException("Exepected event: " + type + + " and tag: " + tag + " but got event: " + parser.getEventType() + + " and tag:" + parser.getName()); + } + } + + private void skipEmptyTextTags(XmlPullParser parser) + throws IOException, XmlPullParserException { + while (accept(parser, XmlPullParser.TEXT, null) + && "\n".equals(parser.getText())) { + parser.next(); + } + } + + private boolean accept(XmlPullParser parser, int type, String tag) + throws IOException, XmlPullParserException { + if (parser.getEventType() != type) { + return false; + } + if (tag != null) { + if (!tag.equals(parser.getName())) { + return false; + } + } else if (parser.getName() != null) { + return false; + } + return true; + } + } + + public static abstract class PrinterDiscoverySession { + + private PrintSpoolerService mService; + + private boolean mIsStarted; + + public PrinterDiscoverySession() { + mService = PrintSpoolerService.peekInstance(); + mService.createPrinterDiscoverySession(); + mService.setPrinterDiscoverySessionClient(this); + } + + public final void startPrinterDisovery(List<PrinterId> priorityList) { + mIsStarted = true; + mService.startPrinterDiscovery(priorityList); + } + + public final void stopPrinterDiscovery() { + mIsStarted = false; + mService.stopPrinterDiscovery(); + } + + public void requestPrinterUpdated(PrinterId printerId) { + mService.requestPrinterUpdate(printerId); + } + + public final void destroy() { + mService.setPrinterDiscoverySessionClient(null); + mService.destroyPrinterDiscoverySession(); + } + + public final boolean isStarted() { + return mIsStarted; + } + + public abstract void onPrintersAdded(List<PrinterInfo> printers); + + public abstract void onPrintersRemoved(List<PrinterId> printerIds); + + public abstract void onPrintersUpdated(List<PrinterInfo> printers); + } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterActivity.java new file mode 100644 index 0000000..141dbd1 --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterActivity.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 com.android.printspooler; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.print.PrinterId; + +import com.android.printspooler.SelectPrinterFragment.OnPrinterSelectedListener; + +public class SelectPrinterActivity extends Activity implements OnPrinterSelectedListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.select_printer_activity); + } + + @Override + public void onPrinterSelected(PrinterId printer) { + Intent intent = new Intent(); + intent.putExtra(PrintJobConfigActivity.INTENT_EXTRA_PRINTER_ID, printer); + setResult(RESULT_OK, intent); + finish(); + } +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java new file mode 100644 index 0000000..9ca3a86 --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java @@ -0,0 +1,401 @@ +/* + * 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.printspooler; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; +import android.app.FragmentTransaction; +import android.app.ListFragment; +import android.app.LoaderManager; +import android.content.ComponentName; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.Loader; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.print.PrinterId; +import android.print.PrinterInfo; +import android.printservice.PrintServiceInfo; +import android.text.TextUtils; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ListView; +import android.widget.SearchView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +/** + * This is a fragment for selecting a printer. + */ +public final class SelectPrinterFragment extends ListFragment { + + private static final int LOADER_ID_PRINTERS_LOADER = 1; + + private static final String FRAGMRNT_TAG_ADD_PRINTER_DIALOG = + "FRAGMRNT_TAG_ADD_PRINTER_DIALOG"; + + private static final String FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS = + "FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS"; + + private final ArrayList<PrintServiceInfo> mAddPrinterServices = + new ArrayList<PrintServiceInfo>(); + + public static interface OnPrinterSelectedListener { + public void onPrinterSelected(PrinterId printerId); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setListAdapter(new DestinationAdapter()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.select_printer_activity, menu); + + MenuItem searchItem = menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchItem.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return true; + } + + @Override + public boolean onQueryTextChange(String searchString) { + ((DestinationAdapter) getListAdapter()).getFilter().filter(searchString); + return true; + } + }); + + if (mAddPrinterServices.isEmpty()) { + menu.removeItem(R.id.action_add_printer); + } + } + + @Override + public void onResume() { + updateAddPrintersAdapter(); + getActivity().invalidateOptionsMenu(); + super.onResume(); + } + + @Override + public void onListItemClick(ListView list, View view, int position, long id) { + PrinterInfo printer = (PrinterInfo) list.getAdapter().getItem(position); + Activity activity = getActivity(); + if (activity instanceof OnPrinterSelectedListener) { + ((OnPrinterSelectedListener) activity).onPrinterSelected(printer.getId()); + } else { + throw new IllegalStateException("the host activity must implement" + + " OnPrinterSelectedListener"); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.action_add_printer) { + showAddPrinterSelectionDialog(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void updateAddPrintersAdapter() { + mAddPrinterServices.clear(); + + // Get all print services. + List<ResolveInfo> resolveInfos = getActivity().getPackageManager().queryIntentServices( + new Intent(android.printservice.PrintService.SERVICE_INTERFACE), + PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); + + // No print services - done. + if (resolveInfos.isEmpty()) { + return; + } + + // Find the services with valid add printers activities. + final int resolveInfoCount = resolveInfos.size(); + for (int i = 0; i < resolveInfoCount; i++) { + ResolveInfo resolveInfo = resolveInfos.get(i); + + PrintServiceInfo printServiceInfo = PrintServiceInfo.create( + resolveInfo, getActivity()); + String addPrintersActivity = printServiceInfo.getAddPrintersActivityName(); + + // No add printers activity declared - done. + if (TextUtils.isEmpty(addPrintersActivity)) { + continue; + } + + ComponentName addPrintersComponentName = new ComponentName( + resolveInfo.serviceInfo.packageName, + addPrintersActivity); + Intent addPritnersIntent = new Intent(Intent.ACTION_MAIN) + .setComponent(addPrintersComponentName); + + // The add printers activity is valid - add it. + if (!getActivity().getPackageManager().queryIntentActivities( + addPritnersIntent, 0).isEmpty()) { + mAddPrinterServices.add(printServiceInfo); + } + } + } + + private void showAddPrinterSelectionDialog() { + FragmentTransaction transaction = getFragmentManager().beginTransaction(); + Fragment oldFragment = getFragmentManager().findFragmentByTag( + FRAGMRNT_TAG_ADD_PRINTER_DIALOG); + if (oldFragment != null) { + transaction.remove(oldFragment); + } + AddPrinterAlertDialogFragment newFragment = new AddPrinterAlertDialogFragment(); + Bundle arguments = new Bundle(); + arguments.putParcelableArrayList(FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS, + mAddPrinterServices); + newFragment.setArguments(arguments); + transaction.add(newFragment, FRAGMRNT_TAG_ADD_PRINTER_DIALOG); + transaction.commit(); + } + + public static class AddPrinterAlertDialogFragment extends DialogFragment { + + private static final String DEFAULT_MARKET_QUERY_STRING = + "market://search?q=print"; + + @Override + @SuppressWarnings("unchecked") + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.choose_print_service); + + final List<PrintServiceInfo> printServices = (List<PrintServiceInfo>) (List<?>) + getArguments().getParcelableArrayList(FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS); + + ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), + android.R.layout.simple_list_item_1); + final int printServiceCount = printServices.size(); + for (int i = 0; i < printServiceCount; i++) { + PrintServiceInfo printService = printServices.get(i); + adapter.add(printService.getResolveInfo().loadLabel( + getActivity().getPackageManager()).toString()); + } + + builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + PrintServiceInfo printService = printServices.get(which); + ComponentName componentName = new ComponentName( + printService.getResolveInfo().serviceInfo.packageName, + printService.getAddPrintersActivityName()); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setComponent(componentName); + startActivity(intent); + } + }); + + Uri marketUri = Uri.parse(DEFAULT_MARKET_QUERY_STRING); + final Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); + if (getActivity().getPackageManager().resolveActivity(marketIntent, 0) != null) { + builder.setPositiveButton(R.string.search_play_store, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + startActivity(marketIntent); + } + }); + } + + return builder.create(); + } + } + + private final class DestinationAdapter extends BaseAdapter + implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>, Filterable { + + private final Object mLock = new Object(); + + private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>(); + + private final List<PrinterInfo> mFilteredPrinters = new ArrayList<PrinterInfo>(); + + private CharSequence mLastSearchString; + + public DestinationAdapter() { + getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this); + } + + @Override + public Filter getFilter() { + return new Filter() { + @Override + protected FilterResults performFiltering(CharSequence constraint) { + synchronized (mLock) { + if (TextUtils.isEmpty(constraint)) { + return null; + } + FilterResults results = new FilterResults(); + List<PrinterInfo> filteredPrinters = new ArrayList<PrinterInfo>(); + String constraintLowerCase = constraint.toString().toLowerCase(); + final int printerCount = mPrinters.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = mPrinters.get(i); + if (printer.getName().toLowerCase().contains(constraintLowerCase)) { + filteredPrinters.add(printer); + } + } + results.values = filteredPrinters; + results.count = filteredPrinters.size(); + return results; + } + } + + @Override + @SuppressWarnings("unchecked") + protected void publishResults(CharSequence constraint, FilterResults results) { + synchronized (mLock) { + mLastSearchString = constraint; + mFilteredPrinters.clear(); + if (results == null) { + mFilteredPrinters.addAll(mPrinters); + } else { + List<PrinterInfo> printers = (List<PrinterInfo>) results.values; + mFilteredPrinters.addAll(printers); + } + } + notifyDataSetChanged(); + } + }; + } + + @Override + public int getCount() { + synchronized (mLock) { + return mFilteredPrinters.size(); + } + } + + @Override + public Object getItem(int position) { + synchronized (mLock) { + return mFilteredPrinters.get(position); + } + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getDropDownView(int position, View convertView, + ViewGroup parent) { + return getView(position, convertView, parent); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = getActivity().getLayoutInflater().inflate( + R.layout.spinner_dropdown_item, parent, false); + } + + CharSequence title = null; + CharSequence subtitle = null; + + PrinterInfo printer = (PrinterInfo) getItem(position); + title = printer.getName(); + try { + PackageManager pm = getActivity().getPackageManager(); + PackageInfo packageInfo = pm.getPackageInfo(printer.getId() + .getServiceName().getPackageName(), 0); + subtitle = packageInfo.applicationInfo.loadLabel(pm); + } catch (NameNotFoundException nnfe) { + /* ignore */ + } + + TextView titleView = (TextView) convertView.findViewById(R.id.title); + titleView.setText(title); + + TextView subtitleView = (TextView) convertView.findViewById(R.id.subtitle); + if (!TextUtils.isEmpty(subtitle)) { + subtitleView.setText(subtitle); + subtitleView.setVisibility(View.VISIBLE); + } else { + subtitleView.setText(null); + subtitleView.setVisibility(View.GONE); + } + + return convertView; + } + + @Override + public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) { + if (id == LOADER_ID_PRINTERS_LOADER) { + return new FusedPrintersProvider(getActivity()); + } + return null; + } + + @Override + public void onLoadFinished(Loader<List<PrinterInfo>> loader, + List<PrinterInfo> printers) { + synchronized (mLock) { + mPrinters.clear(); + mPrinters.addAll(printers); + mFilteredPrinters.clear(); + mFilteredPrinters.addAll(printers); + if (!TextUtils.isEmpty(mLastSearchString)) { + getFilter().filter(mLastSearchString); + } + } + notifyDataSetChanged(); + } + + @Override + public void onLoaderReset(Loader<List<PrinterInfo>> loader) { + synchronized (mLock) { + mPrinters.clear(); + mFilteredPrinters.clear(); + } + notifyDataSetInvalidated(); + } + } +} diff --git a/packages/SystemUI/ic_sysbar_internal.psd b/packages/SystemUI/ic_sysbar_internal.psd Binary files differdeleted file mode 100644 index 929c872..0000000 --- a/packages/SystemUI/ic_sysbar_internal.psd +++ /dev/null diff --git a/packages/SystemUI/res/drawable-nodpi/lightning.png b/packages/SystemUI/res/drawable-nodpi/lightning.png Binary files differnew file mode 100644 index 0000000..29de308 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/lightning.png diff --git a/packages/SystemUI/res/layout/quick_settings_tile_battery.xml b/packages/SystemUI/res/layout/quick_settings_tile_battery.xml index c41e9b9..f3b894c 100644 --- a/packages/SystemUI/res/layout/quick_settings_tile_battery.xml +++ b/packages/SystemUI/res/layout/quick_settings_tile_battery.xml @@ -19,14 +19,14 @@ android:layout_height="match_parent" android:layout_gravity="top" android:orientation="vertical"> - <ImageView + <com.android.systemui.BatteryMeterView android:id="@+id/image" android:layout_marginTop="@dimen/qs_tile_margin_above_icon" android:layout_marginBottom="@dimen/qs_tile_margin_below_icon" - android:layout_width="@dimen/qs_tile_icon_size" - android:layout_height="@dimen/qs_tile_icon_size" + android:layout_width="22dp" + android:layout_height="32dp" + android:padding="3dp" android:layout_gravity="top|center_horizontal" - android:scaleType="centerInside" /> <TextView style="@style/TextAppearance.QuickSettings.TileView" @@ -36,4 +36,4 @@ android:layout_gravity="top|center_horizontal" android:gravity="top|center_horizontal" /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index aab5083..66b06ef 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -20,8 +20,9 @@ <com.android.systemui.statusbar.SignalClusterView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:layout_width="wrap_content" + android:gravity="center" android:orientation="horizontal" > <FrameLayout diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index b27536d..4741cec 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -95,11 +95,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> - <ImageView + <!-- battery must be padded below by 1px to match assets --> + <com.android.systemui.BatteryMeterView android:id="@+id/battery" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:paddingStart="4dip" + android:layout_height="16dp" + android:layout_width="10dp" + android:paddingBottom="1px" + android:layout_marginStart="4dip" /> </LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 9b2c127..2bed730 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Sleep rand van skerm om balk te wys"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Sleep van rand van skerm af om stelselbalk te wys"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 4aa452d..ebbad16 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -164,7 +164,7 @@ <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_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> @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"አሞሌውን ለማሳየት የማያ ገጹን ጠርዝ ላይ ያንሸራትቱ"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"አሞሌውን ለማሳየት ከማያ ገጹ ጠርዝ ጀምረው ያንሸራትቱ"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index f7f5e37..7aac94e 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"مرر سريعًا لحافة الشاشة لإظهار الشريط"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"مرر سريعًا من حافة الشاشة لإظهار شريط النظام"</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..d22f3e6 --- /dev/null +++ b/packages/SystemUI/res/values-az/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">"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="compat_mode_help_header" msgid="7969493989397529910">"Uyğunluq zoomu"</string> + <string name="compat_mode_help_body" msgid="4946726776359270040">"Tətbiq kiçik bir ekran üçün nəzərdə tutulduğu zaman, zoom kontrolu saatın yanında görünür."</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> +</resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index aaca584..76d0580 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -206,8 +206,4 @@ <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 hiding_navigation_confirmation_message (3227814171674734332) --> - <skip /> - <!-- no translation found for hiding_navigation_confirmation_message_long (7854368870786524950) --> - <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index b10f5ff..605dd97 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -164,8 +164,7 @@ <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_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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Прекарайте пръст по ръба на екрана, за да се покаже лентата"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Прекарайте пръст от ръба на екрана, за да се покаже системната лента"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 0a95005..83e7020 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Fes lliscar el dit per la vora de la pantalla perquè es mostri la barra"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Fes lliscar el dit des de la vora de la pantalla perquè es mostri la barra del sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 178238f..4497735 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -203,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Panel zobrazíte přejetím přes okraj obrazovky"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Systémový panel zobrazíte přejetím přes okraj obrazovky"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 1c772b5..be42612 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -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">"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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Stryg fra skærmkanten for at se bjælken"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Stryg med fingeren fra skærmens kant for at få vist systembjælken"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 86ea82d..052990c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Zum Einblenden der Leiste vom Rand weg wischen"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Zum Einblenden der Systemleiste vom Display-Rand weg wischen"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index f965773..d23b8d5 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -203,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Σύρετε από την άκρη της οθόνης για να εμφανίσετε τη γραμμή"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Σύρετε από την άκρη της οθόνης για να εμφανίσετε τη γραμμή συστήματος"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index a7d6213..2ac1040 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Swipe edge of screen to reveal bar"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Swipe from edge of screen to reveal system bar"</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..2ac1040 --- /dev/null +++ b/packages/SystemUI/res/values-en-rIN/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">"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="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> + <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_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_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="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">"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="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> +</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index bdd0363..d11d413 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Desliza el dedo desde el borde de la pantalla para mostrar la barra."</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Desliza el dedo desde el borde de la pantalla para mostrar la barra del sistema."</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index a81a2b4..068af45 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Desliza el borde de la pantalla para mostrar la barra"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Desliza el borde de la pantalla para mostrar la barra del sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index c4fda13..28ece65 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -201,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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Riba kuvamiseks pühkige ekraani serva"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"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 a84b9b4..2ba0427 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"برای نمایش نوار، انگشت خود را از لبه صفحه به داخل بکشید"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"برای نمایش نوار سیستم، انگشت خود را از لبه صفحه به داخل بکشید"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index f2cce06..b652cb0 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Tuo palkki näkyviin liu\'uttamalla ruudun reunasta"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Tuo järjestelmäpalkki näkyviin liu\'uttamalla ruudun reunasta"</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..8fb7340 --- /dev/null +++ b/packages/SystemUI/res/values-fr-rCA/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">"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="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 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_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_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="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</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="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> +</resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 7fe1143..d00e4a3 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Faites glisser le doigt sur le côté de l\'écran pour afficher la barre."</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Faites glisser le doigt à partir d\'un côté de l\'écran pour afficher la barre système."</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index a1de7a1..45b5813 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"बार को प्रदर्शित करने के लिए स्क्रीन के किनारे को स्वाइप करें"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"सिस्टम बार को प्रदर्शित करने के लिए स्क्रीन के किनारे से स्वाइप करें"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index f8ff35d..9f8559c 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Prijeđite prstom po rubu zaslona da bi se prikazala traka"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Prijeđite prstom od ruba zaslona da bi se prikazala traka sustava"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 118baed..f2dcd93 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Csúsztassa ujját a képernyő szélén a sáv megjelenítéséhez"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Csúsztassa ujját a képernyő szélétől a rendszersáv megjelenítéséhez"</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 013bd99..6846056 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Gesek tepi layar untuk membuka bilah"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Gesek dari bagian tepi layar untuk membuka bilah sistem"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index ff539be..a889342 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -203,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Fai scorrere il bordo dello schermo per visualizzare la barra"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Fai scorrere il dito dal bordo dello schermo per visualizzare la barra di sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index c80ad7c..899f092 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -164,8 +164,7 @@ <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_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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"החלק מקצה המסך כדי להציג את הסרגל"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"החלק מקצה המסך כדי להציג את סרגל המערכת"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 73aa558..e92e8be 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -166,8 +166,7 @@ <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_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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"バーを表示するには、画面の端からスワイプします"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"システムバーを表示するには、画面の端からスワイプします"</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/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 403c94b..6319184 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -164,8 +164,7 @@ <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_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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"화면 가장자리에서 스와이프하여 표시줄 표시"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"화면 가장자리에서 스와이프하여 시스템 표시줄 표시"</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 11b67ed..4400d37 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Jei norite, kad būtų rodoma juosta, perbraukite ekrano krašte"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Jei norite, kad būtų rodoma sistemos juosta, perbraukite iš ekrano krašto"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 85ab3fd..b2bee8c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Velciet no ekrāna malas, lai piekļūtu joslai."</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Velciet no ekrāna malas, lai piekļūtu sistēmas joslai."</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..f5b45e1 --- /dev/null +++ b/packages/SystemUI/res/values-mn/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">"<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">"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> +</resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index b6b3577..9c76eae 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -201,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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Leret ke bahagian tepi skrin untuk menampakkan bar"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"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 6f7d727..d850cf3 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -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">"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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Sveip på kanten av skjermen for å få frem feltet"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Sveip fra kanten på skjermen for å få frem systemfeltet"</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 02a5b45..5b6ebab 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Veeg vanaf de rand om balk weer te geven"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Veeg vanaf de rand van het scherm om de systeembalk weer te geven"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index d17c45e..6bff7af 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Przesuń palcem od krawędzi ekranu, by odkryć pasek"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Przesuń palcem od krawędzi ekranu, by odkryć pasek systemu"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index b520319..6aa94e0 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Deslize da extremidade do ecrã para revelar a barra"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Deslize da extremidade do ecrã para revelar a barra do sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 2a2f336..aa972fb 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Deslize a borda da tela para ver a barra"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Deslize a partir da borda da tela ver a barra do sistema"</string> </resources> diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml index 22a857e..05b7453 100644 --- a/packages/SystemUI/res/values-rm/strings.xml +++ b/packages/SystemUI/res/values-rm/strings.xml @@ -372,8 +372,4 @@ <skip /> <!-- no translation found for status_bar_help_text (7874607155052076323) --> <skip /> - <!-- no translation found for hiding_navigation_confirmation_message (3227814171674734332) --> - <skip /> - <!-- no translation found for hiding_navigation_confirmation_message_long (7854368870786524950) --> - <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 375d12c..9c5ad00 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Glisați dinspre marginea ecranului pentru a afișa bara"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Glisați dinspre marginea ecranului pentru a afișa bara de sistem"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 15adf90..3020624 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -166,8 +166,7 @@ <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_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> @@ -206,6 +205,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Чтобы открыть панель, проведите пальцем от края к центру экрана"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Чтобы открыть панель навигации, проведите пальцем от края к центру экрана"</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 bb70f36..59af9ab 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Panel zobrazíte posunutím cez okraj obrazovky"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Systémový panel zobrazíte posunutím cez okraj obrazovky"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 46a5826..338ff44 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Vrstico prikažete tako, da povlečete z roba zaslona"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Sistemsko vrstico prikažete tako, da povlečete z roba zaslona"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 163bc06..b501d69 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Превуците по ивици екрана да би се приказала трака"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Превуците од ивице екрана да би се приказала системска трака"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c5335f4..560a00e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -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">"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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Dra från kanten av skärmen om du vill visa fältet"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Dra från kanten av skärmen om du vill visa systemfältet"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a0fb0a8..e3338de 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -199,6 +199,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau wa mfumo"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 2552e5c..3127eb3 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"กวาดขอบของหน้าจอเพื่อแสดงแถบ"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"กวาดจากขอบของหน้าจอเพื่อแสดงแถบระบบ"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index dfc6c7d..9d4d9de 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Mag-swipe sa gilid ng screen upang ipakita ang bar"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Mag-swipe mula sa gilid ng screen upang ipakita ang system bar"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index f7b34de..b885344 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Çubuğu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Sistem çubuğunu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 23e276b..1f3c131 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -164,8 +164,7 @@ <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_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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Гортайте від краю екрана, щоб з’явилась панель"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Проведіть пальцем від краю екрана, щоб з’явилась навігаційна панель"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 31fc2c8..1bea172 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -164,8 +164,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -202,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Vuốt cạnh màn hình để hiển thị thanh"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Vuốt từ cạnh màn hình để hiển thị thanh hệ thống"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index b8b56c9..867cb17 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -166,8 +166,7 @@ <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> - <!-- no translation found for accessibility_location_active (2427290146138169014) --> - <skip /> + <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> @@ -204,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"从屏幕边缘向里滑可显示系统栏"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"从屏幕边缘向里滑动即可显示系统栏"</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..ab38c59 --- /dev/null +++ b/packages/SystemUI/res/values-zh-rHK/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">"系統用戶介面"</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="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">"數據網絡訊號強度為兩格。"</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_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 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> +</resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index a0bb92a..1d5b2ac 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -203,6 +203,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"從螢幕邊緣向內滑動即可顯示導覽列"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"從螢幕邊緣向內滑動即可顯示導覽列"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 53e7db0..662d3cb 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -201,6 +201,4 @@ <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="hiding_navigation_confirmation_message" msgid="3227814171674734332">"Swayipha kunqenqema lwesikrini ukuze uveze ibha"</string> - <string name="hiding_navigation_confirmation_message_long" msgid="7854368870786524950">"Swayipha kusuka kunqenqema ukuze uveze ibha yesistimu"</string> </resources> diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index cd6aaf6..506722d 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -40,4 +40,16 @@ <item>@null</item> </array> + <!-- BatteryMeterView parameters --> + <array name="batterymeter_color_levels"> + <item>4</item> + <item>15</item> + <item>100</item> + </array> + <array name="batterymeter_color_values"> + <item>#FFFF0000</item> + <item>#FFFE6600</item> + <item>#FF3792B4</item> + </array> + </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 4a7d090..5718db2 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -20,6 +20,10 @@ <drawable name="notification_number_text_color">#ffffffff</drawable> <drawable name="ticker_background_color">#ff1d1d1d</drawable> <drawable name="status_bar_background">#ff000000</drawable> + <color name="status_bar_background_semi_transparent">#55000000</color> + <color name="status_bar_background_transparent">#00000000</color> + <color name="navigation_bar_background_transparent_start">#7f000000</color> + <color name="navigation_bar_background_transparent_end">#00000000</color> <color name="notification_panel_solid_background">#ff000000</color> <drawable name="status_bar_recents_app_thumbnail_background">#88000000</drawable> <color name="status_bar_recents_app_label_color">#ffffffff</color> @@ -30,4 +34,6 @@ <drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable> <drawable name="notification_header_bg">#FF000000</drawable> <color name="notification_panel_scrim_color">#B0000000</color> + + <color name="batterymeter_frame_color">#FF404040</color> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 33a85c3..c849aa6 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -504,9 +504,6 @@ <!-- Body of help text shown when the notification panel is pulled down for the very first time. [CHAR LIMIT=NONE] --> <string name="status_bar_help_text">Access them anytime by swiping down.\nSwipe down again for system controls.</string> - <!-- Toast bar message when hiding the navigation bar --> - <string name="hiding_navigation_confirmation_message">Swipe edge of screen to reveal bar</string> - - <!-- Longer version of toast bar message when hiding the navigation bar (if room) --> - <string name="hiding_navigation_confirmation_message_long">Swipe from edge of screen to reveal system bar</string> + <!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. --> + <string name="battery_meter_very_low_overlay_symbol">!</string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java new file mode 100755 index 0000000..aa4362e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -0,0 +1,302 @@ +/* + * 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.systemui; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.BatteryManager; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; + +public class BatteryMeterView extends View { + public static final String TAG = BatteryMeterView.class.getSimpleName(); + public static final String ACTION_LEVEL_TEST = "com.android.systemui.BATTERY_LEVEL_TEST"; + + public static final boolean ENABLE_PERCENT = true; + public static final boolean SINGLE_DIGIT_PERCENT = false; + public static final boolean SHOW_100_PERCENT = false; + + public static final int FULL = 96; + public static final int EMPTY = 4; + + int[] mColors; + + boolean mShowPercent = true; + Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint; + int mButtonHeight; + private float mTextHeight, mWarningTextHeight; + Drawable mLightning; + + private int mHeight; + private int mWidth; + private String mWarningString; + + private class BatteryTracker extends BroadcastReceiver { + // current battery status + int level; + String percentStr; + int plugType; + boolean plugged; + int health; + int status; + String technology; + int voltage; + int temperature; + boolean testmode = false; + + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { + if (testmode && ! intent.getBooleanExtra("testmode", false)) return; + + level = (int)(100f + * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) + / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)); + + plugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); + plugged = plugType != 0; + health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, + BatteryManager.BATTERY_HEALTH_UNKNOWN); + status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + technology = intent.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY); + voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0); + temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0); + + setContentDescription( + context.getString(R.string.accessibility_battery_level, level)); + postInvalidate(); + } else if (action.equals(ACTION_LEVEL_TEST)) { + testmode = true; + post(new Runnable() { + int curLevel = 0; + int incr = 1; + int saveLevel = level; + int savePlugged = plugType; + Intent dummy = new Intent(Intent.ACTION_BATTERY_CHANGED); + @Override + public void run() { + if (curLevel < 0) { + testmode = false; + dummy.putExtra("level", saveLevel); + dummy.putExtra("plugged", savePlugged); + dummy.putExtra("testmode", false); + } else { + dummy.putExtra("level", curLevel); + dummy.putExtra("plugged", incr > 0 ? BatteryManager.BATTERY_PLUGGED_AC : 0); + dummy.putExtra("testmode", true); + } + getContext().sendBroadcast(dummy); + + if (!testmode) return; + + curLevel += incr; + if (curLevel == 100) { + incr *= -1; + } + postDelayed(this, 200); + } + }); + } + } + } + + BatteryTracker mTracker = new BatteryTracker(); + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_BATTERY_CHANGED); + filter.addAction(ACTION_LEVEL_TEST); + getContext().registerReceiver(mTracker, filter); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + getContext().unregisterReceiver(mTracker); + } + + public BatteryMeterView(Context context) { + this(context, null, 0); + } + + public BatteryMeterView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final Resources res = context.getResources(); + TypedArray levels = res.obtainTypedArray(R.array.batterymeter_color_levels); + TypedArray colors = res.obtainTypedArray(R.array.batterymeter_color_values); + + final int N = levels.length(); + mColors = new int[2*N]; + for (int i=0; i<N; i++) { + mColors[2*i] = levels.getInt(i, 0); + mColors[2*i+1] = colors.getColor(i, 0); + } + + mShowPercent = ENABLE_PERCENT && 0 != Settings.System.getInt( + context.getContentResolver(), "status_bar_show_battery_percent", 0); + + mWarningString = context.getString(R.string.battery_meter_very_low_overlay_symbol); + + mFramePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mFramePaint.setColor(res.getColor(R.color.batterymeter_frame_color)); + mBatteryPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBatteryPaint.setColor(0xFF00FF00); // will be replaced by something from mColors + + mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mTextPaint.setColor(0xFFFFFFFF); + Typeface font = Typeface.create("sans-serif-condensed", Typeface.NORMAL); + mTextPaint.setTypeface(font); + mTextPaint.setTextAlign(Paint.Align.CENTER); + + mWarningTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mWarningTextPaint.setColor(mColors[1]); + font = Typeface.create("sans-serif", Typeface.BOLD); + mWarningTextPaint.setTypeface(font); + mWarningTextPaint.setTextAlign(Paint.Align.CENTER); + + mLightning = getResources().getDrawable(R.drawable.lightning); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + mHeight = h; + mWidth = w; + mWarningTextPaint.setTextSize(h * 0.75f); + mWarningTextHeight = -mWarningTextPaint.getFontMetrics().ascent; + } + + private int getColorForLevel(int percent) { + int thresh, color = 0; + for (int i=0; i<mColors.length; i+=2) { + thresh = mColors[i]; + color = mColors[i+1]; + if (percent <= thresh) return color; + } + return color; + } + + @Override + public void draw(Canvas c) { + final int level = mTracker.level; + float drawFrac = (float) level / 100f; + final int pt = getPaddingTop(); + final int pl = getPaddingLeft(); + final int pr = getPaddingRight(); + final int pb = getPaddingBottom(); + int height = mHeight - pt - pb; + int width = mWidth - pl - pr; + + mButtonHeight = (int) (height * 0.12f); + + final RectF frame = new RectF(0, 0, width, height); + frame.offset(pl, pt); + + // Log.v("BatteryGauge", String.format("canvas: %dx%d frame: %s", + // c.getWidth(), c.getHeight(), frame.toString())); + + final RectF buttonframe = new RectF( + frame.left + width * 0.25f, + frame.top, + frame.right - width * 0.25f, + frame.top + mButtonHeight); + + frame.top += mButtonHeight; + + // first, draw the battery shape + c.drawRect(frame, mFramePaint); + + // fill 'er up + final int pct = mTracker.level; + final int color = getColorForLevel(pct); + mBatteryPaint.setColor(color); + + if (level >= FULL) { + drawFrac = 1f; + } else if (level <= EMPTY) { + drawFrac = 0f; + } + + c.drawRect(buttonframe, + drawFrac == 1f ? mBatteryPaint : mFramePaint); + + RectF clip = new RectF(frame); + clip.top += (frame.height() * (1f - drawFrac)); + + c.save(Canvas.CLIP_SAVE_FLAG); + c.clipRect(clip); + c.drawRect(frame, mBatteryPaint); + c.restore(); + + if (level <= EMPTY) { + final float x = mWidth * 0.5f; + final float y = (mHeight + mWarningTextHeight) * 0.48f; + c.drawText(mWarningString, x, y, mWarningTextPaint); + } else if (mTracker.plugged) { + final Rect r = new Rect( + (int)frame.left + width / 4, (int)frame.top + height / 5, + (int)frame.right - width / 4, (int)frame.bottom - height / 6); + mLightning.setBounds(r); + mLightning.draw(c); + } else if (mShowPercent && !(mTracker.level == 100 && !SHOW_100_PERCENT)) { + mTextPaint.setTextSize(height * + (SINGLE_DIGIT_PERCENT ? 0.75f + : (mTracker.level == 100 ? 0.38f : 0.5f))); + mTextHeight = -mTextPaint.getFontMetrics().ascent; + + final String str = String.valueOf(SINGLE_DIGIT_PERCENT ? (pct/10) : pct); + final float x = mWidth * 0.5f; + final float y = (mHeight + mTextHeight) * 0.47f; + c.drawText(str, + x, + y, + mTextPaint); + +// Paint pt = new Paint(); +// pt.setStrokeWidth(1f); +// pt.setStyle(Paint.Style.STROKE); +// pt.setColor(0xFFFF0000); +// c.drawRect(x, y-mTextHeight, x+tw, y, pt); +// +// Slog.v(TAG, "tw=" + tw + " th=" + mTextHeight); +// +// pt.setColor(0xFFFF00FF); +// c.drawRect(1, 1, mWidth, mHeight, pt); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index f17b143..ff84243 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -135,9 +135,9 @@ public class SignalClusterView public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { // Standard group layout onPopulateAccessibilityEvent() implementations // ignore content description, so populate manually - if (mWifiVisible && mWifiGroup.getContentDescription() != null) + if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null) event.getText().add(mWifiGroup.getContentDescription()); - if (mMobileVisible && mMobileGroup.getContentDescription() != null) + if (mMobileVisible && mMobileGroup != null && mMobileGroup.getContentDescription() != null) event.getText().add(mMobileGroup.getContentDescription()); return super.dispatchPopulateAccessibilityEvent(event); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java new file mode 100644 index 0000000..e40c4e5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.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 com.android.systemui.statusbar.phone; + +import android.animation.ArgbEvaluator; +import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; +import android.app.ActivityManager; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.View; + +import com.android.systemui.R; + +public class BarTransitions { + private static final boolean DEBUG = false; + + public static final int MODE_OPAQUE = 0; + public static final int MODE_SEMI_TRANSPARENT = 1; + public static final int MODE_TRANSPARENT = 2; + + private final String mTag; + private final View mTarget; + private final int mOpaque; + private final int mSemiTransparent; + + protected Drawable mTransparent; + private int mMode; + + private final AnimatorUpdateListener mBackgroundColorListener = new AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animator) { + mTarget.setBackgroundColor((Integer) animator.getAnimatedValue()); + } + }; + + public BarTransitions(Context context, View target) { + mTag = "BarTransitions." + target.getClass().getSimpleName(); + mTarget = target; + final Resources res = context.getResources(); + mOpaque = res.getColor(R.drawable.status_bar_background); + mSemiTransparent = res.getColor(R.color.status_bar_background_semi_transparent); + } + + public void setTransparent(Drawable transparent) { + mTransparent = transparent; + if (mMode == MODE_TRANSPARENT) { + transitionTo(MODE_TRANSPARENT); + } + } + + public void transitionTo(int mode) { + transitionTo(mode, false); + } + + public void transitionTo(int mode, boolean animate) { + if (mMode == mode) return; + int oldMode = mMode; + mMode = mode; + if (!ActivityManager.isHighEndGfx()) return; + if (DEBUG) Log.d(mTag, modeToString(oldMode) + " -> " + modeToString(mode)); + onTransition(oldMode, mMode, animate); + } + + protected void onTransition(int oldMode, int newMode, boolean animate) { + if (animate && oldMode == MODE_SEMI_TRANSPARENT && newMode == MODE_OPAQUE) { + startColorAnimation(mSemiTransparent, mOpaque); + } else if (animate && oldMode == MODE_OPAQUE && newMode == MODE_SEMI_TRANSPARENT) { + startColorAnimation(mOpaque, mSemiTransparent); + } else if (newMode == MODE_OPAQUE || newMode == MODE_SEMI_TRANSPARENT) { + mTarget.setBackgroundColor(newMode == MODE_OPAQUE ? mOpaque : mSemiTransparent); + } else { + mTarget.setBackground(newMode == MODE_TRANSPARENT? mTransparent + : newMode == MODE_SEMI_TRANSPARENT ? new ColorDrawable(mSemiTransparent) + : new ColorDrawable(mOpaque)); + } + } + + private void startColorAnimation(int from, int to) { + ValueAnimator anim = ValueAnimator.ofObject(new ArgbEvaluator(), from, to); + anim.addUpdateListener(mBackgroundColorListener); + anim.start(); + } + + public static String modeToString(int mode) { + if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; + if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; + if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; + throw new IllegalArgumentException("Unknown mode " + mode); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index de33b87..62f8596 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -25,6 +25,8 @@ import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.GradientDrawable.Orientation; import android.os.Handler; import android.os.Message; import android.os.ServiceManager; @@ -45,6 +47,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.DelegateViewHelper; import com.android.systemui.statusbar.policy.DeadZone; +import com.android.systemui.statusbar.policy.KeyButtonView; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -79,6 +82,7 @@ public class NavigationBarView extends LinearLayout { private DelegateViewHelper mDelegateHelper; private DeadZone mDeadZone; + private final NavigationBarTransitions mBarTransitions; // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288) final static boolean WORKAROUND_INVALID_LAYOUT = true; @@ -107,6 +111,68 @@ public class NavigationBarView extends LinearLayout { } } + private final class NavigationBarTransitions extends BarTransitions { + + private final Drawable mTransparentBottom; + private final Drawable mTransparentRight; + + public NavigationBarTransitions(Context context) { + super(context, NavigationBarView.this); + final Resources res = mContext.getResources(); + final int[] gradientColors = new int[] { + res.getColor(R.color.navigation_bar_background_transparent_start), + res.getColor(R.color.navigation_bar_background_transparent_end) + }; + mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors); + mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors); + } + + public void setVertical(boolean isVertical) { + mTransparent = isVertical ? mTransparentRight : mTransparentBottom; + } + + @Override + protected void onTransition(int oldMode, int newMode, boolean animate) { + super.onTransition(oldMode, newMode, animate); + final float alpha = newMode == MODE_OPAQUE ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f; + setKeyButtonViewQuiescentAlpha(getBackButton(), alpha); + setKeyButtonViewQuiescentAlpha(getHomeButton(), alpha); + setKeyButtonViewQuiescentAlpha(getRecentsButton(), alpha); + setKeyButtonViewQuiescentAlpha(getMenuButton(), alpha); + } + + private void setKeyButtonViewQuiescentAlpha(View button, float alpha) { + if (button instanceof KeyButtonView) { + ((KeyButtonView) button).setQuiescentAlpha(alpha); + } + } + } + + public NavigationBarView(Context context, AttributeSet attrs) { + super(context, attrs); + + mHidden = false; + + mDisplay = ((WindowManager)context.getSystemService( + Context.WINDOW_SERVICE)).getDefaultDisplay(); + mBarService = IStatusBarService.Stub.asInterface( + ServiceManager.getService(Context.STATUS_BAR_SERVICE)); + + final Resources res = mContext.getResources(); + mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size); + mVertical = false; + mShowMenu = false; + mDelegateHelper = new DelegateViewHelper(this); + + getIcons(res); + + mBarTransitions = new NavigationBarTransitions(context); + } + + public BarTransitions getBarTransitions() { + return mBarTransitions; + } + public void setDelegateView(View view) { mDelegateHelper.setDelegateView(view); } @@ -155,25 +221,6 @@ public class NavigationBarView extends LinearLayout { return mCurrentView.findViewById(R.id.search_light); } - public NavigationBarView(Context context, AttributeSet attrs) { - super(context, attrs); - - mHidden = false; - - mDisplay = ((WindowManager)context.getSystemService( - Context.WINDOW_SERVICE)).getDefaultDisplay(); - mBarService = IStatusBarService.Stub.asInterface( - ServiceManager.getService(Context.STATUS_BAR_SERVICE)); - - final Resources res = mContext.getResources(); - mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size); - mVertical = false; - mShowMenu = false; - mDelegateHelper = new DelegateViewHelper(this); - - getIcons(res); - } - private void getIcons(Resources res) { mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back); mBackLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_land); @@ -406,6 +453,7 @@ public class NavigationBarView extends LinearLayout { } setNavigationIconHints(mNavigationIconHints, true); + mBarTransitions.setVertical(mVertical); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index d0a6385..4b2c3e1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -76,6 +76,7 @@ public class PanelView extends FrameLayout { private boolean mClosing; private boolean mRubberbanding; private boolean mTracking; + private int mTrackingPointer; private TimeAnimator mTimeAnimator; private ObjectAnimator mPeekAnimator; @@ -118,7 +119,7 @@ public class PanelView extends FrameLayout { int i = 0; float totalweight = 0f; float weight = 10f; - for (final Iterator<MotionEventCopy> iter = mEventBuf.descendingIterator(); + for (final Iterator<MotionEventCopy> iter = mEventBuf.iterator(); iter.hasNext();) { final MotionEventCopy event = iter.next(); if (last != null) { @@ -126,13 +127,22 @@ public class PanelView extends FrameLayout { final float dx = (event.x - last.x); final float dy = (event.y - last.y); if (FlingTracker.DEBUG) { - Log.v("FlingTracker", String.format(" [%d] dx=%.1f dy=%.1f dt=%.0f vx=%.1f vy=%.1f", - i, + Log.v("FlingTracker", String.format( + " [%d] (t=%d %.1f,%.1f) dx=%.1f dy=%.1f dt=%f vx=%.1f vy=%.1f", + i, event.t, event.x, event.y, dx, dy, dt, (dx/dt), (dy/dt) )); } + if (event.t == last.t) { + // Really not sure what to do with events that happened at the same time, + // so we'll skip subsequent events. + if (DEBUG_NAN) { + Log.v("FlingTracker", "skipping simultaneous event at t=" + event.t); + } + continue; + } mVX += weight * dx / dt; mVY += weight * dy / dt; totalweight += weight; @@ -158,18 +168,18 @@ public class PanelView extends FrameLayout { } } public float getXVelocity() { - if (Float.isNaN(mVX)) { + if (Float.isNaN(mVX) || Float.isInfinite(mVX)) { if (DEBUG_NAN) { - Log.v("FlingTracker", "warning: vx=NaN"); + Log.v("FlingTracker", "warning: vx=" + mVX); } mVX = 0; } return mVX; } public float getYVelocity() { - if (Float.isNaN(mVY)) { + if (Float.isNaN(mVY) || Float.isInfinite(mVX)) { if (DEBUG_NAN) { - Log.v("FlingTracker", "warning: vx=NaN"); + Log.v("FlingTracker", "warning: vx=" + mVY); } mVY = 0; } @@ -371,14 +381,21 @@ public class PanelView extends FrameLayout { mHandleView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { - final float y = event.getY(); - final float rawY = event.getRawY(); - if (DEBUG) logf("handle.onTouch: a=%s y=%.1f rawY=%.1f off=%.1f", + int pointerIndex = event.findPointerIndex(mTrackingPointer); + if (pointerIndex < 0) { + pointerIndex = 0; + mTrackingPointer = event.getPointerId(pointerIndex); + } + final float y = event.getY(pointerIndex); + final float rawDelta = event.getRawY() - event.getY(); + final float rawY = y + rawDelta; + if (DEBUG) logf("handle.onTouch: a=%s p=[%d,%d] y=%.1f rawY=%.1f off=%.1f", MotionEvent.actionToString(event.getAction()), + mTrackingPointer, pointerIndex, y, rawY, mTouchOffset); PanelView.this.getLocationOnScreen(mAbsPos); - switch (event.getAction()) { + switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mTracking = true; mHandleView.setPressed(true); @@ -388,13 +405,26 @@ public class PanelView extends FrameLayout { trackMovement(event); mTimeAnimator.cancel(); // end any outstanding animations mBar.onTrackingStarted(PanelView.this); - mTouchOffset = (rawY - mAbsPos[1]) - PanelView.this.getExpandedHeight(); + mTouchOffset = (rawY - mAbsPos[1]) - mExpandedHeight; if (mExpandedHeight == 0) { mJustPeeked = true; runPeekAnimation(); } break; + case MotionEvent.ACTION_POINTER_UP: + final int upPointer = event.getPointerId(event.getActionIndex()); + if (mTrackingPointer == upPointer) { + // gesture is ongoing, find a new pointer to track + final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1; + final float newY = event.getY(newIndex); + final float newRawY = newY + rawDelta; + mTrackingPointer = event.getPointerId(newIndex); + mTouchOffset = (newRawY - mAbsPos[1]) - mExpandedHeight; + mInitialTouchY = newY; + } + break; + case MotionEvent.ACTION_MOVE: final float h = rawY - mAbsPos[1] - mTouchOffset; if (h > mPeekHeight) { @@ -415,6 +445,7 @@ public class PanelView extends FrameLayout { case MotionEvent.ACTION_CANCEL: mFinalTouchY = y; mTracking = false; + mTrackingPointer = -1; mHandleView.setPressed(false); postInvalidate(); // catch the press state change mBar.onTrackingStopped(PanelView.this); @@ -613,6 +644,10 @@ public class PanelView extends FrameLayout { return mClosing; } + public boolean isTracking() { + return mTracking; + } + public void setBar(PanelBar panelBar) { mBar = panelBar; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index c914a34..ad53fea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -16,6 +16,10 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -57,7 +61,6 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; -import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewPropertyAnimator; @@ -72,7 +75,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; -import android.widget.Toast; + import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.EventLogTags; import com.android.systemui.R; @@ -129,14 +132,7 @@ public class PhoneStatusBar extends BaseStatusBar { private static final int STATUS_OR_NAV_TRANSIENT = View.STATUS_BAR_TRANSIENT | View.NAVIGATION_BAR_TRANSIENT; - private static final int TRANSIENT_NAV_HIDING = - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT; private static final long AUTOHIDE_TIMEOUT_MS = 3000; - private static final float TRANSPARENT_ALPHA = 0.7f; - - private static final int BAR_MODE_NORMAL = 0; - private static final int BAR_MODE_TRANSIENT = 1; - private static final int BAR_MODE_TRANSPARENT = 2; // fling gesture tuning parameters, scaled to display density private float mSelfExpandVelocityPx; // classic value: 2000px/s @@ -314,37 +310,6 @@ public class PhoneStatusBar extends BaseStatusBar { } }; - private Toast mHidingNavigationConfirmation; - private boolean mHidingNavigationConfirmationDismissed; - - private final View.OnTouchListener mDismissHidingNavigationConfirmationOnTouchOutside = - new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_OUTSIDE) { - dismissHidingNavigationConfirmation(); - } - return false; - } - }; - - private final Runnable mHidingNavigationConfirmationAction = new Runnable() { - @Override - public void run() { - if (mHidingNavigationConfirmation != null) { - final boolean isGloballyConfirmed = Prefs.read(mContext) - .getBoolean(Prefs.HIDING_NAVIGATION_CONFIRMED, false); - if (!isGloballyConfirmed) { - // user pressed button, consider this a confirmation - Prefs.edit(mContext) - .putBoolean(Prefs.HIDING_NAVIGATION_CONFIRMED, true) - .apply(); - } - dismissHidingNavigationConfirmation(); - } - } - }; - private boolean mAutohideSuspended; private final Runnable mAutohide = new Runnable() { @@ -542,7 +507,6 @@ public class PhoneStatusBar extends BaseStatusBar { // Other icons mLocationController = new LocationController(mContext); // will post a notification mBatteryController = new BatteryController(mContext); - mBatteryController.addIconView((ImageView)mStatusBarView.findViewById(R.id.battery)); mNetworkController = new NetworkController(mContext); mBluetoothController = new BluetoothController(mContext); mRotationLockController = new RotationLockController(mContext); @@ -971,7 +935,7 @@ public class PhoneStatusBar extends BaseStatusBar { } if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0 - && !mStatusBarWindow.isPointerDown()) { + && !mNotificationPanel.isTracking()) { animateCollapsePanels(); } } @@ -1939,97 +1903,56 @@ public class PhoneStatusBar extends BaseStatusBar { } // update status bar mode - int sbMode = updateBarMode(oldVal, newVal, mStatusBarView, + int sbMode = updateBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(), View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS); // update navigation bar mode - int nbMode = updateBarMode(oldVal, newVal, mNavigationBarView, + int nbMode = updateBarMode(oldVal, newVal, mNavigationBarView.getBarTransitions(), View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION); if (sbMode != -1 || nbMode != -1) { // update transient bar autohide - if (sbMode == BAR_MODE_TRANSIENT || nbMode == BAR_MODE_TRANSIENT) { + if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) { scheduleAutohide(); } else { cancelAutohide(); } } - // update hiding navigation confirmation - if (mNavigationBarView != null) { - boolean oldShowConfirm = (oldVal & TRANSIENT_NAV_HIDING) == TRANSIENT_NAV_HIDING; - boolean newShowConfirm = (newVal & TRANSIENT_NAV_HIDING) == TRANSIENT_NAV_HIDING; - if (!oldShowConfirm && newShowConfirm) { - mHidingNavigationConfirmationDismissed = false; - } - setHidingNavigationConfirmationVisible(newShowConfirm); - } - // send updated sysui visibility to window manager notifyUiVisibilityChanged(mSystemUiVisibility); } } - private int updateBarMode(int oldVis, int newVis, View view, + private int updateBarMode(int oldVis, int newVis, BarTransitions transitions, int transientFlag, int transparentFlag) { final int oldMode = barMode(oldVis, transientFlag, transparentFlag); final int newMode = barMode(newVis, transientFlag, transparentFlag); if (oldMode == newMode) { return -1; // no mode change } - setTransparent(view, newMode != BAR_MODE_NORMAL); + transitions.transitionTo(newMode); return newMode; } private int barMode(int vis, int transientFlag, int transparentFlag) { - return (vis & transientFlag) != 0 ? BAR_MODE_TRANSIENT - : (vis & transparentFlag) != 0 ? BAR_MODE_TRANSPARENT - : BAR_MODE_NORMAL; - } - - private void dismissHidingNavigationConfirmation() { - if (mHidingNavigationConfirmation != null) { - mHidingNavigationConfirmationDismissed = true; - mHidingNavigationConfirmation.cancel(); - mHidingNavigationConfirmation = null; - } - } - - private void setHidingNavigationConfirmationVisible(boolean visible) { - if (DEBUG) Log.d(TAG, "setHidingNavigationConfirmationVisible " + visible); - if (visible && - mHidingNavigationConfirmation == null && !mHidingNavigationConfirmationDismissed) { - // create the confirmation toast bar - int msg = R.string.hiding_navigation_confirmation_message; - mHidingNavigationConfirmation = Toast.makeBar(mContext, msg, Toast.LENGTH_INFINITE) - .setAction(com.android.internal.R.string.ok, - mHidingNavigationConfirmationAction); - View v = mHidingNavigationConfirmation.getView(); - v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); - boolean isGloballyConfirmed = Prefs.read(mContext) - .getBoolean(Prefs.HIDING_NAVIGATION_CONFIRMED, false); - if (isGloballyConfirmed) { - // dismiss on outside touch if globally confirmed - v.setOnTouchListener(mDismissHidingNavigationConfirmationOnTouchOutside); - } - // position at the bottom like normal toasts, but use top gravity - // to avoid jumping around when showing/hiding the nav bar - v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); - int offsetY = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.toast_y_offset); - mHidingNavigationConfirmation.setGravity(Gravity.TOP, - 0, mCurrentDisplaySize.y - v.getMeasuredHeight() / 2 - offsetY); - // show the confirmation - mHidingNavigationConfirmation.show(); - } else if (!visible) { - dismissHidingNavigationConfirmation(); - } + return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT + : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT + : MODE_OPAQUE; } @Override public void resumeAutohide() { if (mAutohideSuspended) { scheduleAutohide(); + animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT); + } + } + + private void animateTransitionTo(int newMode) { + mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/); + if (mNavigationBarView != null) { + mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/); } } @@ -2037,6 +1960,7 @@ public class PhoneStatusBar extends BaseStatusBar { public void suspendAutohide() { mHandler.removeCallbacks(mAutohide); mAutohideSuspended = 0 != (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT); + animateTransitionTo(BarTransitions.MODE_OPAQUE); } private void cancelAutohide() { @@ -2063,13 +1987,6 @@ public class PhoneStatusBar extends BaseStatusBar { mHandler.postDelayed(mAutohide, 25); } - private void setTransparent(View view, boolean transparent) { - float alpha = transparent ? TRANSPARENT_ALPHA : 1; - if (DEBUG) Log.d(TAG, "Setting " + (view == mStatusBarView ? "status bar" : - view == mNavigationBarView ? "navigation bar" : "view") + " alpha to " + alpha); - view.setAlpha(alpha); - } - private void setStatusBarLowProfile(boolean lightsOut) { if (mLightsOutAnimation == null) { final View notifications = mStatusBarView.findViewById(R.id.notification_icon_area); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 1554e2c..910d4c4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -17,10 +17,10 @@ package com.android.systemui.statusbar.phone; import android.app.ActivityManager; -import android.app.StatusBarManager; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.EventLog; import android.util.Log; @@ -46,6 +46,15 @@ public class PhoneStatusBarView extends PanelBar { PanelView mLastFullyOpenedPanel = null; PanelView mNotificationPanel, mSettingsPanel; private boolean mShouldFade; + private final StatusBarTransitions mBarTransitions; + + private final class StatusBarTransitions extends BarTransitions { + public StatusBarTransitions(Context context) { + super(context, PhoneStatusBarView.this); + final Resources res = context.getResources(); + mTransparent = res.getDrawable(R.color.status_bar_background_transparent); + } + } public PhoneStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -59,6 +68,11 @@ public class PhoneStatusBarView extends PanelBar { mSettingsPanelDragzoneFrac = 0f; } mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f; + mBarTransitions = new StatusBarTransitions(context); + } + + public BarTransitions getBarTransitions() { + return mBarTransitions; } public void setBar(PhoneStatusBar bar) { 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 5233f42..5f034a8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -494,7 +494,9 @@ class QuickSettings { } // Battery - final QuickSettingsBasicTile batteryTile = new QuickSettingsBasicTile(mContext); + final QuickSettingsTileView batteryTile = (QuickSettingsTileView) + inflater.inflate(R.layout.quick_settings_tile, parent, false); + batteryTile.setContent(R.layout.quick_settings_tile_battery, inflater); batteryTile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -506,9 +508,6 @@ class QuickSettings { public void refreshView(QuickSettingsTileView unused, State state) { QuickSettingsModel.BatteryState batteryState = (QuickSettingsModel.BatteryState) state; - Drawable d = batteryState.pluggedIn - ? mChargingBatteryLevels - : mBatteryLevels; String t; if (batteryState.batteryLevel == 100) { t = mContext.getString(R.string.quick_settings_battery_charged_label); @@ -519,9 +518,7 @@ class QuickSettings { : mContext.getString(R.string.status_bar_settings_battery_meter_format, batteryState.batteryLevel); } - batteryTile.setImageDrawable(d); - batteryTile.getImageView().setImageLevel(batteryState.batteryLevel); - batteryTile.setText(t); + ((TextView)batteryTile.findViewById(R.id.text)).setText(t); batteryTile.setContentDescription( mContext.getString(R.string.accessibility_quick_settings_battery, t)); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 800bc02..a600aae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -42,7 +42,6 @@ public class StatusBarWindowView extends FrameLayout private NotificationRowLayout latestItems; private NotificationPanelView mNotificationPanel; private ScrollView mScrollView; - private boolean mPointerDown; PhoneStatusBar mService; @@ -87,7 +86,6 @@ public class StatusBarWindowView extends FrameLayout @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - registerPointer(ev); boolean intercept = false; if (mNotificationPanel.isFullyExpanded() && mScrollView.getVisibility() == View.VISIBLE) { intercept = mExpandHelper.onInterceptTouchEvent(ev); @@ -133,21 +131,5 @@ public class StatusBarWindowView extends FrameLayout mExpandHelper.cancel(); } } - - private void registerPointer(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mPointerDown = true; - break; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - mPointerDown = false; - break; - } - } - - public boolean isPointerDown() { - return mPointerDown; - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index f325957..924478c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -16,6 +16,9 @@ package com.android.systemui.statusbar.policy; +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; @@ -26,6 +29,7 @@ import android.graphics.drawable.Drawable; import android.hardware.input.InputManager; import android.os.SystemClock; import android.util.AttributeSet; +import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.InputDevice; import android.view.KeyCharacterMap; @@ -41,9 +45,10 @@ import com.android.systemui.R; public class KeyButtonView extends ImageView { private static final String TAG = "StatusBar.KeyButtonView"; + private static final boolean DEBUG = false; final float GLOW_MAX_SCALE_FACTOR = 1.8f; - final float BUTTON_QUIESCENT_ALPHA = 0.70f; + public static final float DEFAULT_QUIESCENT_ALPHA = 0.70f; long mDownTime; int mCode; @@ -51,6 +56,7 @@ public class KeyButtonView extends ImageView { Drawable mGlowBG; int mGlowWidth, mGlowHeight; float mGlowAlpha = 0f, mGlowScale = 1f, mDrawingAlpha = 1f; + float mQuiescentAlpha = DEFAULT_QUIESCENT_ALPHA; boolean mSupportsLongpress = true; RectF mRect = new RectF(0f,0f,0f,0f); AnimatorSet mPressedAnim; @@ -70,6 +76,15 @@ public class KeyButtonView extends ImageView { } }; + private final AnimatorListener mRecoverToQuiescentListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (mQuiescentAlpha != mDrawingAlpha) { + animateToQuiescent().setDuration(200).start(); + } + } + }; + public KeyButtonView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -86,7 +101,7 @@ public class KeyButtonView extends ImageView { mGlowBG = a.getDrawable(R.styleable.KeyButtonView_glowBackground); if (mGlowBG != null) { - setDrawingAlpha(BUTTON_QUIESCENT_ALPHA); + setDrawingAlpha(mQuiescentAlpha); mGlowWidth = mGlowBG.getIntrinsicWidth(); mGlowHeight = mGlowBG.getIntrinsicHeight(); } @@ -118,6 +133,16 @@ public class KeyButtonView extends ImageView { super.onDraw(canvas); } + public void setQuiescentAlpha(float alpha) { + alpha = Math.min(Math.max(alpha, 0), 1); + if (alpha == mQuiescentAlpha) return; + mQuiescentAlpha = alpha; + if (DEBUG) Log.d(TAG, "New quiescent alpha = " + mQuiescentAlpha); + if (mGlowBG != null) { + setDrawingAlpha(mQuiescentAlpha); + } + } + public float getDrawingAlpha() { if (mGlowBG == null) return 0; return mDrawingAlpha; @@ -172,6 +197,12 @@ public class KeyButtonView extends ImageView { } } + private ObjectAnimator animateToQuiescent() { + ObjectAnimator anim = ObjectAnimator.ofFloat(this, "drawingAlpha", mQuiescentAlpha); + anim.addListener(mRecoverToQuiescentListener); // mQuiescentAlpha may change mid-animation + return anim; + } + public void setPressed(boolean pressed) { if (mGlowBG != null) { if (pressed != isPressed()) { @@ -182,8 +213,8 @@ public class KeyButtonView extends ImageView { if (pressed) { if (mGlowScale < GLOW_MAX_SCALE_FACTOR) mGlowScale = GLOW_MAX_SCALE_FACTOR; - if (mGlowAlpha < BUTTON_QUIESCENT_ALPHA) - mGlowAlpha = BUTTON_QUIESCENT_ALPHA; + if (mGlowAlpha < mQuiescentAlpha) + mGlowAlpha = mQuiescentAlpha; setDrawingAlpha(1f); as.playTogether( ObjectAnimator.ofFloat(this, "glowAlpha", 1f), @@ -194,7 +225,7 @@ public class KeyButtonView extends ImageView { as.playTogether( ObjectAnimator.ofFloat(this, "glowAlpha", 0f), ObjectAnimator.ofFloat(this, "glowScale", 1f), - ObjectAnimator.ofFloat(this, "drawingAlpha", BUTTON_QUIESCENT_ALPHA) + animateToQuiescent() ); as.setDuration(500); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java index fcf04ac..c2ffff8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java @@ -53,7 +53,6 @@ public class LocationController extends BroadcastReceiver { private StatusBarManager mStatusBarManager; private boolean mAreActiveLocationRequests; - private boolean mIsAirplaneMode; private ArrayList<LocationSettingsChangeCallback> mSettingsChangeCallbacks = new ArrayList<LocationSettingsChangeCallback>(); @@ -76,9 +75,6 @@ public class LocationController extends BroadcastReceiver { IntentFilter filter = new IntentFilter(); filter.addAction(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION); - // Listen for a change in the airplane mode setting so we can defensively turn off the - // high power location icon when radios are disabled. - filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); context.registerReceiver(this, filter); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); @@ -100,7 +96,6 @@ public class LocationController extends BroadcastReceiver { // Examine the current location state and initialize the status view. updateActiveLocationRequests(); - updateAirplaneMode(); refreshViews(); } @@ -170,11 +165,9 @@ public class LocationController extends BroadcastReceiver { return false; } - // Updates the status view based on the current state of location requests and airplane mode. + // Updates the status view based on the current state of location requests. private void refreshViews() { - // The airplane mode check is defensive - there shouldn't be any active high power - // location requests when airplane mode is on. - if (!mIsAirplaneMode && mAreActiveLocationRequests) { + if (mAreActiveLocationRequests) { mStatusBarManager.setIcon(LOCATION_STATUS_ICON_PLACEHOLDER, LOCATION_STATUS_ICON_ID, 0, mContext.getString(R.string.accessibility_location_active)); } else { @@ -191,25 +184,11 @@ public class LocationController extends BroadcastReceiver { } } - // Reads the airplane mode setting and updates the status view if necessary. - private void updateAirplaneMode() { - boolean wasAirplaneMode = mIsAirplaneMode; - // TODO This probably warrants a utility method in Settings.java. - mIsAirplaneMode = (Settings.Global.getInt( - mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_ON, 0) == 1); - if (mIsAirplaneMode != wasAirplaneMode) { - refreshViews(); - } - } - @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action)) { updateActiveLocationRequests(); - } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) { - updateAirplaneMode(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index fb2348e..34e3013 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -430,7 +430,8 @@ public class NetworkController extends BroadcastReceiver { @Override public void onServiceStateChanged(ServiceState state) { if (DEBUG) { - Log.d(TAG, "onServiceStateChanged state=" + state.getState()); + Log.d(TAG, "onServiceStateChanged voiceState=" + state.getVoiceRegState() + + " dataState=" + state.getDataRegState()); } mServiceState = state; updateTelephonySignalStrength(); @@ -506,10 +507,16 @@ public class NetworkController extends BroadcastReceiver { private boolean hasService() { if (mServiceState != null) { - switch (mServiceState.getState()) { - case ServiceState.STATE_OUT_OF_SERVICE: + // Consider the device to be in service if either voice or data service is available. + // Some SIM cards are marketed as data-only and do not support voice service, and on + // these SIM cards, we want to show signal bars for data service as well as the "no + // service" or "emergency calls only" text that indicates that voice is not available. + switch(mServiceState.getVoiceRegState()) { case ServiceState.STATE_POWER_OFF: return false; + case ServiceState.STATE_OUT_OF_SERVICE: + case ServiceState.STATE_EMERGENCY_ONLY: + return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE; default: return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java index 3d51f20..16a92ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java @@ -25,8 +25,6 @@ public class Prefs { public static final String SHOWN_COMPAT_MODE_HELP = "shown_compat_mode_help"; public static final String SHOWN_QUICK_SETTINGS_HELP = "shown_quick_settings_help"; - public static final String HIDING_NAVIGATION_CONFIRMED = "hiding_navigation_confirmed"; - public static SharedPreferences read(Context context) { return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE); } diff --git a/packages/services/PacProcessor/Android.mk b/packages/services/PacProcessor/Android.mk index e4afde6..d9566d5 100644 --- a/packages/services/PacProcessor/Android.mk +++ b/packages/services/PacProcessor/Android.mk @@ -18,24 +18,15 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_SRC_FILES := \ - main_pacserver.cpp \ - ProxyService.cpp \ - IProxyService.cpp - -LOCAL_C_INCLUDES += \ - external/chromium-libpac/src - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - liblog \ - libpac \ - libbinder \ - libstlport - -LOCAL_MODULE := pacserver LOCAL_MODULE_TAGS := optional -include external/stlport/libstlport.mk +LOCAL_SRC_FILES := $(call all-java-files-under, src) -include $(BUILD_EXECUTABLE) +LOCAL_PACKAGE_NAME := PacProcessor +LOCAL_CERTIFICATE := platform + +LOCAL_REQUIRED_MODULES := libjni_pacprocessor + +include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/packages/services/PacProcessor/AndroidManifest.xml b/packages/services/PacProcessor/AndroidManifest.xml new file mode 100644 index 0000000..6740c16 --- /dev/null +++ b/packages/services/PacProcessor/AndroidManifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.pacprocessor"> + + <uses-permission android:name="android.permission.INTERNET" /> + + <application + android:label="@string/app_name"> + + <service android:name=".PacService" + android:exported="true"> + </service> + + </application> + +</manifest> diff --git a/packages/services/PacProcessor/IProxyService.cpp b/packages/services/PacProcessor/IProxyService.cpp deleted file mode 100644 index 3707d85..0000000 --- a/packages/services/PacProcessor/IProxyService.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#define LOG_TAG "ProxyTesting" - -#include <stdint.h> -#include <sys/types.h> -#include <binder/Parcel.h> -#include <binder/IPCThreadState.h> -#include <utils/Errors.h> -#include "IProxyService.h" - -#include <utils/Log.h> - -#include <private/android_filesystem_config.h> - -using namespace android; - -String16 BpProxyService::resolveProxies(String16 host, String16 url) { - String16 ret; - return ret; -} - -void BpProxyService::setPacFile(String16& scriptContents) { - -} - -void BpProxyService::startPacSystem() { - -} -void BpProxyService::stopPacSystem() { - -} - -IMPLEMENT_META_INTERFACE(ProxyService, "com.android.net.IProxyService"); - -status_t BnProxyService::onTransact( - uint32_t code, const Parcel& data, - Parcel* reply, uint32_t flags) { - int returnInt = 0; - switch (code) { - case RESOLVE_PROXIES: - { - CHECK_INTERFACE(IProxyService, data, reply); - String16 host = data.readString16(); - String16 url = data.readString16(); - String16 response = resolveProxies(host, url); - reply->writeNoException(); - reply->writeString16(response); - return NO_ERROR; - } break; - case SET_PAC: - { - CHECK_INTERFACE(IProxyService, data, reply); - if (notSystemUid()) { - returnInt = 1; - } else { - String16 pacFile = data.readString16(); - setPacFile(pacFile); - } - reply->writeNoException(); - reply->writeInt32(returnInt); - return NO_ERROR; - } break; - case START_PAC: - { - CHECK_INTERFACE(IProxyService, data, reply); - if (notSystemUid()) { - returnInt = 1; - } else { - startPacSystem(); - } - reply->writeNoException(); - reply->writeInt32(returnInt); - return NO_ERROR; - } break; - case STOP_PAC: - { - CHECK_INTERFACE(IProxyService, data, reply); - if (notSystemUid()) { - returnInt = 1; - } else { - stopPacSystem(); - } - reply->writeNoException(); - reply->writeInt32(returnInt); - return NO_ERROR; - } break; - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - -int BnProxyService::getCallingUid() { - return IPCThreadState::self()->getCallingUid(); -} - -bool BnProxyService::notSystemUid() { - return getCallingUid() != AID_SYSTEM; -} diff --git a/packages/services/PacProcessor/IProxyService.h b/packages/services/PacProcessor/IProxyService.h deleted file mode 100644 index 57c527b..0000000 --- a/packages/services/PacProcessor/IProxyService.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef IPROXY_SERVICE_H -#define IPROXY_SERVICE_H - -#include <binder/IInterface.h> -#include <binder/IBinder.h> - -namespace android { -class IProxyService : public IInterface { -public: - /** - * Keep up-to-date with - * frameworks/base/packages/services/Proxy/com/android/net/IProxyService.aidl - */ - enum { - RESOLVE_PROXIES = IBinder::FIRST_CALL_TRANSACTION, - SET_PAC, - START_PAC, - STOP_PAC, - }; -public: - DECLARE_META_INTERFACE(ProxyService); - -public: - - virtual String16 resolveProxies(String16 host, String16 url) = 0; - - virtual void setPacFile(String16& scriptContents) = 0; - - virtual void startPacSystem() = 0; - virtual void stopPacSystem() = 0; -private: -}; - -class BpProxyService : public BpInterface<IProxyService> { -public: - BpProxyService(const sp<IBinder>& impl) : BpInterface<IProxyService>(impl) {} - - virtual String16 resolveProxies(String16 host, String16 url); - - virtual void setPacFile(String16& scriptContents); - - virtual void startPacSystem(); - virtual void stopPacSystem(); -}; - -class BnProxyService : public BnInterface<IProxyService> { -public: - virtual status_t onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); - -private: - int getCallingUid(); - - bool notSystemUid(); -}; -} - - -#endif //IPROXY_SERVICE_H diff --git a/packages/services/PacProcessor/ProxyService.cpp b/packages/services/PacProcessor/ProxyService.cpp deleted file mode 100644 index 7084a47..0000000 --- a/packages/services/PacProcessor/ProxyService.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#define LOG_TAG "ProxyService" -#include <utils/Log.h> - -#include <errno.h> -#include <utils/threads.h> -#include <binder/IServiceManager.h> -#include <binder/IPCThreadState.h> -#include <sys/stat.h> -#include <proxy_resolver_v8.h> -#include <sstream> - -#include "ProxyService.h" - -using namespace net; - -using namespace android; - -class ProxyErrorLogger : public ProxyErrorListener { -protected: - ~ProxyErrorLogger() { - - } -public: - void AlertMessage(String16 message) { - String8 str(message); - ALOGD("Alert: %s", str.string()); - } - void ErrorMessage(String16 message) { - String8 str(message); - ALOGE("Error: %s", str.string()); - } -}; - -void ProxyService::instantiate() { - ALOGV("instantiate"); - defaultServiceManager()->addService(String16("com.android.net.IProxyService"), - new ProxyService()); -} - -ProxyService::ProxyService() { - hasSetScript = false; -} - -ProxyService::~ProxyService() { - stopPacSystem(); -} - -String16 ProxyService::resolveProxies(String16 host, String16 url) { - ALOGV("resolve"); - String16 blankRet; - if (proxyResolver != NULL) { - if (hasSetScript) { - String16 ret; - if (proxyResolver->GetProxyForURL(url, host, &ret) != OK) { - return blankRet; - } - return ret; - } else { - ALOGD("Unable to resolve PAC when no script is set!"); - } - } else { - ALOGE("Cannot parse while resolver not initialized!"); - } - return blankRet; -} - -void ProxyService::setPacFile(String16& scriptContents) { - ALOGV("set"); - if (proxyResolver != NULL) { - if (proxyResolver->SetPacScript(scriptContents) != OK) { - ALOGD("Unable to initialize PAC - Resolving will not work"); - } else { - hasSetScript = true; - } - } else { - ALOGE("PAC script set while resolver not initialized!"); - } -} - -void ProxyService::startPacSystem() { - ALOGV("start"); - // Stop in case redundant start call - stopPacSystem(); - - proxyResolver = new ProxyResolverV8(ProxyResolverJSBindings::CreateDefault(), - new ProxyErrorLogger()); - hasSetScript = false; -} - -void ProxyService::stopPacSystem() { - ALOGV("stop"); - if (proxyResolver != NULL) { - delete proxyResolver; - proxyResolver = NULL; - } -} diff --git a/packages/services/PacProcessor/ProxyService.h b/packages/services/PacProcessor/ProxyService.h deleted file mode 100644 index a0861b2..0000000 --- a/packages/services/PacProcessor/ProxyService.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef PROXY_SERVICE_H -#define PROXY_SERVICE_H - -#include <binder/IInterface.h> -#include "IProxyService.h" -#include "proxy_resolver_v8.h" - -namespace android { - -class ProxyService : public BnProxyService { -public: - static void instantiate(); - -private: - ProxyService(); - virtual ~ProxyService(); - -public: - String16 resolveProxies(String16 host, String16 url); - - void setPacFile(String16& scriptContents); - - void startPacSystem(); - void stopPacSystem(); - -private: - net::ProxyResolverV8* proxyResolver; - bool hasSetScript; -}; - -} - -#endif //PROXY_SERVICE_H diff --git a/packages/services/PacProcessor/com/android/net/IProxyService.aidl b/packages/services/PacProcessor/com/android/net/IProxyService.aidl new file mode 100644 index 0000000..4e54aba --- /dev/null +++ b/packages/services/PacProcessor/com/android/net/IProxyService.aidl @@ -0,0 +1,27 @@ +/** + * 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.net; + +/** @hide */ +interface IProxyService +{ + String resolvePacFile(String host, String url); + + oneway void setPacFile(String scriptContents); + + oneway void startPacSystem(); + oneway void stopPacSystem(); +} diff --git a/packages/services/PacProcessor/jni/Android.mk b/packages/services/PacProcessor/jni/Android.mk new file mode 100644 index 0000000..f16c90b --- /dev/null +++ b/packages/services/PacProcessor/jni/Android.mk @@ -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. +# + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + jni_init.cpp \ + com_android_pacprocessor_PacNative.cpp + +LOCAL_C_INCLUDES += \ + external/chromium-libpac/src + +LOCAL_SHARED_LIBRARIES := \ + libandroidfw \ + libandroid_runtime \ + liblog \ + libutils \ + libnativehelper \ + libpac + +LOCAL_MODULE := libjni_pacprocessor +LOCAL_MODULE_TAGS := optional + +include external/stlport/libstlport.mk + +include $(BUILD_SHARED_LIBRARY) diff --git a/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp new file mode 100644 index 0000000..c5aa13b --- /dev/null +++ b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp @@ -0,0 +1,148 @@ +/* + * 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. + */ + +#define LOG_TAG "PacProcessor" + +#include <utils/Log.h> +#include <utils/Mutex.h> +#include "android_runtime/AndroidRuntime.h" + +#include "jni.h" +#include "JNIHelp.h" + +#include "proxy_resolver_v8.h" + +namespace android { + +class ProxyErrorLogger : public net::ProxyErrorListener { +public: + ~ProxyErrorLogger() { + + } + void AlertMessage(String16 message) { + String8 str(message); + ALOGD("Alert: %s", str.string()); + } + void ErrorMessage(String16 message) { + String8 str(message); + ALOGE("Error: %s", str.string()); + } +}; + +net::ProxyResolverV8* proxyResolver = NULL; +ProxyErrorLogger* logger = NULL; +bool pacSet = false; + +String16 jstringToString16(JNIEnv* env, jstring jstr) { + const jchar* str = env->GetStringCritical(jstr, 0); + String16 str16(str, env->GetStringLength(jstr)); + env->ReleaseStringCritical(jstr, str); + return str16; +} + +jstring string16ToJstring(JNIEnv* env, String16 string) { + const char16_t* str = string.string(); + size_t len = string.size(); + + return env->NewString(str, len); +} + +static jboolean com_android_pacprocessor_PacNative_createV8ParserNativeLocked(JNIEnv* env, + jobject) { + if (proxyResolver == NULL) { + logger = new ProxyErrorLogger(); + proxyResolver = new net::ProxyResolverV8(net::ProxyResolverJSBindings::CreateDefault(), + logger); + pacSet = false; + return JNI_FALSE; + } + return JNI_TRUE; +} + +static jboolean com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked(JNIEnv* env, + jobject) { + if (proxyResolver != NULL) { + delete logger; + delete proxyResolver; + logger = NULL; + proxyResolver = NULL; + return JNI_FALSE; + } + return JNI_TRUE; +} + +static jboolean com_android_pacprocessor_PacNative_setProxyScriptNativeLocked(JNIEnv* env, jobject, + jstring script) { + String16 script16 = jstringToString16(env, script); + + if (proxyResolver == NULL) { + ALOGE("V8 Parser not started when setting PAC script"); + return JNI_TRUE; + } + + if (proxyResolver->SetPacScript(script16) != OK) { + ALOGE("Unable to set PAC script"); + return JNI_TRUE; + } + pacSet = true; + + return JNI_FALSE; +} + +static jstring com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked(JNIEnv* env, jobject, + jstring url, jstring host) { + String16 url16 = jstringToString16(env, url); + String16 host16 = jstringToString16(env, host); + String16 ret; + + if (proxyResolver == NULL) { + ALOGE("V8 Parser not initialized when running PAC script"); + return NULL; + } + + if (!pacSet) { + ALOGW("Attempting to run PAC with no script set"); + return NULL; + } + + if (proxyResolver->GetProxyForURL(url16, host16, &ret) != OK) { + String8 ret8(ret); + ALOGE("Error Running PAC: %s", ret8.string()); + return NULL; + } + + jstring jret = string16ToJstring(env, ret); + + return jret; +} + +static JNINativeMethod gMethods[] = { + { "createV8ParserNativeLocked", "()Z", + (void*)com_android_pacprocessor_PacNative_createV8ParserNativeLocked}, + { "destroyV8ParserNativeLocked", "()Z", + (void*)com_android_pacprocessor_PacNative_destroyV8ParserNativeLocked}, + { "setProxyScriptNativeLocked", "(Ljava/lang/String;)Z", + (void*)com_android_pacprocessor_PacNative_setProxyScriptNativeLocked}, + { "makeProxyRequestNativeLocked", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + (void*)com_android_pacprocessor_PacNative_makeProxyRequestNativeLocked}, +}; + +int register_com_android_pacprocessor_PacNative(JNIEnv* env) { + return jniRegisterNativeMethods(env, "com/android/pacprocessor/PacNative", + gMethods, NELEM(gMethods)); +} + +} /* namespace android */ diff --git a/packages/services/PacProcessor/jni/jni_init.cpp b/packages/services/PacProcessor/jni/jni_init.cpp new file mode 100644 index 0000000..bda33fb --- /dev/null +++ b/packages/services/PacProcessor/jni/jni_init.cpp @@ -0,0 +1,38 @@ +/* + * 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. + */ + +#define LOG_TAG "PacProcessor" + +#include <utils/Log.h> +#include "jni.h" + +namespace android { + extern int register_com_android_pacprocessor_PacNative(JNIEnv *env); +} + +using namespace android; + +extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv *env; + if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { + ALOGE("ERROR: GetEnv failed"); + return -1; + } + + register_com_android_pacprocessor_PacNative(env); + + return JNI_VERSION_1_6; +} diff --git a/packages/services/PacProcessor/main_pacserver.cpp b/packages/services/PacProcessor/main_pacserver.cpp deleted file mode 100644 index 19588b5..0000000 --- a/packages/services/PacProcessor/main_pacserver.cpp +++ /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. - */ - -#define LOG_TAG "pacserver" -//#define LOG_NDEBUG 0 - -#include <binder/IPCThreadState.h> -#include <binder/ProcessState.h> -#include <binder/IServiceManager.h> -#include <utils/Log.h> -#include "ProxyService.h" -#include "proxy_resolver_v8.h" -#include <stdio.h> - -using namespace android; - -int main(int argc, char** argv) -{ - sp<ProcessState> proc(ProcessState::self()); - sp<IServiceManager> sm = defaultServiceManager(); - - printf("1\n"); - ALOGV("ServiceManager: %p", sm.get()); - ProxyService::instantiate(); - printf("1\n"); - - ProcessState::self()->startThreadPool(); - printf("1\n"); - IPCThreadState::self()->joinThreadPool(); -} diff --git a/packages/services/PacProcessor/res/values/strings.xml b/packages/services/PacProcessor/res/values/strings.xml new file mode 100644 index 0000000..301a2b6 --- /dev/null +++ b/packages/services/PacProcessor/res/values/strings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <string name="app_name">PacProcessor</string> + +</resources> diff --git a/packages/services/PacProcessor/src/com/android/pacprocessor/PacNative.java b/packages/services/PacProcessor/src/com/android/pacprocessor/PacNative.java new file mode 100644 index 0000000..c67fe9f --- /dev/null +++ b/packages/services/PacProcessor/src/com/android/pacprocessor/PacNative.java @@ -0,0 +1,86 @@ +/** + * 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.pacprocessor; + +import android.util.Log; + +/** + * @hide + */ +public class PacNative { + private static final String TAG = "PacProxy"; + + private String mCurrentPac; + + private boolean mIsActive; + + // Only make native calls from inside synchronized blocks. + private native boolean createV8ParserNativeLocked(); + private native boolean destroyV8ParserNativeLocked(); + + private native boolean setProxyScriptNativeLocked(String script); + + private native String makeProxyRequestNativeLocked(String url, String host); + + static { + System.loadLibrary("jni_pacprocessor"); + } + + PacNative() { + + } + + public synchronized boolean startPacSupport() { + if (createV8ParserNativeLocked()) { + Log.e(TAG, "Unable to Create v8 Proxy Parser."); + return true; + } + mIsActive = true; + return false; + } + + public synchronized boolean stopPacSupport() { + if (mIsActive) { + if (destroyV8ParserNativeLocked()) { + Log.e(TAG, "Unable to Destroy v8 Proxy Parser."); + return true; + } + mIsActive = false; + } + return false; + } + + public synchronized boolean setCurrentProxyScript(String script) { + if (setProxyScriptNativeLocked(script)) { + Log.e(TAG, "Unable to parse proxy script."); + return true; + } + return false; + } + + public synchronized String makeProxyRequest(String url, String host) { + String ret = makeProxyRequestNativeLocked(url, host); + if ((ret == null) || (ret.length() == 0)) { + Log.e(TAG, "v8 Proxy request failed."); + ret = null; + } + return ret; + } + + public synchronized boolean isActive() { + return mIsActive; + } +} diff --git a/packages/services/PacProcessor/src/com/android/pacprocessor/PacService.java b/packages/services/PacProcessor/src/com/android/pacprocessor/PacService.java new file mode 100644 index 0000000..7e76025 --- /dev/null +++ b/packages/services/PacProcessor/src/com/android/pacprocessor/PacService.java @@ -0,0 +1,101 @@ +/** + * 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.pacprocessor; + +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; +import android.os.Process; +import android.os.RemoteException; +import android.util.Log; + +import com.android.net.IProxyService; + +public class PacService extends Service { + private static final String TAG = "PacService"; + + private PacNative mPacNative; + private ProxyServiceStub mStub; + + @Override + public void onCreate() { + super.onCreate(); + if (mPacNative == null) { + mPacNative = new PacNative(); + mStub = new ProxyServiceStub(mPacNative); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mPacNative != null) { + mPacNative.stopPacSupport(); + mPacNative = null; + mStub = null; + } + } + + @Override + public IBinder onBind(Intent intent) { + if (mPacNative == null) { + mPacNative = new PacNative(); + mStub = new ProxyServiceStub(mPacNative); + } + return mStub; + } + + private static class ProxyServiceStub extends IProxyService.Stub { + private final PacNative mPacNative; + + public ProxyServiceStub(PacNative pacNative) { + mPacNative = pacNative; + } + + @Override + public String resolvePacFile(String host, String url) throws RemoteException { + return mPacNative.makeProxyRequest(url, host); + } + + @Override + public void setPacFile(String script) throws RemoteException { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + Log.e(TAG, "Only system user is allowed to call setPacFile"); + throw new SecurityException(); + } + mPacNative.setCurrentProxyScript(script); + } + + @Override + public void startPacSystem() throws RemoteException { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + Log.e(TAG, "Only system user is allowed to call startPacSystem"); + throw new SecurityException(); + } + mPacNative.startPacSupport(); + } + + @Override + public void stopPacSystem() throws RemoteException { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + Log.e(TAG, "Only system user is allowed to call stopPacSystem"); + throw new SecurityException(); + } + mPacNative.stopPacSupport(); + } + } +} diff --git a/packages/services/Proxy/AndroidManifest.xml b/packages/services/Proxy/AndroidManifest.xml index 02475c0..09b8327 100644 --- a/packages/services/Proxy/AndroidManifest.xml +++ b/packages/services/Proxy/AndroidManifest.xml @@ -6,7 +6,6 @@ <uses-permission android:name="android.permission.INTERNET" /> <application - android:persistent="true" android:label="@string/app_label" android:process="com.android.proxyhandler"> diff --git a/packages/services/Proxy/com/android/net/IProxyService.aidl b/packages/services/Proxy/com/android/net/IProxyService.aidl deleted file mode 100644 index 7e9ed79..0000000 --- a/packages/services/Proxy/com/android/net/IProxyService.aidl +++ /dev/null @@ -1,16 +0,0 @@ -package com.android.net; - -/** @hide */ -interface IProxyService -{ - /** - * Keep up-to-date with - * frameworks/base/packages/services/PacProcessor/IProxyService.h - */ - String resolvePacFile(String host, String url); - - int setPacFile(String scriptContents); - - int startPacSystem(); - int stopPacSystem(); -} diff --git a/packages/services/Proxy/src/com/android/proxyhandler/ProxyService.java b/packages/services/Proxy/src/com/android/proxyhandler/ProxyService.java index 0aea5ee..18ed645 100644 --- a/packages/services/Proxy/src/com/android/proxyhandler/ProxyService.java +++ b/packages/services/Proxy/src/com/android/proxyhandler/ProxyService.java @@ -24,24 +24,28 @@ public class ProxyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { - handleCommand(intent); + if (handleCommand(intent)) { + return START_REDELIVER_INTENT; + } } - return START_STICKY; + return START_NOT_STICKY; } - private void handleCommand(Intent intent) { + private boolean handleCommand(Intent intent) { Bundle bundle = intent.getExtras(); ProxyProperties proxy = null; if ((bundle != null) && bundle.containsKey(Proxy.EXTRA_PROXY_INFO)) { proxy = bundle.getParcelable(Proxy.EXTRA_PROXY_INFO); if ((proxy != null) && !TextUtils.isEmpty(proxy.getPacFileUrl())) { startProxy(proxy); + return true; } else { stopSelf(); } } else { stopSelf(); } + return false; } diff --git a/packages/services/Proxy/src/com/android/proxyhandler/ProxyServiceReceiver.java b/packages/services/Proxy/src/com/android/proxyhandler/ProxyServiceReceiver.java index f5c2ca5..4638def 100644 --- a/packages/services/Proxy/src/com/android/proxyhandler/ProxyServiceReceiver.java +++ b/packages/services/Proxy/src/com/android/proxyhandler/ProxyServiceReceiver.java @@ -4,7 +4,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.Proxy; +import android.net.ProxyProperties; import android.os.Bundle; +import android.text.TextUtils; public class ProxyServiceReceiver extends BroadcastReceiver { @@ -12,11 +14,16 @@ public class ProxyServiceReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, ProxyService.class); Bundle bundle = intent.getExtras(); + ProxyProperties proxy = null; if (bundle != null) { - service.putExtra(Proxy.EXTRA_PROXY_INFO, - bundle.getParcelable(Proxy.EXTRA_PROXY_INFO)); + proxy = bundle.getParcelable(Proxy.EXTRA_PROXY_INFO); + service.putExtra(Proxy.EXTRA_PROXY_INFO, proxy); + } + if ((proxy != null) && (!TextUtils.isEmpty(proxy.getPacFileUrl()))) { + context.startService(service); + } else { + context.stopService(service); } - context.startService(service); } } diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java new file mode 100644 index 0000000..fb76e20 --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/BarController.java @@ -0,0 +1,186 @@ +/* + * 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.policy.impl; + +import android.app.StatusBarManager; +import android.os.Handler; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Slog; +import android.view.View; +import android.view.WindowManagerPolicy.WindowState; + +import com.android.internal.statusbar.IStatusBarService; + +import java.io.PrintWriter; + +/** + * Controls state/behavior specific to a system bar window. + */ +public class BarController { + private static final boolean DEBUG = false; + + private static final int TRANSIENT_BAR_NONE = 0; + private static final int TRANSIENT_BAR_SHOWING = 1; + private static final int TRANSIENT_BAR_HIDING = 2; + + private final String mTag; + private final int mTransientFlag; + private final int mStatusBarManagerId; + private final Handler mHandler; + private final Object mServiceAquireLock = new Object(); + private IStatusBarService mStatusBarService; + + private WindowState mWin; + private int mTransientBarState; + private boolean mPendingShow; + + public BarController(String tag, int transientFlag, int statusBarManagerId) { + mTag = "BarController." + tag; + mTransientFlag = transientFlag; + mStatusBarManagerId = statusBarManagerId; + mHandler = new Handler(); + } + + public void setWindow(WindowState win) { + mWin = win; + } + + public void showTransient() { + if (mWin != null) { + setTransientBarState(TRANSIENT_BAR_SHOWING); + } + } + + public boolean isTransientShowing() { + return mTransientBarState == TRANSIENT_BAR_SHOWING; + } + + public void adjustSystemUiVisibilityLw(int visibility) { + if (mWin != null && mTransientBarState == TRANSIENT_BAR_SHOWING && + (visibility & mTransientFlag) == 0) { + setTransientBarState(TRANSIENT_BAR_HIDING); + setBarShowingLw(false); + } + } + + public boolean setBarShowingLw(final boolean show) { + if (mWin == null) return false; + + mHandler.post(new Runnable() { + @Override + public void run() { + try { + IStatusBarService statusbar = getStatusBarService(); + if (statusbar != null) { + statusbar.setWindowState(mStatusBarManagerId, show + ? StatusBarManager.WINDOW_STATE_SHOWING + : StatusBarManager.WINDOW_STATE_HIDING); + } + } catch (RemoteException e) { + // re-acquire status bar service next time it is needed. + mStatusBarService = null; + } + } + }); + if (show && mTransientBarState == TRANSIENT_BAR_HIDING) { + mPendingShow = true; + return false; + } + return show ? mWin.showLw(true) : mWin.hideLw(true); + } + + public boolean checkHiddenLw() { + if (mWin != null && mTransientBarState == TRANSIENT_BAR_HIDING && !mWin.isVisibleLw()) { + // Finished animating out, clean up and reset style + setTransientBarState(TRANSIENT_BAR_NONE); + if (mPendingShow) { + setBarShowingLw(true); + mPendingShow = false; + } + return true; + } + return false; + } + + public boolean checkShowTransientBarLw() { + if (mTransientBarState == TRANSIENT_BAR_SHOWING) { + if (DEBUG) Slog.d(mTag, "Not showing transient bar, already shown"); + return false; + } else if (mWin == null) { + if (DEBUG) Slog.d(mTag, "Not showing transient bar, bar doesn't exist"); + return false; + } else if (mWin.isDisplayedLw()) { + if (DEBUG) Slog.d(mTag, "Not showing transient bar, bar already visible"); + return false; + } else { + return true; + } + } + + public int updateVisibilityLw(boolean allowed, int oldVis, int vis) { + if (mWin == null) return vis; + + if (mTransientBarState == TRANSIENT_BAR_SHOWING) { // transient bar requested + if (allowed) { + vis |= mTransientFlag; + if ((oldVis & mTransientFlag) == 0) { + setBarShowingLw(true); + } + } else { + setTransientBarState(TRANSIENT_BAR_NONE); // request denied + } + } + if (mTransientBarState != TRANSIENT_BAR_NONE) { + vis |= mTransientFlag; // ignore clear requests until transition completes + vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; // never show transient bars in low profile + } + return vis; + } + + private void setTransientBarState(int state) { + if (mWin != null && state != mTransientBarState) { + mTransientBarState = state; + if (DEBUG) Slog.d(mTag, "New state: " + transientBarStateToString(state)); + } + } + + private IStatusBarService getStatusBarService() { + synchronized (mServiceAquireLock) { + if (mStatusBarService == null) { + mStatusBarService = IStatusBarService.Stub.asInterface( + ServiceManager.getService("statusbar")); + } + return mStatusBarService; + } + } + + private static String transientBarStateToString(int state) { + if (state == TRANSIENT_BAR_HIDING) return "TRANSIENT_BAR_HIDING"; + if (state == TRANSIENT_BAR_SHOWING) return "TRANSIENT_BAR_SHOWING"; + if (state == TRANSIENT_BAR_NONE) return "TRANSIENT_BAR_NONE"; + throw new IllegalArgumentException("Unknown state " + state); + } + + public void dump(PrintWriter pw, String prefix) { + if (mWin != null) { + pw.print(prefix); pw.print(mTag); pw.print(' '); + pw.print("mTransientBar"); pw.print('='); + pw.println(transientBarStateToString(mTransientBarState)); + } + } +} diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index ae7120f..11e33dc 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -553,11 +553,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } MyOrientationListener mOrientationListener; - private static final int TRANSIENT_BAR_NONE = 0; - private static final int TRANSIENT_BAR_SHOWING = 1; - private static final int TRANSIENT_BAR_HIDING = 2; - private int mStatusTransientBar; - private int mNavigationTransientBar; + private final BarController mStatusBarController = new BarController("StatusBar", + View.STATUS_BAR_TRANSIENT, StatusBarManager.WINDOW_STATUS_BAR); + private final BarController mNavigationBarController = new BarController("NavigationBar", + View.NAVIGATION_BAR_TRANSIENT, StatusBarManager.WINDOW_NAVIGATION_BAR); + private TransientNavigationConfirmation mTransientNavigationConfirmation; private SystemGesturesPointerEventListener mSystemGestures; @@ -942,6 +942,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } }); + mTransientNavigationConfirmation = new TransientNavigationConfirmation(mContext); mWindowManagerFuncs.registerPointerEventListener(mSystemGestures); mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); @@ -1714,6 +1715,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mStatusBar = win; + mStatusBarController.setWindow(win); break; case TYPE_NAVIGATION_BAR: mContext.enforceCallingOrSelfPermission( @@ -1725,6 +1727,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mNavigationBar = win; + mNavigationBarController.setWindow(win); if (DEBUG_LAYOUT) Slog.i(TAG, "NAVIGATION BAR: " + mNavigationBar); break; case TYPE_NAVIGATION_BAR_PANEL: @@ -1763,6 +1766,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void removeWindowLw(WindowState win) { if (mStatusBar == win) { mStatusBar = null; + mStatusBarController.setWindow(null); } else if (mKeyguard == win) { Log.v(TAG, "Removing keyguard window (Did it crash?)"); mKeyguard = null; @@ -1772,6 +1776,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mKeyguardScrim = null; } if (mNavigationBar == win) { mNavigationBar = null; + mNavigationBarController.setWindow(null); } } @@ -2546,16 +2551,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public int adjustSystemUiVisibilityLw(int visibility) { - if (mStatusBar != null && mStatusTransientBar == TRANSIENT_BAR_SHOWING && - 0 == (visibility & View.STATUS_BAR_TRANSIENT)) { - mStatusTransientBar = TRANSIENT_BAR_HIDING; - setBarShowingLw(mStatusBar, false); - } - if (mNavigationBar != null && mNavigationTransientBar == TRANSIENT_BAR_SHOWING && - 0 == (visibility & View.NAVIGATION_BAR_TRANSIENT)) { - mNavigationTransientBar = TRANSIENT_BAR_HIDING; - setBarShowingLw(mNavigationBar, false); - } + mStatusBarController.adjustSystemUiVisibilityLw(visibility); + mNavigationBarController.adjustSystemUiVisibilityLw(visibility); + // Reset any bits in mForceClearingStatusBarVisibility that // are now clear. mResettingSystemUiFlags &= visibility; @@ -2712,7 +2710,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean updateSysUiVisibility = false; if (mNavigationBar != null) { - boolean transientNavBarShowing = mNavigationTransientBar == TRANSIENT_BAR_SHOWING; + boolean transientNavBarShowing = mNavigationBarController.isTransientShowing(); // Force the navigation bar to its appropriate place and // size. We need to do this directly, instead of relying on // it to bubble up from the nav bar, because this needs to @@ -2725,15 +2723,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mTmpNavigationFrame.set(0, top, displayWidth, displayHeight - overscanBottom); mStableBottom = mStableFullscreenBottom = mTmpNavigationFrame.top; if (transientNavBarShowing || navTransparent) { - setBarShowingLw(mNavigationBar, true); + mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { - setBarShowingLw(mNavigationBar, true); + mNavigationBarController.setBarShowingLw(true); mDockBottom = mTmpNavigationFrame.top; mRestrictedScreenHeight = mDockBottom - mRestrictedScreenTop; mRestrictedOverscanScreenHeight = mDockBottom - mRestrictedOverscanScreenTop; } else { // We currently want to hide the navigation UI. - setBarShowingLw(mNavigationBar, false); + mNavigationBarController.setBarShowingLw(false); } if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw()) { // If the opaque nav bar is currently requested to be visible, @@ -2748,15 +2746,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mTmpNavigationFrame.set(left, 0, displayWidth - overscanRight, displayHeight); mStableRight = mStableFullscreenRight = mTmpNavigationFrame.left; if (transientNavBarShowing || navTransparent) { - setBarShowingLw(mNavigationBar, true); + mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { - setBarShowingLw(mNavigationBar, true); + mNavigationBarController.setBarShowingLw(true); mDockRight = mTmpNavigationFrame.left; mRestrictedScreenWidth = mDockRight - mRestrictedScreenLeft; mRestrictedOverscanScreenWidth = mDockRight - mRestrictedOverscanScreenLeft; } else { // We currently want to hide the navigation UI. - setBarShowingLw(mNavigationBar, false); + mNavigationBarController.setBarShowingLw(false); } if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw()) { // If the nav bar is currently requested to be visible, @@ -2776,9 +2774,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame); if (DEBUG_LAYOUT) Slog.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame); - if (mNavigationTransientBar == TRANSIENT_BAR_HIDING && !mNavigationBar.isVisibleLw()) { - // Finished animating out, clean up and reset alpha - mNavigationTransientBar = TRANSIENT_BAR_NONE; + if (mNavigationBarController.checkHiddenLw()) { updateSysUiVisibility = true; } } @@ -2836,10 +2832,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // we can tell the app that it is covered by it. mSystemTop = mUnrestrictedScreenTop + mStatusBarHeight; } - - if (mStatusTransientBar == TRANSIENT_BAR_HIDING && !mStatusBar.isVisibleLw()) { - // Finished animating out, clean up and reset alpha - mStatusTransientBar = TRANSIENT_BAR_NONE; + if (mStatusBarController.checkHiddenLw()) { updateSysUiVisibility = true; } } @@ -3173,11 +3166,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { = mOverscanScreenTop + mOverscanScreenHeight; } else if (mCanHideNavigationBar && (sysUiFl & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0 - && attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW - && attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) { + && (attrs.type == TYPE_TOAST + || (attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW + && attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW))) { // Asking for layout as if the nav bar is hidden, lets the // application extend into the unrestricted screen area. We - // only do this for application windows to ensure no window that + // only do this for application windows (or toasts) to ensure no window that // can be above the nav bar can do this. // XXX This assumes that an app asking for this will also // ask for layout in only content. We can't currently figure out @@ -3407,7 +3401,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { + " top=" + mTopFullscreenOpaqueWindowState); if (mForceStatusBar || mForceStatusBarFromKeyguard) { if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced"); - if (setBarShowingLw(mStatusBar, true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; + if (mStatusBarController.setBarShowingLw(true)) { + changes |= FINISH_LAYOUT_REDO_LAYOUT; + } } else if (mTopFullscreenOpaqueWindowState != null) { if (localLOGV) { Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw() @@ -3421,20 +3417,22 @@ public class PhoneWindowManager implements WindowManagerPolicy { // and mTopIsFullscreen is that that mTopIsFullscreen is set only if the window // has the FLAG_FULLSCREEN set. Not sure if there is another way that to be the // case though. - if (mStatusTransientBar == TRANSIENT_BAR_SHOWING) { - if (setBarShowingLw(mStatusBar, true)) { + if (mStatusBarController.isTransientShowing()) { + if (mStatusBarController.setBarShowingLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; } } else if (topIsFullscreen) { if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar"); - if (setBarShowingLw(mStatusBar, false)) { + if (mStatusBarController.setBarShowingLw(false)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; } else { if (DEBUG_LAYOUT) Slog.v(TAG, "Status bar already hiding"); } } else { if (DEBUG_LAYOUT) Slog.v(TAG, "** SHOWING status bar: top is not fullscreen"); - if (setBarShowingLw(mStatusBar, true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; + if (mStatusBarController.setBarShowingLw(true)) { + changes |= FINISH_LAYOUT_REDO_LAYOUT; + } } } } @@ -3879,6 +3877,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyEvent.KEYCODE_POWER: { result &= ~ACTION_PASS_TO_USER; if (down) { + if (isScreenOn && isTransientNavigationAllowed(mLastSystemUiFlags)) { + mTransientNavigationConfirmation.unconfirmLastPackage(); + } if (isScreenOn && !mPowerKeyTriggered && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { mPowerKeyTriggered = true; @@ -4147,36 +4148,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void requestTransientBars(WindowState swipeTarget) { synchronized (mWindowManagerFuncs.getWindowManagerLock()) { - boolean sb = checkShowTransientBar("status", mStatusTransientBar, mStatusBar); - boolean nb = checkShowTransientBar("nav", mNavigationTransientBar, mNavigationBar); + boolean sb = mStatusBarController.checkShowTransientBarLw(); + boolean nb = mNavigationBarController.checkShowTransientBarLw(); if (sb || nb) { WindowState barTarget = sb ? mStatusBar : mNavigationBar; if (sb ^ nb && barTarget != swipeTarget) { if (DEBUG) Slog.d(TAG, "Not showing transient bar, wrong swipe target"); return; } - mStatusTransientBar = sb ? TRANSIENT_BAR_SHOWING : mStatusTransientBar; - mNavigationTransientBar = nb ? TRANSIENT_BAR_SHOWING : mNavigationTransientBar; + if (sb) mStatusBarController.showTransient(); + if (nb) mNavigationBarController.showTransient(); updateSystemUiVisibilityLw(); } } } - private boolean checkShowTransientBar(String tag, int transientBar, WindowState win) { - if (transientBar == TRANSIENT_BAR_SHOWING) { - if (DEBUG) Slog.d(TAG, "Not showing " + tag + " transient bar, already shown"); - return false; - } else if (win == null) { - if (DEBUG) Slog.d(TAG, "Not showing " + tag + " transient bar, bar doesn't exist"); - return false; - } else if (win.isDisplayedLw()) { - if (DEBUG) Slog.d(TAG, "Not showing " + tag + " transient bar, bar already visible"); - return false; - } else { - return true; - } - } - @Override public void screenTurnedOff(int why) { EventLog.writeEvent(70000, 0); @@ -5019,7 +5005,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mForcingShowNavBar && mFocusedWindow.getSurfaceLayer() < mForcingShowNavBarLayer) { tmpVisibility &= ~View.SYSTEM_UI_CLEARABLE_FLAGS; } - final int visibility = updateTransientBarsLw(tmpVisibility); + final int visibility = updateTransientBarsLw(mLastSystemUiFlags, tmpVisibility); final int diff = visibility ^ mLastSystemUiFlags; final boolean needsMenu = mFocusedWindow.getNeedsMenuLw(mTopFullscreenOpaqueWindowState); if (diff == 0 && mLastFocusNeedsMenu == needsMenu @@ -5047,95 +5033,64 @@ public class PhoneWindowManager implements WindowManagerPolicy { return diff; } - private int updateTransientBarsLw(int vis) { + private int updateTransientBarsLw(int oldVis, int vis) { if (ImmersiveModeTesting.enabled) { vis = ImmersiveModeTesting.applyForced(mFocusedWindow, vis); } + + // prevent status bar interaction from clearing certain flags boolean statusBarHasFocus = mFocusedWindow.getAttrs().type == TYPE_STATUS_BAR; if (statusBarHasFocus) { - // prevent status bar interaction from clearing certain flags int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT; vis = (vis & ~flags) | (mLastSystemUiFlags & flags); } - boolean transientAllowed = (vis & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0; - if (mStatusTransientBar == TRANSIENT_BAR_SHOWING) { - // status transient bar requested - boolean hideStatusBarWM = - (mFocusedWindow.getAttrs().flags - & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; - boolean hideStatusBarSysui = - (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; - - boolean transientStatusBarAllowed = - hideStatusBarWM - || (hideStatusBarSysui && transientAllowed) - || statusBarHasFocus; - - if (mStatusBar == null || !transientStatusBarAllowed) { - mStatusTransientBar = TRANSIENT_BAR_NONE; - if (mStatusBar != null && hideStatusBarSysui) { - // clear the clearable flags instead - int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS; - if (newVal != mResettingSystemUiFlags) { - mResettingSystemUiFlags = newVal; - mWindowManagerFuncs.reevaluateStatusBarVisibility(); - } - } - } else { - // show status transient bar - vis |= View.STATUS_BAR_TRANSIENT; - if ((mLastSystemUiFlags & View.STATUS_BAR_TRANSIENT) == 0) { - vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; - setBarShowingLw(mStatusBar, true); - } + + // update status bar + boolean transientAllowed = + (vis & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0; + boolean hideStatusBarWM = + (mFocusedWindow.getAttrs().flags + & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; + boolean hideStatusBarSysui = + (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + + boolean transientStatusBarAllowed = + mStatusBar != null && ( + hideStatusBarWM + || (hideStatusBarSysui && transientAllowed) + || statusBarHasFocus); + + if (mStatusBarController.isTransientShowing() + && !transientStatusBarAllowed && hideStatusBarSysui) { + // clear the clearable flags instead + int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS; + if (newVal != mResettingSystemUiFlags) { + mResettingSystemUiFlags = newVal; + mWindowManagerFuncs.reevaluateStatusBarVisibility(); } } - if (mNavigationTransientBar == TRANSIENT_BAR_SHOWING) { - // navigation transient bar requested - boolean hideNavigationBarSysui = - (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0; - boolean transientNavigationBarAllowed = - mNavigationBar != null && hideNavigationBarSysui && transientAllowed; - if (!transientNavigationBarAllowed) { - mNavigationTransientBar = TRANSIENT_BAR_NONE; - } else { - // show navigation transient bar - vis |= View.NAVIGATION_BAR_TRANSIENT; - if ((mLastSystemUiFlags & View.NAVIGATION_BAR_TRANSIENT) == 0) { - vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; - setBarShowingLw(mNavigationBar, true); - } - } + + vis = mStatusBarController.updateVisibilityLw(transientStatusBarAllowed, oldVis, vis); + + // update navigation bar + boolean oldTransientNav = isTransientNavigationAllowed(oldVis); + boolean isTransientNav = isTransientNavigationAllowed(vis); + if (mFocusedWindow != null && oldTransientNav != isTransientNav) { + final int uid = getCurrentUserId(); + final String pkg = mFocusedWindow.getOwningPackage(); + mTransientNavigationConfirmation.transientNavigationChanged(uid, pkg, isTransientNav); } + vis = mNavigationBarController.updateVisibilityLw(isTransientNav, oldVis, vis); + return vis; } - private boolean setBarShowingLw(WindowState win, final boolean show) { - final int window = - win == mStatusBar ? StatusBarManager.WINDOW_STATUS_BAR - : win == mNavigationBar ? StatusBarManager.WINDOW_NAVIGATION_BAR - : 0; - if (window != 0) { - mHandler.post(new Runnable() { - @Override - public void run() { - try { - IStatusBarService statusbar = getStatusBarService(); - if (statusbar != null) { - statusbar.setWindowState(window, show - ? StatusBarManager.WINDOW_STATE_SHOWING - : StatusBarManager.WINDOW_STATE_HIDING); - } - } catch (RemoteException e) { - // re-acquire status bar service next time it is needed. - mStatusBarService = null; - } - } - }); - } - return show ? win.showLw(true) : win.hideLw(true); + private boolean isTransientNavigationAllowed(int vis) { + return mNavigationBar != null + && (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 + && (vis & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0; } // Temporary helper that allows testing immersive mode on existing apps @@ -5398,5 +5353,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mDemoHdmiRotation="); pw.print(mDemoHdmiRotation); pw.print(" mDemoHdmiRotationLock="); pw.println(mDemoHdmiRotationLock); pw.print(prefix); pw.print("mUndockedHdmiRotation="); pw.println(mUndockedHdmiRotation); + mStatusBarController.dump(pw, prefix); + mNavigationBarController.dump(pw, prefix); } } diff --git a/policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java b/policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java new file mode 100644 index 0000000..3c4f092 --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java @@ -0,0 +1,131 @@ +/* + * 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.policy.impl; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.util.ArraySet; +import android.util.Slog; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.AnimationUtils; +import android.widget.Toast; + +import com.android.internal.R; + +/** + * Helper to manage showing/hiding a confirmation prompt when the transient navigation bar + * is hidden. + */ +public class TransientNavigationConfirmation { + private static final String TAG = "TransientNavigationConfirmation"; + private static final boolean DEBUG = false; + + private final Context mContext; + private final H mHandler; + private final ArraySet<String> mConfirmedUserPackages = new ArraySet<String>(); + private final long mShowDelayMs; + + private Toast mToast; + private String mLastUserPackage; + + public TransientNavigationConfirmation(Context context) { + mContext = context; + mHandler = new H(); + mShowDelayMs = getNavBarExitDuration() * 3; + } + + private long getNavBarExitDuration() { + Animation exit = AnimationUtils.loadAnimation(mContext, R.anim.dock_bottom_exit); + return exit != null ? exit.getDuration() : 0; + } + + public void transientNavigationChanged(int userId, String pkg, boolean isNavTransient) { + if (pkg == null) { + return; + } + String userPkg = userId + ":" + pkg; + mHandler.removeMessages(H.SHOW); + if (isNavTransient) { + mLastUserPackage = userPkg; + if (!mConfirmedUserPackages.contains(userPkg)) { + if (DEBUG) Slog.d(TAG, "Showing transient navigation confirmation for " + userPkg); + mHandler.sendMessageDelayed(mHandler.obtainMessage(H.SHOW, userPkg), mShowDelayMs); + } + } else { + mLastUserPackage = null; + if (DEBUG) Slog.d(TAG, "Hiding transient navigation confirmation for " + userPkg); + mHandler.sendEmptyMessage(H.HIDE); + } + } + + public void unconfirmLastPackage() { + if (mLastUserPackage != null) { + if (DEBUG) Slog.d(TAG, "Unconfirming transient navigation for " + mLastUserPackage); + mConfirmedUserPackages.remove(mLastUserPackage); + } + } + + private void handleHide() { + if (mToast != null) { + mToast.cancel(); + mToast = null; + } + } + + private void handleShow(String userPkg) { + // create the confirmation toast bar + final int msg = R.string.transient_navigation_confirmation; + mToast = Toast.makeBar(mContext, msg, Toast.LENGTH_INFINITE); + mToast.setAction(R.string.ok, confirmAction(userPkg)); + + // we will be hiding the nav bar, so layout as if it's already hidden + mToast.getView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + + // show the confirmation + mToast.show(); + } + + private Runnable confirmAction(final String userPkg) { + return new Runnable() { + @Override + public void run() { + mConfirmedUserPackages.add(userPkg); + handleHide(); + } + }; + } + + private final class H extends Handler { + private static final int SHOW = 0; + private static final int HIDE = 1; + + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + case SHOW: + handleShow((String)msg.obj); + break; + case HIDE: + handleHide(); + break; + } + } + } +} diff --git a/services/input/InputReader.h b/services/input/InputReader.h index 98daaf5..a8bb636 100644 --- a/services/input/InputReader.h +++ b/services/input/InputReader.h @@ -1285,6 +1285,9 @@ protected: if (haveSizeBias) { *outSize += sizeBias; } + if (*outSize < 0) { + *outSize = 0; + } } } mCalibration; diff --git a/services/java/Android.mk b/services/java/Android.mk index 95b28d9..8c3d0f0 100644 --- a/services/java/Android.mk +++ b/services/java/Android.mk @@ -11,7 +11,7 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE:= services -LOCAL_JAVA_LIBRARIES := android.policy telephony-common +LOCAL_JAVA_LIBRARIES := android.policy conscrypt telephony-common include $(BUILD_JAVA_LIBRARY) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index bb0d248..a0e6dd1 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -3916,13 +3916,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { Random rand = new Random(); mParams = params; - try { - if (mCs.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false) { - log("isMobileOk: not mobile capable"); - result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION; - return result; - } + if (mCs.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false) { + log("isMobileOk: not mobile capable"); + result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION; + return result; + } + try { // Enable fail fast as we'll do retries here and use a // hipri connection so the default connection stays active. log("isMobileOk: start hipri url=" + params.mUrl); diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index 43f95c3..7e83396 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -16,11 +16,14 @@ package com.android.server; +import static android.Manifest.permission.MANAGE_CA_CERTIFICATES; + import com.android.internal.os.storage.ExternalStorageFormatter; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.JournaledFile; import com.android.internal.util.XmlUtils; import com.android.internal.widget.LockPatternUtils; +import com.android.org.conscrypt.TrustedCertificateStore; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -49,6 +52,7 @@ import android.content.pm.Signature; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; import android.os.Environment; @@ -66,7 +70,12 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.security.Credentials; +import android.security.IKeyChainService; +import android.security.KeyChain; +import android.security.KeyChain.KeyChainConnection; import android.util.AtomicFile; +import android.util.Log; import android.util.PrintWriterPrinter; import android.util.Printer; import android.util.Slog; @@ -75,6 +84,7 @@ import android.util.Xml; import android.view.IWindowManager; import android.view.WindowManagerPolicy; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -82,8 +92,14 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.security.KeyStore.TrustedCertificateEntry; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.text.DateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -1870,6 +1886,76 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return !"".equals(state); } + public boolean installCaCert(byte[] certBuffer) throws RemoteException { + mContext.enforceCallingOrSelfPermission(MANAGE_CA_CERTIFICATES, null); + KeyChainConnection keyChainConnection = null; + byte[] pemCert; + try { + X509Certificate cert = parseCert(certBuffer); + pemCert = Credentials.convertToPem(cert); + } catch (CertificateException ce) { + Log.e(TAG, "Problem converting cert", ce); + return false; + } catch (IOException ioe) { + Log.e(TAG, "Problem reading cert", ioe); + return false; + } + try { + keyChainConnection = KeyChain.bind(mContext); + try { + keyChainConnection.getService().installCaCertificate(pemCert); + return true; + } finally { + if (keyChainConnection != null) { + keyChainConnection.close(); + keyChainConnection = null; + } + } + } catch (InterruptedException e1) { + Log.w(TAG, "installCaCertsToKeyChain(): ", e1); + Thread.currentThread().interrupt(); + } + return false; + } + + private static X509Certificate parseCert(byte[] certBuffer) + throws CertificateException, IOException { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream( + certBuffer)); + } + + public void uninstallCaCert(final byte[] certBuffer) { + mContext.enforceCallingOrSelfPermission(MANAGE_CA_CERTIFICATES, null); + TrustedCertificateStore certStore = new TrustedCertificateStore(); + String alias = null; + try { + X509Certificate cert = parseCert(certBuffer); + alias = certStore.getCertificateAlias(cert); + } catch (CertificateException ce) { + Log.e(TAG, "Problem creating X509Certificate", ce); + return; + } catch (IOException ioe) { + Log.e(TAG, "Problem reading certificate", ioe); + return; + } + try { + KeyChainConnection keyChainConnection = KeyChain.bind(mContext); + IKeyChainService service = keyChainConnection.getService(); + try { + service.deleteCaCertificate(alias); + } catch (RemoteException e) { + Log.e(TAG, "from CaCertUninstaller: ", e); + } finally { + keyChainConnection.close(); + keyChainConnection = null; + } + } catch (InterruptedException ie) { + Log.w(TAG, "CaCertUninstaller: ", ie); + Thread.currentThread().interrupt(); + } + } + void wipeDataLocked(int flags) { // If the SD card is encrypted and non-removable, we have to force a wipe. boolean forceExtWipe = !Environment.isExternalStorageRemovable() && isExtStorageEncrypted(); diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index a32699a..9761441 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -420,19 +420,7 @@ public class LocationManagerService extends ILocationManager.Stub { Slog.e(TAG, "no geocoder provider found"); } - // bind to geofence provider - GeofenceProxy provider = GeofenceProxy.createAndBind(mContext, - com.android.internal.R.bool.config_enableGeofenceOverlay, - com.android.internal.R.string.config_geofenceProviderPackageName, - com.android.internal.R.array.config_locationProviderPackageNames, - mLocationHandler, - gpsProvider.getGpsGeofenceProxy()); - if (provider == null) { - Slog.e(TAG, "no geofence provider found"); - } - // bind to fused provider - // TODO: [GeofenceIntegration] bind #getGeofenceHardware() with the GeofenceProxy FlpHardwareProvider flpHardwareProvider = FlpHardwareProvider.getInstance(mContext); FusedProxy fusedProxy = FusedProxy.createAndBind( mContext, @@ -441,10 +429,21 @@ public class LocationManagerService extends ILocationManager.Stub { com.android.internal.R.bool.config_enableFusedLocationOverlay, com.android.internal.R.string.config_fusedLocationProviderPackageName, com.android.internal.R.array.config_locationProviderPackageNames); - if(fusedProxy == null) { Slog.e(TAG, "No FusedProvider found."); } + + // bind to geofence provider + GeofenceProxy provider = GeofenceProxy.createAndBind(mContext, + com.android.internal.R.bool.config_enableGeofenceOverlay, + com.android.internal.R.string.config_geofenceProviderPackageName, + com.android.internal.R.array.config_locationProviderPackageNames, + mLocationHandler, + gpsProvider.getGpsGeofenceProxy(), + flpHardwareProvider.getGeofenceHardware()); + if (provider == null) { + Slog.e(TAG, "no geofence provider found"); + } } /** @@ -549,30 +548,52 @@ public class LocationManagerService extends ILocationManager.Stub { return s.toString(); } + /** + * Update AppOp monitoring for this receiver. + * + * @param allow If true receiver is currently active, if false it's been removed. + */ public void updateMonitoring(boolean allow) { if (mHideFromAppOps) { return; } + boolean requestingLocation = false; + boolean requestingHighPowerLocation = false; + if (allow) { + // See if receiver has any enabled update records. Also note if any update records + // are high power (has a high power provider with an interval under a threshold). + for (UpdateRecord updateRecord : mUpdateRecords.values()) { + if (isAllowedByCurrentUserSettingsLocked(updateRecord.mProvider)) { + requestingLocation = true; + LocationProviderInterface locationProvider + = mProvidersByName.get(updateRecord.mProvider); + ProviderProperties properties = locationProvider != null + ? locationProvider.getProperties() : null; + if (properties != null + && properties.mPowerRequirement == Criteria.POWER_HIGH + && updateRecord.mRequest.getInterval() < HIGH_POWER_INTERVAL_MS) { + requestingHighPowerLocation = true; + break; + } + } + } + } + // First update monitoring of any location request (including high power). - mOpMonitoring = updateMonitoring(allow, mOpMonitoring, + mOpMonitoring = updateMonitoring( + requestingLocation, + mOpMonitoring, AppOpsManager.OP_MONITOR_LOCATION); // Now update monitoring of high power requests only. - // A high power request is any gps request with interval under a threshold. - boolean allowHighPower = allow; - if (allowHighPower) { - UpdateRecord gpsRecord = mUpdateRecords.get(LocationManager.GPS_PROVIDER); - if (gpsRecord == null - || gpsRecord.mRequest.getInterval() > HIGH_POWER_INTERVAL_MS) { - allowHighPower = false; - } - } boolean wasHighPowerMonitoring = mOpHighPowerMonitoring; - mOpHighPowerMonitoring = updateMonitoring(allowHighPower, mOpHighPowerMonitoring, + mOpHighPowerMonitoring = updateMonitoring( + requestingHighPowerLocation, + mOpHighPowerMonitoring, AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION); if (mOpHighPowerMonitoring != wasHighPowerMonitoring) { - // send an intent to notify that a high power request has been added/removed. + // Send an intent to notify that a high power request has been added/removed. Intent intent = new Intent(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); } @@ -689,6 +710,10 @@ public class LocationManagerService extends ILocationManager.Stub { } public boolean callProviderEnabledLocked(String provider, boolean enabled) { + // First update AppOp monitoring. + // An app may get/lose location access as providers are enabled/disabled. + updateMonitoring(true); + if (mListener != null) { try { synchronized (this) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index a6d7e3c..8f4b6c2 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -21,12 +21,12 @@ import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.writeIntAttribute; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; - import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; import android.app.AppOpsManager; import android.appwidget.AppWidgetManager; import android.util.ArrayMap; + import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IAppOpsService; @@ -52,6 +52,7 @@ import com.android.server.pm.UserManagerService; import com.android.server.wm.AppTransition; import com.android.server.wm.StackBox; import com.android.server.wm.WindowManagerService; + import com.google.android.collect.Lists; import com.google.android.collect.Maps; @@ -154,6 +155,7 @@ import android.os.UpdateLock; import android.os.UserHandle; import android.provider.Settings; import android.text.format.Time; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.EventLog; import android.util.Log; @@ -536,7 +538,7 @@ public final class ActivityManagerService extends ActivityManagerNative * This is the process holding what we currently consider to be * the "home" activity. */ - ProcessRecord mHomeProcess; + ArraySet<ProcessRecord> mHomeProcess = new ArraySet<ProcessRecord>(); /** * This is the process holding the activity the user last visited that @@ -8062,12 +8064,10 @@ public final class ActivityManagerService extends ActivityManagerNative if (activity == null) { Slog.w(TAG, "getAssistContextExtras error: no resumed activity"); validActivity = false; - } - if (activity.app == null || activity.app.thread == null) { + } else if (activity.app == null || activity.app.thread == null) { Slog.w(TAG, "getAssistContextExtras error: no process for " + activity); validActivity = false; - } - if (activity.app.pid == Binder.getCallingPid()) { + } else if (activity.app.pid == Binder.getCallingPid()) { Slog.w(TAG, "getAssistContextExtras error: request process same as " + activity); validActivity = false; } @@ -8154,18 +8154,20 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void convertFromTranslucent(IBinder token) { + public boolean convertFromTranslucent(IBinder token) { final long origId = Binder.clearCallingIdentity(); try { synchronized (this) { final ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { - return; + return false; } if (r.changeWindowTranslucency(true)) { mWindowManager.setAppFullscreen(token, true); mStackSupervisor.ensureActivitiesVisibleLocked(null, 0); + return true; } + return false; } } finally { Binder.restoreCallingIdentity(origId); @@ -8173,19 +8175,21 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void convertToTranslucent(IBinder token) { + public boolean convertToTranslucent(IBinder token) { final long origId = Binder.clearCallingIdentity(); try { synchronized (this) { final ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { - return; + return false; } if (r.changeWindowTranslucency(false)) { r.task.stack.convertToTranslucent(r); mWindowManager.setAppFullscreen(token, false); mStackSupervisor.ensureActivitiesVisibleLocked(null, 0); + return true; } + return false; } } finally { Binder.restoreCallingIdentity(origId); @@ -8953,11 +8957,11 @@ public final class ActivityManagerService extends ActivityManagerNative // replaced by a third-party app, clear the package preferred activities from packages // with a home activity running in the process to prevent a repeatedly crashing app // from blocking the user to manually clear the list. - if (app == mHomeProcess && mHomeProcess.activities.size() > 0 - && (mHomeProcess.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { - Iterator<ActivityRecord> it = mHomeProcess.activities.iterator(); - while (it.hasNext()) { - ActivityRecord r = it.next(); + final ArrayList<ActivityRecord> activities = app.activities; + if (mHomeProcess.contains(app) && activities.size() > 0 + && (app.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + final ActivityRecord r = activities.get(activityNdx); if (r.isHomeActivity()) { Log.i(TAG, "Clearing package preferred activities from " + r.packageName); try { @@ -10232,13 +10236,20 @@ public final class ActivityManagerService extends ActivityManagerNative pw.print(" mStartedUserArray: "); pw.println(Arrays.toString(mStartedUserArray)); } } - if (mHomeProcess != null && (dumpPackage == null - || mHomeProcess.pkgList.containsKey(dumpPackage))) { - if (needSep) { - pw.println(); - needSep = false; + if (!mHomeProcess.isEmpty()) { + final int size = mHomeProcess.size(); + ProcessRecord[] processes = new ProcessRecord[size]; + mHomeProcess.toArray(processes); + for (int processNdx = 0; processNdx < size; ++processNdx) { + final ProcessRecord app = processes[processNdx]; + if (dumpPackage == null || app.pkgList.containsKey(dumpPackage)) { + if (needSep) { + pw.println(); + needSep = false; + } + pw.println(" mHomeProcess[" + processNdx + "]: " + app); + } } - pw.println(" mHomeProcess: " + mHomeProcess); } if (mPreviousProcess != null && (dumpPackage == null || mPreviousProcess.pkgList.containsKey(dumpPackage))) { @@ -11739,10 +11750,10 @@ public final class ActivityManagerService extends ActivityManagerNative } return inLaunching; } - + /** * Main code for cleaning up a process when it has gone away. This is - * called both as a result of the process dying, or directly when stopping + * called both as a result of the process dying, or directly when stopping * a process when running in single process mode. */ private final void cleanUpApplicationRecordLocked(ProcessRecord app, @@ -11753,7 +11764,7 @@ public final class ActivityManagerService extends ActivityManagerNative mProcessesToGc.remove(app); mPendingPssProcesses.remove(app); - + // Dismiss any open dialogs. if (app.crashDialog != null && !app.forceCrashReport) { app.crashDialog.dismiss(); @@ -11770,7 +11781,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.crashing = false; app.notResponding = false; - + app.resetPackageList(mProcessStats); app.unlinkDeathRecipient(); app.thread = null; @@ -11803,7 +11814,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (checkAppInLaunchingProvidersLocked(app, false)) { restart = true; } - + // Unregister from connected content providers. if (!app.conProviders.isEmpty()) { for (int i=0; i<app.conProviders.size(); i++) { @@ -11830,7 +11841,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } } - + skipCurrentReceiverLocked(app); // Unregister any receivers. @@ -11861,6 +11872,8 @@ public final class ActivityManagerService extends ActivityManagerNative } mHandler.obtainMessage(DISPATCH_PROCESS_DIED, app.pid, app.info.uid, null).sendToTarget(); + mHomeProcess.remove(app); + // If the caller is restarting this app, then leave it in its // current lists and let the caller take care of it. if (restarting) { @@ -11890,8 +11903,8 @@ public final class ActivityManagerService extends ActivityManagerNative "Clean-up removing on hold: " + app); mProcessesOnHold.remove(app); - if (app == mHomeProcess) { - mHomeProcess = null; + if (mHomeProcess.contains(app)) { + mHomeProcess.remove(app); } if (app == mPreviousProcess) { mPreviousProcess = null; @@ -13817,7 +13830,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } - if (app == mHomeProcess) { + if (mHomeProcess.contains(app)) { if (adj > ProcessList.HOME_APP_ADJ) { // This process is hosting what we currently consider to be the // home app, so we don't want to let it go into the background. @@ -13884,7 +13897,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (procState > ActivityManager.PROCESS_STATE_SERVICE) { procState = ActivityManager.PROCESS_STATE_SERVICE; } - if (app.hasShownUi && app != mHomeProcess) { + if (app.hasShownUi && !mHomeProcess.contains(app)) { // If this process has shown some UI, let it immediately // go to the LRU list because it may be pretty heavy with // UI stuff. We'll tag it with a label just to help @@ -13947,7 +13960,7 @@ public final class ActivityManagerService extends ActivityManagerNative if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) { // Not doing bind OOM management, so treat // this guy more like a started service. - if (app.hasShownUi && app != mHomeProcess) { + if (app.hasShownUi && !mHomeProcess.contains(app)) { // If this process has shown some UI, let it immediately // go to the LRU list because it may be pretty heavy with // UI stuff. We'll tag it with a label just to help @@ -14002,7 +14015,7 @@ public final class ActivityManagerService extends ActivityManagerNative // about letting this process get into the LRU // list to be killed and restarted if needed for // memory. - if (app.hasShownUi && app != mHomeProcess + if (app.hasShownUi && !mHomeProcess.contains(app) && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) { adjType = "cch-bound-ui-services"; } else { @@ -14116,7 +14129,7 @@ public final class ActivityManagerService extends ActivityManagerNative clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY; } if (adj > clientAdj) { - if (app.hasShownUi && app != mHomeProcess + if (app.hasShownUi && !mHomeProcess.contains(app) && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) { app.adjType = "cch-ui-provider"; } else { @@ -14976,7 +14989,7 @@ public final class ActivityManagerService extends ActivityManagerNative // to be good enough at this point that destroying // activities causes more harm than good. if (curLevel >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE - && app != mHomeProcess && app != mPreviousProcess) { + && !mHomeProcess.contains(app) && app != mPreviousProcess) { // Need to do this on its own message because the stack may not // be in a consistent state at this point. // For these apps we will also finish their activities diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index a0bbfad..2fefadf 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -2246,7 +2246,7 @@ final class ActivityStack { if (r.state == ActivityState.RESUMED || r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED) { - if (!r.isHomeActivity() || mService.mHomeProcess != r.app) { + if (!r.isHomeActivity() || !mService.mHomeProcess.contains(r.app)) { Slog.w(TAG, " Force finishing activity " + r.intent.getComponent().flattenToShortString()); finishActivityLocked(r, Activity.RESULT_CANCELED, null, "crashed", false); diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index 0808861..250ab4a 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -905,7 +905,7 @@ public final class ActivityStackSupervisor { r.task.taskId, r.shortComponentName); } if (r.isHomeActivity() && r.isNotResolverActivity()) { - mService.mHomeProcess = app; + mService.mHomeProcess.add(app); } mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); r.sleeping = false; @@ -1946,7 +1946,7 @@ public final class ActivityStackSupervisor { // makes sense to. if (r.app != null && fgApp != null && r.app != fgApp && r.lastVisibleTime > mService.mPreviousProcessVisibleTime - && r.app != mService.mHomeProcess) { + && !mService.mHomeProcess.contains(r.app)) { mService.mPreviousProcess = r.app; mService.mPreviousProcessVisibleTime = r.lastVisibleTime; } diff --git a/services/java/com/android/server/connectivity/PacManager.java b/services/java/com/android/server/connectivity/PacManager.java index defe9f0..0b68ff5 100644 --- a/services/java/com/android/server/connectivity/PacManager.java +++ b/services/java/com/android/server/connectivity/PacManager.java @@ -1,14 +1,31 @@ +/** + * 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.server.connectivity; import android.app.AlarmManager; import android.app.PendingIntent; 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.net.ConnectivityManager; +import android.content.ServiceConnection; import android.net.ProxyProperties; +import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -17,42 +34,26 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.net.IProxyService; +import com.android.server.IoThread; +import libcore.io.Streams; -import org.apache.http.HttpEntity; -import org.apache.http.HttpException; -import org.apache.http.HttpHost; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.conn.params.ConnRouteParams; -import org.apache.http.conn.routing.HttpRoute; -import org.apache.http.conn.routing.HttpRoutePlanner; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.protocol.HttpContext; - -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.ProxySelector; import java.net.URL; import java.net.URLConnection; /** * @hide */ -public class PacManager implements Runnable { - public static final int NO_ERROR = 0; - public static final int PERMISSION_DENIED = 1; - public static final String PROXY_SERVICE = "com.android.net.IProxyService"; +public class PacManager { + public static final String PROXY_PACKAGE = "com.android.pacprocessor"; + public static final String PROXY_SERVICE = "com.android.pacprocessor.PacService"; + public static final String PROXY_SERVICE_NAME = "com.android.net.IProxyService"; - private static final String TAG = "PACManager"; + private static final String TAG = "PacManager"; private static final String ACTION_PAC_REFRESH = "android.net.proxy.PAC_REFRESH"; @@ -64,31 +65,57 @@ public class PacManager implements Runnable { /** Keep these values up-to-date with ProxyService.java */ public static final String KEY_PROXY = "keyProxy"; private String mCurrentPac; - private volatile String mPacUrl; + @GuardedBy("mProxyLock") + private String mPacUrl; private AlarmManager mAlarmManager; + @GuardedBy("mProxyLock") private IProxyService mProxyService; private PendingIntent mPacRefreshIntent; + private ServiceConnection mConnection; private Context mContext; private int mCurrentDelay; + /** + * Used for locking when setting mProxyService and all references to mPacUrl or mCurrentPac. + */ + private final Object mProxyLock = new Object(); + + private Runnable mPacDownloader = new Runnable() { + @Override + public void run() { + String file; + synchronized (mProxyLock) { + if (mPacUrl == null) return; + try { + file = get(mPacUrl); + } catch (IOException ioe) { + file = null; + Log.w(TAG, "Failed to load PAC file: " + ioe); + } + } + if (file != null) { + synchronized (mProxyLock) { + if (!file.equals(mCurrentPac)) { + setCurrentProxyScript(file); + } + } + longSchedule(); + } else { + reschedule(); + } + } + }; + class PacRefreshIntentReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { - new Thread(PacManager.this).start(); + IoThread.getHandler().post(mPacDownloader); } } public PacManager(Context context) { mContext = context; - mProxyService = IProxyService.Stub.asInterface( - ServiceManager.getService(PROXY_SERVICE)); - if (mProxyService == null) { - // Added because of b10267814 where mako is restarting. - Log.e(TAG, "PacManager: no proxy service"); - } else { - Log.d(TAG, "PacManager: mProxyService available"); - } mPacRefreshIntent = PendingIntent.getBroadcast( context, 0, new Intent(ACTION_PAC_REFRESH), 0); @@ -103,26 +130,28 @@ public class PacManager implements Runnable { return mAlarmManager; } - public void setCurrentProxyScriptUrl(ProxyProperties proxy) { - if (mProxyService == null) { - Log.e(TAG, "setCurrentProxyScriptUrl: no proxy service"); - return; - } + public synchronized void setCurrentProxyScriptUrl(ProxyProperties proxy) { if (!TextUtils.isEmpty(proxy.getPacFileUrl())) { - try { - mProxyService.startPacSystem(); + synchronized (mProxyLock) { mPacUrl = proxy.getPacFileUrl(); - mCurrentDelay = DELAY_1; - getAlarmManager().cancel(mPacRefreshIntent); - new Thread(this).start(); - } catch (RemoteException e) { - Log.e(TAG, "Unable to reach ProxyService - PAC will not be started", e); } + mCurrentDelay = DELAY_1; + getAlarmManager().cancel(mPacRefreshIntent); + bind(); } else { - try { - mProxyService.stopPacSystem(); - } catch (RemoteException e) { - e.printStackTrace(); + getAlarmManager().cancel(mPacRefreshIntent); + synchronized (mProxyLock) { + mPacUrl = null; + mCurrentPac = null; + if (mProxyService != null) { + try { + mProxyService.stopPacSystem(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to stop PAC service", e); + } finally { + unbind(); + } + } } } } @@ -132,51 +161,10 @@ public class PacManager implements Runnable { * * @throws IOException */ - public static String get(String urlString) throws IOException { + private static String get(String urlString) throws IOException { URL url = new URL(urlString); URLConnection urlConnection = url.openConnection(java.net.Proxy.NO_PROXY); - BufferedReader in = new BufferedReader(new InputStreamReader( - urlConnection.getInputStream())); - String inputLine; - String resp = ""; - while ((inputLine = in.readLine()) != null) { - resp = resp + inputLine + "\n"; - } - in.close(); - return resp; - } - - private static String toString(InputStream content) throws IOException { - StringBuffer buffer = new StringBuffer(); - String line; - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(content)); - - while ((line = bufferedReader.readLine()) != null) { - if (buffer.length() != 0) { - buffer.append('\n'); - } - buffer.append(line); - } - - return buffer.toString(); - } - - @Override - public void run() { - String file; - try { - file = get(mPacUrl); - } catch (IOException ioe) { - file = null; - } - if (file != null) { - if (!file.equals(mCurrentPac)) { - setCurrentProxyScript(file); - } - longSchedule(); - } else { - reschedule(); - } + return new String(Streams.readFully(urlConnection.getInputStream())); } private int getNextDelay(int currentDelay) { @@ -227,14 +215,60 @@ public class PacManager implements Runnable { return false; } try { - if (mProxyService.setPacFile(script) != NO_ERROR) { - Log.e(TAG, "Unable to parse proxy script."); - return false; - } + mProxyService.setPacFile(script); mCurrentPac = script; } catch (RemoteException e) { Log.e(TAG, "Unable to set PAC file", e); } return true; } + + private void bind() { + if (mContext == null) { + Log.e(TAG, "No context for binding"); + return; + } + Intent intent = new Intent(); + intent.setClassName(PROXY_PACKAGE, PROXY_SERVICE); + mConnection = new ServiceConnection() { + @Override + public void onServiceDisconnected(ComponentName component) { + synchronized (mProxyLock) { + mProxyService = null; + } + } + + @Override + public void onServiceConnected(ComponentName component, IBinder binder) { + synchronized (mProxyLock) { + try { + Log.d(TAG, "Adding service " + PROXY_SERVICE_NAME + " " + + binder.getInterfaceDescriptor()); + } catch (RemoteException e1) { + Log.e(TAG, "Remote Exception", e1); + } + ServiceManager.addService(PROXY_SERVICE_NAME, binder); + mProxyService = IProxyService.Stub.asInterface(binder); + if (mProxyService == null) { + Log.e(TAG, "No proxy service"); + } else { + try { + mProxyService.startPacSystem(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to reach ProxyService - PAC will not be started", e); + } + IoThread.getHandler().post(mPacDownloader); + } + } + } + }; + Log.e(TAG, "Attempting to bind"); + mContext.bindService(intent, mConnection, + Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND | Context.BIND_NOT_VISIBLE); + } + + private void unbind() { + mContext.unbindService(mConnection); + mConnection = null; + } } diff --git a/services/java/com/android/server/content/SyncManager.java b/services/java/com/android/server/content/SyncManager.java index ee5b890..a6b69a2 100644 --- a/services/java/com/android/server/content/SyncManager.java +++ b/services/java/com/android/server/content/SyncManager.java @@ -2889,11 +2889,12 @@ public class SyncManager { // determine if we need to set or cancel the alarm boolean shouldSet = false; boolean shouldCancel = false; - final boolean alarmIsActive = mAlarmScheduleTime != null; + final boolean alarmIsActive = (mAlarmScheduleTime != null) && (now < mAlarmScheduleTime); final boolean needAlarm = alarmTime != Long.MAX_VALUE; if (needAlarm) { - // Need the alarm if it's currently not set, or if our time is before the currently - // set time. + // Need the alarm if + // - it's currently not set + // - if the alarm is set in the past. if (!alarmIsActive || alarmTime < mAlarmScheduleTime) { shouldSet = true; } @@ -2910,7 +2911,7 @@ public class SyncManager { + " secs from now"); } mAlarmScheduleTime = alarmTime; - mAlarmService.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmTime, + mAlarmService.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmTime, mSyncAlarmIntent); } else if (shouldCancel) { mAlarmScheduleTime = null; diff --git a/services/java/com/android/server/content/SyncStorageEngine.java b/services/java/com/android/server/content/SyncStorageEngine.java index 25529a6..e3693f8 100644 --- a/services/java/com/android/server/content/SyncStorageEngine.java +++ b/services/java/com/android/server/content/SyncStorageEngine.java @@ -53,6 +53,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; @@ -71,7 +72,7 @@ public class SyncStorageEngine extends Handler { private static final String TAG = "SyncManager"; private static final boolean DEBUG = true; - private static final boolean DEBUG_FILE = true; + private static final String TAG_FILE = "SyncManagerFile"; private static final String XML_ATTR_NEXT_AUTHORITY_ID = "nextAuthorityId"; private static final String XML_ATTR_LISTEN_FOR_TICKLES = "listen-for-tickles"; @@ -420,9 +421,12 @@ public class SyncStorageEngine extends Handler { File systemDir = new File(dataDir, "system"); File syncDir = new File(systemDir, "sync"); syncDir.mkdirs(); + + maybeDeleteLegacyPendingInfoLocked(syncDir); + mAccountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml")); mStatusFile = new AtomicFile(new File(syncDir, "status.bin")); - mPendingFile = new AtomicFile(new File(syncDir, "pending.bin")); + mPendingFile = new AtomicFile(new File(syncDir, "pending.xml")); mStatisticsFile = new AtomicFile(new File(syncDir, "stats.bin")); readAccountInfoLocked(); @@ -676,7 +680,8 @@ public class SyncStorageEngine extends Handler { continue; } for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) { - if (providerName != null && !providerName.equals(authorityInfo.authority)) { + if (providerName != null + && !providerName.equals(authorityInfo.authority)) { continue; } if (authorityInfo.backoffTime != nextSyncTime @@ -774,10 +779,12 @@ public class SyncStorageEngine extends Handler { } synchronized (mAuthorities) { if (toUpdate.period <= 0 && add) { - Log.e(TAG, "period < 0, should never happen in updateOrRemovePeriodicSync: add-" + add); + Log.e(TAG, "period < 0, should never happen in updateOrRemovePeriodicSync: add-" + + add); } if (toUpdate.extras == null) { - Log.e(TAG, "period < 0, should never happen in updateOrRemovePeriodicSync: add-" + add); + Log.e(TAG, "null extras, should never happen in updateOrRemovePeriodicSync: add-" + + add); } try { AuthorityInfo authority = @@ -806,7 +813,7 @@ public class SyncStorageEngine extends Handler { if (!alreadyPresent) { authority.periodicSyncs.add(new PeriodicSync(toUpdate)); SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident); - status.setPeriodicSyncTime(authority.periodicSyncs.size() - 1, 0); + status.setPeriodicSyncTime(authority.periodicSyncs.size() - 1, 0L); } } else { // Remove any periodic syncs that match the authority and extras. @@ -824,7 +831,8 @@ public class SyncStorageEngine extends Handler { if (status != null) { status.removePeriodicSyncTime(i); } else { - Log.e(TAG, "Tried removing sync status on remove periodic sync but did not find it."); + Log.e(TAG, "Tried removing sync status on remove periodic sync but" + + "did not find it."); } } else { i++; @@ -942,7 +950,7 @@ public class SyncStorageEngine extends Handler { op = new PendingOperation(op); op.authorityId = authority.ident; mPendingOperations.add(op); - writePendingOperationsLocked(); + appendPendingOperationLocked(op); SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident); status.pending = true; @@ -1660,7 +1668,9 @@ public class SyncStorageEngine extends Handler { FileInputStream fis = null; try { fis = mAccountInfoFile.openRead(); - if (DEBUG_FILE) Log.v(TAG, "Reading " + mAccountInfoFile.getBaseFile()); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Reading " + mAccountInfoFile.getBaseFile()); + } XmlPullParser parser = Xml.newPullParser(); parser.setInput(fis, null); int eventType = parser.getEventType(); @@ -1745,6 +1755,20 @@ public class SyncStorageEngine extends Handler { } /** + * Ensure the old pending.bin is deleted, as it has been changed to pending.xml. + * pending.xml was used starting in KLP. + * @param syncDir directory where the sync files are located. + */ + private void maybeDeleteLegacyPendingInfoLocked(File syncDir) { + File file = new File(syncDir, "pending.bin"); + if (!file.exists()) { + return; + } else { + file.delete(); + } + } + + /** * some authority names have changed. copy over their settings and delete the old ones * @return true if a change was made */ @@ -1832,18 +1856,21 @@ public class SyncStorageEngine extends Handler { syncable = "unknown"; } authority = mAuthorities.get(id); - if (DEBUG_FILE) Log.v(TAG, "Adding authority: account=" - + accountName + " auth=" + authorityName - + " user=" + userId - + " enabled=" + enabled - + " syncable=" + syncable); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Adding authority: account=" + + accountName + " auth=" + authorityName + + " user=" + userId + + " enabled=" + enabled + + " syncable=" + syncable); + } if (authority == null) { - if (DEBUG_FILE) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { Log.v(TAG, "Creating entry"); } if (accountName != null && accountType != null) { authority = getOrCreateAuthorityLocked( - new Account(accountName, accountType), userId, authorityName, id, false); + new Account(accountName, accountType), userId, authorityName, id, + false); } else { authority = getOrCreateAuthorityLocked( new ComponentName(packageName, className), userId, id, false); @@ -1943,7 +1970,9 @@ public class SyncStorageEngine extends Handler { * Write all account information to the account file. */ private void writeAccountInfoLocked() { - if (DEBUG_FILE) Log.v(TAG, "Writing new " + mAccountInfoFile.getBaseFile()); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Writing new " + mAccountInfoFile.getBaseFile()); + } FileOutputStream fos = null; try { @@ -2041,7 +2070,9 @@ public class SyncStorageEngine extends Handler { final boolean hasType = db.getVersion() >= 11; // Copy in all of the status information, as well as accounts. - if (DEBUG_FILE) Log.v(TAG, "Reading legacy sync accounts db"); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Reading legacy sync accounts db"); + } SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables("stats, status"); HashMap<String,String> map = new HashMap<String,String>(); @@ -2151,7 +2182,9 @@ public class SyncStorageEngine extends Handler { * Read all sync status back in to the initial engine state. */ private void readStatusLocked() { - if (DEBUG_FILE) Log.v(TAG, "Reading " + mStatusFile.getBaseFile()); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Reading " + mStatusFile.getBaseFile()); + } try { byte[] data = mStatusFile.readFully(); Parcel in = Parcel.obtain(); @@ -2163,8 +2196,10 @@ public class SyncStorageEngine extends Handler { SyncStatusInfo status = new SyncStatusInfo(in); if (mAuthorities.indexOfKey(status.authorityId) >= 0) { status.pending = false; - if (DEBUG_FILE) Log.v(TAG, "Adding status for id " - + status.authorityId); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Adding status for id " + + status.authorityId); + } mSyncStatus.put(status.authorityId, status); } } else { @@ -2182,7 +2217,9 @@ public class SyncStorageEngine extends Handler { * Write all sync status to the sync status file. */ private void writeStatusLocked() { - if (DEBUG_FILE) Log.v(TAG, "Writing new " + mStatusFile.getBaseFile()); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Writing new " + mStatusFile.getBaseFile()); + } // The file is being written, so we don't need to have a scheduled // write until the next change. @@ -2211,103 +2248,97 @@ public class SyncStorageEngine extends Handler { } } - public static final int PENDING_OPERATION_VERSION = 4; + public static final int PENDING_OPERATION_VERSION = 3; - /** - * Read all pending operations back in to the initial engine state. - */ + /** Read all pending operations back in to the initial engine state. */ private void readPendingOperationsLocked() { - if (DEBUG_FILE) Log.v(TAG, "Reading " + mPendingFile.getBaseFile()); - try { - readPendingAsXml(); - } catch (XmlPullParserException e) { - Log.d(TAG, "Error parsing pending as xml, trying as parcel."); - try { - readPendingAsParcelled(); - } catch (java.io.IOException e1) { - Log.i(TAG, "No initial pending operations"); + FileInputStream fis = null; + if (!mPendingFile.getBaseFile().exists()) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG_FILE, "No pending operation file."); + return; } } - } - - private void readPendingAsXml() throws XmlPullParserException { - FileInputStream fis = null; try { fis = mPendingFile.openRead(); - XmlPullParser parser = Xml.newPullParser(); + XmlPullParser parser; + parser = Xml.newPullParser(); parser.setInput(fis, null); + int eventType = parser.getEventType(); while (eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_DOCUMENT) { eventType = parser.next(); } - if (eventType == XmlPullParser.END_DOCUMENT) return; + if (eventType == XmlPullParser.END_DOCUMENT) return; // Nothing to read. String tagName = parser.getName(); - if ("pending".equals(tagName)) { - int version = -1; - String versionString = parser.getAttributeValue(null, "version"); - if (versionString == null || - Integer.parseInt(versionString) != PENDING_OPERATION_VERSION) { - Log.w(TAG, "Unknown pending operation version " - + version + "; trying to read as binary."); - throw new XmlPullParserException("Unknown version."); - } - eventType = parser.next(); + do { PendingOperation pop = null; - do { - if (eventType == XmlPullParser.START_TAG) { - try { - tagName = parser.getName(); - if (parser.getDepth() == 2 && "op".equals(tagName)) { - int authorityId = Integer.valueOf(parser.getAttributeValue( - null, XML_ATTR_AUTHORITYID)); - boolean expedited = Boolean.valueOf(parser.getAttributeValue( - null, XML_ATTR_EXPEDITED)); - int syncSource = Integer.valueOf(parser.getAttributeValue( - null, XML_ATTR_SOURCE)); - int reason = Integer.valueOf(parser.getAttributeValue( - null, XML_ATTR_REASON)); - AuthorityInfo authority = mAuthorities.get(authorityId); - if (DEBUG_FILE) { - Log.v(TAG, authorityId + " " + expedited + " " + syncSource + " " + reason); - } - if (authority != null) { - pop = new PendingOperation( - authority.account, authority.userId, reason, syncSource, - authority.authority, new Bundle(), expedited); - pop.authorityId = authorityId; - pop.flatExtras = null; // No longer used. - mPendingOperations.add(pop); - if (DEBUG_FILE) Log.v(TAG, "Adding pending op: account=" + pop.account - + " auth=" + pop.authority + if (eventType == XmlPullParser.START_TAG) { + try { + tagName = parser.getName(); + if (parser.getDepth() == 1 && "op".equals(tagName)) { + // Verify version. + String versionString = + parser.getAttributeValue(null, XML_ATTR_VERSION); + if (versionString == null || + Integer.parseInt(versionString) != PENDING_OPERATION_VERSION) { + Log.w(TAG, "Unknown pending operation version " + versionString); + throw new java.io.IOException("Unknown version."); + } + int authorityId = Integer.valueOf(parser.getAttributeValue( + null, XML_ATTR_AUTHORITYID)); + boolean expedited = Boolean.valueOf(parser.getAttributeValue( + null, XML_ATTR_EXPEDITED)); + int syncSource = Integer.valueOf(parser.getAttributeValue( + null, XML_ATTR_SOURCE)); + int reason = Integer.valueOf(parser.getAttributeValue( + null, XML_ATTR_REASON)); + AuthorityInfo authority = mAuthorities.get(authorityId); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG_FILE, authorityId + " " + expedited + " " + syncSource + " " + + reason); + } + if (authority != null) { + pop = new PendingOperation( + authority.account, authority.userId, reason, + syncSource, authority.authority, 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 + " src=" + pop.syncSource + " reason=" + pop.reason + " expedited=" + pop.expedited); - } else { - // Skip non-existent authority; - pop = null; - if (DEBUG_FILE) { - Log.v(TAG, "No authority found for " + authorityId - + ", skipping"); - } } - } else if (parser.getDepth() == 3 && - pop != null && - "extra".equals(tagName)) { - parseExtra(parser, pop.extras); + } else { + // Skip non-existent authority. + pop = null; + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG_FILE, "No authority found for " + authorityId + + ", skipping"); + } } - } catch (NumberFormatException e) { - Log.d(TAG, "Invalid data in xml file.", e); + } else if (parser.getDepth() == 2 && + pop != null && + "extra".equals(tagName)) { + parseExtra(parser, pop.extras); } + } catch (NumberFormatException e) { + Log.d(TAG, "Invalid data in xml file.", e); } - eventType = parser.next(); - } while(eventType != XmlPullParser.END_DOCUMENT); - } + } + eventType = parser.next(); + } while(eventType != XmlPullParser.END_DOCUMENT); } catch (java.io.IOException e) { - if (fis == null) Log.i(TAG, "No initial pending operations."); - else Log.w(TAG, "Error reading pending data.", e); - return; + Log.w(TAG_FILE, "Error reading pending data.", e); + } catch (XmlPullParserException e) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.w(TAG_FILE, "Error parsing pending ops xml.", e); + } } finally { if (fis != null) { try { @@ -2316,60 +2347,99 @@ public class SyncStorageEngine extends Handler { } } } + + 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"; + /** - * Old format of reading pending.bin as a parcelled file. Replaced in lieu of JSON because - * persisting parcels is unsafe. - * @throws java.io.IOException + * Write all currently pending ops to the pending ops file. */ - private void readPendingAsParcelled() throws java.io.IOException { - byte[] data = mPendingFile.readFully(); - Parcel in = Parcel.obtain(); - in.unmarshall(data, 0, data.length); - in.setDataPosition(0); - final int SIZE = in.dataSize(); - while (in.dataPosition() < SIZE) { - int version = in.readInt(); - if (version != 3 && version != 1) { - Log.w(TAG, "Unknown pending operation version " - + version + "; dropping all ops"); - break; - } - int authorityId = in.readInt(); - int syncSource = in.readInt(); - byte[] flatExtras = in.createByteArray(); - boolean expedited; - if (version == PENDING_OPERATION_VERSION) { - expedited = in.readInt() != 0; - } else { - expedited = false; - } - int reason = in.readInt(); - AuthorityInfo authority = mAuthorities.get(authorityId); - if (authority != null) { - Bundle extras; - if (flatExtras != null) { - extras = unflattenBundle(flatExtras); - } else { - // if we are unable to parse the extras for whatever reason convert this - // to a regular sync by creating an empty extras - extras = new Bundle(); + private void writePendingOperationsLocked() { + final int N = mPendingOperations.size(); + FileOutputStream fos = null; + try { + if (N == 0) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG_FILE, "Truncating " + mPendingFile.getBaseFile()); } - PendingOperation op = new PendingOperation( - authority.account, authority.userId, reason, syncSource, - authority.authority, extras, expedited); - op.authorityId = authorityId; - op.flatExtras = flatExtras; - if (DEBUG_FILE) Log.v(TAG, "Adding pending op: account=" + op.account - + " auth=" + op.authority - + " src=" + op.syncSource - + " reason=" + op.reason - + " expedited=" + op.expedited - + " extras=" + op.extras); - mPendingOperations.add(op); + mPendingFile.truncate(); + return; + } + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG_FILE, "Writing new " + mPendingFile.getBaseFile()); + } + fos = mPendingFile.startWrite(); + XmlSerializer out = new FastXmlSerializer(); + out.setOutput(fos, "utf-8"); + + for (int i = 0; i < N; i++) { + PendingOperation pop = mPendingOperations.get(i); + writePendingOperationLocked(pop, out); + } + out.endDocument(); + mPendingFile.finishWrite(fos); + } catch (java.io.IOException e1) { + Log.w(TAG, "Error writing pending operations", e1); + if (fos != null) { + mPendingFile.failWrite(fos); } } } + /** Write all currently pending ops to the pending ops file. */ + private void writePendingOperationLocked(PendingOperation pop, XmlSerializer out) + throws IOException { + // Pending operation. + out.startTag(null, "op"); + + out.attribute(null, XML_ATTR_VERSION, Integer.toString(PENDING_OPERATION_VERSION)); + out.attribute(null, XML_ATTR_AUTHORITYID, Integer.toString(pop.authorityId)); + out.attribute(null, XML_ATTR_SOURCE, Integer.toString(pop.syncSource)); + out.attribute(null, XML_ATTR_EXPEDITED, Boolean.toString(pop.expedited)); + out.attribute(null, XML_ATTR_REASON, Integer.toString(pop.reason)); + extrasToXml(out, pop.extras); + + out.endTag(null, "op"); + } + + /** + * Append the given operation to the pending ops file; if unable to, + * write all pending ops. + */ + private void appendPendingOperationLocked(PendingOperation op) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Appending to " + mPendingFile.getBaseFile()); + } + FileOutputStream fos = null; + try { + fos = mPendingFile.openAppend(); + } catch (java.io.IOException e) { + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Failed append; writing full file"); + } + writePendingOperationsLocked(); + return; + } + + try { + XmlSerializer out = new FastXmlSerializer(); + out.setOutput(fos, "utf-8"); + writePendingOperationLocked(op, out); + out.endDocument(); + mPendingFile.finishWrite(fos); + } catch (java.io.IOException e1) { + Log.w(TAG, "Error writing appending operation", e1); + mPendingFile.failWrite(fos); + } finally { + try { + fos.close(); + } catch (IOException e) {} + } + } + static private byte[] flattenBundle(Bundle bundle) { byte[] flatData = null; Parcel parcel = Parcel.obtain(); @@ -2399,54 +2469,6 @@ public class SyncStorageEngine extends Handler { return bundle; } - 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"; - /** - * Write all currently pending ops to the pending ops file. TODO: Change this from xml - * so that we can append to this file as before. - */ - private void writePendingOperationsLocked() { - final int N = mPendingOperations.size(); - FileOutputStream fos = null; - try { - if (N == 0) { - if (DEBUG_FILE) Log.v(TAG, "Truncating " + mPendingFile.getBaseFile()); - mPendingFile.truncate(); - return; - } - if (DEBUG_FILE) Log.v(TAG, "Writing new " + mPendingFile.getBaseFile()); - fos = mPendingFile.startWrite(); - XmlSerializer out = new FastXmlSerializer(); - out.setOutput(fos, "utf-8"); - out.startDocument(null, true); - out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - - out.startTag(null, "pending"); - out.attribute(null, "version", Integer.toString(PENDING_OPERATION_VERSION)); - - for (int i = 0; i < N; i++) { - PendingOperation pop = mPendingOperations.get(i); - out.startTag(null, "op"); - out.attribute(null, XML_ATTR_AUTHORITYID, Integer.toString(pop.authorityId)); - out.attribute(null, XML_ATTR_SOURCE, Integer.toString(pop.syncSource)); - out.attribute(null, XML_ATTR_EXPEDITED, Boolean.toString(pop.expedited)); - out.attribute(null, XML_ATTR_REASON, Integer.toString(pop.reason)); - extrasToXml(out, pop.extras); - out.endTag(null, "op"); - } - out.endTag(null, "pending"); - out.endDocument(); - mPendingFile.finishWrite(fos); - } catch (java.io.IOException e1) { - Log.w(TAG, "Error writing pending operations", e1); - if (fos != null) { - mPendingFile.failWrite(fos); - } - } - } - private void extrasToXml(XmlSerializer out, Bundle extras) throws java.io.IOException { for (String key : extras.keySet()) { out.startTag(null, "extra"); @@ -2479,35 +2501,6 @@ public class SyncStorageEngine extends Handler { } } -// /** -// * Update the pending ops file, if e -// */ -// private void appendPendingOperationLocked(PendingOperation op) { -// if (DEBUG_FILE) Log.v(TAG, "Appending to " + mPendingFile.getBaseFile()); -// FileOutputStream fos = null; -// try { -// fos = mPendingFile.openAppend(); -// } catch (java.io.IOException e) { -// if (DEBUG_FILE) Log.v(TAG, "Failed append; writing full file"); -// writePendingOperationsLocked(); -// return; -// } -// -// try { -// Parcel out = Parcel.obtain(); -// writePendingOperationLocked(op, out); -// fos.write(out.marshall()); -// out.recycle(); -// } catch (java.io.IOException e1) { -// Log.w(TAG, "Error writing pending operations", e1); -// } finally { -// try { -// fos.close(); -// } catch (java.io.IOException e2) { -// } -// } -// } - 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 @@ -2568,7 +2561,9 @@ public class SyncStorageEngine extends Handler { * Write all sync statistics to the sync status file. */ private void writeStatisticsLocked() { - if (DEBUG_FILE) Log.v(TAG, "Writing new " + mStatisticsFile.getBaseFile()); + if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { + Log.v(TAG, "Writing new " + mStatisticsFile.getBaseFile()); + } // The file is being written, so we don't need to have a scheduled // write until the next change. @@ -2611,7 +2606,7 @@ public class SyncStorageEngine extends Handler { sb.append("Pending Ops: ").append(mPendingOperations.size()).append(" operation(s)\n"); for (PendingOperation pop : mPendingOperations) { sb.append("(" + pop.account) - .append(", " + pop.userId) + .append(", u" + pop.userId) .append(", " + pop.authority) .append(", " + pop.extras) .append(")\n"); diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java index f89917c..846a74d 100644 --- a/services/java/com/android/server/display/WifiDisplayController.java +++ b/services/java/com/android/server/display/WifiDisplayController.java @@ -83,11 +83,6 @@ final class WifiDisplayController implements DumpUtils.Dump { private static final int CONNECT_MAX_RETRIES = 3; private static final int CONNECT_RETRY_DELAY_MILLIS = 500; - // A unique token to identify the remote submix that is managed by Wifi display. - // It must match what the media server uses when it starts recording the submix - // for transmission. We use 0 although the actual value is currently ignored. - private static final int REMOTE_SUBMIX_ADDRESS = 0; - private final Context mContext; private final Handler mHandler; private final Listener mListener; @@ -95,8 +90,6 @@ final class WifiDisplayController implements DumpUtils.Dump { private final WifiP2pManager mWifiP2pManager; private final Channel mWifiP2pChannel; - private final AudioManager mAudioManager; - private boolean mWifiP2pEnabled; private boolean mWfdEnabled; private boolean mWfdEnabling; @@ -146,9 +139,6 @@ final class WifiDisplayController implements DumpUtils.Dump { // True if RTSP has connected. private boolean mRemoteDisplayConnected; - // True if the remote submix is enabled. - private boolean mRemoteSubmixOn; - // The information we have most recently told WifiDisplayAdapter about. private WifiDisplay mAdvertisedDisplay; private Surface mAdvertisedDisplaySurface; @@ -164,8 +154,6 @@ final class WifiDisplayController implements DumpUtils.Dump { mWifiP2pManager = (WifiP2pManager)context.getSystemService(Context.WIFI_P2P_SERVICE); mWifiP2pChannel = mWifiP2pManager.initialize(context, handler.getLooper(), null); - mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); - IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); @@ -211,7 +199,6 @@ final class WifiDisplayController implements DumpUtils.Dump { pw.println("mRemoteDisplay=" + mRemoteDisplay); pw.println("mRemoteDisplayInterface=" + mRemoteDisplayInterface); pw.println("mRemoteDisplayConnected=" + mRemoteDisplayConnected); - pw.println("mRemoteSubmixOn=" + mRemoteSubmixOn); pw.println("mAdvertisedDisplay=" + mAdvertisedDisplay); pw.println("mAdvertisedDisplaySurface=" + mAdvertisedDisplaySurface); pw.println("mAdvertisedDisplayWidth=" + mAdvertisedDisplayWidth); @@ -482,7 +469,6 @@ final class WifiDisplayController implements DumpUtils.Dump { mHandler.removeCallbacks(mRtspTimeout); mWifiP2pManager.setMiracastMode(WifiP2pManager.MIRACAST_DISABLED); - setRemoteSubmixOn(false); unadvertiseDisplay(); // continue to next step @@ -626,7 +612,6 @@ final class WifiDisplayController implements DumpUtils.Dump { return; // done } - setRemoteSubmixOn(true); mWifiP2pManager.setMiracastMode(WifiP2pManager.MIRACAST_SOURCE); final WifiP2pDevice oldDevice = mConnectedDevice; @@ -677,13 +662,6 @@ final class WifiDisplayController implements DumpUtils.Dump { } } - private void setRemoteSubmixOn(boolean on) { - if (mRemoteSubmixOn != on) { - mRemoteSubmixOn = on; - mAudioManager.setRemoteSubmixOn(on, REMOTE_SUBMIX_ADDRESS); - } - } - private void handleStateChanged(boolean enabled) { mWifiP2pEnabled = enabled; updateWfdEnableState(); diff --git a/services/java/com/android/server/dreams/DreamManagerService.java b/services/java/com/android/server/dreams/DreamManagerService.java index 21e54fe..b6e7781 100644 --- a/services/java/com/android/server/dreams/DreamManagerService.java +++ b/services/java/com/android/server/dreams/DreamManagerService.java @@ -86,7 +86,13 @@ public final class DreamManagerService extends IDreamManager.Stub { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); + if (mContext.checkCallingOrSelfPermission("android.permission.DUMP") + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump DreamManager from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } pw.println("DREAM MANAGER (dumpsys dreams)"); pw.println(); diff --git a/services/java/com/android/server/location/FlpHardwareProvider.java b/services/java/com/android/server/location/FlpHardwareProvider.java index 226c18c..ebeccfb 100644 --- a/services/java/com/android/server/location/FlpHardwareProvider.java +++ b/services/java/com/android/server/location/FlpHardwareProvider.java @@ -16,12 +16,13 @@ package com.android.server.location; +import android.hardware.location.GeofenceHardware; import android.hardware.location.GeofenceHardwareImpl; +import android.hardware.location.GeofenceHardwareRequestParcelable; import android.hardware.location.IFusedLocationHardware; import android.hardware.location.IFusedLocationHardwareSink; import android.location.IFusedGeofenceHardware; import android.location.FusedBatchOptions; -import android.location.Geofence; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -49,6 +50,15 @@ public class FlpHardwareProvider { private final Context mContext; private final Object mLocationSinkLock = new Object(); + // FlpHal result codes, they must be equal to the ones in fused_location.h + private static final int FLP_RESULT_SUCCESS = 0; + private static final int FLP_RESULT_ERROR = -1; + private static final int FLP_RESULT_INSUFFICIENT_MEMORY = -2; + private static final int FLP_RESULT_TOO_MANY_GEOFENCES = -3; + private static final int FLP_RESULT_ID_EXISTS = -4; + private static final int FLP_RESULT_ID_UNKNOWN = -5; + private static final int FLP_RESULT_INVALID_GEOFENCE_TRANSITION = -6; + public static FlpHardwareProvider getInstance(Context context) { if (sSingletonInstance == null) { sSingletonInstance = new FlpHardwareProvider(context); @@ -120,29 +130,46 @@ public class FlpHardwareProvider { Location location, int transition, long timestamp, - int sourcesUsed - ) { - // TODO: [GeofenceIntegration] change GeofenceHardwareImpl to accept a location object + int sourcesUsed) { + getGeofenceHardwareSink().reportGeofenceTransition( + geofenceId, + updateLocationInformation(location), + transition, + timestamp, + GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, + sourcesUsed); } private void onGeofenceMonitorStatus(int status, int source, Location location) { - // TODO: [GeofenceIntegration] + getGeofenceHardwareSink().reportGeofenceMonitorStatus( + GeofenceHardware.MONITORING_TYPE_FUSED_HARDWARE, + status, + updateLocationInformation(location), + source); } private void onGeofenceAdd(int geofenceId, int result) { - // TODO: [GeofenceIntegration] map between GPS and FLP results to pass a consistent status + getGeofenceHardwareSink().reportGeofenceAddStatus( + geofenceId, + translateToGeofenceHardwareStatus(result)); } private void onGeofenceRemove(int geofenceId, int result) { - // TODO: [GeofenceIntegration] map between GPS and FLP results to pass a consistent status + getGeofenceHardwareSink().reportGeofenceRemoveStatus( + geofenceId, + translateToGeofenceHardwareStatus(result)); } private void onGeofencePause(int geofenceId, int result) { - // TODO; [GeofenceIntegration] map between GPS and FLP results + getGeofenceHardwareSink().reportGeofencePauseStatus( + geofenceId, + translateToGeofenceHardwareStatus(result)); } private void onGeofenceResume(int geofenceId, int result) { - // TODO: [GeofenceIntegration] map between GPS and FLP results + getGeofenceHardwareSink().reportGeofenceResumeStatus( + geofenceId, + translateToGeofenceHardwareStatus(result)); } /** @@ -175,7 +202,8 @@ public class FlpHardwareProvider { // FlpGeofencingInterface members private native boolean nativeIsGeofencingSupported(); - private native void nativeAddGeofences(int[] geofenceIdsArray, Geofence[] geofencesArray); + private native void nativeAddGeofences( + GeofenceHardwareRequestParcelable[] geofenceRequestsArray); private native void nativePauseGeofence(int geofenceId); private native void nativeResumeGeofence(int geofenceId, int monitorTransitions); private native void nativeModifyGeofenceOption( @@ -281,8 +309,8 @@ public class FlpHardwareProvider { } @Override - public void addGeofences(int[] geofenceIdsArray, Geofence[] geofencesArray) { - nativeAddGeofences(geofenceIdsArray, geofencesArray); + public void addGeofences(GeofenceHardwareRequestParcelable[] geofenceRequestsArray) { + nativeAddGeofences(geofenceRequestsArray); } @Override @@ -305,17 +333,15 @@ public class FlpHardwareProvider { int lastTransition, int monitorTransitions, int notificationResponsiveness, - int unknownTimer - ) { - // TODO: [GeofenceIntegration] set sourcesToUse to the right value - // TODO: expose sourcesToUse externally when needed + int unknownTimer, + int sourcesToUse) { nativeModifyGeofenceOption( geofenceId, lastTransition, monitorTransitions, notificationResponsiveness, unknownTimer, - /* sourcesToUse */ 0xFFFF); + sourcesToUse); } }; @@ -347,10 +373,39 @@ public class FlpHardwareProvider { private GeofenceHardwareImpl getGeofenceHardwareSink() { if (mGeofenceHardwareSink == null) { - // TODO: [GeofenceIntegration] we need to register ourselves with GeofenceHardwareImpl mGeofenceHardwareSink = GeofenceHardwareImpl.getInstance(mContext); } return mGeofenceHardwareSink; } -}
\ No newline at end of file + + private static int translateToGeofenceHardwareStatus(int flpHalResult) { + switch(flpHalResult) { + case FLP_RESULT_SUCCESS: + return GeofenceHardware.GEOFENCE_SUCCESS; + case FLP_RESULT_ERROR: + return GeofenceHardware.GEOFENCE_FAILURE; + // TODO: uncomment this once the ERROR definition is marked public + //case FLP_RESULT_INSUFFICIENT_MEMORY: + // return GeofenceHardware.GEOFENCE_ERROR_INSUFFICIENT_MEMORY; + case FLP_RESULT_TOO_MANY_GEOFENCES: + return GeofenceHardware.GEOFENCE_ERROR_TOO_MANY_GEOFENCES; + case FLP_RESULT_ID_EXISTS: + return GeofenceHardware.GEOFENCE_ERROR_ID_EXISTS; + case FLP_RESULT_ID_UNKNOWN: + return GeofenceHardware.GEOFENCE_ERROR_ID_UNKNOWN; + case FLP_RESULT_INVALID_GEOFENCE_TRANSITION: + return GeofenceHardware.GEOFENCE_ERROR_INVALID_TRANSITION; + default: + Log.e(TAG, String.format("Invalid FlpHal result code: %d", flpHalResult)); + return GeofenceHardware.GEOFENCE_FAILURE; + } + } + + private Location updateLocationInformation(Location location) { + location.setProvider(LocationManager.FUSED_PROVIDER); + // set the elapsed time-stamp just as GPS provider does + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + return location; + } +} diff --git a/services/java/com/android/server/location/GeofenceProxy.java b/services/java/com/android/server/location/GeofenceProxy.java index f6be27b..a86c923 100644 --- a/services/java/com/android/server/location/GeofenceProxy.java +++ b/services/java/com/android/server/location/GeofenceProxy.java @@ -22,6 +22,7 @@ import android.hardware.location.GeofenceHardwareService; import android.hardware.location.IGeofenceHardware; import android.location.IGeofenceProvider; import android.location.IGpsGeofenceHardware; +import android.location.IFusedGeofenceHardware; import android.content.Context; import android.os.Handler; import android.os.IBinder; @@ -44,6 +45,7 @@ public final class GeofenceProxy { private Context mContext; private IGeofenceHardware mGeofenceHardware; private IGpsGeofenceHardware mGpsGeofenceHardware; + private IFusedGeofenceHardware mFusedGeofenceHardware; private static final int GEOFENCE_PROVIDER_CONNECTED = 1; private static final int GEOFENCE_HARDWARE_CONNECTED = 2; @@ -60,9 +62,11 @@ public final class GeofenceProxy { public static GeofenceProxy createAndBind(Context context, int overlaySwitchResId, int defaultServicePackageNameResId, - int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence) { + int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence, + IFusedGeofenceHardware fusedGeofenceHardware) { GeofenceProxy proxy = new GeofenceProxy(context, overlaySwitchResId, - defaultServicePackageNameResId, initialPackageNamesResId, handler, gpsGeofence); + defaultServicePackageNameResId, initialPackageNamesResId, handler, gpsGeofence, + fusedGeofenceHardware); if (proxy.bindGeofenceProvider()) { return proxy; } else { @@ -72,11 +76,13 @@ public final class GeofenceProxy { private GeofenceProxy(Context context, int overlaySwitchResId, int defaultServicePackageNameResId, - int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence) { + int initialPackageNamesResId, Handler handler, IGpsGeofenceHardware gpsGeofence, + IFusedGeofenceHardware fusedGeofenceHardware) { mContext = context; mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId, mRunnable, handler); mGpsGeofenceHardware = gpsGeofence; + mFusedGeofenceHardware = fusedGeofenceHardware; bindHardwareGeofence(); } @@ -123,6 +129,13 @@ public final class GeofenceProxy { } } + private void setFusedGeofence() { + try { + mGeofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware); + } catch(RemoteException e) { + Log.e(TAG, "Error while connecting to GeofenceHardwareService"); + } + } // This needs to be reworked, when more services get added, // Might need a state machine or add a framework utility class, @@ -142,6 +155,7 @@ public final class GeofenceProxy { break; case GEOFENCE_HARDWARE_CONNECTED: setGpsGeofence(); + setFusedGeofence(); mGeofenceHardwareConnected = true; if (mGeofenceProviderConnected) { setGeofenceHardwareInProvider(); diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java index 38453c8..6053c61 100644 --- a/services/java/com/android/server/location/GpsLocationProvider.java +++ b/services/java/com/android/server/location/GpsLocationProvider.java @@ -24,9 +24,10 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; +import android.hardware.location.GeofenceHardware; import android.hardware.location.GeofenceHardwareImpl; -import android.hardware.location.IGeofenceHardware; import android.location.Criteria; +import android.location.FusedBatchOptions; import android.location.IGpsGeofenceHardware; import android.location.IGpsStatusListener; import android.location.IGpsStatusProvider; @@ -195,6 +196,17 @@ public class GpsLocationProvider implements LocationProviderInterface { private static final String PROPERTIES_FILE = "/etc/gps.conf"; + private static final int GPS_GEOFENCE_UNAVAILABLE = 1<<0L; + private static final int GPS_GEOFENCE_AVAILABLE = 1<<1L; + + // GPS Geofence errors. Should match gps.h constants. + private static final int GPS_GEOFENCE_OPERATION_SUCCESS = 0; + private static final int GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES = 100; + private static final int GPS_GEOFENCE_ERROR_ID_EXISTS = -101; + private static final int GPS_GEOFENCE_ERROR_ID_UNKNOWN = -102; + private static final int GPS_GEOFENCE_ERROR_INVALID_TRANSITION = -103; + private static final int GPS_GEOFENCE_ERROR_GENERIC = -149; + /** simpler wrapper for ProviderRequest + Worksource */ private static class GpsRequest { public ProviderRequest request; @@ -501,7 +513,7 @@ public class GpsLocationProvider implements LocationProviderInterface { LocationManager locManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); locManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, - 0, 0, new NetworkLocationListener(), mHandler.getLooper()); + 0, 0, new NetworkLocationListener(), mHandler.getLooper()); } }); } @@ -1405,6 +1417,62 @@ public class GpsLocationProvider implements LocationProviderInterface { } /** + * Helper method to construct a location object. + */ + private Location buildLocation( + int flags, + double latitude, + double longitude, + double altitude, + float speed, + float bearing, + float accuracy, + long timestamp) { + Location location = new Location(LocationManager.GPS_PROVIDER); + if((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) { + location.setLatitude(latitude); + location.setLongitude(longitude); + location.setTime(timestamp); + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + } + if((flags & LOCATION_HAS_ALTITUDE) == LOCATION_HAS_ALTITUDE) { + location.setAltitude(altitude); + } + if((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { + location.setSpeed(speed); + } + if((flags & LOCATION_HAS_BEARING) == LOCATION_HAS_BEARING) { + location.setBearing(bearing); + } + if((flags & LOCATION_HAS_ACCURACY) == LOCATION_HAS_ACCURACY) { + location.setAccuracy(accuracy); + } + return location; + } + + /** + * Converts the GPS HAL status to the internal Geofence Hardware status. + */ + private int getGeofenceStatus(int status) { + switch(status) { + case GPS_GEOFENCE_OPERATION_SUCCESS: + return GeofenceHardware.GEOFENCE_SUCCESS; + case GPS_GEOFENCE_ERROR_GENERIC: + return GeofenceHardware.GEOFENCE_FAILURE; + case GPS_GEOFENCE_ERROR_ID_EXISTS: + return GeofenceHardware.GEOFENCE_ERROR_ID_EXISTS; + case GPS_GEOFENCE_ERROR_INVALID_TRANSITION: + return GeofenceHardware.GEOFENCE_ERROR_INVALID_TRANSITION; + case GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES: + return GeofenceHardware.GEOFENCE_ERROR_TOO_MANY_GEOFENCES; + case GPS_GEOFENCE_ERROR_ID_UNKNOWN: + return GeofenceHardware.GEOFENCE_ERROR_ID_UNKNOWN; + default: + return -1; + } + } + + /** * Called from native to report GPS Geofence transition * All geofence callbacks are called on the same thread */ @@ -1414,8 +1482,22 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofenceTransition(geofenceId, flags, latitude, longitude, - altitude, speed, bearing, accuracy, timestamp, transition, transitionTimestamp); + Location location = buildLocation( + flags, + latitude, + longitude, + altitude, + speed, + bearing, + accuracy, + timestamp); + mGeofenceHardwareImpl.reportGeofenceTransition( + geofenceId, + location, + transition, + transitionTimestamp, + GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, + FusedBatchOptions.SourceTechnologies.GNSS); } /** @@ -1427,8 +1509,24 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofenceStatus(status, flags, latitude, longitude, altitude, - speed, bearing, accuracy, timestamp); + Location location = buildLocation( + flags, + latitude, + longitude, + altitude, + speed, + bearing, + accuracy, + timestamp); + int monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_UNAVAILABLE; + if(status == GPS_GEOFENCE_AVAILABLE) { + monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE; + } + mGeofenceHardwareImpl.reportGeofenceMonitorStatus( + GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE, + monitorStatus, + location, + FusedBatchOptions.SourceTechnologies.GNSS); } /** @@ -1438,7 +1536,7 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofenceAddStatus(geofenceId, status); + mGeofenceHardwareImpl.reportGeofenceAddStatus(geofenceId, getGeofenceStatus(status)); } /** @@ -1448,7 +1546,7 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofenceRemoveStatus(geofenceId, status); + mGeofenceHardwareImpl.reportGeofenceRemoveStatus(geofenceId, getGeofenceStatus(status)); } /** @@ -1458,7 +1556,7 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofencePauseStatus(geofenceId, status); + mGeofenceHardwareImpl.reportGeofencePauseStatus(geofenceId, getGeofenceStatus(status)); } /** @@ -1468,7 +1566,7 @@ public class GpsLocationProvider implements LocationProviderInterface { if (mGeofenceHardwareImpl == null) { mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext); } - mGeofenceHardwareImpl.reportGpsGeofenceResumeStatus(geofenceId, status); + mGeofenceHardwareImpl.reportGeofenceResumeStatus(geofenceId, getGeofenceStatus(status)); } //============================================================= diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 656080b..78c1c79 100755 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -1792,8 +1792,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } + @Override public int[] getPackageGids(String packageName) { - final boolean enforcedDefault = isPermissionEnforcedDefault(READ_EXTERNAL_STORAGE); // reader synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); @@ -1801,17 +1801,7 @@ public class PackageManagerService extends IPackageManager.Stub { Log.v(TAG, "getPackageGids" + packageName + ": " + p); if (p != null) { final PackageSetting ps = (PackageSetting)p.mExtras; - final SharedUserSetting suid = ps.sharedUser; - int[] gids = suid != null ? suid.gids : ps.gids; - - // include GIDs for any unenforced permissions - if (!isPermissionEnforcedLocked(READ_EXTERNAL_STORAGE, enforcedDefault)) { - final BasePermission basePerm = mSettings.mPermissions.get( - READ_EXTERNAL_STORAGE); - gids = appendInts(gids, basePerm.gids); - } - - return gids; + return ps.getGids(); } } // stupid thing to indicate an error. @@ -2132,7 +2122,6 @@ public class PackageManagerService extends IPackageManager.Stub { } public int checkPermission(String permName, String pkgName) { - final boolean enforcedDefault = isPermissionEnforcedDefault(permName); synchronized (mPackages) { PackageParser.Package p = mPackages.get(pkgName); if (p != null && p.mExtras != null) { @@ -2145,15 +2134,11 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.PERMISSION_GRANTED; } } - if (!isPermissionEnforcedLocked(permName, enforcedDefault)) { - return PackageManager.PERMISSION_GRANTED; - } } return PackageManager.PERMISSION_DENIED; } public int checkUidPermission(String permName, int uid) { - final boolean enforcedDefault = isPermissionEnforcedDefault(permName); synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj != null) { @@ -2167,9 +2152,6 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.PERMISSION_GRANTED; } } - if (!isPermissionEnforcedLocked(permName, enforcedDefault)) { - return PackageManager.PERMISSION_GRANTED; - } } return PackageManager.PERMISSION_DENIED; } @@ -11112,42 +11094,9 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + @Deprecated public boolean isPermissionEnforced(String permission) { - final boolean enforcedDefault = isPermissionEnforcedDefault(permission); - synchronized (mPackages) { - return isPermissionEnforcedLocked(permission, enforcedDefault); - } - } - - /** - * Check if given permission should be enforced by default. Should always be - * called outside of {@link #mPackages} lock. - */ - private boolean isPermissionEnforcedDefault(String permission) { - if (READ_EXTERNAL_STORAGE.equals(permission)) { - return android.provider.Settings.Global.getInt(mContext.getContentResolver(), - android.provider.Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 0) - != 0; - } else { - return true; - } - } - - /** - * Check if user has requested that given permission be enforced, using - * given default if undefined. - */ - private boolean isPermissionEnforcedLocked(String permission, boolean enforcedDefault) { - if (READ_EXTERNAL_STORAGE.equals(permission)) { - if (mSettings.mReadExternalStorageEnforced != null) { - return mSettings.mReadExternalStorageEnforced; - } else { - // User hasn't defined; fall back to secure default - return enforcedDefault; - } - } else { - return true; - } + return true; } public boolean isStorageLow() { diff --git a/services/java/com/android/server/pm/PackageSetting.java b/services/java/com/android/server/pm/PackageSetting.java index f7f0870..b6f9f5b 100644 --- a/services/java/com/android/server/pm/PackageSetting.java +++ b/services/java/com/android/server/pm/PackageSetting.java @@ -52,4 +52,8 @@ final class PackageSetting extends PackageSettingBase { + Integer.toHexString(System.identityHashCode(this)) + " " + name + "/" + appId + "}"; } -}
\ No newline at end of file + + public int[] getGids() { + return sharedUser != null ? sharedUser.gids : gids; + } +} diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index e78362b..e18202b 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -1385,9 +1385,10 @@ final class Settings { StringBuilder sb = new StringBuilder(); for (final PackageSetting pkg : mPackages.values()) { - ApplicationInfo ai = pkg.pkg.applicationInfo; - String dataPath = ai.dataDir; - boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + final ApplicationInfo ai = pkg.pkg.applicationInfo; + final String dataPath = ai.dataDir; + final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + final int[] gids = pkg.getGids(); // Avoid any application that has a space in its path // or that is handled by the system. @@ -1401,6 +1402,7 @@ final class Settings { // debugFlag - 0 or 1 if the package is debuggable. // dataPath - path to package's data path // seinfo - seinfo label for the app (assigned at install time) + // gids - supplementary gids this app launches with // // NOTE: We prefer not to expose all ApplicationInfo flags for now. // @@ -1417,6 +1419,16 @@ final class Settings { sb.append(dataPath); sb.append(" "); sb.append(ai.seinfo); + sb.append(" "); + if (gids != null && gids.length > 0) { + sb.append(gids[0]); + for (int i = 1; i < gids.length; i++) { + sb.append(","); + sb.append(gids[i]); + } + } else { + sb.append("none"); + } sb.append("\n"); str.write(sb.toString().getBytes()); } @@ -1425,6 +1437,7 @@ final class Settings { str.close(); journal.commit(); } catch (Exception e) { + Log.wtf(TAG, "Failed to write packages.list", e); IoUtils.closeQuietly(str); journal.rollback(); } diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java index 322de6c..5c68460 100644 --- a/services/java/com/android/server/print/RemotePrintService.java +++ b/services/java/com/android/server/print/RemotePrintService.java @@ -30,8 +30,6 @@ import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.UserHandle; -import android.print.IPrinterDiscoverySessionController; -import android.print.IPrinterDiscoverySessionObserver; import android.print.PrintJobInfo; import android.print.PrintManager; import android.print.PrinterId; @@ -79,6 +77,10 @@ final class RemotePrintService implements DeathRecipient { private boolean mDestroyed; + private boolean mAllPrintJobsHandled; + + private boolean mHasPrinterDiscoverySession; + public RemotePrintService(Context context, ComponentName componentName, int userId, RemotePrintSpooler spooler) { mContext = context; @@ -97,6 +99,8 @@ final class RemotePrintService implements DeathRecipient { private void handleDestroy() { throwIfDestroyed(); ensureUnbound(); + mAllPrintJobsHandled = false; + mHasPrinterDiscoverySession = false; mDestroyed = true; } @@ -110,17 +114,27 @@ final class RemotePrintService implements DeathRecipient { } private void handleBinderDied() { + mAllPrintJobsHandled = false; + mHasPrinterDiscoverySession = false; + mPendingCommands.clear(); ensureUnbound(); } private void handleOnAllPrintJobsHandled() { throwIfDestroyed(); + + mAllPrintJobsHandled = true; + if (isBound()) { if (DEBUG) { Slog.i(LOG_TAG, "[user: " + mUserId + "] handleOnAllPrintJobsHandled()"); } - // If bound and all the work is completed, then unbind. - ensureUnbound(); + + // If the service has a printer discovery session + // created we should not disconnect from it just yet. + if (!mHasPrinterDiscoverySession) { + ensureUnbound(); + } } } @@ -152,6 +166,9 @@ final class RemotePrintService implements DeathRecipient { private void handleOnPrintJobQueued(final PrintJobInfo printJob) { throwIfDestroyed(); + + mAllPrintJobsHandled = false; + if (!isBound()) { ensureBound(); mPendingCommands.add(new Runnable() { @@ -172,20 +189,18 @@ final class RemotePrintService implements DeathRecipient { } } - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { - mHandler.obtainMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION, - observer).sendToTarget(); + public void createPrinterDiscoverySession() { + mHandler.sendEmptyMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION); } - private void handleCreatePrinterDiscoverySession( - final IPrinterDiscoverySessionObserver observer) { + private void handleCreatePrinterDiscoverySession() { throwIfDestroyed(); if (!isBound()) { ensureBound(); mPendingCommands.add(new Runnable() { @Override public void run() { - handleCreatePrinterDiscoverySession(observer); + handleCreatePrinterDiscoverySession(); } }); } else { @@ -193,9 +208,126 @@ final class RemotePrintService implements DeathRecipient { Slog.i(LOG_TAG, "[user: " + mUserId + "] createPrinterDiscoverySession()"); } try { - mPrintService.createPrinterDiscoverySession(observer); + mPrintService.createPrinterDiscoverySession(); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error creating printer dicovery session.", re); + } + + mHasPrinterDiscoverySession = true; + } + } + + public void destroyPrinterDiscoverySession() { + mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY_PRINTER_DISCOVERY_SESSION); + } + + private void handleDestroyPrinterDiscoverySession() { + throwIfDestroyed(); + if (!isBound()) { + ensureBound(); + mPendingCommands.add(new Runnable() { + @Override + public void run() { + handleDestroyPrinterDiscoverySession(); + } + }); + } else { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserId + "] destroyPrinterDiscoverySession()"); + } + + mHasPrinterDiscoverySession = false; + + try { + mPrintService.destroyPrinterDiscoverySession(); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error destroying printer dicovery session.", re); + } + + // If the service has no print jobs and no active discovery + // session anymore we should disconnect from it. + if (mAllPrintJobsHandled) { + ensureUnbound(); + } + } + } + + public void startPrinterDiscovery(List<PrinterId> priorityList) { + mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_DISCOVERY, + priorityList).sendToTarget(); + } + + private void handleStartPrinterDiscovery(final List<PrinterId> priorityList) { + throwIfDestroyed(); + if (!isBound()) { + ensureBound(); + mPendingCommands.add(new Runnable() { + @Override + public void run() { + handleStartPrinterDiscovery(priorityList); + } + }); + } else { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserId + "] startPrinterDiscovery()"); + } + try { + mPrintService.startPrinterDiscovery(priorityList); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error starting printer dicovery.", re); + } + } + } + + public void stopPrinterDiscovery() { + mHandler.sendEmptyMessage(MyHandler.MSG_STOP_PRINTER_DISCOVERY); + } + + private void handleStopPrinterDiscovery() { + throwIfDestroyed(); + if (!isBound()) { + ensureBound(); + mPendingCommands.add(new Runnable() { + @Override + public void run() { + handleStopPrinterDiscovery(); + } + }); + } else { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserId + "] stopPrinterDiscovery()"); + } + try { + mPrintService.stopPrinterDiscovery(); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error stopping printer dicovery.", re); + } + } + } + + public void requestPrinterUpdate(PrinterId printerId) { + mHandler.obtainMessage(MyHandler.MSG_REQUEST_PRINTER_UPDATE, + printerId).sendToTarget(); + } + + private void handleRequestPrinterUpdate(final PrinterId printerId) { + throwIfDestroyed(); + if (!isBound()) { + ensureBound(); + mPendingCommands.add(new Runnable() { + @Override + public void run() { + handleRequestPrinterUpdate(printerId); + } + }); + } else { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserId + "] requestPrinterUpdate()"); + } + try { + mPrintService.requestPrinterUpdate(printerId); } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error announcing start printer dicovery.", re); + Slog.e(LOG_TAG, "Error requesting a printer update.", re); } } } @@ -278,20 +410,47 @@ final class RemotePrintService implements DeathRecipient { } private final class MyHandler extends Handler { - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 1; - public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 2; - public static final int MSG_ON_PRINT_JOB_QUEUED = 3; - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 4; - public static final int MSG_DESTROY = 6; - public static final int MSG_BINDER_DIED = 7; + public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1; + public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2; + public static final int MSG_START_PRINTER_DISCOVERY = 3; + public static final int MSG_STOP_PRINTER_DISCOVERY = 4; + public static final int MSG_REQUEST_PRINTER_UPDATE = 5; + public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 6; + public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 7; + public static final int MSG_ON_PRINT_JOB_QUEUED = 8; + public static final int MSG_DESTROY = 9; + public static final int MSG_BINDER_DIED = 10; public MyHandler(Looper looper) { super(looper, null, false); } @Override + @SuppressWarnings("unchecked") public void handleMessage(Message message) { switch (message.what) { + case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { + handleCreatePrinterDiscoverySession(); + } break; + + case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: { + handleDestroyPrinterDiscoverySession(); + } break; + + case MSG_START_PRINTER_DISCOVERY: { + List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj; + handleStartPrinterDiscovery(priorityList); + } break; + + case MSG_STOP_PRINTER_DISCOVERY: { + handleStopPrinterDiscovery(); + } break; + + case MSG_REQUEST_PRINTER_UPDATE: { + PrinterId printerId = (PrinterId) message.obj; + handleRequestPrinterUpdate(printerId); + } break; + case MSG_ON_ALL_PRINT_JOBS_HANDLED: { handleOnAllPrintJobsHandled(); } break; @@ -306,13 +465,6 @@ final class RemotePrintService implements DeathRecipient { handleOnPrintJobQueued(printJob); } break; - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { - IPrinterDiscoverySessionObserver observer = - (IPrinterDiscoverySessionObserver) message.obj; - handleCreatePrinterDiscoverySession(new SecurePrinterDiscoverySessionObserver( - mComponentName, observer)); - } break; - case MSG_DESTROY: { handleDestroy(); } break; @@ -362,7 +514,7 @@ final class RemotePrintService implements DeathRecipient { } @Override - public boolean setPrintJobState(int printJobId, int state, CharSequence error) { + public boolean setPrintJobState(int printJobId, int state, String error) { RemotePrintService service = mWeakService.get(); if (service != null) { final long identity = Binder.clearCallingIdentity(); @@ -401,79 +553,70 @@ final class RemotePrintService implements DeathRecipient { } } } - } - - private static final class SecurePrinterDiscoverySessionObserver - extends IPrinterDiscoverySessionObserver.Stub { - private final ComponentName mComponentName; - - private final IPrinterDiscoverySessionObserver mDecoratedObsever; - - public SecurePrinterDiscoverySessionObserver(ComponentName componentName, - IPrinterDiscoverySessionObserver observer) { - mComponentName = componentName; - mDecoratedObsever = observer; - } @Override public void onPrintersAdded(List<PrinterInfo> printers) { - throwIfPrinterIdsForPrinterInfoTampered(printers); - try { - mDecoratedObsever.onPrintersAdded(printers); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error delegating to onPrintersAdded", re); - } - } - - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - throwIfPrinterIdsForPrinterInfoTampered(printers); - try { - mDecoratedObsever.onPrintersUpdated(printers); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error delegating to onPrintersUpdated.", re); + RemotePrintService service = mWeakService.get(); + if (service != null) { + throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers); + final long identity = Binder.clearCallingIdentity(); + try { + service.mSpooler.onPrintersAdded(printers); + } finally { + Binder.restoreCallingIdentity(identity); + } } } @Override public void onPrintersRemoved(List<PrinterId> printerIds) { - throwIfPrinterIdsTampered(printerIds); - try { - mDecoratedObsever.onPrintersRemoved(printerIds); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error delegating to onPrintersRemoved", re); + RemotePrintService service = mWeakService.get(); + if (service != null) { + throwIfPrinterIdsTampered(service.mComponentName, printerIds); + final long identity = Binder.clearCallingIdentity(); + try { + service.mSpooler.onPrintersRemoved(printerIds); + } finally { + Binder.restoreCallingIdentity(identity); + } } } @Override - public void setController(IPrinterDiscoverySessionController controller) { - try { - mDecoratedObsever.setController(controller); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error setting controller", re); + public void onPrintersUpdated(List<PrinterInfo> printers) { + RemotePrintService service = mWeakService.get(); + if (service != null) { + throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers); + final long identity = Binder.clearCallingIdentity(); + try { + service.mSpooler.onPrintersUpdated(printers); + } finally { + Binder.restoreCallingIdentity(identity); + } } } - private void throwIfPrinterIdsForPrinterInfoTampered( + private void throwIfPrinterIdsForPrinterInfoTampered(ComponentName serviceName, List<PrinterInfo> printerInfos) { final int printerInfoCount = printerInfos.size(); for (int i = 0; i < printerInfoCount; i++) { PrinterId printerId = printerInfos.get(i).getId(); - throwIfPrinterIdTampered(printerId); + throwIfPrinterIdTampered(serviceName, printerId); } } - private void throwIfPrinterIdsTampered(List<PrinterId> printerIds) { + private void throwIfPrinterIdsTampered(ComponentName serviceName, + List<PrinterId> printerIds) { final int printerIdCount = printerIds.size(); for (int i = 0; i < printerIdCount; i++) { PrinterId printerId = printerIds.get(i); - throwIfPrinterIdTampered(printerId); + throwIfPrinterIdTampered(serviceName, printerId); } } - private void throwIfPrinterIdTampered(PrinterId printerId) { + private void throwIfPrinterIdTampered(ComponentName serviceName, PrinterId printerId) { if (printerId == null || printerId.getServiceName() == null - || !printerId.getServiceName().equals(mComponentName)) { + || !printerId.getServiceName().equals(serviceName)) { throw new IllegalArgumentException("Invalid printer id: " + printerId); } } diff --git a/services/java/com/android/server/print/RemotePrintSpooler.java b/services/java/com/android/server/print/RemotePrintSpooler.java index c932e9b..d261288 100644 --- a/services/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/java/com/android/server/print/RemotePrintSpooler.java @@ -32,9 +32,10 @@ import android.print.IPrintDocumentAdapter; import android.print.IPrintSpooler; import android.print.IPrintSpoolerCallbacks; import android.print.IPrintSpoolerClient; -import android.print.IPrinterDiscoverySessionObserver; import android.print.PrintAttributes; import android.print.PrintJobInfo; +import android.print.PrinterId; +import android.print.PrinterInfo; import android.util.Slog; import android.util.TimedRemoteCaller; @@ -92,7 +93,11 @@ final class RemotePrintSpooler { public static interface PrintSpoolerCallbacks { public void onPrintJobQueued(PrintJobInfo printJob); public void onAllPrintJobsForServiceHandled(ComponentName printService); - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer); + public void createPrinterDiscoverySession(); + public void destroyPrinterDiscoverySession(); + public void startPrinterDiscovery(List<PrinterId> priorityList); + public void stopPrinterDiscovery(); + public void requestPrinterUpdate(PrinterId printerId); } public RemotePrintSpooler(Context context, int userId, @@ -209,7 +214,7 @@ final class RemotePrintSpooler { return null; } - public final boolean setPrintJobState(int printJobId, int state, CharSequence error) { + public final boolean setPrintJobState(int printJobId, int state, String error) { throwIfCalledOnMainThread(); synchronized (mLock) { throwIfDestroyedLocked(); @@ -300,6 +305,78 @@ final class RemotePrintSpooler { } } + public final void onPrintersAdded(List<PrinterInfo> printers) { + throwIfCalledOnMainThread(); + synchronized (mLock) { + throwIfDestroyedLocked(); + mCanUnbind = false; + } + try { + getRemoteInstanceLazy().onPrintersAdded(printers); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error adding printers.", re); + } catch (TimeoutException te) { + Slog.e(LOG_TAG, "Error adding printers.", te); + } finally { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + + "] onPrintersAdded()"); + } + synchronized (mLock) { + mCanUnbind = true; + mLock.notifyAll(); + } + } + } + + public final void onPrintersRemoved(List<PrinterId> printerIds) { + throwIfCalledOnMainThread(); + synchronized (mLock) { + throwIfDestroyedLocked(); + mCanUnbind = false; + } + try { + getRemoteInstanceLazy().onPrintersRemoved(printerIds); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error removing printers.", re); + } catch (TimeoutException te) { + Slog.e(LOG_TAG, "Error removing printers.", te); + } finally { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + + "] onPrintersRemoved()"); + } + synchronized (mLock) { + mCanUnbind = true; + mLock.notifyAll(); + } + } + } + + public final void onPrintersUpdated(List<PrinterInfo> printers) { + throwIfCalledOnMainThread(); + synchronized (mLock) { + throwIfDestroyedLocked(); + mCanUnbind = false; + } + try { + getRemoteInstanceLazy().onPrintersUpdated(printers); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error updating printers.", re); + } catch (TimeoutException te) { + Slog.e(LOG_TAG, "Error updating printers.", te); + } finally { + if (DEBUG) { + Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + + "] onPrintersUpdted()"); + } + synchronized (mLock) { + mCanUnbind = true; + mLock.notifyAll(); + } + } + } + private IPrintSpooler getRemoteInstanceLazy() throws TimeoutException { synchronized (mLock) { if (mRemoteInstance != null) { @@ -488,7 +565,7 @@ final class RemotePrintSpooler { } public boolean setPrintJobState(IPrintSpooler target, int printJobId, - int status, CharSequence error) throws RemoteException, TimeoutException { + int status, String error) throws RemoteException, TimeoutException { final int sequence = onBeforeRemoteCall(); target.setPrintJobState(printJobId, status, error, mCallback, sequence); return getResultTimed(sequence); @@ -597,12 +674,64 @@ final class RemotePrintSpooler { } @Override - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { + public void createPrinterDiscoverySession() { + RemotePrintSpooler spooler = mWeakSpooler.get(); + if (spooler != null) { + final long identity = Binder.clearCallingIdentity(); + try { + spooler.mCallbacks.createPrinterDiscoverySession(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } + + @Override + public void destroyPrinterDiscoverySession() { + RemotePrintSpooler spooler = mWeakSpooler.get(); + if (spooler != null) { + final long identity = Binder.clearCallingIdentity(); + try { + spooler.mCallbacks.destroyPrinterDiscoverySession(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } + + @Override + public void startPrinterDiscovery(List<PrinterId> priorityList) { + RemotePrintSpooler spooler = mWeakSpooler.get(); + if (spooler != null) { + final long identity = Binder.clearCallingIdentity(); + try { + spooler.mCallbacks.startPrinterDiscovery(priorityList); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } + + @Override + public void stopPrinterDiscovery() { + RemotePrintSpooler spooler = mWeakSpooler.get(); + if (spooler != null) { + final long identity = Binder.clearCallingIdentity(); + try { + spooler.mCallbacks.stopPrinterDiscovery(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } + + @Override + public void requestPrinterUpdate(PrinterId printerId) { RemotePrintSpooler spooler = mWeakSpooler.get(); if (spooler != null) { final long identity = Binder.clearCallingIdentity(); try { - spooler.mCallbacks.createPrinterDiscoverySession(observer); + spooler.mCallbacks.requestPrinterUpdate(printerId); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index ffcc9c3..9d7cfdd 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -21,8 +21,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.print.IPrinterDiscoverySessionObserver; import android.print.PrintJobInfo; +import android.print.PrinterId; import android.printservice.PrintServiceInfo; import android.provider.Settings; import android.text.TextUtils; @@ -105,7 +105,7 @@ final class UserState implements PrintSpoolerCallbacks { } @Override - public void createPrinterDiscoverySession(IPrinterDiscoverySessionObserver observer) { + public void createPrinterDiscoverySession() { final List<RemotePrintService> services; synchronized (mLock) { throwIfDestroyedLocked(); @@ -117,7 +117,73 @@ final class UserState implements PrintSpoolerCallbacks { final int serviceCount = services.size(); for (int i = 0; i < serviceCount; i++) { RemotePrintService service = services.get(i); - service.createPrinterDiscoverySession(observer); + service.createPrinterDiscoverySession(); + } + } + + @Override + public void destroyPrinterDiscoverySession() { + final List<RemotePrintService> services; + synchronized (mLock) { + throwIfDestroyedLocked(); + if (mActiveServices.isEmpty()) { + return; + } + services = new ArrayList<RemotePrintService>(mActiveServices.values()); + } + final int serviceCount = services.size(); + for (int i = 0; i < serviceCount; i++) { + RemotePrintService service = services.get(i); + service.destroyPrinterDiscoverySession(); + } + } + + @Override + public void startPrinterDiscovery(List<PrinterId> printerIds) { + final List<RemotePrintService> services; + synchronized (mLock) { + throwIfDestroyedLocked(); + if (mActiveServices.isEmpty()) { + return; + } + services = new ArrayList<RemotePrintService>(mActiveServices.values()); + } + final int serviceCount = services.size(); + for (int i = 0; i < serviceCount; i++) { + RemotePrintService service = services.get(i); + service.startPrinterDiscovery(printerIds); + } + } + + @Override + public void stopPrinterDiscovery() { + final List<RemotePrintService> services; + synchronized (mLock) { + throwIfDestroyedLocked(); + if (mActiveServices.isEmpty()) { + return; + } + services = new ArrayList<RemotePrintService>(mActiveServices.values()); + } + final int serviceCount = services.size(); + for (int i = 0; i < serviceCount; i++) { + RemotePrintService service = services.get(i); + service.stopPrinterDiscovery(); + } + } + + @Override + public void requestPrinterUpdate(PrinterId printerId) { + final RemotePrintService service; + synchronized (mLock) { + throwIfDestroyedLocked(); + if (mActiveServices.isEmpty()) { + return; + } + service = mActiveServices.get(printerId.getServiceName()); + } + if (service != null) { + service.requestPrinterUpdate(printerId); } } diff --git a/services/java/com/android/server/wifi/WifiService.java b/services/java/com/android/server/wifi/WifiService.java index 6e0e055..c215f40 100644 --- a/services/java/com/android/server/wifi/WifiService.java +++ b/services/java/com/android/server/wifi/WifiService.java @@ -25,18 +25,20 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.database.ContentObserver; +import android.net.DhcpInfo; +import android.net.DhcpResults; +import android.net.LinkAddress; +import android.net.NetworkUtils; +import android.net.RouteInfo; import android.net.wifi.IWifiManager; import android.net.wifi.ScanResult; +import android.net.wifi.BatchedScanResult; +import android.net.wifi.BatchedScanSettings; +import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiStateMachine; -import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiWatchdogStateMachine; -import android.net.DhcpInfo; -import android.net.DhcpResults; -import android.net.LinkAddress; -import android.net.NetworkUtils; -import android.net.RouteInfo; import android.os.Binder; import android.os.Handler; import android.os.Messenger; @@ -63,6 +65,7 @@ import java.io.PrintWriter; import java.net.InetAddress; import java.net.Inet4Address; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -121,6 +124,8 @@ public final class WifiService extends IWifiManager.Stub { /* Tracks the persisted states for wi-fi & airplane mode */ final WifiSettingsStore mSettingsStore; + final boolean mBatchedScanSupported; + /** * Asynchronous channel to WifiStateMachine */ @@ -246,6 +251,9 @@ public final class WifiService extends IWifiManager.Stub { mWifiController = new WifiController(mContext, this, wifiThread.getLooper()); mWifiController.start(); + mBatchedScanSupported = mContext.getResources().getBoolean( + R.bool.config_wifi_batched_scan_supported); + registerForScanModeChange(); mContext.registerReceiver( new BroadcastReceiver() { @@ -314,6 +322,148 @@ public final class WifiService extends IWifiManager.Stub { mWifiStateMachine.startScan(Binder.getCallingUid(), workSource); } + private class BatchedScanRequest extends DeathRecipient { + BatchedScanSettings settings; + int uid; + + BatchedScanRequest(BatchedScanSettings settings, IBinder binder, int uid) { + super(0, null, binder, null); + this.settings = settings; + this.uid = uid; + } + public void binderDied() { + stopBatchedScan(settings, mBinder); + } + public String toString() { + return "BatchedScanRequest{settings=" + settings + ", binder=" + mBinder + "}"; + } + } + + private final List<BatchedScanRequest> mBatchedScanners = new ArrayList<BatchedScanRequest>(); + + public boolean isBatchedScanSupported() { + return mBatchedScanSupported; + } + + public void pollBatchedScan() { + enforceChangePermission(); + if (mBatchedScanSupported == false) return; + mWifiStateMachine.requestBatchedScanPoll(); + } + + /** + * see {@link android.net.wifi.WifiManager#requestBatchedScan()} + */ + public boolean requestBatchedScan(BatchedScanSettings requested, IBinder binder) { + enforceChangePermission(); + if (mBatchedScanSupported == false) return false; + requested = new BatchedScanSettings(requested); + if (requested.isInvalid()) return false; + BatchedScanRequest r = new BatchedScanRequest(requested, binder, Binder.getCallingUid()); + synchronized(mBatchedScanners) { + mBatchedScanners.add(r); + resolveBatchedScannersLocked(); + } + return true; + } + + public List<BatchedScanResult> getBatchedScanResults(String callingPackage) { + enforceAccessPermission(); + if (mBatchedScanSupported == false) return new ArrayList<BatchedScanResult>(); + int userId = UserHandle.getCallingUserId(); + int uid = Binder.getCallingUid(); + long ident = Binder.clearCallingIdentity(); + try { + if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage) + != AppOpsManager.MODE_ALLOWED) { + return new ArrayList<BatchedScanResult>(); + } + int currentUser = ActivityManager.getCurrentUser(); + if (userId != currentUser) { + return new ArrayList<BatchedScanResult>(); + } else { + return mWifiStateMachine.syncGetBatchedScanResultsList(); + } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + + public void stopBatchedScan(BatchedScanSettings settings, IBinder binder) { + enforceChangePermission(); + if (mBatchedScanSupported == false) return; + synchronized(mBatchedScanners) { + BatchedScanRequest found = null; + for (BatchedScanRequest r : mBatchedScanners) { + if (r.mBinder.equals(binder) && r.settings.equals(settings)) { + found = r; + break; + } + } + if (found != null) { + mBatchedScanners.remove(found); + resolveBatchedScannersLocked(); + } + } + } + + private void resolveBatchedScannersLocked() { + BatchedScanSettings setting = new BatchedScanSettings(); + setting.scanIntervalSec = BatchedScanSettings.DEFAULT_INTERVAL_SEC; + int responsibleUid = 0; + setting.channelSet = new ArrayList<String>(); + + if (mBatchedScanners.size() == 0) { + mWifiStateMachine.setBatchedScanSettings(null, 0); + return; + } + + for (BatchedScanRequest r : mBatchedScanners) { + BatchedScanSettings s = r.settings; + if (s.maxScansPerBatch != BatchedScanSettings.UNSPECIFIED && + s.maxScansPerBatch < setting.maxScansPerBatch) { + setting.maxScansPerBatch = s.maxScansPerBatch; + responsibleUid = r.uid; + } + if (s.maxApPerScan != BatchedScanSettings.UNSPECIFIED && + s.maxApPerScan > setting.maxApPerScan) { + setting.maxApPerScan = s.maxApPerScan; + } + if (s.scanIntervalSec != BatchedScanSettings.UNSPECIFIED && + s.scanIntervalSec < setting.scanIntervalSec) { + setting.scanIntervalSec = s.scanIntervalSec; + responsibleUid = r.uid; + } + if (s.maxApForDistance != BatchedScanSettings.UNSPECIFIED && + s.maxApForDistance > setting.maxApForDistance) { + setting.maxApForDistance = s.maxApForDistance; + } + if (s.channelSet != null) { + for (String i : s.channelSet) { + if (setting.channelSet.contains(i) == false) setting.channelSet.add(i); + } + } + } + if (setting.channelSet.size() == 0) setting.channelSet = null; + if (setting.scanIntervalSec < BatchedScanSettings.MIN_INTERVAL_SEC) { + setting.scanIntervalSec = BatchedScanSettings.MIN_INTERVAL_SEC; + } + if (setting.maxScansPerBatch == BatchedScanSettings.UNSPECIFIED) { + setting.maxScansPerBatch = BatchedScanSettings.DEFAULT_SCANS_PER_BATCH; + } + if (setting.maxApPerScan == BatchedScanSettings.UNSPECIFIED) { + setting.maxApPerScan = BatchedScanSettings.DEFAULT_AP_PER_SCAN; + } + if (setting.scanIntervalSec == BatchedScanSettings.UNSPECIFIED) { + setting.scanIntervalSec = BatchedScanSettings.DEFAULT_INTERVAL_SEC; + } + if (setting.maxApForDistance == BatchedScanSettings.UNSPECIFIED) { + setting.maxApForDistance = BatchedScanSettings.DEFAULT_AP_FOR_DISTANCE; + } + mWifiStateMachine.setBatchedScanSettings(setting, responsibleUid); + } + private void enforceAccessPermission() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_WIFI_STATE, "WifiService"); @@ -569,11 +719,11 @@ public final class WifiService extends IWifiManager.Stub { int userId = UserHandle.getCallingUserId(); int uid = Binder.getCallingUid(); long ident = Binder.clearCallingIdentity(); - if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage) - != AppOpsManager.MODE_ALLOWED) { - return new ArrayList<ScanResult>(); - } try { + if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage) + != AppOpsManager.MODE_ALLOWED) { + return new ArrayList<ScanResult>(); + } int currentUser = ActivityManager.getCurrentUser(); if (userId != currentUser) { return new ArrayList<ScanResult>(); diff --git a/services/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/jni/com_android_server_location_FlpHardwareProvider.cpp index 48b86db..c871828 100644 --- a/services/jni/com_android_server_location_FlpHardwareProvider.cpp +++ b/services/jni/com_android_server_location_FlpHardwareProvider.cpp @@ -261,6 +261,75 @@ static void TranslateFromObject( } /* + * Helper function to unwrap Geofence structures from the Java Runtime calls. + */ +static void TranslateGeofenceFromGeofenceHardwareRequestParcelable( + JNIEnv* env, + jobject geofenceRequestObject, + Geofence& geofence) { + jclass geofenceRequestClass = env->GetObjectClass(geofenceRequestObject); + + jmethodID getId = env->GetMethodID(geofenceRequestClass, "getId", "()I"); + geofence.geofence_id = env->CallIntMethod(geofenceRequestObject, getId); + + jmethodID getType = env->GetMethodID(geofenceRequestClass, "getType", "()I"); + // this works because GeofenceHardwareRequest.java and fused_location.h have + // the same notion of geofence types + GeofenceType type = (GeofenceType)env->CallIntMethod(geofenceRequestObject, getType); + if(type != TYPE_CIRCLE) { + ThrowOnError(env, FLP_RESULT_ERROR, __FUNCTION__); + } + geofence.data->type = type; + GeofenceCircle& circle = geofence.data->geofence.circle; + + jmethodID getLatitude = env->GetMethodID( + geofenceRequestClass, + "getLatitude", + "()D"); + circle.latitude = env->CallDoubleMethod(geofenceRequestObject, getLatitude); + + jmethodID getLongitude = env->GetMethodID( + geofenceRequestClass, + "getLongitude", + "()D"); + circle.longitude = env->CallDoubleMethod(geofenceRequestObject, getLongitude); + + jmethodID getRadius = env->GetMethodID(geofenceRequestClass, "getRadius", "()D"); + circle.radius_m = env->CallDoubleMethod(geofenceRequestObject, getRadius); + + GeofenceOptions* options = geofence.options; + jmethodID getMonitorTransitions = env->GetMethodID( + geofenceRequestClass, + "getMonitorTransitions", + "()I"); + options->monitor_transitions = env->CallIntMethod( + geofenceRequestObject, + getMonitorTransitions); + + jmethodID getUnknownTimer = env->GetMethodID( + geofenceRequestClass, + "getUnknownTimer", + "()I"); + options->unknown_timer_ms = env->CallIntMethod(geofenceRequestObject, getUnknownTimer); + + jmethodID getNotificationResponsiveness = env->GetMethodID( + geofenceRequestClass, + "getNotificationResponsiveness", + "()D"); + options->notification_responsivenes_ms = env->CallIntMethod( + geofenceRequestObject, + getNotificationResponsiveness); + + jmethodID getLastTransition = env->GetMethodID( + geofenceRequestClass, + "getLastTransition", + "()I"); + options->last_transition = env->CallIntMethod(geofenceRequestObject, getLastTransition); + + // TODO: set data.sources_to_use when available +} + +/* * Helper function to transform FlpLocation into a java object. */ static void TranslateToObject(const FlpLocation* location, jobject& locationObject) { @@ -559,7 +628,7 @@ static void Init(JNIEnv* env, jobject obj) { } err = module->methods->open( - module, + module, FUSED_LOCATION_HARDWARE_MODULE_ID, &sHardwareDevice); if(err != 0) { ALOGE("Error opening device '%s': %d", FUSED_LOCATION_HARDWARE_MODULE_ID, err); @@ -749,10 +818,9 @@ static jboolean IsGeofencingSupported() { static void AddGeofences( JNIEnv* env, jobject object, - jintArray geofenceIdsArray, - jobjectArray geofencesArray) { - if(geofencesArray == NULL) { - ALOGE("Invalid Geofences to add: %p", geofencesArray); + jobjectArray geofenceRequestsArray) { + if(geofenceRequestsArray == NULL) { + ALOGE("Invalid Geofences to add: %p", geofenceRequestsArray); ThrowOnError(env, FLP_RESULT_ERROR, __FUNCTION__); } @@ -760,23 +828,32 @@ static void AddGeofences( ThrowOnError(env, FLP_RESULT_ERROR, __FUNCTION__); } - jint geofencesCount = env->GetArrayLength(geofenceIdsArray); - Geofence* geofences = new Geofence[geofencesCount]; + jint geofenceRequestsCount = env->GetArrayLength(geofenceRequestsArray); + if(geofenceRequestsCount == 0) { + return; + } + + Geofence* geofences = new Geofence[geofenceRequestsCount]; if (geofences == NULL) { ThrowOnError(env, FLP_RESULT_INSUFFICIENT_MEMORY, __FUNCTION__); } - jint* ids = env->GetIntArrayElements(geofenceIdsArray, /* isCopy */ NULL); - for (int i = 0; i < geofencesCount; ++i) { - geofences[i].geofence_id = ids[i]; + for (int i = 0; i < geofenceRequestsCount; ++i) { + geofences[i].data = new GeofenceData(); + geofences[i].options = new GeofenceOptions(); + jobject geofenceObject = env->GetObjectArrayElement(geofenceRequestsArray, i); - // TODO: fill in the GeofenceData - - // TODO: fill in the GeofenceOptions + TranslateGeofenceFromGeofenceHardwareRequestParcelable(env, geofenceObject, geofences[i]); } - sFlpGeofencingInterface->add_geofences(geofencesCount, &geofences); - if (geofences != NULL) delete[] geofences; + sFlpGeofencingInterface->add_geofences(geofenceRequestsCount, &geofences); + if (geofences != NULL) { + for(int i = 0; i < geofenceRequestsCount; ++i) { + delete geofences[i].data; + delete geofences[i].options; + } + delete[] geofences; + } } static void PauseGeofence(JNIEnv* env, jobject object, jint geofenceId) { @@ -847,41 +924,41 @@ static JNINativeMethod sMethods[] = { {"nativeCleanup", "()V", reinterpret_cast<void*>(Cleanup)}, {"nativeIsSupported", "()Z", reinterpret_cast<void*>(IsSupported)}, {"nativeGetBatchSize", "()I", reinterpret_cast<void*>(GetBatchSize)}, - {"nativeStartBatching", - "(ILandroid/location/FusedBatchOptions;)V", + {"nativeStartBatching", + "(ILandroid/location/FusedBatchOptions;)V", reinterpret_cast<void*>(StartBatching)}, - {"nativeUpdateBatchingOptions", - "(ILandroid/location/FusedBatchOptions;)V", + {"nativeUpdateBatchingOptions", + "(ILandroid/location/FusedBatchOptions;)V", reinterpret_cast<void*>(UpdateBatchingOptions)}, {"nativeStopBatching", "(I)V", reinterpret_cast<void*>(StopBatching)}, - {"nativeRequestBatchedLocation", - "(I)V", + {"nativeRequestBatchedLocation", + "(I)V", reinterpret_cast<void*>(GetBatchedLocation)}, - {"nativeInjectLocation", - "(Landroid/location/Location;)V", + {"nativeInjectLocation", + "(Landroid/location/Location;)V", reinterpret_cast<void*>(InjectLocation)}, - {"nativeIsDiagnosticSupported", - "()Z", + {"nativeIsDiagnosticSupported", + "()Z", reinterpret_cast<void*>(IsDiagnosticSupported)}, - {"nativeInjectDiagnosticData", - "(Ljava/lang/String;)V", + {"nativeInjectDiagnosticData", + "(Ljava/lang/String;)V", reinterpret_cast<void*>(InjectDiagnosticData)}, - {"nativeIsDeviceContextSupported", - "()Z", + {"nativeIsDeviceContextSupported", + "()Z", reinterpret_cast<void*>(IsDeviceContextSupported)}, - {"nativeInjectDeviceContext", - "(I)V", + {"nativeInjectDeviceContext", + "(I)V", reinterpret_cast<void*>(InjectDeviceContext)}, - {"nativeIsGeofencingSupported", - "()Z", + {"nativeIsGeofencingSupported", + "()Z", reinterpret_cast<void*>(IsGeofencingSupported)}, - {"nativeAddGeofences", - "([I[Landroid/location/Geofence;)V", + {"nativeAddGeofences", + "([Landroid/hardware/location/GeofenceHardwareRequestParcelable;)V", reinterpret_cast<void*>(AddGeofences)}, {"nativePauseGeofence", "(I)V", reinterpret_cast<void*>(PauseGeofence)}, {"nativeResumeGeofence", "(II)V", reinterpret_cast<void*>(ResumeGeofence)}, - {"nativeModifyGeofenceOption", - "(IIIIII)V", + {"nativeModifyGeofenceOption", + "(IIIIII)V", reinterpret_cast<void*>(ModifyGeofenceOption)}, {"nativeRemoveGeofences", "([I)V", reinterpret_cast<void*>(RemoveGeofences)} }; 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 dff6661..e44652f 100644 --- a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java +++ b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java @@ -67,7 +67,7 @@ public class SyncStorageEngineTest extends AndroidTestCase { /** * Test that we handle the case of a history row being old enough to purge before the - * correcponding sync is finished. This can happen if the clock changes while we are syncing. + * corresponding sync is finished. This can happen if the clock changes while we are syncing. * */ // TODO: this test causes AidlTest to fail. Omit for now @@ -104,6 +104,17 @@ public class SyncStorageEngineTest extends AndroidTestCase { engine.clearAndReadState(); assert(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)); + } /** diff --git a/wifi/java/android/net/wifi/BatchedScanResult.aidl b/wifi/java/android/net/wifi/BatchedScanResult.aidl new file mode 100644 index 0000000..a70bc0a --- /dev/null +++ b/wifi/java/android/net/wifi/BatchedScanResult.aidl @@ -0,0 +1,19 @@ +/** + * 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.wifi; + +parcelable BatchedScanResult; diff --git a/wifi/java/android/net/wifi/BatchedScanResult.java b/wifi/java/android/net/wifi/BatchedScanResult.java new file mode 100644 index 0000000..eb4e027 --- /dev/null +++ b/wifi/java/android/net/wifi/BatchedScanResult.java @@ -0,0 +1,94 @@ +/* + * 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.net.wifi; + +import android.os.Parcelable; +import android.os.Parcel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Describes the Results of a batched set of wifi scans where the firmware performs many + * scans and stores the timestamped results without waking the main processor each time. + * @hide pending review + */ +public class BatchedScanResult implements Parcelable { + private static final String TAG = "BatchedScanResult"; + + /** Inidcates this scan was interrupted and may only have partial results. */ + public boolean truncated; + + /** The result of this particular scan. */ + public final List<ScanResult> scanResults = new ArrayList<ScanResult>(); + + + public BatchedScanResult() { + } + + public BatchedScanResult(BatchedScanResult source) { + truncated = source.truncated; + for (ScanResult s : source.scanResults) scanResults.add(new ScanResult(s)); + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + + sb.append("BatchedScanResult: "). + append("truncated: ").append(String.valueOf(truncated)). + append("scanResults: ["); + for (ScanResult s : scanResults) { + sb.append(" <").append(s.toString()).append("> "); + } + sb.append(" ]"); + return sb.toString(); + } + + /** Implement the Parcelable interface {@hide} */ + public int describeContents() { + return 0; + } + + /** Implement the Parcelable interface {@hide} */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(truncated ? 1 : 0); + dest.writeInt(scanResults.size()); + for (ScanResult s : scanResults) { + s.writeToParcel(dest, flags); + } + } + + /** Implement the Parcelable interface {@hide} */ + public static final Creator<BatchedScanResult> CREATOR = + new Creator<BatchedScanResult>() { + public BatchedScanResult createFromParcel(Parcel in) { + BatchedScanResult result = new BatchedScanResult(); + result.truncated = (in.readInt() == 1); + int count = in.readInt(); + while (count-- > 0) { + result.scanResults.add(ScanResult.CREATOR.createFromParcel(in)); + } + return result; + } + + public BatchedScanResult[] newArray(int size) { + return new BatchedScanResult[size]; + } + }; +} diff --git a/wifi/java/android/net/wifi/BatchedScanSettings.aidl b/wifi/java/android/net/wifi/BatchedScanSettings.aidl new file mode 100644 index 0000000..8cfc508 --- /dev/null +++ b/wifi/java/android/net/wifi/BatchedScanSettings.aidl @@ -0,0 +1,19 @@ +/** + * 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.wifi; + +parcelable BatchedScanSettings; diff --git a/wifi/java/android/net/wifi/BatchedScanSettings.java b/wifi/java/android/net/wifi/BatchedScanSettings.java new file mode 100644 index 0000000..44a2ab4 --- /dev/null +++ b/wifi/java/android/net/wifi/BatchedScanSettings.java @@ -0,0 +1,227 @@ +/* + * 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.net.wifi; + +import android.os.Parcelable; +import android.os.Parcel; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * Describes the settings for batched wifi scans where the firmware performs many + * scans and stores the timestamped results without waking the main processor each time. + * This can give information over time with minimal battery impact. + * @hide pending review + */ +public class BatchedScanSettings implements Parcelable { + private static final String TAG = "BatchedScanSettings"; + + /** Used to indicate no preference for an int value */ + public final static int UNSPECIFIED = Integer.MAX_VALUE; + + // TODO - make MIN/mAX dynamic and gservices adjustable. + public final static int MIN_SCANS_PER_BATCH = 2; + public final static int MAX_SCANS_PER_BATCH = 255; + public final static int DEFAULT_SCANS_PER_BATCH = MAX_SCANS_PER_BATCH; + + public final static int MIN_AP_PER_SCAN = 2; + public final static int MAX_AP_PER_SCAN = 255; + public final static int DEFAULT_AP_PER_SCAN = 16; + + public final static int MIN_INTERVAL_SEC = 0; + public final static int MAX_INTERVAL_SEC = 3600; + public final static int DEFAULT_INTERVAL_SEC = 30; + + public final static int MIN_AP_FOR_DISTANCE = 0; + public final static int MAX_AP_FOR_DISTANCE = MAX_AP_PER_SCAN; + public final static int DEFAULT_AP_FOR_DISTANCE = 0; + + public final static int MAX_WIFI_CHANNEL = 196; + + /** The expected number of scans per batch. Note that the firmware may drop scans + * leading to fewer scans during the normal batch scan duration. This value need not + * be specified (may be set to {@link UNSPECIFIED}) by the application and we will try + * to scan as many times as the firmware can support. If another app requests fewer + * scans per batch we will attempt to honor that. + */ + public int maxScansPerBatch; + + /** The maximum desired AP listed per scan. Fewer AP may be returned if that's all + * that the driver detected. If another application requests more AP per scan that + * will take precedence. The if more channels are detected than we request, the APs + * with the lowest signal strength will be dropped. + */ + public int maxApPerScan; + + /** The channels used in the scan. If all channels should be used, {@code null} may be + * specified. If another application requests more channels or all channels, that + * will take precedence. + */ + public Collection<String> channelSet; + + /** The time between the start of two sequential scans, in seconds. If another + * application requests more frequent scans, that will take precedence. If this + * value is less than the duration of a scan, the next scan should start immediately. + */ + public int scanIntervalSec; + + /** The number of the best (strongest signal) APs for which the firmware will + * attempt to get distance information (RTT). Not all firmware supports this + * feature, so it may be ignored. If another application requests a greater + * number, that will take precedence. + */ + public int maxApForDistance; + + public BatchedScanSettings() { + clear(); + } + + public void clear() { + maxScansPerBatch = UNSPECIFIED; + maxApPerScan = UNSPECIFIED; + channelSet = null; + scanIntervalSec = UNSPECIFIED; + maxApForDistance = UNSPECIFIED; + } + + public BatchedScanSettings(BatchedScanSettings source) { + maxScansPerBatch = source.maxScansPerBatch; + maxApPerScan = source.maxApPerScan; + if (source.channelSet != null) { + channelSet = new ArrayList(source.channelSet); + } + scanIntervalSec = source.scanIntervalSec; + maxApForDistance = source.maxApForDistance; + } + + private boolean channelSetIsValid() { + if (channelSet == null || channelSet.isEmpty()) return true; + for (String channel : channelSet) { + try { + int i = Integer.parseInt(channel); + if (i > 0 && i <= MAX_WIFI_CHANNEL) continue; + } catch (NumberFormatException e) {} + if (channel.equals("A") || channel.equals("B")) continue; + return false; + } + return true; + } + /** @hide */ + public boolean isInvalid() { + if (maxScansPerBatch != UNSPECIFIED && (maxScansPerBatch < MIN_SCANS_PER_BATCH || + maxScansPerBatch > MAX_SCANS_PER_BATCH)) return true; + if (maxApPerScan != UNSPECIFIED && (maxApPerScan < MIN_AP_PER_SCAN || + maxApPerScan > MAX_AP_PER_SCAN)) return true; + if (channelSetIsValid() == false) return true; + if (scanIntervalSec != UNSPECIFIED && (scanIntervalSec < MIN_INTERVAL_SEC || + scanIntervalSec > MAX_INTERVAL_SEC)) return true; + if (maxApForDistance != UNSPECIFIED && (maxApForDistance < MIN_AP_FOR_DISTANCE || + maxApForDistance > MAX_AP_FOR_DISTANCE)) return true; + return false; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BatchedScanSettings == false) return false; + BatchedScanSettings o = (BatchedScanSettings)obj; + if (maxScansPerBatch != o.maxScansPerBatch || + maxApPerScan != o.maxApPerScan || + scanIntervalSec != o.scanIntervalSec || + maxApForDistance != o.maxApForDistance) return false; + if (channelSet == null) { + return (o.channelSet == null); + } + return channelSet.equals(o.channelSet); + } + + @Override + public int hashCode() { + return maxScansPerBatch + + (maxApPerScan * 3) + + (scanIntervalSec * 5) + + (maxApForDistance * 7) + + (channelSet.hashCode() * 11); + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + String none = "<none>"; + + sb.append("BatchScanSettings [maxScansPerBatch: "). + append(maxScansPerBatch == UNSPECIFIED ? none : maxScansPerBatch). + append(", maxApPerScan: ").append(maxApPerScan == UNSPECIFIED? none : maxApPerScan). + append(", scanIntervalSec: "). + append(scanIntervalSec == UNSPECIFIED ? none : scanIntervalSec). + append(", maxApForDistance: "). + append(maxApForDistance == UNSPECIFIED ? none : maxApForDistance). + append(", channelSet: "); + if (channelSet == null) { + sb.append("ALL"); + } else { + sb.append("<"); + for (String channel : channelSet) { + sb.append(" " + channel); + } + sb.append(">"); + } + sb.append("]"); + return sb.toString(); + } + + /** Implement the Parcelable interface {@hide} */ + public int describeContents() { + return 0; + } + + /** Implement the Parcelable interface {@hide} */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(maxScansPerBatch); + dest.writeInt(maxApPerScan); + dest.writeInt(scanIntervalSec); + dest.writeInt(maxApForDistance); + dest.writeInt(channelSet == null ? 0 : channelSet.size()); + if (channelSet != null) { + for (String channel : channelSet) dest.writeString(channel); + } + } + + /** Implement the Parcelable interface {@hide} */ + public static final Creator<BatchedScanSettings> CREATOR = + new Creator<BatchedScanSettings>() { + public BatchedScanSettings createFromParcel(Parcel in) { + BatchedScanSettings settings = new BatchedScanSettings(); + settings.maxScansPerBatch = in.readInt(); + settings.maxApPerScan = in.readInt(); + settings.scanIntervalSec = in.readInt(); + settings.maxApForDistance = in.readInt(); + int channelCount = in.readInt(); + if (channelCount > 0) { + settings.channelSet = new ArrayList(channelCount); + while (channelCount-- > 0) { + settings.channelSet.add(in.readString()); + } + } + return settings; + } + + public BatchedScanSettings[] newArray(int size) { + return new BatchedScanSettings[size]; + } + }; +} diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 8103e84..4f68ca0 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -16,8 +16,10 @@ package android.net.wifi; -import android.net.wifi.WifiInfo; +import android.net.wifi.BatchedScanResult; +import android.net.wifi.BatchedScanSettings; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; import android.net.wifi.ScanResult; import android.net.DhcpInfo; @@ -114,5 +116,15 @@ interface IWifiManager void enableTdls(String remoteIPAddress, boolean enable); void enableTdlsWithMacAddress(String remoteMacAddress, boolean enable); + + boolean requestBatchedScan(in BatchedScanSettings requested, IBinder binder); + + void stopBatchedScan(in BatchedScanSettings requested, IBinder binder); + + List<BatchedScanResult> getBatchedScanResults(String callingPackage); + + boolean isBatchedScanSupported(); + + void pollBatchedScan(); } diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index 9977419..12729d2 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -54,7 +54,26 @@ public class ScanResult implements Parcelable { * Time Synchronization Function (tsf) timestamp in microseconds when * this result was last seen. */ - public long timestamp; + public long timestamp; + + /** + * The approximate distance to the AP in centimeter, if available. Else + * {@link UNSPECIFIED}. + * {@hide} + */ + public int distanceCm; + + /** + * The standard deviation of the distance to the AP, if available. + * Else {@link UNSPECIFIED}. + * {@hide} + */ + public int distanceSdCm; + + /** + * {@hide} + */ + public final static int UNSPECIFIED = -1; /** {@hide} */ public ScanResult(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency, @@ -66,8 +85,23 @@ public class ScanResult implements Parcelable { this.level = level; this.frequency = frequency; this.timestamp = tsf; + this.distanceCm = UNSPECIFIED; + this.distanceSdCm = UNSPECIFIED; } + /** {@hide} */ + public ScanResult(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency, + long tsf, int distCm, int distSdCm) { + this.wifiSsid = wifiSsid; + this.SSID = (wifiSsid != null) ? wifiSsid.toString() : WifiSsid.NONE; + this.BSSID = BSSID; + this.capabilities = caps; + this.level = level; + this.frequency = frequency; + this.timestamp = tsf; + this.distanceCm = distCm; + this.distanceSdCm = distSdCm; + } /** copy constructor {@hide} */ public ScanResult(ScanResult source) { @@ -79,6 +113,8 @@ public class ScanResult implements Parcelable { level = source.level; frequency = source.frequency; timestamp = source.timestamp; + distanceCm = source.distanceCm; + distanceSdCm = source.distanceSdCm; } } @@ -100,6 +136,11 @@ public class ScanResult implements Parcelable { append(", timestamp: "). append(timestamp); + sb.append(", distance: ").append((distanceCm != UNSPECIFIED ? distanceCm : "?")). + append("(cm)"); + sb.append(", distanceSd: ").append((distanceSdCm != UNSPECIFIED ? distanceSdCm : "?")). + append("(cm)"); + return sb.toString(); } @@ -121,6 +162,8 @@ public class ScanResult implements Parcelable { dest.writeInt(level); dest.writeInt(frequency); dest.writeLong(timestamp); + dest.writeInt(distanceCm); + dest.writeInt(distanceSdCm); } /** Implement the Parcelable interface {@hide} */ @@ -137,7 +180,9 @@ public class ScanResult implements Parcelable { in.readString(), in.readInt(), in.readInt(), - in.readLong() + in.readLong(), + in.readInt(), + in.readInt() ); } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 6793710..5f5d54f 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -35,6 +35,7 @@ import android.util.SparseArray; import java.net.InetAddress; import java.util.concurrent.CountDownLatch; +import com.android.internal.R; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; @@ -365,6 +366,14 @@ public class WifiManager { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; /** + * A batch of access point scans has been completed and the results areavailable. + * Call {@link #getBatchedScanResults()} to obtain the results. + * @hide pending review + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = + "android.net.wifi.BATCHED_RESULTS"; + /** * The RSSI (signal strength) has changed. * @see #EXTRA_NEW_RSSI */ @@ -778,6 +787,85 @@ public class WifiManager { } /** + * Request a batched scan for access points. To end your requested batched scan, + * call stopBatchedScan with the same Settings. + * + * If there are mulitple requests for batched scans, the more demanding settings will + * take precidence. + * + * @param requested {@link BatchedScanSettings} the scan settings requested. + * @return false on known error + * @hide + */ + public boolean requestBatchedScan(BatchedScanSettings requested) { + try { + return mService.requestBatchedScan(requested, new Binder()); + } catch (RemoteException e) { return false; } + } + + /** + * Check if the Batched Scan feature is supported. + * + * @return false if not supported. + * @hide + */ + public boolean isBatchedScanSupported() { + try { + return mService.isBatchedScanSupported(); + } catch (RemoteException e) { return false; } + } + + /** + * End a requested batch scan for this applicaiton. Note that batched scan may + * still occur if other apps are using them. + * @hide + */ + public void stopBatchedScan(BatchedScanSettings requested) { + try { + mService.stopBatchedScan(requested, new Binder()); + } catch (RemoteException e) {} + } + + /** + * Retrieve the latest batched scan result. This should be called immediately after + * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. + * @hide + */ + public List<BatchedScanResult> getBatchedScanResults() { + try { + return mService.getBatchedScanResults(mContext.getBasePackageName()); + } catch (RemoteException e) { + return null; + } + } + + /** + * Force a re-reading of batched scan results. This will attempt + * to read more information from the chip, but will do so at the expense + * of previous data. Rate limited to the current scan frequency. + * + * pollBatchedScan will always wait 1 period from the start of the batch + * before trying to read from the chip, so if your #scans/batch == 1 this will + * have no effect. + * + * If you had already waited 1 period before calling, this should have + * immediate (though async) effect. + * + * If you call before that 1 period is up this will set up a timer and fetch + * results when the 1 period is up. + * + * Servicing a pollBatchedScan request (immediate or after timed delay) starts a + * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you + * would get data in the 4th and then again 10 scans later. + * @hide + */ + public void pollBatchedScan() { + try { + mService.pollBatchedScan(); + } catch (RemoteException e) { } + } + + /** * Return dynamic information about the current Wi-Fi connection, if any is active. * @return the Wi-Fi information, contained in {@link WifiInfo}. */ @@ -1146,16 +1234,26 @@ public class WifiManager { /** - * Enable TDLS on a specific local route + * Enable/Disable TDLS on a specific local route. * - * This API is used by WiFi display, but eventually it can be made public, - * just depends on how popular TDLS gets + * <p> + * TDLS enables two wireless endpoints to talk to each other directly + * without going through the access point that is managing the local + * network. It saves bandwidth and improves quality of the link. + * </p> + * <p> + * This API enables/disables the option of using TDLS. If enabled, the + * underlying hardware is free to use TDLS or a hop through the access + * point. If disabled, existing TDLS session is torn down and + * hardware is restricted to use access point for transferring wireless + * packets. Default value for all routes is 'disabled', meaning restricted + * to use access point for transferring packets. + * </p> * * @param remoteIPAddress IP address of the endpoint to setup TDLS with * @param enable true = setup and false = tear down TDLS - * @hide */ - public void enableTdls(InetAddress remoteIPAddress, boolean enable) { + public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { try { mService.enableTdls(remoteIPAddress.getHostAddress(), enable); } catch (RemoteException e) { @@ -1164,16 +1262,12 @@ public class WifiManager { } /** - * Enable TDLS on a specific local route - * - * This API is used by WiFi display, but eventually it can be made public, - * just depends on how popular TDLS gets - * + * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except + * this version allows you to specify remote endpoint with a MAC address. * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab * @param enable true = setup and false = tear down TDLS - * @hide */ - public void enableTdlsWithMacAddress(String remoteMacAddress, boolean enable) { + public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { try { mService.enableTdlsWithMacAddress(remoteMacAddress, enable); } catch (RemoteException e) { diff --git a/wifi/java/android/net/wifi/WifiMonitor.java b/wifi/java/android/net/wifi/WifiMonitor.java index f6d5c98..a80238b 100644 --- a/wifi/java/android/net/wifi/WifiMonitor.java +++ b/wifi/java/android/net/wifi/WifiMonitor.java @@ -506,13 +506,14 @@ 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) { - String iface = eventStr.substring(7,space); + iface = eventStr.substring(7,space); m = mWifiMonitorSingleton.getMonitor(iface); if (m == null && iface.startsWith("p2p-")) { // p2p interfaces are created dynamically, but we have @@ -520,20 +521,20 @@ public class WifiMonitor { // for it explicitly, and send messages there .. m = mWifiMonitorSingleton.getMonitor("p2p0"); } - if (m != null) { - if (m.mMonitoring) { - mStateMachine = m.mWifiStateMachine; - eventStr = eventStr.substring(space + 1); - } - else { - if (DBG) Log.d(TAG, "Dropping event because monitor (" + iface + - ") is stopped"); - continue; - } - } - else { - eventStr = eventStr.substring(space + 1); - } + 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; } } diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index d30c7cf..c3ed03c 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -82,8 +82,13 @@ public class WifiNative { public WifiNative(String interfaceName) { mInterfaceName = interfaceName; - mInterfacePrefix = "IFNAME=" + interfaceName + " "; mTAG = "WifiNative-" + interfaceName; + if (!interfaceName.equals("p2p0")) { + mInterfacePrefix = "IFNAME=" + interfaceName + " "; + } else { + // commands for p2p0 interface don't need prefix + mInterfacePrefix = ""; + } } public boolean connectToSupplicant() { @@ -219,6 +224,42 @@ public class WifiNative { return doStringCommand("BSS RANGE=" + sid + "- MASK=0x21987"); } + /** + * Format of command + * DRIVER WLS_BATCHING SET SCAN_FRQ=x MSCAN=r BESTN=y CHANNEL=<z, w, t> RTT=s + * where x is an ascii representation of an integer number of seconds between scans + * r is an ascii representation of an integer number of scans per batch + * y is an ascii representation of an integer number of the max AP to remember per scan + * z, w, t represent a 1..n size list of channel numbers and/or 'A', 'B' values + * indicating entire ranges of channels + * s is an ascii representation of an integer number of highest-strength AP + * for which we'd like approximate distance reported + * + * The return value is an ascii integer representing a guess of the number of scans + * the firmware can remember before it runs out of buffer space or -1 on error + */ + public String setBatchedScanSettings(BatchedScanSettings settings) { + if (settings == null) return doStringCommand("DRIVER WLS_BATCHING STOP"); + String cmd = "DRIVER WLS_BATCHING SET SCAN_FRQ=" + settings.scanIntervalSec; + cmd += " MSCAN=" + settings.maxScansPerBatch; + if (settings.maxApPerScan != BatchedScanSettings.UNSPECIFIED) { + cmd += " BESTN=" + settings.maxApPerScan; + } + if (settings.channelSet != null && !settings.channelSet.isEmpty()) { + cmd += " CHANNEL=<"; + for (String channel : settings.channelSet) cmd += " " + channel; + cmd += ">"; + } + if (settings.maxApForDistance != BatchedScanSettings.UNSPECIFIED) { + cmd += " RTT=" + settings.maxApForDistance; + } + return doStringCommand(cmd); + } + + public String getBatchedScanResults() { + return doStringCommand("DRIVER WLS_BATCHING GET"); + } + public boolean startDriver() { return doBooleanCommand("DRIVER START"); } diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 1fcd609..8b7b8ae 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -123,6 +123,13 @@ public class WifiStateMachine extends StateMachine { private static final int SCAN_RESULT_CACHE_SIZE = 80; private final LruCache<String, ScanResult> mScanResultCache; + /* Batch scan results */ + private final List<BatchedScanResult> mBatchedScanResults = + new ArrayList<BatchedScanResult>(); + private int mBatchedScanOwnerUid = UNKNOWN_SCAN_SOURCE; + private int mExpectedBatchedScans = 0; + private long mBatchedScanMinPollTime = 0; + /* Chipset supports background scan */ private final boolean mBackgroundScanSupported; @@ -211,6 +218,7 @@ public class WifiStateMachine extends StateMachine { private AlarmManager mAlarmManager; private PendingIntent mScanIntent; private PendingIntent mDriverStopIntent; + private PendingIntent mBatchedScanIntervalIntent; /* Tracks current frequency mode */ private AtomicInteger mFrequencyBand = new AtomicInteger(WifiManager.WIFI_FREQUENCY_BAND_AUTO); @@ -356,6 +364,14 @@ public class WifiStateMachine extends StateMachine { public static final int CMD_BOOT_COMPLETED = BASE + 134; + /* change the batch scan settings. + * arg1 = responsible UID + * obj = the new settings + */ + public static final int CMD_SET_BATCHED_SCAN = BASE + 135; + public static final int CMD_START_NEXT_BATCHED_SCAN = BASE + 136; + public static final int CMD_POLL_BATCHED_SCAN = BASE + 137; + public static final int CONNECT_MODE = 1; public static final int SCAN_ONLY_MODE = 2; public static final int SCAN_ONLY_WITH_WIFI_OFF_MODE = 3; @@ -520,6 +536,8 @@ public class WifiStateMachine extends StateMachine { private static final String ACTION_DELAYED_DRIVER_STOP = "com.android.server.WifiManager.action.DELAYED_DRIVER_STOP"; + private static final String ACTION_REFRESH_BATCHED_SCAN = + "com.android.server.WifiManager.action.REFRESH_BATCHED_SCAN"; /** * Keep track of whether WIFI is running. */ @@ -542,6 +560,9 @@ public class WifiStateMachine extends StateMachine { private final IBatteryStats mBatteryStats; + private BatchedScanSettings mBatchedScanSettings = null; + + public WifiStateMachine(Context context, String wlanInterface) { super("WifiStateMachine"); mContext = context; @@ -577,6 +598,9 @@ public class WifiStateMachine extends StateMachine { Intent scanIntent = new Intent(ACTION_START_SCAN, null); mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); + Intent batchedIntent = new Intent(ACTION_REFRESH_BATCHED_SCAN, null); + mBatchedScanIntervalIntent = PendingIntent.getBroadcast(mContext, 0, batchedIntent, 0); + mDefaultFrameworkScanIntervalMs = mContext.getResources().getInteger( R.integer.config_wifi_framework_scan_interval); @@ -614,22 +638,25 @@ public class WifiStateMachine extends StateMachine { }, new IntentFilter(ACTION_START_SCAN)); - IntentFilter screenFilter = new IntentFilter(); - screenFilter.addAction(Intent.ACTION_SCREEN_ON); - screenFilter.addAction(Intent.ACTION_SCREEN_OFF); - BroadcastReceiver screenReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - - if (action.equals(Intent.ACTION_SCREEN_ON)) { - handleScreenStateChanged(true); - } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { - handleScreenStateChanged(false); - } - } - }; - mContext.registerReceiver(screenReceiver, screenFilter); + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(ACTION_REFRESH_BATCHED_SCAN); + mContext.registerReceiver( + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + + if (action.equals(Intent.ACTION_SCREEN_ON)) { + handleScreenStateChanged(true); + } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { + handleScreenStateChanged(false); + } else if (action.equals(ACTION_REFRESH_BATCHED_SCAN)) { + startNextBatchedScanAsync(); + } + } + }, filter); mContext.registerReceiver( new BroadcastReceiver() { @@ -738,6 +765,281 @@ public class WifiStateMachine extends StateMachine { sendMessage(CMD_START_SCAN, callingUid, 0, workSource); } + /** + * start or stop batched scanning using the given settings + */ + public void setBatchedScanSettings(BatchedScanSettings settings, int callingUid) { + sendMessage(CMD_SET_BATCHED_SCAN, callingUid, 0, settings); + } + + public List<BatchedScanResult> syncGetBatchedScanResultsList() { + synchronized (mBatchedScanResults) { + List<BatchedScanResult> batchedScanList = + new ArrayList<BatchedScanResult>(mBatchedScanResults.size()); + for(BatchedScanResult result: mBatchedScanResults) { + batchedScanList.add(new BatchedScanResult(result)); + } + return batchedScanList; + } + } + + public void requestBatchedScanPoll() { + sendMessage(CMD_POLL_BATCHED_SCAN); + } + + private void startBatchedScan() { + // first grab any existing data + retrieveBatchedScanData(); + + mAlarmManager.cancel(mBatchedScanIntervalIntent); + + String scansExpected = mWifiNative.setBatchedScanSettings(mBatchedScanSettings); + + try { + mExpectedBatchedScans = Integer.parseInt(scansExpected); + setNextBatchedAlarm(mExpectedBatchedScans); + } catch (NumberFormatException e) { + loge("Exception parsing WifiNative.setBatchedScanSettings response " + e); + } + } + + // called from BroadcastListener + private void startNextBatchedScanAsync() { + sendMessage(CMD_START_NEXT_BATCHED_SCAN); + } + + private void startNextBatchedScan() { + // first grab any existing data + retrieveBatchedScanData(); + + setNextBatchedAlarm(mExpectedBatchedScans); + } + + private void handleBatchedScanPollRequest() { + // if there is no appropriate PollTime that's because we either aren't + // batching or we've already set a time for a poll request + if (mBatchedScanMinPollTime == 0) return; + if (mBatchedScanSettings == null) return; + + long now = System.currentTimeMillis(); + + if (now > mBatchedScanMinPollTime) { + // do the poll and reset our timers + startNextBatchedScan(); + } else { + mAlarmManager.set(AlarmManager.RTC_WAKEUP, mBatchedScanMinPollTime, + mBatchedScanIntervalIntent); + mBatchedScanMinPollTime = 0; + } + } + + // return true if new/different + private boolean recordBatchedScanSettings(BatchedScanSettings settings) { + if (DBG) log("set batched scan to " + settings); + if (settings != null) { + // TODO - noteBatchedScanStart(message.arg1); + if (settings.equals(mBatchedScanSettings)) return false; + } else { + if (mBatchedScanSettings == null) return false; + // TODO - noteBatchedScanStop(message.arg1); + } + mBatchedScanSettings = settings; + return true; + } + + private void stopBatchedScan() { + mAlarmManager.cancel(mBatchedScanIntervalIntent); + retrieveBatchedScanData(); + mWifiNative.setBatchedScanSettings(null); + } + + private void setNextBatchedAlarm(int scansExpected) { + + if (mBatchedScanSettings == null || scansExpected < 1) return; + + mBatchedScanMinPollTime = System.currentTimeMillis() + + mBatchedScanSettings.scanIntervalSec * 1000; + + if (mBatchedScanSettings.maxScansPerBatch < scansExpected) { + scansExpected = mBatchedScanSettings.maxScansPerBatch; + } + + int secToFull = mBatchedScanSettings.scanIntervalSec; + secToFull *= scansExpected; + + int debugPeriod = SystemProperties.getInt("wifi.batchedScan.pollPeriod", 0); + if (debugPeriod > 0) secToFull = debugPeriod; + + // set the alarm to do the next poll. We set it a little short as we'd rather + // wake up wearly than miss a scan due to buffer overflow + mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + + ((secToFull - (mBatchedScanSettings.scanIntervalSec / 2)) * 1000), + mBatchedScanIntervalIntent); + } + + /** + * Start reading new scan data + * Data comes in as: + * "scancount=5\n" + * "nextcount=5\n" + * "apcount=3\n" + * "trunc\n" (optional) + * "bssid=...\n" + * "ssid=...\n" + * "freq=...\n" (in Mhz) + * "level=...\n" + * "dist=...\n" (in cm) + * "distsd=...\n" (standard deviation, in cm) + * "====" + * "bssid=...\n" + * etc + * "====" + * "bssid=...\n" + * etc + * "%%%%" + * "apcount=2\n" + * "bssid=...\n" + * etc + * "%%%% + * etc + * "----" + */ + private void retrieveBatchedScanData() { + String rawData = mWifiNative.getBatchedScanResults(); + mBatchedScanMinPollTime = 0; + if (rawData == null) { + loge("Unexpected null BatchedScanResults"); + return; + } + + int scanCount = 0; + final String END_OF_BATCHES = "----"; + final String SCANCOUNT = "scancount="; + final String TRUNCATED = "trunc"; + final String AGE = "age="; + final String DIST = "dist="; + final String DISTSD = "distsd="; + + String splitData[] = rawData.split("\n"); + int n = 0; + if (splitData[n].startsWith(SCANCOUNT)) { + try { + scanCount = Integer.parseInt(splitData[n++].substring(SCANCOUNT.length())); + } catch (NumberFormatException e) {} + } + if (scanCount == 0) { + loge("scanCount not found"); + return; + } + + final Intent intent = new Intent(WifiManager.BATCHED_SCAN_RESULTS_AVAILABLE_ACTION); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + + synchronized (mBatchedScanResults) { + mBatchedScanResults.clear(); + BatchedScanResult batchedScanResult = new BatchedScanResult(); + + String bssid = null; + WifiSsid wifiSsid = null; + int level = 0; + int freq = 0; + int dist, distSd; + long tsf = 0; + dist = distSd = ScanResult.UNSPECIFIED; + long now = System.currentTimeMillis(); + + while (true) { + while (n < splitData.length) { + if (splitData[n].equals(END_OF_BATCHES)) { + if (++n != splitData.length) { + loge("didn't consume " + (splitData.length-n)); + } + if (mBatchedScanResults.size() > 0) { + mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + } + return; + } + if ((splitData[n].equals(END_STR)) || splitData[n].equals(DELIMITER_STR)) { + if (bssid != null) { + batchedScanResult.scanResults.add(new ScanResult( + wifiSsid, bssid, "", level, freq, tsf, dist, distSd)); + wifiSsid = null; + bssid = null; + level = 0; + freq = 0; + tsf = 0; + dist = distSd = ScanResult.UNSPECIFIED; + } + if (splitData[n].equals(END_STR)) { + if (batchedScanResult.scanResults.size() != 0) { + mBatchedScanResults.add(batchedScanResult); + batchedScanResult = new BatchedScanResult(); + } else { + logd("Found empty batch"); + } + } + n++; + } else if (splitData[n].equals(BSSID_STR)) { + bssid = splitData[n++].substring(BSSID_STR.length()); + } else if (splitData[n].equals(FREQ_STR)) { + try { + freq = Integer.parseInt(splitData[n++].substring(FREQ_STR.length())); + } catch (NumberFormatException e) { + loge("Invalid freqency: " + splitData[n-1]); + freq = 0; + } + } else if (splitData[n].equals(AGE)) { + try { + tsf = now - Long.parseLong(splitData[n++].substring(AGE.length())); + } catch (NumberFormatException e) { + loge("Invalid timestamp: " + splitData[n-1]); + tsf = 0; + } + } else if (splitData[n].equals(SSID_STR)) { + wifiSsid = WifiSsid.createFromAsciiEncoded( + splitData[n++].substring(SSID_STR.length())); + } else if (splitData[n].equals(LEVEL_STR)) { + try { + level = Integer.parseInt(splitData[n++].substring(LEVEL_STR.length())); + if (level > 0) level -= 256; + } catch (NumberFormatException e) { + loge("Invalid level: " + splitData[n-1]); + level = 0; + } + } else if (splitData[n].equals(DIST)) { + try { + dist = Integer.parseInt(splitData[n++].substring(DIST.length())); + } catch (NumberFormatException e) { + loge("Invalid distance: " + splitData[n-1]); + dist = ScanResult.UNSPECIFIED; + } + } else if (splitData[n].equals(DISTSD)) { + try { + distSd = Integer.parseInt(splitData[n++].substring(DISTSD.length())); + } catch (NumberFormatException e) { + loge("Invalid distanceSd: " + splitData[n-1]); + distSd = ScanResult.UNSPECIFIED; + } + } + } + rawData = mWifiNative.getBatchedScanResults(); + if (rawData == null) { + loge("Unexpected null BatchedScanResults"); + return; + } + splitData = rawData.split("\n"); + if (splitData.length == 0 || splitData[0].equals("ok")) { + loge("batch scan results just ended!"); + if (mBatchedScanResults.size() > 0) { + mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + } + return; + } + n = 0; + } + } + } + // If workSource is not null, blame is given to it, otherwise blame is given to callingUid. private void noteScanStart(int callingUid, WorkSource workSource) { if (mScanWorkSource == null && (callingUid != UNKNOWN_SCAN_SOURCE || workSource != null)) { @@ -1979,6 +2281,14 @@ public class WifiStateMachine extends StateMachine { sendMessageAtFrontOfQueue(CMD_SET_COUNTRY_CODE, countryCode); } break; + case CMD_SET_BATCHED_SCAN: + recordBatchedScanSettings((BatchedScanSettings)message.obj); + break; + case CMD_POLL_BATCHED_SCAN: + handleBatchedScanPollRequest(); + case CMD_START_NEXT_BATCHED_SCAN: + startNextBatchedScan(); + break; /* Discard */ case CMD_START_SCAN: case CMD_START_SUPPLICANT: @@ -2470,6 +2780,10 @@ public class WifiStateMachine extends StateMachine { mWifiNative.stopFilteringMulticastV4Packets(); } + if (mBatchedScanSettings != null) { + startBatchedScan(); + } + if (mOperationalMode != CONNECT_MODE) { mWifiNative.disconnect(); transitionTo(mScanModeState); @@ -2511,6 +2825,10 @@ public class WifiStateMachine extends StateMachine { noteScanStart(message.arg1, (WorkSource) message.obj); startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP); break; + case CMD_SET_BATCHED_SCAN: + recordBatchedScanSettings((BatchedScanSettings)message.obj); + startBatchedScan(); + break; case CMD_SET_COUNTRY_CODE: String country = (String) message.obj; if (DBG) log("set country code " + country); @@ -2639,6 +2957,10 @@ public class WifiStateMachine extends StateMachine { updateBatteryWorkSource(null); mScanResults = new ArrayList<ScanResult>(); + if (mBatchedScanSettings != null) { + stopBatchedScan(); + } + final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); |