summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--api/current.txt110
-rw-r--r--api/removed.txt8
-rw-r--r--api/system-current.txt59
-rw-r--r--api/system-removed.txt8
-rw-r--r--core/java/android/alsa/AlsaCardsParser.java7
-rw-r--r--core/java/android/app/ActivityManager.java3
-rw-r--r--core/java/android/content/pm/ActivityInfo.java1
-rw-r--r--core/java/android/content/pm/LauncherActivityInfo.java40
-rw-r--r--core/java/android/content/pm/PackageParser.java8
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java44
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java13
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java13
-rw-r--r--core/java/android/hardware/camera2/DngCreator.java6
-rw-r--r--core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java58
-rw-r--r--core/java/android/net/SSLCertificateSocketFactory.java2
-rw-r--r--core/java/android/net/Uri.java9
-rw-r--r--core/java/android/os/IProcessInfoService.aidl29
-rw-r--r--core/java/android/print/PrintAttributes.java109
-rw-r--r--core/java/android/print/PrinterCapabilitiesInfo.java91
-rw-r--r--core/java/android/view/LayoutInflater.java47
-rw-r--r--core/java/android/view/View.java14
-rw-r--r--core/java/android/view/Window.java18
-rw-r--r--core/java/android/widget/AbsListView.java23
-rw-r--r--core/java/android/widget/PopupWindow.java48
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java2
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java76
-rw-r--r--core/jni/android_media_AudioSystem.cpp30
-rw-r--r--core/res/res/drawable-mdpi/ic_clear_mtrl_alpha.pngbin216 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.pngbin436 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.pngbin522 -> 0 bytes
-rw-r--r--core/res/res/drawable/ic_clear_material.xml13
-rw-r--r--core/res/res/drawable/scrubber_progress_horizontal_material.xml48
-rw-r--r--core/res/res/values-af/strings.xml3
-rw-r--r--core/res/res/values-am/strings.xml11
-rw-r--r--core/res/res/values-ar/strings.xml3
-rw-r--r--core/res/res/values-bg/strings.xml3
-rw-r--r--core/res/res/values-bn-rBD/strings.xml11
-rw-r--r--core/res/res/values-ca/strings.xml11
-rw-r--r--core/res/res/values-cs/strings.xml3
-rw-r--r--core/res/res/values-da/strings.xml11
-rw-r--r--core/res/res/values-de/strings.xml3
-rw-r--r--core/res/res/values-el/strings.xml13
-rw-r--r--core/res/res/values-en-rGB/strings.xml11
-rw-r--r--core/res/res/values-en-rIN/strings.xml11
-rw-r--r--core/res/res/values-es-rUS/strings.xml11
-rw-r--r--core/res/res/values-es/strings.xml3
-rw-r--r--core/res/res/values-et-rEE/strings.xml11
-rw-r--r--core/res/res/values-eu-rES/strings.xml15
-rw-r--r--core/res/res/values-fa/strings.xml3
-rw-r--r--core/res/res/values-fi/strings.xml11
-rw-r--r--core/res/res/values-fr-rCA/strings.xml3
-rw-r--r--core/res/res/values-fr/strings.xml3
-rw-r--r--core/res/res/values-gl-rES/strings.xml11
-rw-r--r--core/res/res/values-hi/strings.xml11
-rw-r--r--core/res/res/values-hr/strings.xml3
-rw-r--r--core/res/res/values-hu/strings.xml11
-rw-r--r--core/res/res/values-hy-rAM/strings.xml11
-rw-r--r--core/res/res/values-in/strings.xml11
-rw-r--r--core/res/res/values-is-rIS/strings.xml11
-rw-r--r--core/res/res/values-it/strings.xml3
-rw-r--r--core/res/res/values-iw/strings.xml3
-rw-r--r--core/res/res/values-ja/strings.xml7
-rw-r--r--core/res/res/values-ka-rGE/strings.xml11
-rw-r--r--core/res/res/values-kk-rKZ/strings.xml11
-rw-r--r--core/res/res/values-km-rKH/strings.xml11
-rw-r--r--core/res/res/values-kn-rIN/strings.xml11
-rw-r--r--core/res/res/values-ko/strings.xml3
-rw-r--r--core/res/res/values-ky-rKG/strings.xml11
-rw-r--r--core/res/res/values-lo-rLA/strings.xml11
-rw-r--r--core/res/res/values-lt/strings.xml3
-rw-r--r--core/res/res/values-lv/strings.xml3
-rw-r--r--core/res/res/values-mk-rMK/strings.xml11
-rw-r--r--core/res/res/values-ml-rIN/strings.xml11
-rw-r--r--core/res/res/values-mn-rMN/strings.xml11
-rw-r--r--core/res/res/values-mr-rIN/strings.xml11
-rw-r--r--core/res/res/values-ms-rMY/strings.xml11
-rw-r--r--core/res/res/values-my-rMM/strings.xml11
-rw-r--r--core/res/res/values-nb/strings.xml11
-rw-r--r--core/res/res/values-ne-rNP/strings.xml11
-rw-r--r--core/res/res/values-nl/strings.xml11
-rw-r--r--core/res/res/values-pl/strings.xml3
-rw-r--r--core/res/res/values-pt-rPT/strings.xml11
-rw-r--r--core/res/res/values-pt/strings.xml3
-rw-r--r--core/res/res/values-ro/strings.xml3
-rw-r--r--core/res/res/values-ru/strings.xml3
-rw-r--r--core/res/res/values-si-rLK/strings.xml11
-rw-r--r--core/res/res/values-sk/strings.xml3
-rw-r--r--core/res/res/values-sl/strings.xml3
-rw-r--r--core/res/res/values-sr/strings.xml3
-rw-r--r--core/res/res/values-sv/strings.xml11
-rw-r--r--core/res/res/values-sw/strings.xml3
-rw-r--r--core/res/res/values-ta-rIN/strings.xml11
-rw-r--r--core/res/res/values-te-rIN/strings.xml11
-rw-r--r--core/res/res/values-th/strings.xml11
-rw-r--r--core/res/res/values-tl/strings.xml11
-rw-r--r--core/res/res/values-tr/strings.xml31
-rw-r--r--core/res/res/values-uk/strings.xml15
-rw-r--r--core/res/res/values-ur-rPK/strings.xml11
-rw-r--r--core/res/res/values-uz-rUZ/strings.xml11
-rw-r--r--core/res/res/values-vi/strings.xml13
-rw-r--r--core/res/res/values-zh-rCN/strings.xml3
-rw-r--r--core/res/res/values-zh-rHK/strings.xml11
-rw-r--r--core/res/res/values-zh-rTW/strings.xml11
-rw-r--r--core/res/res/values-zu/strings.xml3
-rw-r--r--core/res/res/values/attrs.xml37
-rw-r--r--core/res/res/values/attrs_manifest.xml2
-rw-r--r--core/res/res/values/public.xml3
-rw-r--r--core/tests/coretests/src/android/net/StaticIpConfigurationTest.java225
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk6
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk8
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk3
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk5
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java224
-rw-r--r--libs/hwui/Android.common.mk7
-rw-r--r--libs/hwui/Caches.cpp2
-rw-r--r--libs/hwui/Glop.h17
-rw-r--r--libs/hwui/GlopBuilder.cpp133
-rw-r--r--libs/hwui/GlopBuilder.h55
-rw-r--r--libs/hwui/OpenGLRenderer.cpp11
-rw-r--r--libs/hwui/PathCache.cpp4
-rw-r--r--libs/hwui/RenderNode.cpp5
-rw-r--r--libs/hwui/ResourceCache.h2
-rw-r--r--libs/hwui/Snapshot.cpp4
-rw-r--r--libs/hwui/TessellationCache.cpp8
-rw-r--r--libs/hwui/renderstate/Blend.cpp41
-rw-r--r--libs/hwui/renderstate/Blend.h3
-rw-r--r--libs/hwui/renderstate/MeshState.cpp14
-rw-r--r--libs/hwui/renderstate/MeshState.h8
-rw-r--r--libs/hwui/renderstate/RenderState.cpp11
-rw-r--r--libs/hwui/tests/main.cpp215
-rw-r--r--libs/hwui/thread/TaskManager.cpp6
-rw-r--r--libs/hwui/thread/TaskProcessor.h8
-rw-r--r--libs/hwui/utils/PaintUtils.h3
-rw-r--r--location/java/android/location/GpsSatellite.java18
-rw-r--r--location/java/android/location/GpsStatus.java97
-rw-r--r--location/tests/locationtests/src/android/location/GpsStatusTest.java356
-rw-r--r--media/java/android/media/AudioAttributes.java8
-rw-r--r--media/java/android/media/AudioDevicePort.java5
-rw-r--r--media/java/android/media/AudioManager.java35
-rw-r--r--media/java/android/media/AudioMixPort.java5
-rw-r--r--media/java/android/media/AudioPort.java17
-rw-r--r--media/java/android/media/AudioRoutesInfo.java1
-rw-r--r--media/java/android/media/AudioService.java129
-rw-r--r--media/java/android/media/AudioSystem.java3
-rw-r--r--media/java/android/media/IAudioService.aidl2
-rw-r--r--media/java/android/media/MediaCodecInfo.java8
-rw-r--r--media/java/android/media/tv/TvContract.java5
-rw-r--r--media/jni/android_media_Utils.cpp8
-rw-r--r--packages/Keyguard/src/com/android/keyguard/CarrierText.java8
-rw-r--r--packages/Keyguard/src/com/android/keyguard/EmergencyButton.java70
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java68
-rw-r--r--packages/PrintSpooler/res/layout/print_activity_controls.xml28
-rw-r--r--packages/PrintSpooler/res/values-af/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-am/strings.xml9
-rw-r--r--packages/PrintSpooler/res/values-ar/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-bg/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-bn-rBD/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-ca/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-cs/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-da/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-de/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-el/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-en-rGB/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-en-rIN/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-es-rUS/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-es/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-et-rEE/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-eu-rES/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-fa/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-fi/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-fr-rCA/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-fr/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-gl-rES/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-hi/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-hr/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-hu/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-hy-rAM/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-in/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-is-rIS/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-it/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-iw/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ja/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ka-rGE/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-kk-rKZ/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-km-rKH/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-kn-rIN/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-ko/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ky-rKG/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-lo-rLA/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-lt/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-lv/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-mk-rMK/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-ml-rIN/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-mn-rMN/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-mr-rIN/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-ms-rMY/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-my-rMM/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-nb/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ne-rNP/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-nl/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-pl/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-pt/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ro/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ru/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-si-rLK/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-sk/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-sl/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-sr/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-sv/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-sw/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ta-rIN/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-te-rIN/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-th/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-tl/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-tr/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-uk/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-ur-rPK/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-uz-rUZ/strings.xml5
-rw-r--r--packages/PrintSpooler/res/values-vi/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-zh-rCN/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-zh-rHK/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-zh-rTW/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values-zu/strings.xml7
-rw-r--r--packages/PrintSpooler/res/values/strings.xml15
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java11
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java108
-rw-r--r--packages/SettingsLib/res/values/arrays.xml81
-rw-r--r--packages/SettingsLib/res/values/strings.xml49
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/Blank.java0
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/WirelessUtils.java37
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java739
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java465
-rw-r--r--packages/SettingsLib/tests/Android.mk30
-rw-r--r--packages/SettingsLib/tests/AndroidManifest.xml28
-rw-r--r--packages/SettingsLib/tests/src/com/android/settingslib/BaseTest.java30
-rw-r--r--packages/SettingsLib/tests/src/com/android/settingslib/wifi/AccessPointTest.java97
-rw-r--r--packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java284
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java5
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml18
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml2
-rw-r--r--packages/SystemUI/res/values/colors.xml3
-rw-r--r--packages/SystemUI/res/values/ids.xml6
-rw-r--r--packages/SystemUI/res/values/strings.xml4
-rwxr-xr-xpackages/SystemUI/src/com/android/systemui/BatteryMeterView.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java64
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java185
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java3
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java4
-rw-r--r--rs/java/android/renderscript/Allocation.java11
-rw-r--r--rs/java/android/renderscript/FieldPacker.java286
-rw-r--r--rs/java/android/renderscript/RenderScript.java15
-rw-r--r--rs/java/android/renderscript/Script.java40
-rw-r--r--rs/java/android/renderscript/ScriptGroup2.java58
-rw-r--r--rs/jni/android_renderscript_RenderScript.cpp43
-rw-r--r--services/core/java/com/android/server/WiredAccessoryManager.java11
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java145
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java5
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkMonitor.java32
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java22
-rw-r--r--services/usb/java/com/android/server/usb/UsbAlsaManager.java9
-rw-r--r--services/usb/java/com/android/server/usb/UsbAudioDevice.java1
-rw-r--r--telecomm/java/android/telecom/PhoneAccount.java14
-rw-r--r--telecomm/java/android/telecom/PhoneAccountHandle.java17
-rw-r--r--telecomm/java/android/telecom/RemoteConnectionService.java15
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java8
-rw-r--r--telecomm/java/android/telecom/VideoProfile.java2
279 files changed, 5965 insertions, 1220 deletions
diff --git a/Android.mk b/Android.mk
index 2d0d1f7462c0..a20798d85172 100644
--- a/Android.mk
+++ b/Android.mk
@@ -202,6 +202,7 @@ LOCAL_SRC_FILES += \
core/java/android/os/INetworkActivityListener.aidl \
core/java/android/os/INetworkManagementService.aidl \
core/java/android/os/IPermissionController.aidl \
+ core/java/android/os/IProcessInfoService.aidl \
core/java/android/os/IPowerManager.aidl \
core/java/android/os/IRemoteCallback.aidl \
core/java/android/os/ISchedulingPolicyService.aidl \
diff --git a/api/current.txt b/api/current.txt
index 2a6d33eca630..ec07456caeaf 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -529,6 +529,7 @@ package android {
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
field public static final int enabled = 16842766; // 0x101000e
+ field public static final int end = 16843997; // 0x10104dd
field public static final int endColor = 16843166; // 0x101019e
field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
@@ -1128,6 +1129,7 @@ package android {
field public static final int stackFromBottom = 16843005; // 0x10100fd
field public static final int stackViewStyle = 16843838; // 0x101043e
field public static final int starStyle = 16842882; // 0x1010082
+ field public static final int start = 16843996; // 0x10104dc
field public static final int startColor = 16843165; // 0x101019d
field public static final int startDelay = 16843746; // 0x10103e2
field public static final int startOffset = 16843198; // 0x10101be
@@ -1410,6 +1412,7 @@ package android {
field public static final int windowExitTransition = 16843832; // 0x1010438
field public static final int windowFrame = 16842837; // 0x1010055
field public static final int windowFullscreen = 16843277; // 0x101020d
+ field public static final int windowHasLightStatusBar = 16843998; // 0x10104de
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
@@ -8432,7 +8435,6 @@ package android.content.pm {
field public java.lang.String parentActivityName;
field public java.lang.String permission;
field public int persistableMode;
- field public boolean resizeable;
field public int screenOrientation;
field public int softInputMode;
field public java.lang.String targetActivity;
@@ -11947,6 +11949,9 @@ package android.graphics.drawable {
method public android.graphics.drawable.Drawable findDrawableByLayerId(int);
method public android.graphics.drawable.Drawable getDrawable(int);
method public int getId(int);
+ method public int getLayerGravity(int);
+ method public int getLayerHeight(int);
+ method public int getLayerWidth(int);
method public int getNumberOfLayers();
method public int getOpacity();
method public int getPaddingMode();
@@ -11956,7 +11961,10 @@ package android.graphics.drawable {
method public void setColorFilter(android.graphics.ColorFilter);
method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
method public void setId(int, int);
+ method public void setLayerGravity(int, int);
method public void setLayerInset(int, int, int, int, int);
+ method public void setLayerInsetRelative(int, int, int, int, int);
+ method public void setLayerSize(int, int, int);
method public void setOpacity(int);
method public void setPaddingMode(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
@@ -12697,11 +12705,14 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
@@ -17624,7 +17635,6 @@ package android.net {
method public static javax.net.SocketFactory getDefault(int);
method public static javax.net.ssl.SSLSocketFactory getDefault(int, android.net.SSLSessionCache);
method public java.lang.String[] getDefaultCipherSuites();
- method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
method public byte[] getNpnSelectedProtocol(java.net.Socket);
method public java.lang.String[] getSupportedCipherSuites();
@@ -23224,6 +23234,7 @@ package android.print {
public final class PrintAttributes implements android.os.Parcelable {
method public int describeContents();
method public int getColorMode();
+ method public int getDuplexMode();
method public android.print.PrintAttributes.MediaSize getMediaSize();
method public android.print.PrintAttributes.Margins getMinMargins();
method public android.print.PrintAttributes.Resolution getResolution();
@@ -23231,12 +23242,16 @@ package android.print {
field public static final int COLOR_MODE_COLOR = 2; // 0x2
field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.print.PrintAttributes> CREATOR;
+ field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2
+ field public static final int DUPLEX_MODE_NONE = 1; // 0x1
+ field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4
}
public static final class PrintAttributes.Builder {
ctor public PrintAttributes.Builder();
method public android.print.PrintAttributes build();
method public android.print.PrintAttributes.Builder setColorMode(int);
+ method public android.print.PrintAttributes.Builder setDuplexMode(int);
method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
method public android.print.PrintAttributes.Builder setMinMargins(android.print.PrintAttributes.Margins);
method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution);
@@ -23454,6 +23469,7 @@ package android.print {
method public int describeContents();
method public int getColorModes();
method public android.print.PrintAttributes getDefaults();
+ method public int getDuplexModes();
method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
method public android.print.PrintAttributes.Margins getMinMargins();
method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
@@ -23467,6 +23483,7 @@ package android.print {
method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean);
method public android.print.PrinterCapabilitiesInfo build();
method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
+ method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins);
}
@@ -28608,8 +28625,65 @@ package android.system {
package android.telecom {
+ public class PhoneAccount implements android.os.Parcelable {
+ method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
+ method public android.graphics.drawable.Drawable createIconDrawable(android.content.Context);
+ method public int describeContents();
+ method public android.telecom.PhoneAccountHandle getAccountHandle();
+ method public android.net.Uri getAddress();
+ method public int getCapabilities();
+ method public int getHighlightColor();
+ method public android.graphics.Bitmap getIconBitmap();
+ method public java.lang.String getIconPackageName();
+ method public int getIconResId();
+ method public int getIconTint();
+ method public java.lang.CharSequence getLabel();
+ method public java.lang.CharSequence getShortDescription();
+ method public android.net.Uri getSubscriptionAddress();
+ method public java.util.List<java.lang.String> getSupportedUriSchemes();
+ method public boolean hasCapabilities(int);
+ method public boolean supportsUriScheme(java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
+ field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
+ field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR;
+ field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0
+ field public static final int NO_ICON_TINT = 0; // 0x0
+ field public static final int NO_RESOURCE_ID = -1; // 0xffffffff
+ field public static final java.lang.String SCHEME_SIP = "sip";
+ field public static final java.lang.String SCHEME_TEL = "tel";
+ field public static final java.lang.String SCHEME_VOICEMAIL = "voicemail";
+ }
+
+ public static class PhoneAccount.Builder {
+ ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
+ ctor public PhoneAccount.Builder(android.telecom.PhoneAccount);
+ method public android.telecom.PhoneAccount build();
+ method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
+ method public android.telecom.PhoneAccount.Builder setCapabilities(int);
+ method public android.telecom.PhoneAccount.Builder setHighlightColor(int);
+ method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int);
+ method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int);
+ method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int, int);
+ method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int, int);
+ method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.Bitmap);
+ method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence);
+ method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri);
+ method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>);
+ }
+
+ public class PhoneAccountHandle implements android.os.Parcelable {
+ ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String);
+ method public int describeContents();
+ method public android.content.ComponentName getComponentName();
+ method public java.lang.String getId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccountHandle> CREATOR;
+ }
+
public class TelecomManager {
method public void cancelMissedCallsNotification();
+ method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
method public boolean handleMmi(java.lang.String);
method public boolean isInCall();
method public void showInCallScreen(boolean);
@@ -28618,7 +28692,10 @@ package android.telecom {
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
+ field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
+ field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
field public static final int PRESENTATION_ALLOWED = 1; // 0x1
@@ -28627,6 +28704,34 @@ package android.telecom {
field public static final int PRESENTATION_UNKNOWN = 3; // 0x3
}
+ public class VideoProfile implements android.os.Parcelable {
+ ctor public VideoProfile(int);
+ ctor public VideoProfile(int, int);
+ method public int describeContents();
+ method public int getQuality();
+ method public int getVideoState();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telecom.VideoProfile> CREATOR;
+ field public static final int QUALITY_DEFAULT = 4; // 0x4
+ field public static final int QUALITY_HIGH = 1; // 0x1
+ field public static final int QUALITY_LOW = 3; // 0x3
+ field public static final int QUALITY_MEDIUM = 2; // 0x2
+ }
+
+ public static class VideoProfile.VideoState {
+ ctor public VideoProfile.VideoState();
+ method public static boolean isAudioOnly(int);
+ method public static boolean isBidirectional(int);
+ method public static boolean isPaused(int);
+ method public static boolean isReceptionEnabled(int);
+ method public static boolean isTransmissionEnabled(int);
+ field public static final int AUDIO_ONLY = 0; // 0x0
+ field public static final int BIDIRECTIONAL = 3; // 0x3
+ field public static final int PAUSED = 4; // 0x4
+ field public static final int RX_ENABLED = 2; // 0x2
+ field public static final int TX_ENABLED = 1; // 0x1
+ }
+
}
package android.telephony {
@@ -34315,6 +34420,7 @@ package android.view {
field public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024; // 0x400
field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200
field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100
+ field public static final int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR = 8192; // 0x2000
field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1
field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0
field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600
diff --git a/api/removed.txt b/api/removed.txt
index 1b69ee8229f6..93229732e913 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -6,6 +6,14 @@ package android.media {
}
+package android.net {
+
+ public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
+ method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
+ }
+
+}
+
package android.os {
public final class PowerManager {
diff --git a/api/system-current.txt b/api/system-current.txt
index 5388ff31ac9d..236260854a13 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -601,6 +601,7 @@ package android {
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
field public static final int enabled = 16842766; // 0x101000e
+ field public static final int end = 16843997; // 0x10104dd
field public static final int endColor = 16843166; // 0x101019e
field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
@@ -1204,6 +1205,7 @@ package android {
field public static final int stackFromBottom = 16843005; // 0x10100fd
field public static final int stackViewStyle = 16843838; // 0x101043e
field public static final int starStyle = 16842882; // 0x1010082
+ field public static final int start = 16843996; // 0x10104dc
field public static final int startColor = 16843165; // 0x101019d
field public static final int startDelay = 16843746; // 0x10103e2
field public static final int startOffset = 16843198; // 0x10101be
@@ -1486,6 +1488,7 @@ package android {
field public static final int windowExitTransition = 16843832; // 0x1010438
field public static final int windowFrame = 16842837; // 0x1010055
field public static final int windowFullscreen = 16843277; // 0x101020d
+ field public static final int windowHasLightStatusBar = 16843998; // 0x10104de
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
@@ -8640,7 +8643,6 @@ package android.content.pm {
field public java.lang.String parentActivityName;
field public java.lang.String permission;
field public int persistableMode;
- field public boolean resizeable;
field public int screenOrientation;
field public int softInputMode;
field public java.lang.String targetActivity;
@@ -12215,6 +12217,9 @@ package android.graphics.drawable {
method public android.graphics.drawable.Drawable findDrawableByLayerId(int);
method public android.graphics.drawable.Drawable getDrawable(int);
method public int getId(int);
+ method public int getLayerGravity(int);
+ method public int getLayerHeight(int);
+ method public int getLayerWidth(int);
method public int getNumberOfLayers();
method public int getOpacity();
method public int getPaddingMode();
@@ -12224,7 +12229,10 @@ package android.graphics.drawable {
method public void setColorFilter(android.graphics.ColorFilter);
method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
method public void setId(int, int);
+ method public void setLayerGravity(int, int);
method public void setLayerInset(int, int, int, int, int);
+ method public void setLayerInsetRelative(int, int, int, int, int);
+ method public void setLayerSize(int, int, int);
method public void setOpacity(int);
method public void setPaddingMode(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
@@ -12965,11 +12973,14 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
@@ -18884,7 +18895,6 @@ package android.net {
method public static javax.net.SocketFactory getDefault(int);
method public static javax.net.ssl.SSLSocketFactory getDefault(int, android.net.SSLSessionCache);
method public java.lang.String[] getDefaultCipherSuites();
- method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
method public byte[] getNpnSelectedProtocol(java.net.Socket);
method public java.lang.String[] getSupportedCipherSuites();
@@ -24813,6 +24823,7 @@ package android.print {
public final class PrintAttributes implements android.os.Parcelable {
method public int describeContents();
method public int getColorMode();
+ method public int getDuplexMode();
method public android.print.PrintAttributes.MediaSize getMediaSize();
method public android.print.PrintAttributes.Margins getMinMargins();
method public android.print.PrintAttributes.Resolution getResolution();
@@ -24820,12 +24831,16 @@ package android.print {
field public static final int COLOR_MODE_COLOR = 2; // 0x2
field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.print.PrintAttributes> CREATOR;
+ field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2
+ field public static final int DUPLEX_MODE_NONE = 1; // 0x1
+ field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4
}
public static final class PrintAttributes.Builder {
ctor public PrintAttributes.Builder();
method public android.print.PrintAttributes build();
method public android.print.PrintAttributes.Builder setColorMode(int);
+ method public android.print.PrintAttributes.Builder setDuplexMode(int);
method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
method public android.print.PrintAttributes.Builder setMinMargins(android.print.PrintAttributes.Margins);
method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution);
@@ -25043,6 +25058,7 @@ package android.print {
method public int describeContents();
method public int getColorModes();
method public android.print.PrintAttributes getDefaults();
+ method public int getDuplexModes();
method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
method public android.print.PrintAttributes.Margins getMinMargins();
method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
@@ -25056,6 +25072,7 @@ package android.print {
method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean);
method public android.print.PrinterCapabilitiesInfo build();
method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
+ method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins);
}
@@ -30613,10 +30630,14 @@ package android.telecom {
method public java.util.List<java.lang.String> getSupportedUriSchemes();
method public boolean hasCapabilities(int);
method public boolean supportsUriScheme(java.lang.String);
+ method public android.telecom.PhoneAccount.Builder toBuilder();
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2
field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
+ field public static final int CAPABILITY_MULTI_USER = 32; // 0x20
field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
+ field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8
field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR;
field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0
field public static final int NO_ICON_TINT = 0; // 0x0
@@ -30629,7 +30650,9 @@ package android.telecom {
public static class PhoneAccount.Builder {
ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
ctor public PhoneAccount.Builder(android.telecom.PhoneAccount);
+ method public android.telecom.PhoneAccount.Builder addSupportedUriScheme(java.lang.String);
method public android.telecom.PhoneAccount build();
+ method public android.telecom.PhoneAccount.Builder setAccountHandle(android.telecom.PhoneAccountHandle);
method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
method public android.telecom.PhoneAccount.Builder setCapabilities(int);
method public android.telecom.PhoneAccount.Builder setHighlightColor(int);
@@ -30645,9 +30668,11 @@ package android.telecom {
public class PhoneAccountHandle implements android.os.Parcelable {
ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String);
+ ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String, android.os.UserHandle);
method public int describeContents();
method public android.content.ComponentName getComponentName();
method public java.lang.String getId();
+ method public android.os.UserHandle getUserHandle();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccountHandle> CREATOR;
}
@@ -30783,6 +30808,7 @@ package android.telecom {
field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
field public static final int PRESENTATION_ALLOWED = 1; // 0x1
@@ -30791,6 +30817,34 @@ package android.telecom {
field public static final int PRESENTATION_UNKNOWN = 3; // 0x3
}
+ public class VideoProfile implements android.os.Parcelable {
+ ctor public VideoProfile(int);
+ ctor public VideoProfile(int, int);
+ method public int describeContents();
+ method public int getQuality();
+ method public int getVideoState();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telecom.VideoProfile> CREATOR;
+ field public static final int QUALITY_DEFAULT = 4; // 0x4
+ field public static final int QUALITY_HIGH = 1; // 0x1
+ field public static final int QUALITY_LOW = 3; // 0x3
+ field public static final int QUALITY_MEDIUM = 2; // 0x2
+ }
+
+ public static class VideoProfile.VideoState {
+ ctor public VideoProfile.VideoState();
+ method public static boolean isAudioOnly(int);
+ method public static boolean isBidirectional(int);
+ method public static boolean isPaused(int);
+ method public static boolean isReceptionEnabled(int);
+ method public static boolean isTransmissionEnabled(int);
+ field public static final int AUDIO_ONLY = 0; // 0x0
+ field public static final int BIDIRECTIONAL = 3; // 0x3
+ field public static final int PAUSED = 4; // 0x4
+ field public static final int RX_ENABLED = 2; // 0x2
+ field public static final int TX_ENABLED = 1; // 0x1
+ }
+
}
package android.telephony {
@@ -36517,6 +36571,7 @@ package android.view {
field public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024; // 0x400
field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200
field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100
+ field public static final int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR = 8192; // 0x2000
field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1
field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0
field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 1b69ee8229f6..93229732e913 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -6,6 +6,14 @@ package android.media {
}
+package android.net {
+
+ public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
+ method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
+ }
+
+}
+
package android.os {
public final class PowerManager {
diff --git a/core/java/android/alsa/AlsaCardsParser.java b/core/java/android/alsa/AlsaCardsParser.java
index 2c7d502ba308..26a61ae81b31 100644
--- a/core/java/android/alsa/AlsaCardsParser.java
+++ b/core/java/android/alsa/AlsaCardsParser.java
@@ -80,8 +80,11 @@ public class AlsaCardsParser {
} else if (lineIndex == 1) {
tokenIndex = mTokenizer.nextToken(line, 0);
if (tokenIndex != -1) {
- mCardDescription = line.substring(tokenIndex);
- mIsUsb = mCardDescription.contains(kUsbCardKeyStr);
+ int keyIndex = line.indexOf(kUsbCardKeyStr);
+ mIsUsb = keyIndex != -1;
+ if (mIsUsb) {
+ mCardDescription = line.substring(tokenIndex, keyIndex - 1);
+ }
}
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 7a636dbdb59d..c6ffef64f7e8 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -256,6 +256,9 @@ public class ActivityManager {
/** @hide User operation call: given user id is the current user, can't be stopped. */
public static final int USER_OP_IS_CURRENT = -2;
+ /** @hide Process does not exist. */
+ public static final int PROCESS_STATE_NONEXISTENT = -1;
+
/** @hide Process is a persistent system process. */
public static final int PROCESS_STATE_PERSISTENT = 0;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 452603a7dca4..4723c0db621c 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -644,6 +644,7 @@ public class ActivityInfo extends ComponentInfo
/**
* Value indicating if the activity is resizeable to any dimension.
* See {@link android.R.attr#resizeableActivity}.
+ * @hide
*/
public boolean resizeable;
diff --git a/core/java/android/content/pm/LauncherActivityInfo.java b/core/java/android/content/pm/LauncherActivityInfo.java
index ee23fcd33437..87b97aafec3d 100644
--- a/core/java/android/content/pm/LauncherActivityInfo.java
+++ b/core/java/android/content/pm/LauncherActivityInfo.java
@@ -39,6 +39,7 @@ public class LauncherActivityInfo {
private ActivityInfo mActivityInfo;
private ComponentName mComponentName;
+ private ResolveInfo mResolveInfo;
private UserHandle mUser;
private long mFirstInstallTime;
@@ -52,6 +53,7 @@ public class LauncherActivityInfo {
LauncherActivityInfo(Context context, ResolveInfo info, UserHandle user,
long firstInstallTime) {
this(context);
+ mResolveInfo = info;
mActivityInfo = info.activityInfo;
mComponentName = LauncherApps.getComponentName(info);
mUser = user;
@@ -92,7 +94,7 @@ public class LauncherActivityInfo {
* @return The label for the activity.
*/
public CharSequence getLabel() {
- return mActivityInfo.loadLabel(mPm);
+ return mResolveInfo.loadLabel(mPm);
}
/**
@@ -104,8 +106,22 @@ public class LauncherActivityInfo {
* @return The drawable associated with the activity
*/
public Drawable getIcon(int density) {
- // TODO: Use density
- return mActivityInfo.loadIcon(mPm);
+ int iconRes = mResolveInfo.getIconResource();
+ Resources resources = null;
+ Drawable icon = null;
+ // Get the preferred density icon from the app's resources
+ if (density != 0 && iconRes != 0) {
+ try {
+ resources = mPm.getResourcesForApplication(mActivityInfo.applicationInfo);
+ icon = resources.getDrawableForDensity(iconRes, density);
+ } catch (NameNotFoundException | Resources.NotFoundException exc) {
+ }
+ }
+ // Get the default density icon
+ if (icon == null) {
+ icon = mResolveInfo.loadIcon(mPm);
+ }
+ return icon;
}
/**
@@ -151,23 +167,7 @@ public class LauncherActivityInfo {
* @return A badged icon for the activity.
*/
public Drawable getBadgedIcon(int density) {
- int iconRes = mActivityInfo.getIconResource();
- Resources resources = null;
- Drawable originalIcon = null;
- try {
- resources = mPm.getResourcesForApplication(mActivityInfo.applicationInfo);
- try {
- if (density != 0) {
- originalIcon = resources.getDrawableForDensity(iconRes, density);
- }
- } catch (Resources.NotFoundException e) {
- }
- } catch (NameNotFoundException nnfe) {
- }
-
- if (originalIcon == null) {
- originalIcon = mActivityInfo.loadIcon(mPm);
- }
+ Drawable originalIcon = getIcon(density);
if (originalIcon instanceof BitmapDrawable) {
return mPm.getUserBadgedIcon(originalIcon, mUser);
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index b76e8c0f1e3e..04777baf1394 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2760,9 +2760,17 @@ public class PackageParser {
}
}
+ addSharedLibrariesForBackwardCompatibility(owner);
+
return true;
}
+ private static void addSharedLibrariesForBackwardCompatibility(Package owner) {
+ if (owner.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ owner.usesLibraries = ArrayUtils.add(owner.usesLibraries, "org.apache.http.legacy");
+ }
+ }
+
/**
* Parse the {@code application} XML tree at the current parse location in a
* <em>split APK</em> manifest.
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 5310071d26aa..bb45b9151d2e 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -391,10 +391,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* {@link CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION android.control.aeExposureCompensation}, in counts of {@link CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP android.control.aeCompensationStep},
* that are supported by this camera device.</p>
* <p><b>Range of valid values:</b><br></p>
+ * <p>Range [0,0] indicates that exposure compensation is not supported.</p>
+ * <p>For LIMITED and FULL devices, range must follow below requirements if exposure
+ * compensation is supported (<code>range != [0, 0]</code>):</p>
* <p><code>Min.exposure compensation * {@link CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP android.control.aeCompensationStep} &lt;= -2 EV</code></p>
* <p><code>Max.exposure compensation * {@link CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP android.control.aeCompensationStep} &gt;= 2 EV</code></p>
- * <p>LEGACY devices may support a smaller range than this, including the range [0,0], which
- * indicates that changing the exposure compensation is not supported.</p>
+ * <p>LEGACY devices may support a smaller range than this.</p>
* <p>This key is available on all devices.</p>
*
* @see CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP
@@ -422,6 +424,17 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
new Key<Rational>("android.control.aeCompensationStep", Rational.class);
/**
+ * <p>Whether the camera device supports {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock}</p>
+ * <p>LIMITED or FULL devices will always list <code>true</code></p>
+ * <p>This key is available on all devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_AE_LOCK
+ */
+ @PublicKey
+ public static final Key<Boolean> CONTROL_AE_LOCK_AVAILABLE =
+ new Key<Boolean>("android.control.aeLockAvailable", boolean.class);
+
+ /**
* <p>List of auto-focus (AF) modes for {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} that are
* supported by this camera device.</p>
* <p>Not all the auto-focus modes may be supported by a
@@ -469,6 +482,22 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
new Key<int[]>("android.control.availableEffects", int[].class);
/**
+ * <p>List of control modes for {@link CaptureRequest#CONTROL_MODE android.control.mode} that are supported by this camera
+ * device.</p>
+ * <p>This list contains control modes that can be set for the camera device.
+ * LEGACY mode devices will always support AUTO mode. LIMITED and FULL
+ * devices will always support OFF, AUTO modes.</p>
+ * <p><b>Range of valid values:</b><br>
+ * Any value listed in {@link CaptureRequest#CONTROL_MODE android.control.mode}</p>
+ * <p>This key is available on all devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_MODE
+ */
+ @PublicKey
+ public static final Key<int[]> CONTROL_AVAILABLE_MODES =
+ new Key<int[]>("android.control.availableModes", int[].class);
+
+ /**
* <p>List of scene modes for {@link CaptureRequest#CONTROL_SCENE_MODE android.control.sceneMode} that are supported by this camera
* device.</p>
* <p>This list contains scene modes that can be set for the camera device.
@@ -530,6 +559,17 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
new Key<int[]>("android.control.awbAvailableModes", int[].class);
/**
+ * <p>Whether the camera device supports {@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock}</p>
+ * <p>LIMITED or FULL devices will always list <code>true</code></p>
+ * <p>This key is available on all devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_AWB_LOCK
+ */
+ @PublicKey
+ public static final Key<Boolean> CONTROL_AWB_LOCK_AVAILABLE =
+ new Key<Boolean>("android.control.awbLockAvailable", boolean.class);
+
+ /**
* <p>List of the maximum number of regions that can be used for metering in
* auto-exposure (AE), auto-white balance (AWB), and auto-focus (AF);
* this corresponds to the the maximum number of elements in
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index fb37ae560762..e1b14ccf15be 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -552,6 +552,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* in this matrix result metadata. The transform should keep the magnitude
* of the output color values within <code>[0, 1.0]</code> (assuming input color
* values is within the normalized range <code>[0, 1.0]</code>), or clipping may occur.</p>
+ * <p>The valid range of each matrix element varies on different devices, but
+ * values within [-1.5, 3.0] are guaranteed not to be clipped.</p>
* <p><b>Units</b>: Unitless scale factors</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
@@ -575,6 +577,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* TRANSFORM_MATRIX.</p>
* <p>The gains in the result metadata are the gains actually
* applied by the camera device to the current frame.</p>
+ * <p>The valid range of gains varies on different devices, but gains
+ * between [1.0, 3.0] are guaranteed not to be clipped. Even if a given
+ * device allows gains below 1.0, this is usually not recommended because
+ * this can create color artifacts.</p>
* <p><b>Units</b>: Unitless gain factors</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
@@ -1239,10 +1245,6 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* update, as if this frame is never captured. This mode can be used in the scenario
* where the application doesn't want a 3A manual control capture to affect
* the subsequent auto 3A capture results.</p>
- * <p>LEGACY mode devices will only support AUTO and USE_SCENE_MODE modes.
- * LIMITED mode devices will only support OFF and OFF_KEEP_STATE if they
- * support the MANUAL_SENSOR and MANUAL_POST_PROCSESING capabilities.
- * FULL mode devices will always support OFF and OFF_KEEP_STATE.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #CONTROL_MODE_OFF OFF}</li>
@@ -1250,9 +1252,12 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <li>{@link #CONTROL_MODE_USE_SCENE_MODE USE_SCENE_MODE}</li>
* <li>{@link #CONTROL_MODE_OFF_KEEP_STATE OFF_KEEP_STATE}</li>
* </ul></p>
+ * <p><b>Available values for this device:</b><br>
+ * {@link CameraCharacteristics#CONTROL_AVAILABLE_MODES android.control.availableModes}</p>
* <p>This key is available on all devices.</p>
*
* @see CaptureRequest#CONTROL_AF_MODE
+ * @see CameraCharacteristics#CONTROL_AVAILABLE_MODES
* @see #CONTROL_MODE_OFF
* @see #CONTROL_MODE_AUTO
* @see #CONTROL_MODE_USE_SCENE_MODE
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 5642f6ff0e43..5bf5b2999882 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -403,6 +403,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* in this matrix result metadata. The transform should keep the magnitude
* of the output color values within <code>[0, 1.0]</code> (assuming input color
* values is within the normalized range <code>[0, 1.0]</code>), or clipping may occur.</p>
+ * <p>The valid range of each matrix element varies on different devices, but
+ * values within [-1.5, 3.0] are guaranteed not to be clipped.</p>
* <p><b>Units</b>: Unitless scale factors</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
@@ -426,6 +428,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* TRANSFORM_MATRIX.</p>
* <p>The gains in the result metadata are the gains actually
* applied by the camera device to the current frame.</p>
+ * <p>The valid range of gains varies on different devices, but gains
+ * between [1.0, 3.0] are guaranteed not to be clipped. Even if a given
+ * device allows gains below 1.0, this is usually not recommended because
+ * this can create color artifacts.</p>
* <p><b>Units</b>: Unitless gain factors</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
@@ -1855,10 +1861,6 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* update, as if this frame is never captured. This mode can be used in the scenario
* where the application doesn't want a 3A manual control capture to affect
* the subsequent auto 3A capture results.</p>
- * <p>LEGACY mode devices will only support AUTO and USE_SCENE_MODE modes.
- * LIMITED mode devices will only support OFF and OFF_KEEP_STATE if they
- * support the MANUAL_SENSOR and MANUAL_POST_PROCSESING capabilities.
- * FULL mode devices will always support OFF and OFF_KEEP_STATE.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #CONTROL_MODE_OFF OFF}</li>
@@ -1866,9 +1868,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #CONTROL_MODE_USE_SCENE_MODE USE_SCENE_MODE}</li>
* <li>{@link #CONTROL_MODE_OFF_KEEP_STATE OFF_KEEP_STATE}</li>
* </ul></p>
+ * <p><b>Available values for this device:</b><br>
+ * {@link CameraCharacteristics#CONTROL_AVAILABLE_MODES android.control.availableModes}</p>
* <p>This key is available on all devices.</p>
*
* @see CaptureRequest#CONTROL_AF_MODE
+ * @see CameraCharacteristics#CONTROL_AVAILABLE_MODES
* @see #CONTROL_MODE_OFF
* @see #CONTROL_MODE_AUTO
* @see #CONTROL_MODE_USE_SCENE_MODE
diff --git a/core/java/android/hardware/camera2/DngCreator.java b/core/java/android/hardware/camera2/DngCreator.java
index 6fc99ac1b9f6..33d539c25e73 100644
--- a/core/java/android/hardware/camera2/DngCreator.java
+++ b/core/java/android/hardware/camera2/DngCreator.java
@@ -530,9 +530,9 @@ public final class DngCreator implements AutoCloseable {
int uPixStride = uPlane.getPixelStride();
byte[] yuvPixel = { 0, 0, 0 };
- byte[] yFullRow = new byte[yPixStride * width];
- byte[] uFullRow = new byte[uPixStride * width / 2];
- byte[] vFullRow = new byte[vPixStride * width / 2];
+ byte[] yFullRow = new byte[yPixStride * (width - 1) + 1];
+ byte[] uFullRow = new byte[uPixStride * (width / 2 - 1) + 1];
+ byte[] vFullRow = new byte[vPixStride * (width / 2 - 1) + 1];
byte[] finalRow = new byte[BYTES_PER_RGB_PIX * width];
for (int i = 0; i < height; i++) {
int halfH = i / 2;
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 347db05b930c..802b9389fad8 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -474,6 +474,15 @@ public class LegacyMetadataMapper {
m.set(CONTROL_AE_COMPENSATION_STEP, ParamsUtils.createRational(step));
}
+
+ /*
+ * control.aeLockAvailable
+ */
+ {
+ boolean aeLockAvailable = p.isAutoExposureLockSupported();
+
+ m.set(CONTROL_AE_LOCK_AVAILABLE, aeLockAvailable);
+ }
}
@@ -571,6 +580,16 @@ public class LegacyMetadataMapper {
Log.v(TAG, "mapControlAwb - control.awbAvailableModes set to " +
ListUtils.listToString(awbAvail));
}
+
+
+ /*
+ * control.awbLockAvailable
+ */
+ {
+ boolean awbLockAvailable = p.isAutoWhiteBalanceLockSupported();
+
+ m.set(CONTROL_AWB_LOCK_AVAILABLE, awbLockAvailable);
+ }
}
}
@@ -618,17 +637,44 @@ public class LegacyMetadataMapper {
/*
* android.control.availableSceneModes
*/
+ int maxNumDetectedFaces = p.getMaxNumDetectedFaces();
List<String> sceneModes = p.getSupportedSceneModes();
List<Integer> supportedSceneModes =
ArrayUtils.convertStringListToIntList(sceneModes, sLegacySceneModes, sSceneModes);
- if (supportedSceneModes == null) { // camera1 doesn't support scene mode settings
- supportedSceneModes = new ArrayList<Integer>();
- supportedSceneModes.add(CONTROL_SCENE_MODE_DISABLED); // disabled is always available
+
+ // Special case where the only scene mode listed is AUTO => no scene mode
+ if (sceneModes != null && sceneModes.size() == 1 &&
+ sceneModes.get(0) == Parameters.SCENE_MODE_AUTO) {
+ supportedSceneModes = null;
}
- if (p.getMaxNumDetectedFaces() > 0) { // always supports FACE_PRIORITY when face detecting
- supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY);
+
+ boolean sceneModeSupported = true;
+ if (supportedSceneModes == null && maxNumDetectedFaces == 0) {
+ sceneModeSupported = false;
}
- m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes));
+
+ if (sceneModeSupported) {
+ if (supportedSceneModes == null) {
+ supportedSceneModes = new ArrayList<Integer>();
+ }
+ if (maxNumDetectedFaces > 0) { // always supports FACE_PRIORITY when face detecting
+ supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY);
+ }
+ // Remove all DISABLED occurrences
+ if (supportedSceneModes.contains(CONTROL_SCENE_MODE_DISABLED)) {
+ while(supportedSceneModes.remove(new Integer(CONTROL_SCENE_MODE_DISABLED))) {}
+ }
+ m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes));
+ } else {
+ m.set(CONTROL_AVAILABLE_SCENE_MODES, new int[] {CONTROL_SCENE_MODE_DISABLED});
+ }
+
+ /*
+ * android.control.availableModes
+ */
+ m.set(CONTROL_AVAILABLE_MODES, sceneModeSupported ?
+ new int[] { CONTROL_MODE_AUTO, CONTROL_MODE_USE_SCENE_MODE } :
+ new int[] { CONTROL_MODE_AUTO });
}
private static void mapLens(CameraMetadataNative m, Camera.Parameters p) {
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 6654577f310a..27096b182c7f 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -159,6 +159,8 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory {
* instead. The Apache HTTP client is no longer maintained and may be removed in a future
* release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
* for further details.
+ *
+ * @removed
*/
@Deprecated
public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 2099c3f9b02f..bf3d9aac1da1 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -366,6 +366,7 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
public String toSafeString() {
String scheme = getScheme();
String ssp = getSchemeSpecificPart();
+ String authority = null;
if (scheme != null) {
if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip")
|| scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto")
@@ -384,6 +385,9 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
}
}
return builder.toString();
+ } else if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) {
+ ssp = null;
+ authority = "//" + getAuthority() + "/...";
}
}
// Not a sensitive scheme, but let's still be conservative about
@@ -397,6 +401,9 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
if (ssp != null) {
builder.append(ssp);
}
+ if (authority != null) {
+ builder.append(authority);
+ }
return builder.toString();
}
@@ -1742,7 +1749,7 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
*
* @return normalized Uri (never null)
* @see {@link android.content.Intent#setData}
- * @see {@link #setNormalizedData}
+ * @see {@link android.content.Intent#setDataAndNormalize}
*/
public Uri normalizeScheme() {
String scheme = getScheme();
diff --git a/core/java/android/os/IProcessInfoService.aidl b/core/java/android/os/IProcessInfoService.aidl
new file mode 100644
index 000000000000..c98daa282ec4
--- /dev/null
+++ b/core/java/android/os/IProcessInfoService.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+/** {@hide} */
+interface IProcessInfoService
+{
+ /**
+ * For each PID in the given input array, write the current process state
+ * for that process into the output array, or ActivityManager.PROCESS_STATE_NONEXISTENT
+ * to indicate that no process with the given PID exists.
+ */
+ void getProcessStatesFromPids(in int[] pids, out int[] states);
+}
+
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index 30f0c6abef3d..90d30d637b62 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -45,11 +45,22 @@ public final class PrintAttributes implements Parcelable {
private static final int VALID_COLOR_MODES =
COLOR_MODE_MONOCHROME | COLOR_MODE_COLOR;
+ /** Duplex mode: No duplexing. */
+ public static final int DUPLEX_MODE_NONE = 1 << 0;
+ /** Duplex mode: Pages are turned sideways along the long edge - like a book. */
+ public static final int DUPLEX_MODE_LONG_EDGE = 1 << 1;
+ /** Duplex mode: Pages are turned upwards along the short edge - like a notpad. */
+ public static final int DUPLEX_MODE_SHORT_EDGE = 1 << 2;
+
+ private static final int VALID_DUPLEX_MODES =
+ DUPLEX_MODE_NONE | DUPLEX_MODE_LONG_EDGE | DUPLEX_MODE_SHORT_EDGE;
+
private MediaSize mMediaSize;
private Resolution mResolution;
private Margins mMinMargins;
private int mColorMode;
+ private int mDuplexMode = DUPLEX_MODE_NONE;
PrintAttributes() {
/* hide constructor */
@@ -60,6 +71,7 @@ public final class PrintAttributes implements Parcelable {
mResolution = (parcel.readInt() == 1) ? Resolution.createFromParcel(parcel) : null;
mMinMargins = (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null;
mColorMode = parcel.readInt();
+ mDuplexMode = parcel.readInt();
}
/**
@@ -74,7 +86,7 @@ public final class PrintAttributes implements Parcelable {
/**
* Sets the media size.
*
- * @param The media size.
+ * @param mediaSize The media size.
*
* @hide
*/
@@ -94,7 +106,7 @@ public final class PrintAttributes implements Parcelable {
/**
* Sets the resolution.
*
- * @param The resolution.
+ * @param resolution The resolution.
*
* @hide
*/
@@ -130,7 +142,7 @@ public final class PrintAttributes implements Parcelable {
* </strong>
* </p>
*
- * @param The margins.
+ * @param margins The margins.
*
* @hide
*/
@@ -153,7 +165,7 @@ public final class PrintAttributes implements Parcelable {
/**
* Sets the color mode.
*
- * @param The color mode.
+ * @param colorMode The color mode.
*
* @see #COLOR_MODE_MONOCHROME
* @see #COLOR_MODE_COLOR
@@ -179,6 +191,35 @@ public final class PrintAttributes implements Parcelable {
}
/**
+ * Gets the duplex mode.
+ *
+ * @return The duplex mode.
+ *
+ * @see #DUPLEX_MODE_NONE
+ * @see #DUPLEX_MODE_LONG_EDGE
+ * @see #DUPLEX_MODE_SHORT_EDGE
+ */
+ public int getDuplexMode() {
+ return mDuplexMode;
+ }
+
+ /**
+ * Sets the duplex mode.
+ *
+ * @param duplexMode The duplex mode.
+ *
+ * @see #DUPLEX_MODE_NONE
+ * @see #DUPLEX_MODE_LONG_EDGE
+ * @see #DUPLEX_MODE_SHORT_EDGE
+ *
+ * @hide
+ */
+ public void setDuplexMode(int duplexMode) {
+ enforceValidDuplexMode(duplexMode);
+ mDuplexMode = duplexMode;
+ }
+
+ /**
* Gets a new print attributes instance which is in portrait orientation,
* which is the media size is in portrait and all orientation dependent
* attributes such as resolution and margins are properly adjusted.
@@ -211,6 +252,7 @@ public final class PrintAttributes implements Parcelable {
attributes.setMinMargins(getMinMargins());
attributes.setColorMode(getColorMode());
+ attributes.setDuplexMode(getDuplexMode());
return attributes;
}
@@ -248,6 +290,7 @@ public final class PrintAttributes implements Parcelable {
attributes.setMinMargins(getMinMargins());
attributes.setColorMode(getColorMode());
+ attributes.setDuplexMode(getDuplexMode());
return attributes;
}
@@ -273,6 +316,7 @@ public final class PrintAttributes implements Parcelable {
parcel.writeInt(0);
}
parcel.writeInt(mColorMode);
+ parcel.writeInt(mDuplexMode);
}
@Override
@@ -285,6 +329,7 @@ public final class PrintAttributes implements Parcelable {
final int prime = 31;
int result = 1;
result = prime * result + mColorMode;
+ result = prime * result + mDuplexMode;
result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode());
result = prime * result + ((mMediaSize == null) ? 0 : mMediaSize.hashCode());
result = prime * result + ((mResolution == null) ? 0 : mResolution.hashCode());
@@ -306,6 +351,9 @@ public final class PrintAttributes implements Parcelable {
if (mColorMode != other.mColorMode) {
return false;
}
+ if (mDuplexMode != other.mDuplexMode) {
+ return false;
+ }
if (mMinMargins == null) {
if (other.mMinMargins != null) {
return false;
@@ -344,6 +392,7 @@ public final class PrintAttributes implements Parcelable {
builder.append(", resolution: ").append(mResolution);
builder.append(", minMargins: ").append(mMinMargins);
builder.append(", colorMode: ").append(colorModeToString(mColorMode));
+ builder.append(", duplexMode: ").append(duplexModeToString(mDuplexMode));
builder.append("}");
return builder.toString();
}
@@ -354,6 +403,7 @@ public final class PrintAttributes implements Parcelable {
mResolution = null;
mMinMargins = null;
mColorMode = 0;
+ mDuplexMode = DUPLEX_MODE_NONE;
}
/**
@@ -364,6 +414,7 @@ public final class PrintAttributes implements Parcelable {
mResolution = other.mResolution;
mMinMargins = other.mMinMargins;
mColorMode = other.mColorMode;
+ mDuplexMode = other.mDuplexMode;
}
/**
@@ -1270,17 +1321,41 @@ public final class PrintAttributes implements Parcelable {
case COLOR_MODE_COLOR: {
return "COLOR_MODE_COLOR";
}
- default:
+ default: {
return "COLOR_MODE_UNKNOWN";
+ }
+ }
+ }
+
+ static String duplexModeToString(int duplexMode) {
+ switch (duplexMode) {
+ case DUPLEX_MODE_NONE: {
+ return "DUPLEX_MODE_NONE";
+ }
+ case DUPLEX_MODE_LONG_EDGE: {
+ return "DUPLEX_MODE_LONG_EDGE";
+ }
+ case DUPLEX_MODE_SHORT_EDGE: {
+ return "DUPLEX_MODE_SHORT_EDGE";
+ }
+ default: {
+ return "DUPLEX_MODE_UNKNOWN";
+ }
}
}
static void enforceValidColorMode(int colorMode) {
- if ((colorMode & VALID_COLOR_MODES) == 0 && Integer.bitCount(colorMode) == 1) {
+ if ((colorMode & VALID_COLOR_MODES) == 0 || Integer.bitCount(colorMode) != 1) {
throw new IllegalArgumentException("invalid color mode: " + colorMode);
}
}
+ static void enforceValidDuplexMode(int duplexMode) {
+ if ((duplexMode & VALID_DUPLEX_MODES) == 0 || Integer.bitCount(duplexMode) != 1) {
+ throw new IllegalArgumentException("invalid duplex mode: " + duplexMode);
+ }
+ }
+
/**
* Builder for creating {@link PrintAttributes}.
*/
@@ -1331,15 +1406,31 @@ public final class PrintAttributes implements Parcelable {
* @see PrintAttributes#COLOR_MODE_COLOR
*/
public Builder setColorMode(int colorMode) {
- if (Integer.bitCount(colorMode) > 1) {
- throw new IllegalArgumentException("can specify at most one colorMode bit.");
- }
mAttributes.setColorMode(colorMode);
return this;
}
/**
+ * Sets the duplex mode.
+ *
+ * @param duplexMode A valid duplex mode or zero.
+ * @return This builder.
+ *
+ * @see PrintAttributes#DUPLEX_MODE_NONE
+ * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
+ * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
+ */
+ public Builder setDuplexMode(int duplexMode) {
+ mAttributes.setDuplexMode(duplexMode);
+ return this;
+ }
+
+ /**
* Creates a new {@link PrintAttributes} instance.
+ * <p>
+ * If you do not specify a duplex mode, the default
+ * {@link #DUPLEX_MODE_NONE} will be used.
+ * </p>
*
* @return The new instance.
*/
diff --git a/core/java/android/print/PrinterCapabilitiesInfo.java b/core/java/android/print/PrinterCapabilitiesInfo.java
index 806a89d8481f..96f318526384 100644
--- a/core/java/android/print/PrinterCapabilitiesInfo.java
+++ b/core/java/android/print/PrinterCapabilitiesInfo.java
@@ -47,7 +47,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
private static final int PROPERTY_MEDIA_SIZE = 0;
private static final int PROPERTY_RESOLUTION = 1;
private static final int PROPERTY_COLOR_MODE = 2;
- private static final int PROPERTY_COUNT = 3;
+ private static final int PROPERTY_DUPLEX_MODE = 3;
+ private static final int PROPERTY_COUNT = 4;
private static final Margins DEFAULT_MARGINS = new Margins(0, 0, 0, 0);
@@ -56,6 +57,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
private List<Resolution> mResolutions;
private int mColorModes;
+ private int mDuplexModes;
private final int[] mDefaults = new int[PROPERTY_COUNT];
@@ -106,6 +108,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
}
mColorModes = other.mColorModes;
+ mDuplexModes = other.mDuplexModes;
final int defaultCount = other.mDefaults.length;
for (int i = 0; i < defaultCount; i++) {
@@ -154,6 +157,19 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
}
/**
+ * Gets the bit mask of supported duplex modes.
+ *
+ * @return The bit mask of supported duplex modes.
+ *
+ * @see PrintAttributes#DUPLEX_MODE_NONE
+ * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
+ * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
+ */
+ public int getDuplexModes() {
+ return mDuplexModes;
+ }
+
+ /**
* Gets the default print attributes.
*
* @return The default attributes.
@@ -178,6 +194,11 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
builder.setColorMode(colorMode);
}
+ final int duplexMode = mDefaults[PROPERTY_DUPLEX_MODE];
+ if (duplexMode > 0) {
+ builder.setDuplexMode(duplexMode);
+ }
+
return builder.build();
}
@@ -187,6 +208,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
readResolutions(parcel);
mColorModes = parcel.readInt();
+ mDuplexModes = parcel.readInt();
readDefaults(parcel);
}
@@ -203,6 +225,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
writeResolutions(parcel);
parcel.writeInt(mColorModes);
+ parcel.writeInt(mDuplexModes);
writeDefaults(parcel);
}
@@ -215,6 +238,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
result = prime * result + ((mMediaSizes == null) ? 0 : mMediaSizes.hashCode());
result = prime * result + ((mResolutions == null) ? 0 : mResolutions.hashCode());
result = prime * result + mColorModes;
+ result = prime * result + mDuplexModes;
result = prime * result + Arrays.hashCode(mDefaults);
return result;
}
@@ -255,6 +279,9 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
if (mColorModes != other.mColorModes) {
return false;
}
+ if (mDuplexModes != other.mDuplexModes) {
+ return false;
+ }
if (!Arrays.equals(mDefaults, other.mDefaults)) {
return false;
}
@@ -269,6 +296,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
builder.append(", mediaSizes=").append(mMediaSizes);
builder.append(", resolutions=").append(mResolutions);
builder.append(", colorModes=").append(colorModesToString());
+ builder.append(", duplexModes=").append(duplexModesToString());
builder.append("\"}");
return builder.toString();
}
@@ -289,6 +317,22 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
return builder.toString();
}
+ private String duplexModesToString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append('[');
+ int duplexModes = mDuplexModes;
+ while (duplexModes != 0) {
+ final int duplexMode = 1 << Integer.numberOfTrailingZeros(duplexModes);
+ duplexModes &= ~duplexMode;
+ if (builder.length() > 1) {
+ builder.append(", ");
+ }
+ builder.append(PrintAttributes.duplexModeToString(duplexMode));
+ }
+ builder.append(']');
+ return builder.toString();
+ }
+
private void writeMediaSizes(Parcel parcel) {
if (mMediaSizes == null) {
parcel.writeInt(0);
@@ -495,19 +539,51 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
currentModes &= ~currentMode;
PrintAttributes.enforceValidColorMode(currentMode);
}
- if ((colorModes & defaultColorMode) == 0) {
- throw new IllegalArgumentException("Default color mode not in color modes.");
- }
- PrintAttributes.enforceValidColorMode(colorModes);
+ PrintAttributes.enforceValidColorMode(defaultColorMode);
mPrototype.mColorModes = colorModes;
mPrototype.mDefaults[PROPERTY_COLOR_MODE] = defaultColorMode;
return this;
}
/**
+ * Sets the duplex modes.
+ * <p>
+ * <strong>Required:</strong> No
+ * </p>
+ *
+ * @param duplexModes The duplex mode bit mask.
+ * @param defaultDuplexMode The default duplex mode.
+ * @return This builder.
+ *
+ * @throws IllegalArgumentException If duplex modes contains an invalid
+ * mode bit or if the default duplex mode is invalid.
+ *
+ * @see PrintAttributes#DUPLEX_MODE_NONE
+ * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
+ * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
+ */
+ public Builder setDuplexModes(int duplexModes, int defaultDuplexMode) {
+ int currentModes = duplexModes;
+ while (currentModes > 0) {
+ final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
+ currentModes &= ~currentMode;
+ PrintAttributes.enforceValidDuplexMode(currentMode);
+ }
+ PrintAttributes.enforceValidDuplexMode(defaultDuplexMode);
+ mPrototype.mDuplexModes = duplexModes;
+ mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode;
+ return this;
+ }
+
+ /**
* Crates a new {@link PrinterCapabilitiesInfo} enforcing that all
* required properties have been specified. See individual methods
* in this class for reference about required attributes.
+ * <p>
+ * <strong>Note:</strong> If you do not add supported duplex modes,
+ * {@link android.print.PrintAttributes#DUPLEX_MODE_NONE} will set
+ * as the only supported mode and also as the default duplex mode.
+ * </p>
*
* @return A new {@link PrinterCapabilitiesInfo}.
*
@@ -532,6 +608,10 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
if (mPrototype.mDefaults[PROPERTY_COLOR_MODE] == DEFAULT_UNDEFINED) {
throw new IllegalStateException("No default color mode specified.");
}
+ if (mPrototype.mDuplexModes == 0) {
+ setDuplexModes(PrintAttributes.DUPLEX_MODE_NONE,
+ PrintAttributes.DUPLEX_MODE_NONE);
+ }
if (mPrototype.mMinMargins == null) {
throw new IllegalArgumentException("margins cannot be null");
}
@@ -558,4 +638,3 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
}
};
}
-
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index ac324302e0e1..a5225cb239ce 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -16,24 +16,25 @@
package android.view;
-import android.annotation.Nullable;
-import android.graphics.Canvas;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Trace;
-import android.util.TypedValue;
-import android.widget.FrameLayout;
+import com.android.internal.R;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
+import android.graphics.Canvas;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Trace;
import android.util.AttributeSet;
import android.util.Log;
+import android.util.TypedValue;
import android.util.Xml;
+import android.widget.FrameLayout;
import java.io.IOException;
import java.lang.reflect.Constructor;
@@ -925,6 +926,14 @@ public abstract class LayoutInflater {
inheritContext);
final ViewGroup group = (ViewGroup) parent;
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.Include);
+ final int id = a.getResourceId(R.styleable.Include_id, View.NO_ID);
+ final int visibility = a.getInt(R.styleable.Include_visibility, -1);
+ final boolean hasWidth = a.hasValue(R.styleable.Include_layout_width);
+ final boolean hasHeight = a.hasValue(R.styleable.Include_layout_height);
+ a.recycle();
+
// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
@@ -934,27 +943,21 @@ public abstract class LayoutInflater {
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
- try {
- params = group.generateLayoutParams(attrs);
- } catch (RuntimeException e) {
- params = group.generateLayoutParams(childAttrs);
- } finally {
- if (params != null) {
- view.setLayoutParams(params);
+ if (hasWidth && hasHeight) {
+ try {
+ params = group.generateLayoutParams(attrs);
+ } catch (RuntimeException e) {
+ // Ignore, just fail over to child attrs.
}
}
+ if (params == null) {
+ params = group.generateLayoutParams(childAttrs);
+ }
+ view.setLayoutParams(params);
// Inflate all children.
rInflate(childParser, view, childAttrs, true, true);
- final TypedArray a = context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.Include);
- final int id = a.getResourceId(
- com.android.internal.R.styleable.Include_id, View.NO_ID);
- final int visibility = a.getInt(
- com.android.internal.R.styleable.Include_visibility, -1);
- a.recycle();
-
if (id != View.NO_ID) {
view.setId(id);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 97e1bc0c304e..5a8b2655eab2 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2544,6 +2544,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000;
/**
+ * Flag for {@link #setSystemUiVisibility(int)}: Requests the status bar to draw in a mode that
+ * is compatible with light status bar backgrounds.
+ *
+ * <p>For this to take effect, the window must request
+ * {@link android.view.WindowManager.LayoutParams#FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
+ * FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS} but not
+ * {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS
+ * FLAG_TRANSLUCENT_STATUS}.
+ *
+ * @see android.R.attr#windowHasLightStatusBar
+ */
+ public static final int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR = 0x00002000;
+
+ /**
* @deprecated Use {@link #SYSTEM_UI_FLAG_LOW_PROFILE} instead.
*/
public static final int STATUS_BAR_HIDDEN = SYSTEM_UI_FLAG_LOW_PROFILE;
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 3f2f3a53ca21..8704356e7471 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -102,10 +102,12 @@ public abstract class Window {
*/
public static final int FEATURE_SWIPE_TO_DISMISS = 11;
/**
- * Flag for requesting that window content changes should be represented
- * with scenes and transitions.
+ * Flag for requesting that window content changes should be animated using a
+ * TransitionManager.
*
- * TODO Add docs
+ * <p>The TransitionManager is set using
+ * {@link #setTransitionManager(android.transition.TransitionManager)}. If none is set,
+ * a default TransitionManager will be used.</p>
*
* @see #setContentView
*/
@@ -1019,10 +1021,16 @@ public abstract class Window {
* <p>Note that calling this function "locks in" various characteristics
* of the window that can not, from this point forward, be changed: the
* features that have been requested with {@link #requestFeature(int)},
- * and certain window flags as described in {@link #setFlags(int, int)}.
+ * and certain window flags as described in {@link #setFlags(int, int)}.</p>
+ *
+ * <p>If {@link #FEATURE_CONTENT_TRANSITIONS} is set, the window's
+ * TransitionManager will be used to animate content from the current
+ * content View to view.</p>
*
* @param view The desired content to display.
* @param params Layout parameters for the view.
+ * @see #getTransitionManager()
+ * @see #setTransitionManager(android.transition.TransitionManager)
*/
public abstract void setContentView(View view, ViewGroup.LayoutParams params);
@@ -1467,6 +1475,7 @@ public abstract class Window {
* {@link #setContentView}) if {@link #FEATURE_CONTENT_TRANSITIONS} has been granted.</p>
*
* @return This window's content TransitionManager or null if none is set.
+ * @attr ref android.R.styleable#Window_windowContentTransitionManager
*/
public TransitionManager getTransitionManager() {
return null;
@@ -1477,6 +1486,7 @@ public abstract class Window {
* Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
*
* @param tm The TransitionManager to use for scene changes.
+ * @attr ref android.R.styleable#Window_windowContentTransitionManager
*/
public void setTransitionManager(TransitionManager tm) {
throw new UnsupportedOperationException();
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 7ea3265de420..897749ff37bf 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -578,6 +578,12 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private boolean mIsChildViewEnabled;
/**
+ * The cached drawable state for the selector. Accounts for child enabled
+ * state, but otherwise identical to the view's own drawable state.
+ */
+ private int[] mSelectorState;
+
+ /**
* The last scroll state reported to clients through {@link OnScrollListener}.
*/
private int mLastScrollState = OnScrollListener.SCROLL_STATE_IDLE;
@@ -2789,7 +2795,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
void updateSelectorState() {
if (mSelector != null) {
if (shouldShowSelector()) {
- mSelector.setState(getDrawableState());
+ mSelector.setState(getDrawableStateForSelector());
} else {
mSelector.setState(StateSet.NOTHING);
}
@@ -2802,12 +2808,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
updateSelectorState();
}
- @Override
- protected int[] onCreateDrawableState(int extraSpace) {
+ private int[] getDrawableStateForSelector() {
// If the child view is enabled then do the default behavior.
if (mIsChildViewEnabled) {
// Common case
- return super.onCreateDrawableState(extraSpace);
+ return super.getDrawableState();
}
// The selector uses this View's drawable state. The selected child view
@@ -2815,10 +2820,12 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
// states.
final int enabledState = ENABLED_STATE_SET[0];
- // If we don't have any extra space, it will return one of the static state arrays,
- // and clearing the enabled state on those arrays is a bad thing! If we specify
- // we need extra space, it will create+copy into a new array that safely mutable.
- int[] state = super.onCreateDrawableState(extraSpace + 1);
+ // If we don't have any extra space, it will return one of the static
+ // state arrays, and clearing the enabled state on those arrays is a
+ // bad thing! If we specify we need extra space, it will create+copy
+ // into a new array that is safely mutable.
+ final int[] state = onCreateDrawableState(1);
+
int enabledPos = -1;
for (int i = state.length - 1; i >= 0; i--) {
if (state[i] == enabledState) {
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 24380716127a..a929f3dfd5a0 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -160,7 +160,22 @@ public class PopupWindow {
private final EpicenterCallback mEpicenterCallback = new EpicenterCallback() {
@Override
public Rect onGetEpicenter(Transition transition) {
- return mAnchorBounds;
+ final View anchor = mAnchor.get();
+ final View decor = mDecorView;
+ if (anchor == null || decor == null) {
+ return null;
+ }
+
+ final Rect anchorBounds = mAnchorBounds;
+ final int[] anchorLocation = mAnchor.get().getLocationOnScreen();
+ final int[] popupLocation = mDecorView.getLocationOnScreen();
+
+ // Compute the position of the anchor relative to the popup.
+ anchorBounds.set(0, 0, anchor.getWidth(), anchor.getHeight());
+ anchorBounds.offset(anchorLocation[0] - popupLocation[0],
+ anchorLocation[1] - popupLocation[1]);
+
+ return anchorBounds;
}
};
@@ -1494,10 +1509,6 @@ public class PopupWindow {
p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL;
- // Compute the position of the anchor relative to the popup.
- mAnchorBounds.set(0, 0, anchorWidth, anchorHeight);
- mAnchorBounds.offset(mDrawingLocation[0] - p.x, mDrawingLocation[1] - p.y);
-
return onTop;
}
@@ -1573,9 +1584,9 @@ public class PopupWindow {
}
/**
- * <p>Dispose of the popup window. This method can be invoked only after
- * {@link #showAsDropDown(android.view.View)} has been executed. Failing that, calling
- * this method will have no effect.</p>
+ * Disposes of the popup window. This method can be invoked only after
+ * {@link #showAsDropDown(android.view.View)} has been executed. Failing
+ * that, calling this method will have no effect.
*
* @see #showAsDropDown(android.view.View)
*/
@@ -1589,6 +1600,9 @@ public class PopupWindow {
mIsShowing = false;
if (mExitTransition != null) {
+ // Cache the content view, since it may change without notice.
+ final View contentView = mContentView;
+
mExitTransition.addTarget(mBackgroundView);
mExitTransition.addListener(new Transition.TransitionListenerAdapter() {
@Override
@@ -1596,7 +1610,7 @@ public class PopupWindow {
transition.removeListener(this);
transition.removeTarget(mBackgroundView);
- dismissImmediate();
+ dismissImmediate(contentView);
}
});
@@ -1605,7 +1619,11 @@ public class PopupWindow {
// Transition to invisible.
mBackgroundView.setVisibility(View.INVISIBLE);
} else {
- dismissImmediate();
+ dismissImmediate(mContentView);
+ }
+
+ if (mOnDismissListener != null) {
+ mOnDismissListener.onDismiss();
}
}
@@ -1613,21 +1631,17 @@ public class PopupWindow {
* Removes the popup from the window manager and tears down the supporting
* view hierarchy, if necessary.
*/
- private void dismissImmediate() {
+ private void dismissImmediate(View contentView) {
try {
mWindowManager.removeViewImmediate(mDecorView);
} finally {
mDecorView.removeView(mBackgroundView);
mDecorView = null;
- if (mBackgroundView != mContentView) {
- ((ViewGroup) mBackgroundView).removeView(mContentView);
+ if (mBackgroundView != contentView) {
+ ((ViewGroup) mBackgroundView).removeView(contentView);
}
mBackgroundView = null;
-
- if (mOnDismissListener != null) {
- mOnDismissListener.onDismiss();
- }
}
}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 0eb52cbeea02..c9b44bebc626 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -800,7 +800,7 @@ class ZygoteConnection {
if (args.niceName != null) {
String property = "wrap." + args.niceName;
if (property.length() > 31) {
- // Avoid creating an illegal property name when truncating.
+ // Properties with a trailing "." are illegal.
if (property.charAt(30) != '.') {
property = property.substring(0, 31);
} else {
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 4719af11fd0b..90821dc702b1 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -18,7 +18,6 @@ package com.android.internal.widget;
import android.Manifest;
import android.app.ActivityManagerNative;
-import android.app.AlarmManager;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.ComponentName;
@@ -37,18 +36,12 @@ import android.os.UserManager;
import android.os.storage.IMountService;
import android.os.storage.StorageManager;
import android.provider.Settings;
-import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import com.android.internal.R;
import com.google.android.collect.Lists;
import java.nio.charset.StandardCharsets;
-import libcore.util.HexEncoding;
-
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -56,6 +49,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import libcore.util.HexEncoding;
+
/**
* Utilities for the lock pattern and its settings.
*/
@@ -1077,21 +1072,6 @@ public class LockPatternUtils {
return deadline;
}
- public boolean isEmergencyCallCapable() {
- return mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_voice_capable);
- }
-
- public boolean isPukUnlockScreenEnable() {
- return mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_enable_puk_unlock_screen);
- }
-
- public boolean isEmergencyCallEnabledWhileSimLocked() {
- return mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked);
- }
-
private boolean getBoolean(String secureSettingKey, boolean defaultValue, int userId) {
try {
return getLockSettings().getBoolean(secureSettingKey, defaultValue, userId);
@@ -1143,58 +1123,6 @@ public class LockPatternUtils {
}
}
- /**
- * Sets the emergency button visibility based on isEmergencyCallCapable().
- *
- * If the emergency button is visible, sets the text on the emergency button
- * to indicate what action will be taken.
- *
- * If there's currently a call in progress, the button will take them to the call
- * @param button The button to update
- * @param shown Indicates whether the given screen wants the emergency button to show at all
- * @param showIcon Indicates whether to show a phone icon for the button.
- */
- public void updateEmergencyCallButtonState(Button button, boolean shown, boolean showIcon) {
- if (isEmergencyCallCapable() && shown) {
- button.setVisibility(View.VISIBLE);
- } else {
- button.setVisibility(View.GONE);
- return;
- }
-
- int textId;
- if (isInCall()) {
- // show "return to call" text and show phone icon
- textId = R.string.lockscreen_return_to_call;
- int phoneCallIcon = showIcon ? R.drawable.stat_sys_phone_call : 0;
- button.setCompoundDrawablesWithIntrinsicBounds(phoneCallIcon, 0, 0, 0);
- } else {
- textId = R.string.lockscreen_emergency_call;
- int emergencyIcon = showIcon ? R.drawable.ic_emergency : 0;
- button.setCompoundDrawablesWithIntrinsicBounds(emergencyIcon, 0, 0, 0);
- }
- button.setText(textId);
- }
-
- /**
- * Resumes a call in progress. Typically launched from the EmergencyCall button
- * on various lockscreens.
- */
- public void resumeCall() {
- getTelecommManager().showInCallScreen(false);
- }
-
- /**
- * @return {@code true} if there is a call currently in progress, {@code false} otherwise.
- */
- public boolean isInCall() {
- return getTelecommManager().isInCall();
- }
-
- private TelecomManager getTelecommManager() {
- return (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
- }
-
public void setPowerButtonInstantlyLocks(boolean enabled) {
setBoolean(LOCKSCREEN_POWER_BUTTON_INSTANTLY_LOCKS, enabled, getCurrentOrCallingUserId());
}
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 0bf269fdb1c5..ef78fdee5108 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -338,13 +338,15 @@ android_media_AudioSystem_error_callback(status_t err)
}
static jint
-android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address)
+android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address, jstring device_name)
{
const char *c_address = env->GetStringUTFChars(device_address, NULL);
+ const char *c_name = env->GetStringUTFChars(device_name, NULL);
int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device),
static_cast <audio_policy_dev_state_t>(state),
- c_address));
+ c_address, c_name));
env->ReleaseStringUTFChars(device_address, c_address);
+ env->ReleaseStringUTFChars(device_name, c_name);
return (jint) status;
}
@@ -788,10 +790,11 @@ static jint convertAudioPortFromNative(JNIEnv *env,
jintArray jFormats = NULL;
jobjectArray jGains = NULL;
jobject jHandle = NULL;
+ jstring jDeviceName = NULL;
bool useInMask;
- ALOGV("convertAudioPortFromNative id %d role %d type %d",
- nAudioPort->id, nAudioPort->role, nAudioPort->type);
+ ALOGV("convertAudioPortFromNative id %d role %d type %d name %s",
+ nAudioPort->id, nAudioPort->role, nAudioPort->type, nAudioPort->name);
jSamplingRates = env->NewIntArray(nAudioPort->num_sample_rates);
if (jSamplingRates == NULL) {
@@ -871,17 +874,21 @@ static jint convertAudioPortFromNative(JNIEnv *env,
goto exit;
}
+ jDeviceName = env->NewStringUTF(nAudioPort->name);
+
if (nAudioPort->type == AUDIO_PORT_TYPE_DEVICE) {
ALOGV("convertAudioPortFromNative is a device %08x", nAudioPort->ext.device.type);
jstring jAddress = env->NewStringUTF(nAudioPort->ext.device.address);
*jAudioPort = env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor,
- jHandle, jSamplingRates, jChannelMasks, jFormats, jGains,
+ jHandle, jDeviceName,
+ jSamplingRates, jChannelMasks, jFormats, jGains,
nAudioPort->ext.device.type, jAddress);
env->DeleteLocalRef(jAddress);
} else if (nAudioPort->type == AUDIO_PORT_TYPE_MIX) {
ALOGV("convertAudioPortFromNative is a mix");
*jAudioPort = env->NewObject(gAudioMixPortClass, gAudioMixPortCstor,
- jHandle, nAudioPort->role, jSamplingRates, jChannelMasks,
+ jHandle, nAudioPort->role, jDeviceName,
+ jSamplingRates, jChannelMasks,
jFormats, jGains);
} else {
ALOGE("convertAudioPortFromNative unknown nAudioPort type %d", nAudioPort->type);
@@ -905,6 +912,9 @@ static jint convertAudioPortFromNative(JNIEnv *env,
env->SetObjectField(*jAudioPort, gAudioPortFields.mActiveConfig, jAudioPortConfig);
exit:
+ if (jDeviceName != NULL) {
+ env->DeleteLocalRef(jDeviceName);
+ }
if (jSamplingRates != NULL) {
env->DeleteLocalRef(jSamplingRates);
}
@@ -1496,7 +1506,7 @@ static JNINativeMethod gMethods[] = {
{"isStreamActiveRemotely","(II)Z", (void *)android_media_AudioSystem_isStreamActiveRemotely},
{"isSourceActive", "(I)Z", (void *)android_media_AudioSystem_isSourceActive},
{"newAudioSessionId", "()I", (void *)android_media_AudioSystem_newAudioSessionId},
- {"setDeviceConnectionState", "(IILjava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
+ {"setDeviceConnectionState", "(IILjava/lang/String;Ljava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
{"getDeviceConnectionState", "(ILjava/lang/String;)I", (void *)android_media_AudioSystem_getDeviceConnectionState},
{"setPhoneState", "(I)I", (void *)android_media_AudioSystem_setPhoneState},
{"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse},
@@ -1556,7 +1566,7 @@ int register_android_media_AudioSystem(JNIEnv *env)
jclass audioPortClass = FindClassOrDie(env, "android/media/AudioPort");
gAudioPortClass = MakeGlobalRefOrDie(env, audioPortClass);
gAudioPortCstor = GetMethodIDOrDie(env, audioPortClass, "<init>",
- "(Landroid/media/AudioHandle;I[I[I[I[Landroid/media/AudioGain;)V");
+ "(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[Landroid/media/AudioGain;)V");
gAudioPortFields.mHandle = GetFieldIDOrDie(env, audioPortClass, "mHandle",
"Landroid/media/AudioHandle;");
gAudioPortFields.mRole = GetFieldIDOrDie(env, audioPortClass, "mRole", "I");
@@ -1594,12 +1604,12 @@ int register_android_media_AudioSystem(JNIEnv *env)
jclass audioDevicePortClass = FindClassOrDie(env, "android/media/AudioDevicePort");
gAudioDevicePortClass = MakeGlobalRefOrDie(env, audioDevicePortClass);
gAudioDevicePortCstor = GetMethodIDOrDie(env, audioDevicePortClass, "<init>",
- "(Landroid/media/AudioHandle;[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V");
+ "(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V");
jclass audioMixPortClass = FindClassOrDie(env, "android/media/AudioMixPort");
gAudioMixPortClass = MakeGlobalRefOrDie(env, audioMixPortClass);
gAudioMixPortCstor = GetMethodIDOrDie(env, audioMixPortClass, "<init>",
- "(Landroid/media/AudioHandle;I[I[I[I[Landroid/media/AudioGain;)V");
+ "(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[Landroid/media/AudioGain;)V");
jclass audioGainClass = FindClassOrDie(env, "android/media/AudioGain");
gAudioGainClass = MakeGlobalRefOrDie(env, audioGainClass);
diff --git a/core/res/res/drawable-mdpi/ic_clear_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_clear_mtrl_alpha.png
deleted file mode 100644
index d43e4d1fa266..000000000000
--- a/core/res/res/drawable-mdpi/ic_clear_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png
deleted file mode 100644
index ddacb59ff51d..000000000000
--- a/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png
deleted file mode 100644
index 21ed91440ff3..000000000000
--- a/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/ic_clear_material.xml b/core/res/res/drawable/ic_clear_material.xml
index 076c0a280a32..a21f47a3ceb8 100644
--- a/core/res/res/drawable/ic_clear_material.xml
+++ b/core/res/res/drawable/ic_clear_material.xml
@@ -14,6 +14,13 @@
limitations under the License.
-->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_clear_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
+ android:tint="?attr/colorControlNormal">
+<path
+ android:pathData="M19,6.41L17.59,5,12,10.59,6.41,5,5,6.41,10.59,12,5,17.59,6.41,19,12,13.41,17.59,19,19,17.59,13.41,12z"
+ android:fillColor="@color/white"/>
+</vector>
diff --git a/core/res/res/drawable/scrubber_progress_horizontal_material.xml b/core/res/res/drawable/scrubber_progress_horizontal_material.xml
index f2ea30f3c5c6..89a1787df677 100644
--- a/core/res/res/drawable/scrubber_progress_horizontal_material.xml
+++ b/core/res/res/drawable/scrubber_progress_horizontal_material.xml
@@ -14,29 +14,35 @@
limitations under the License.
-->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false">
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@id/background">
<nine-patch android:src="@drawable/scrubber_track_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item>
- <layer-list>
- <item android:id="@id/background">
- <nine-patch android:src="@drawable/scrubber_track_mtrl_alpha"
android:tint="?attr/colorControlNormal" />
- </item>
- <item android:id="@id/secondaryProgress">
- <scale android:scaleWidth="100%">
+ </item>
+ <item android:id="@id/secondaryProgress">
+ <scale android:scaleWidth="100%">
+ <selector>
+ <item android:state_enabled="false">
+ <color android:color="@color/transparent" />
+ </item>
+ <item>
<nine-patch android:src="@drawable/scrubber_primary_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </scale>
- </item>
- <item android:id="@id/progress">
- <scale android:scaleWidth="100%">
+ android:tint="?attr/colorControlNormal" />
+ </item>
+ </selector>
+ </scale>
+ </item>
+ <item android:id="@id/progress">
+ <scale android:scaleWidth="100%">
+ <selector>
+ <item android:state_enabled="false">
+ <color android:color="@color/transparent" />
+ </item>
+ <item>
<nine-patch android:src="@drawable/scrubber_primary_mtrl_alpha"
- android:tint="?attr/colorControlActivated" />
- </scale>
- </item>
- </layer-list>
+ android:tint="?attr/colorControlActivated" />
+ </item>
+ </selector>
+ </scale>
</item>
-</selector>
+</layer-list> \ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 7bc339061dbf..4eed141dbdc4 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kon nie aan Wi-Fikoppel nie"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" het \'n swak internetverbinding."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Laat verbinding toe?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s wil graag koppel aan %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"\'n Program"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Begin Wi-Fi Direct. Dit sal die Wi-Fi-kliënt/warmkol afskakel."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index d8fef9be744d..036abe14df59 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android በመጀመር ላይ ነው…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ማከማቻን በማመቻቸት ላይ።"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ወደ Wi-Fi ለማያያዝ አልተቻለም"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ደካማ የበይነመረብ ግንኙነት ኣለው።"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"ግንኙነት ይፈቀድ?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ከ%2$s ጋር መገናኘት ይፈልጋል"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"መተግበሪያ %1$s ወደ Wifi Network %2$s መገናኘት ይፈልጋል"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"አንድ መተግበሪያ"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ጥያቄ ወደ ደውል ጥያቄ ተሻሽሎዋል።"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ጥያቄ ወደ USSD ጥያቄ ተሻሽሎዋል።"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ጥያቄ ወደ አዲስ SS ጥያቄ ተሻሽሎዋል።"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Peripheral ወደብ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index f8c1bdb8d6c8..2a4c65c762a1 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"‏تعذر الاتصال بـ Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" لديها اتصال إنترنت رديء."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"هل تريد السماح بالاتصال؟"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"‏%1$s يرغب في الاتصال بـ %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"تطبيق"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"‏اتصال Wi-Fi مباشر"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"‏ابدأ Wi-Fi Direct. يؤدي هذا إلى إيقاف عميل/نقطة اتصال Wi-Fi."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index c7fd56a09fc7..0808af84fd48 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не можа да се свърже с Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лоша връзка с интернет."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Да се разреши ли връзката?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s иска да установи връзка с/ъс %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Приложение"</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>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 871453ec7f94..bc61458a5a22 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android চালু হচ্ছে…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"সঞ্চয়স্থান অপ্টিমাইজ করা হচ্ছে৷"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi এর সাথে সংযোগ করা যায়নি"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" একটি দুর্বল ইন্টারনেট সংযোগ রয়েছে৷"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"সংযোগের মঞ্জুরি দেবেন?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$s এর সাথে সংযোগ করতে চায়"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"অ্যাপ্লিকেশান %1$s Wifi নেটওয়ার্ক %2$s এর সাথে সংযোগ করতে চায়"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"একটি অ্যাপ্লিকেশান"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi ডাইরেক্ট"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi ডাইরেক্ট আরম্ভ করুন৷ এটি Wi-Fi client/hotspot কে বন্ধ করবে৷"</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS অনুরোধটিকে ডায়াল অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS অনুরোধটিকে নতুন USSD অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS অনুরোধটিকে নতুন SS অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB পেরিফেরাল পোর্ট"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 9b7b62328216..2a087b5d4afc 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"S\'està iniciant Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"S\'està optimitzant l\'emmagatzematge."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"S\'està optimitzant l\'aplicació <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"S\'està preparant <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"S\'estan iniciant les aplicacions."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"S\'està finalitzant l\'actualització."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No s\'ha pogut connectar a la Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" té una mala connexió a Internet."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vols permetre la connexió?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vol connectar amb %2$s."</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"L\'aplicació %1$s vol connectar-se a la xarxa Wi-Fi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Una aplicació"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Inicia Wi-Fi Direct. Això desactivarà el client/la zona Wi-Fi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La sol·licitud SS s\'ha transformat en una sol·licitud DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La sol·licitud SS s\'ha transformat en una sol·licitud USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La sol·licitud SS s\'ha transformat en una sol·licitud SS nova."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port perifèric USB"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4bf382bc6f2b..8e485bd6de9e 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Připojení k síti Wi-Fi se nezdařilo"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má pomalé připojení k internetu."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povolit připojení?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s se chce připojit k %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikace"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Přímé připojení sítě Wi-Fi"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustit přímé připojení sítě Wi-Fi. Tato možnost vypne provoz sítě Wi-Fi v režimu klient/hotspot."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index dbdbfa4c154a..bdb65a9a2f76 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android starter..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lageret optimeres."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerer app <xliff:g id="NUMBER_0">%1$d</xliff:g> ud af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Åbner dine apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Gennemfører start."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er i gang"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kunne ikke oprette forbindelse til Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dårlig internetforbindelse."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vil du tillade denne forbindelse?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vil gerne oprette forbindelse til %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Applikationen %1$s vil gerne have forbindelse til Wi-Fi-netværk %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"En applikation"</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. Dette slår Wi-Fi-klient/hotspot fra."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-anmodningen er ændret til en DIAL-anmodning."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-anmodningen er ændret til en USSD-anmodning."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-anmodningen er ændret til en ny SS-anmodning."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Ydre USB-port"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 50aedee89d7a..14717c0c2d55 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Es konnte keine WLAN-Verbindung hergestellt werden."</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" hat eine schlechte Internetverbindung."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Verbindung zulassen?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s möchte eine Verbindung mit %2$s herstellen."</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Eine App"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct-Betrieb starten. Hierdurch wird der WLAN-Client-/-Hotspot-Betrieb deaktiviert."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 943a86277545..94d16cf2b24f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -42,7 +42,7 @@
<string name="untitled" msgid="4638956954852782576">"&lt;Χωρίς τίτλο&gt;"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Δεν υπάρχει τηλεφωνικός αριθμός)"</string>
<string name="unknownName" msgid="6867811765370350269">"Άγνωστο"</string>
- <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Αυτόματος τηλεφωνητής"</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>
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Εκκίνηση Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Βελτιστοποίηση αποθηκευτικού χώρου."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Προετοιμασία <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Δεν είναι δυνατή η σύνδεση στο Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" έχει κακή σύνδεση στο Διαδίκτυο."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Να επιτρέπεται η σύνδεση;"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s θα ήθελε να συνδεθεί με %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Η εφαρμογή %1$s θα ήθελε να συνδεθεί με το δίκτυο WiFi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Μια εφαρμογή"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Το αίτημα SS τροποποιήθηκε σε αίτημα DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Το αίτημα SS τροποποιήθηκε σε αίτημα USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Το αίτημα SS τροποποιήθηκε σε νέο αίτημα SS."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Περιφερειακή θύρα USB"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index ef70c9208531..643e1906cc00 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<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_connect_alert_title" msgid="8455846016001810172">"Allow connection?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s would like to connect to %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Application %1$s would like to connect to Wi-Fi Network %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"An application"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Peripheral Port"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ef70c9208531..643e1906cc00 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<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_connect_alert_title" msgid="8455846016001810172">"Allow connection?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s would like to connect to %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Application %1$s would like to connect to Wi-Fi Network %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"An application"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Peripheral Port"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index ca1a30ba399f..a35ad8d89705 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1139,15 +1139,15 @@
<item quantity="other" msgid="2176942008915455116">"hace <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
</plurals>
<plurals name="num_hours_ago">
- <item quantity="one" msgid="9150797944610821849">"Hace 1 hora."</item>
- <item quantity="other" msgid="2467273239587587569">"Hace <xliff:g id="COUNT">%d</xliff:g> horas."</item>
+ <item quantity="one" msgid="9150797944610821849">"Hace 1 hora"</item>
+ <item quantity="other" msgid="2467273239587587569">"Hace <xliff:g id="COUNT">%d</xliff:g> horas"</item>
</plurals>
<!-- no translation found for last_num_days:one (7555846096746489821) -->
<string name="last_month" msgid="3959346739979055432">"Último mes"</string>
<string name="older" msgid="5211975022815554840">"Antiguos"</string>
<plurals name="num_days_ago">
<item quantity="one" msgid="861358534398115820">"ayer"</item>
- <item quantity="other" msgid="2479586466153314633">"Hace <xliff:g id="COUNT">%d</xliff:g> días."</item>
+ <item quantity="other" msgid="2479586466153314633">"Hace <xliff:g id="COUNT">%d</xliff:g> días"</item>
</plurals>
<plurals name="in_num_seconds">
<item quantity="one" msgid="2729745560954905102">"en 1 segundo"</item>
@@ -1174,7 +1174,7 @@
<item quantity="other" msgid="851164968597150710">"Hace <xliff:g id="COUNT">%d</xliff:g> minutos."</item>
</plurals>
<plurals name="abbrev_num_hours_ago">
- <item quantity="one" msgid="4796212039724722116">"Hace 1 hora."</item>
+ <item quantity="one" msgid="4796212039724722116">"Hace 1 hora"</item>
<item quantity="other" msgid="6889970745748538901">"hace <xliff:g id="COUNT">%d</xliff:g> horas"</item>
</plurals>
<plurals name="abbrev_num_days_ago">
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se pudo conectar a la red Wi-Fi."</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una mala conexión a Internet."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s quiere conectarse a %2$s."</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Una aplicación"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar Wi-Fi Direct. Se desactivará el funcionamiento de la zona o del cliente Wi-Fi."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 141b9eab8ac8..d56a893a97ce 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se ha podido establecer conexión con la red Wi-Fi."</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una conexión inestable a Internet."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s quiere conectarse a %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Una aplicación"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar Wi-Fi Direct. Se desactivará el funcionamiento de la zona o del cliente Wi-Fi."</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 55bb0fbc4417..eec356accf3e 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android käivitub ..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Salvestusruumi optimeerimine."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>. rakenduse <xliff:g id="NUMBER_1">%2$d</xliff:g>-st optimeerimine."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> ettevalmistamine."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Rakenduste käivitamine."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Käivitamise lõpuleviimine."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> töötab"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ei saanud WiFi-ga ühendust"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" on halb Interneti-ühendus."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Kas lubada ühendus?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s soovib luua ühenduse võrguga %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Rakendus %1$s soovib luua ühenduse WiFi-võrguga %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Rakendus"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WiFi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Käivitage WiFi otseühendus. See lülitab välja WiFi kliendi/leviala."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-päring muudeti DIAL-päringuks."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-päring muudeti USSD-päringuks."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-päring muudeti uueks SS-päringuks."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Väline USB-port"</string>
</resources>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 2b1029b2d2e2..bf2b274cf1f1 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -424,7 +424,7 @@
<string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"Lotu ahots bidezko elkarrekintzako zerbitzuei"</string>
<string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Ahots bidezko elkarrekintzako zerbitzu baten goi-mailako interfazeari lotzea baimentzen die titularrei. Aplikazio normalek ez lukete beharko."</string>
<string name="permlab_manageVoiceKeyphrases" msgid="1252285102392793548">"kudeatu ahozko gako-esaldiak"</string>
- <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"Ahoz esandako gako-hitzak hautemateko gako-esaldiak kudeatzea baimentzen die aplikazioei. Aplikazio normalek ez lukete behar."</string>
+ <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"Ahozko pasahitzak hautemateko gako-esaldiak kudeatzea baimentzen die aplikazioei. Aplikazio normalek ez lukete behar."</string>
<string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"Lotu urruneko pantaila batera"</string>
<string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Urruneko pantaila baten goi-mailako interfazera lotzeko aukera ematen dio titularrari. Aplikazio normalek ez dute baimen hau behar."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"lotu widget-zerbitzu batekin"</string>
@@ -559,7 +559,7 @@
<string name="permdesc_controlVpn" msgid="762852603315861214">"Sare pribatu birtualen behe-mailako eginbideak kontrolatzea baimentzen die aplikazioei."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"Grabatu audio-irteera"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Audio-irteera grabatzeko eta birbideratzeko aukera ematen die aplikazioei."</string>
- <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"Hauteman Hotword"</string>
+ <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"Hauteman ahozko pasahitza"</string>
<string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"Hotword bidez hauteman daitekeen audioa grabatzeko aukera ematen die aplikazioei. Atzeko planoan grabatzeak ez du bestelako audio-grabazioak (adibidez, bideokamera bidezkoak) egitea eragozten."</string>
<string name="permlab_modifyAudioRouting" msgid="7738060354490807723">"Audio-bideratzea"</string>
<string name="permdesc_modifyAudioRouting" msgid="7205731074267199735">"Audio-bideratzea zuzenean kontrolatzea eta audio-gidalerroei gainjartzea baimentzen die aplikazioei."</string>
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android abiarazten ari da…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Memoria optimizatzen."</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> aplikazio optimizatzen."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> prestatzen."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ezin izan da Wi-Fi sarera konektatu"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Interneteko konexio txarra du."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Konektatzea baimendu nahi diozu?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s aplikazioak %2$s sarera konektatu nahi du"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s aplikazioak %2$s Wi-Fi sarera konektatu nahi du"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikazio bat"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Hasi Wi-Fi Direct. Wi-Fi bezeroa edo sare publikoa desaktibatuko da."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS eskaera DIAL eskaerara aldatu da."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS eskaera USSD eskaerara aldatu da."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS eskaera SS eskaera berrira aldatu da."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB ataka periferikoa"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e5ca49abef47..7a71ceb29a1a 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"‏اتصال به Wi-Fi ممکن نیست"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اتصال اینترنتی ضعیفی دارد."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"اتصال اجازه داده شود؟"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"‏%1$s می‌خواهد به %2$s متصل شود"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"برنامه"</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>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index af70269c3d00..feb93d929343 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android käynnistyy…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimoidaan tallennustilaa."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimoidaan sovellusta <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Valmistellaan: <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Käynnistetään sovelluksia."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Viimeistellään päivitystä."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-yhteyden muodostaminen epäonnistui"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" : huono internetyhteys."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Sallitaanko yhteys?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s haluaa yhdistää kohteeseen %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Sovellus %1$s yrittää yhdistää Wi-Fi-verkkoon %2$s."</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Sovellus"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Suora Wi-Fi-yhteys"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Käynnistä suora Wi-Fi-yhteys. Wi-Fi-asiakas/-hotspot poistetaan käytöstä."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-pyyntö muutettiin DIAL-pyynnöksi."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-pyyntö muutettiin USSD-pyynnöksi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-pyyntö muutettiin uudeksi SS-pyynnöksi."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB-oheislaiteportti"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 43c9c5150fe4..a71d6162ad04 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1348,7 +1348,8 @@
<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_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s souhaite se connecter à %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Une application"</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>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index aa488a33b3f0..83df48da578a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1348,7 +1348,8 @@
<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_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion ?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s souhaite se connecter à %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Une application"</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>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index c9da20126146..b6122b4f45a1 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Estase iniciando Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamento."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicacións."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Está finalizando o arranque"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> está en execución"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Non se puido conectar coa rede Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ten unha conexión a Internet deficiente."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Queres permitir a conexión?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s quere conectarse a %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"A aplicación %1$s quere conectarse á rede wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Unha aplicación"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Inicia Wi-Fi Direct. Esta acción desactivará o cliente e a zona interactiva da wifi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitude SS transformouse nunha solicitude DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitude SS transformouse nunha solicitude USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitude SS transformouse nunha nova solicitude SS."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Porto periférico USB"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 626680c6680a..64f0ab8aae73 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ हो रहा है…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"मेमोरी ऑप्‍टिमाइज़ हो रही है."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाई-फ़ाई से कनेक्‍ट नहीं हो सका"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" के पास एक कमज़ोर इंटरनेट कनेक्‍शन है."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"कनेक्शन की अनुमति दें?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s, %2$s से कनेक्ट होना चाहता/चाहती है"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s ऐप्‍लिकेशन %2$s वाई-फ़ाई नेटवर्क से कनेक्‍ट करना चाहता है"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ऐप्लिकेशन"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाई-फ़ाई डायरेक्ट"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाई-फ़ाई डायरेक्ट प्रारंभ करें. इससे वाई-फ़ाई क्‍लाइंट/हॉटस्पॉट कार्यवाही बंद हो जाएगी."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS अनुरोध को DIAL अनुरोध में बदल दिया गया है."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध को USSD अनुरोध में बदल दिया गया है."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध को नए SS अनुरोध में बदल दिया गया है."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB पेरिफ़ेरल पोर्ट"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index b5500299cdbf..d6c9660e30de 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ne može se spojiti na Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima lošu internetsku vezu."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Dopustiti povezivanje?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s traži povezivanje sa sljedećim: %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacija"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Izravni Wi-Fi"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Pokreni izravan rad s Wi-Fi mrežom. To će isključiti rad s Wi-Fi klijentom/žarišnom točkom."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ab9391af2a3e..ec5e47e06142 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Az Android indítása…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tárhely-optimalizálás."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Alkalmazás optimalizálása: <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> előkészítése."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Kezdő alkalmazások."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Rendszerindítás befejezése."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> fut"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nem sikerült csatlakozni a Wi-Fi hálózathoz"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" rossz internetkapcsolattal rendelkezik."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Engedélyezi a csatlakozást?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"A(z)%1$s szeretne csatlakozni a következőhöz: %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"A(z) %1$s alkalmazás szeretne csatlakozni a következő Wi-Fi hálózathoz: %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Egy alkalmazás"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct elindítása. A Wi-Fi kliens/hotspot ettől leáll."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Az SS-kérés módosítva DIAL-kérésre."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Az SS-kérés módosítva USSD-kérésre."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Az SS-kérés módosítva új SS-kérésre."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB-perifériaport"</string>
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index a511a15d9d25..5e2c5a9bdade 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android-ը մեկնարկում է…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Պահեստի օպտիմալացում:"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Չհաջողվեց միանալ Wi-Fi-ին"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ունի թույլ ինտերնետ կապ:"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Թույլատրե՞լ կապը:"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s օգտվողը ցանկանում է կապվել %2$s-ին"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s հավելվածը ցանկանում է միանալ %2$s Wifi ցանցին"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Հավելված"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS հարցումը փոխվել է DIAL հարցման:"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS հարցումը փոխվել է USSD հարցման:"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS հարցումը փոխվել է նոր SS հարցման:"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB արտաքին միացք"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 70441873dc58..70bcb1b9cec6 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Memulai Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Mengoptimalkan penyimpanan."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimalkan aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Menyiapkan <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Tidak dapat tersambung ke Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" memiliki sambungan internet yang buruk."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Izinkan hubungan?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ingin terhubung ke %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikasi %1$s ingin tersambung ke Jaringan Wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikasi"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Memulai Wi-Fi Direct. Opsi ini akan mematikan hotspot/klien Wi-Fi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Permintaan SS diubah menjadi permintaan DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah menjadi permintaan USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah menjadi permintaan SS baru."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port Periferal USB"</string>
</resources>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index e95735c75fdc..1d7aaba6cc3e 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android er að ræsast…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Fínstillir geymslu."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Fínstillir forrit <xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Undirbýr <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ræsir forrit."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Lýkur ræsingu."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ekki var hægt að tengjast Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" er með lélegt netsamband."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Leyfa tengingu?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vill fá að tengjast %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Forritið %1$s vill tengjast Wi-Fi netinu %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Forrit"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Ræsa Wi-Fi Direct. Þetta mun slökkva á Wi-Fi biðlara/aðgangsstað."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-beiðni er breytt í DIAL-beiðni."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-beiðni er breytt í USSD-beiðni."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-beiðni er breytt í nýja SS-beiðni."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB-tengi fyrir jaðartæki"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index cdff278fb2ac..6443c1ac1da7 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossibile connettersi alla rete Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ha una connessione Internet debole."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Consentire la connessione?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vorrebbe connettersi a %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Un\'applicazione"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Avvia Wi-Fi Direct. Verrà disattivato il client/hotspot Wi-Fi."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index b1e2aba1893f..3c5390a47273 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"‏אין אפשרות להתחבר ל-Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" אינו מחובר היטב לאינטרנט."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"האם להתיר את החיבור?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"‏%1$s רוצה להתחבר אל %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"אפליקציה"</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>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7e22f2e270ed..3109a9be5152 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fiに接続できませんでした"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" はインターネット接続に問題があります。"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"接続を許可しますか?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$sさんが「%2$s」への接続を希望しています"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"アプリ"</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クライアント/アクセスポイントがOFFになります。"</string>
@@ -1418,7 +1419,7 @@
<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="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>
@@ -1847,7 +1848,7 @@
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"画面固定を解除する前にロック解除パターンの入力を求める"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"オフライン再生を解除する前にパスワードの入力を求める"</string>
<string name="battery_saver_description" msgid="1960431123816253034">"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使用するその他のアプリは、起動しても更新されないことがあります。\n\nバッテリーセーバーは端末の充電中は自動的にOFFになります。"</string>
- <string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>にダウンロードが終わるまで"</string>
+ <string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>にダウンタイムが終わるまで"</string>
<string name="downtime_condition_line_one" msgid="8762708714645352010">"ダウンタイム終了まで"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1分間(<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>まで)"</item>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 919d2630a156..3c84acb9c624 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android იწყება…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"მეხსიერების ოპტიმიზირება."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"ემზადება <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-თან დაკავშირება ვერ მოხერხდა"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" აქვს ცუდი ინტერნეტ კავშირი."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"გსურთ კავშირის დაშვება?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s-ს სურს %2$s-თან დაკავშირება"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"განაცხადს %1$s სურს დაუკავშირდეს Wifi ქსელს %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"აპლიკაცია"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS მოთხოვნა შეიცვალა DIAL მოთხოვნით."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS მოთხოვნა შეიცვალა ახალი SS მოთხოვნით."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"პერიფერიული USB პორტი"</string>
</resources>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 432f98c04531..f8df80cc840f 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android іске қосылуда…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Қойманы оңтайландыру."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi желісіне қосыла алмады"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет байланысы нашар."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Қосылуға рұқсат ету керек пе?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$s қосылғысы келеді"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s қолданбасы %2$s Wi-Fi желісіне қосылғысы келеді"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Қолданба"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS сұрауы DIAL сұрауына өзгертілді."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сұрауы USSD сұрауына өзгертілді."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сұрауы жаңа SS сұрауына өзгертілді."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB перифериялық порты"</string>
</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index a320a228feeb..2e973dc61295 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1303,8 +1303,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android កំពុង​ចាប់ផ្ដើម…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"កំពុងធ្វើឲ្យឧបករណ៍ផ្ទុកមានប្រសិទ្ធភាព។"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"កំពុងរៀបចំ <xliff:g id="APPNAME">%1$s</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>
@@ -1350,7 +1349,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"មិន​​អាច​តភ្ជាប់​វ៉ាយហ្វាយ"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" មាន​ការ​តភ្ជាប់​អ៊ីនធឺណិត​មិន​ល្អ។"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"អនុញ្ញាត​ភ្ជាប់?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ចង់​ភ្ជាប់​ %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"កម្មវិធី %1$s ចង់ភ្ជាប់ទៅបណ្តាញ Wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"កម្មវិធី"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"វ៉ាយហ្វាយ​ផ្ទាល់"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ចាប់ផ្ដើម​វ៉ាយហ្វាយ​ផ្ទាល់។ វា​នឹង​បិទ​វ៉ាយហ្វាយ​ហតស្ពត។"</string>
@@ -1881,8 +1880,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរការហៅទូរស័ព្ទ។"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ USSD។"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ SS ថ្មី។"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"ឧបករណ៍រន្ធ USB បន្ថែម"</string>
</resources>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 02fdbd0327b9..befcfd21ebbb 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ಸಂಗ್ರಹಣೆಯನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ಕಳಪೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿದೆ."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"ಸಂಪರ್ಕವನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ಅವರು %2$s ಗೆ ಸಂಪರ್ಕಿಸಲು ಬಯಸುತ್ತಾರೆ"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%2$s ವೈಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು %1$s ಅಪ್ಲಿಕೇಶನ್‌ ಬಯಸುತ್ತದೆ"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ಅಪ್ಲಿಕೇಶನ್"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ವಿನಂತಿಯನ್ನು DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ವಿನಂತಿಯನ್ನು ಹೊಸ SS ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB ಹೊರಭಾಗದ ಪೋರ್ಟ್"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b36f943ee27d..7594e18e7b6c 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1348,8 +1348,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi에 연결할 수 없습니다"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 인터넷 연결 상태가 좋지 않습니다."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"연결을 허용하시겠습니까?"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for wifi_connect_alert_message (8930084523889618078) -->
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
<skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"앱"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index aaf4c88c3c79..9675fdc5738b 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1662,8 +1662,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android жүргүзүлүүдө…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Сактагыч ыңгайлаштырылууда."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> даярдалууда."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Колдонмолорду иштетип баштоо"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Жүктөө аякталууда."</string>
<!-- no translation found for heavy_weight_notification (9087063985776626166) -->
@@ -1720,7 +1719,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi менен туташуу түзүлбөдү"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" хотспотунун интернет байланышы начар."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Туташууга уруксатпы?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$s менен туташкысы келди"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s колдонмосу %2$s Wifi тармагына туташкысы келет"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Колдонмо"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Дайректи иштетүү. Бул Wi-Fi клиентти/хотспотту өчүрөт."</string>
@@ -2360,8 +2359,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS сурамы DIAL сурамына өзгөртүлдү."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сурамы USSD сурамына өзгөртүлдү."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сурамы жаңы SS сурамына өзгөртүлдү."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Сырткы оюкча"</string>
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 7b20179e7f90..21644ecab749 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"ກຳ​ລັງ​ເລີ່ມລະ​ບົບ​ Android …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ການ​ປັບ​ບ່ອນ​ເກັບ​ຂໍ້​ມູນ​ໃຫ້​ເໝາະ​ສົມ."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"ກຳ​ລັງ​ກຽມ <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ບໍ່ສາມາດເຊື່ອມຕໍ່ Wi-Fi ໄດ້"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ມີສັນຍານອິນເຕີເນັດທີ່ບໍ່ດີ."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"​ອະ​ນຸ​ຍາດ​ການ​ເຊື່ອມ​ຕໍ່ຫຼື​ບໍ່?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ​ຕ້ອງ​ການ​ທີ່​ຈະ​ເຊື່ອມ​ຕໍ່​ຫາ %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"ແອັບ​ພ​ລິ​ເຄ​ຊັນ %1$s ຢາກ​ຈະ​ເຊື່ອມ​ຕໍ່​ກັບ​ເຄືອ​ຂ່າຍ Wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"​ແອັບ​ພລິ​ເຄ​ຊັນ"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ DIAL ແລ້ວ."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ USSD ແລ້ວ."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ SS ໃໝ່​ແລ້ວ."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"ຊ່ອງ​ຮອບນອກ USB"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 99595ecc9ec2..9e5bcb565533 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepavyko prisijungti prie „Wi-Fi“"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" turi prastą interneto ryšį."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Leisti prisijungti?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"„%1$s“ nori prisijungti prie „%2$s“"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Programa"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Tiesioginis „Wi-Fi“ ryšys"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Paleiskite „Wi-Fi Direct“. Bus išjungta „Wi-Fi“ programa / viešosios interneto prieigos taškas."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 05837d6aac56..20bad77d733a 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nevarēja izveidot savienojumu ar Wi-Fi."</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ir slikts interneta savienojums."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vai atļaut savienojumu?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vēlas izveidot savienojumu ar tīklu %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Lietojumprogramma"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Palaist programmu Wi-Fi Direct. Tādējādi tiks izslēgta Wi-Fi klienta/tīklāja darbība."</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index b77d0dec58c9..72dd8e231b7d 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android стартува…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизирање на складирањето."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Се подготвува <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не можеше да се поврзе со Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има слаба конекција на интернет."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Дозволете поврзување?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s сака да се поврзе на %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Апликацијата %1$s сака да се поврзе со Wifi-мрежата %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Апликација"</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>
@@ -1881,8 +1880,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Барањето SS е изменето во барање DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Барањето SS е изменето во барање USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Барањето SS е изменето во ново барање SS."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Надворешна порта на УСБ"</string>
</resources>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 862b1b94ff9b..134a9b5dd763 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android ആരംഭിക്കുന്നു…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"സംഭരണം ഒപ്‌റ്റിമൈസ് ചെയ്യുന്നു."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-ലേക്ക് കണക്‌റ്റുചെയ്യാൻ കഴിഞ്ഞില്ല"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" മോശം ഇന്റർനെറ്റ് കണക്ഷനാണുള്ളത്."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"കണക്ഷൻ അനുവദിക്കണോ?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s, %2$s എന്നതിലേക്ക് കണക്‌റ്റുചെയ്യാൻ ആഗ്രഹിക്കുന്നു"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"അപ്ലിക്കേഷൻ %1$s Wifi നെറ്റ്‌വർക്കിലേക്ക് കണക്‌റ്റുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ഒരു അപ്ലിക്കേഷൻ"</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>
@@ -1877,8 +1876,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS അഭ്യർത്ഥന, DIAL അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS അഭ്യർത്ഥന, USSD അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS അഭ്യർത്ഥന, പുതിയ SS അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB പെരിഫറൽ പോർട്ട്"</string>
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 3db7b83699f8..da08b729d955 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Андройд эхэлж байна..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хадгалалтыг сайжруулж байна."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Бэлдэж байна <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-д холбогдож чадсангүй"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет холболт муу байна."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Холболтыг зөвшөөрөх үү?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$s-тай холбогдохыг хүсэж байна"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Програм %1$s нь Wifi сүлжээ %2$s-тай холбох хүсэлтэй байна"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Аппликешн"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS хүсэлтийг DIAL хүсэлт болгон өөрчилсөн байна"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS хүсэлтийг USSD хүсэлт болгон өөрчилсөн байна."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS хүсэлтийг шинэ SS хүсэлт болгон өөрчилсөн байна."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Peripheral Port"</string>
</resources>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 58f80ded52d6..a2c21bd2e20f 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ करत आहे…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"संचयन ऑप्टिमाइझ करत आहे."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाय-फाय ला कनेक्ट करू शकलो नाही"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" खराब इंटरनेट कनेक्शन आहे."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"कनेक्शनला अनुमती द्यायची?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$s शी कनेक्ट करू इच्छितात"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s अनुप्रयोग %2$s वायफाय नेटवर्कशी कनेक्ट करू इच्छित आहे"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"अनुप्रयोग"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाय-फाय थेट"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाय-फाय थेट प्रारंभ करा. हे वाय-फाय क्लायंट/हॉटस्पॉट बंद करेल."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS विनंती डायल विनंतीवर सुधारित केली आहे."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS विनंती USSD विनंतीवर सुधारित केली आहे."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS विनंती नवीन SS विनंतीवर सुधारित केली आहे."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB बाह्यवर्ती पोर्ट"</string>
</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index eb928465f6a4..3ca56d748be0 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android sedang dimulakan…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Mengoptimumkan storan."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimumkan apl <xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Menyediakan <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulakan apl."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"But akhir."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Tidak boleh menyambung kepada Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" mempunyai sambungan internet yang kurang baik."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Benarkan sambungan?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ingin menyambung ke %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikasi %1$s ingin menyambung ke Rangkaian Wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Satu aplikasi"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Langsung"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Mulakan Wi-Fi Langsung. Hal ini akan mematikan pengendalian klien/liputan Wi-Fi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Permintaan SS diubah kepada permintaan DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah kepada permintaan USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah kepada permintaan SS baharu."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port Persisian USB"</string>
</resources>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 94d080d58b63..c8fb23cddb09 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android စတင်နေ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"သိုလှောင်မှုအား ပြုပြင်ခြင်း။"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ထဲက app<xliff:g id="NUMBER_1">%2$d</xliff:g>ကို ဆီလျော်အောင် လုပ်နေ"</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> အားပြင်ဆင်နေသည်။"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"appများကို စတင်နေ"</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ဝိုင်ဖိုင်ကိုချိတ်ဆက်မရပါ"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" အင်တာနက် ဆက်သွယ်မှု ကောင်းကောင်းမရှိပါ"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"ချိတ်ဆက်မှုကို ခွင့်ပြုမလား?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s က %2$s သို့ ချိတ်ဆက်ချင်"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"အပ္ပလီကေးရှင်း %1$s သည် ဝိုင်ဖိုင်ကွန်ရက် %2$s ကိုချိတ်ဆက်လိုသည်"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"အပလီကေးရှင်း"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"တိုက်ရိုက် ဝိုင်ဖိုင်"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"တိုက်ရိုက်ဝိုင်ဖိုင်ကို စတင်ပါ။ ၎င်းသည် ဝိုင်ဖိုင် ဟော့စပေါ့ကို ရပ်ဆိုင်းစေမှာ ဖြစ်ပါသည်။"</string>
@@ -1877,8 +1876,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"DIAL တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"USSD တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"အန်းဒရွိုက်"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB ဘေးရှိပို့တ်"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index d6288e436299..856e2d3b2685 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android starter …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimaliser lagring."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimaliserer app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starter apper."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ferdigstiller oppstart."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kan ikke koble til Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dårlig Internett-tilkobling."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vil du tillat tilkoblingen?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s prøver å koble til %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Appen %1$s vil koble til Wi-Fi-nettverket %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"En app"</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. Dette deaktiverer Wi-Fi-klienten/-sonen."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-forespørselen er endret til en RINGE-forespørsel."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-forespørselen er endret til en USSD-forespørsel."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-forespørselen er endret til en ny SS-forespørsel."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port for USB-tilleggsutstyr"</string>
</resources>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 76c2642a5f3f..73aa852c8930 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -1307,8 +1307,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android शुरू हुँदैछ..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"भण्डारण अनुकूलन गर्दै।"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1354,7 +1353,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाइ-फाइसँग जडान गर्न सकेन"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" कमजोर इन्टरनेट जडान छ।"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"जडान अनुमति दिने हो?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ले %2$s मा जडान गर्न चाहन्छ"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"अनुप्रयोग %1$s वाइफाइ नेटवर्क %2$s मा जडान गर्न चाहन्छ"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"एउटा अनुप्रयोग"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाइफाइ प्रत्यक्ष"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाइफाइ सिधा सुरु गर्नुहोस्। यसले वाइफाइ ग्राहक/हट्स्पटलाई बन्द गराउने छ।"</string>
@@ -1885,8 +1884,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS अनुरोध DIAL अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध USSD अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध नयाँ SS अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB परिधीय पोर्ट"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1c02a4019bfa..fc496aa60a3f 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android wordt gestart…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Opslagruimte wordt geoptimaliseerd."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g> optimaliseren."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> voorbereiden."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps starten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Opstarten afronden."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kan geen verbinding maken met wifi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" heeft een slechte internetverbinding."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Verbinding toestaan?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s wilt verbinding maken met %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"App %1$s wil verbinding maken met wifi-netwerk %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Een app"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wifi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wifi Direct starten. Hierdoor wordt de wifi-client/hotspot uitgeschakeld."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-verzoek is gewijzigd in DIAL-verzoek."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-verzoek is gewijzigd in USSD-verzoek."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-verzoek is gewijzigd in nieuw SS-verzoek."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Poort voor USB-randapparatuur"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 0c53ca833aef..06cca3baa4cf 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nie można połączyć się z siecią Wi-Fi."</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ma powolne połączenie internetowe."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Zezwolić na połączenie?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s chce połączyć się z: %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacja"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Uruchom Wi-Fi Direct. Spowoduje to wyłączenie klienta lub punktu dostępu Wi-Fi."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 85160d9c1d93..b5e5484fcbe0 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"O Android está a iniciar…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"A otimizar o armazenamento."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"A otimizar a aplicação <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"A preparar o <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"A iniciar aplicações"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"A concluir o arranque."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível ligar a Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma ligação à internet fraca."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir ligação?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s pretende ligar a %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"A aplicação %1$s pretende estabelecer ligação à rede Wi-Fi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Uma aplicação"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar o Wi-Fi Direct. Esta opção desativará o cliente/zona Wi-Fi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"O pedido SS foi modificado para um pedido DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"O pedido SS foi modificado para um pedido USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"O pedido SS foi modificado para um novo pedido SS."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Porta periférica USB"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 866884a628b5..5aab6e21dd1a 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível se conectar a redes Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma conexão de baixa qualidade com a Internet."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir conexão?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s gostaria de se conectar a %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Um app"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar o Wi-Fi Direct. Isso desativará o ponto de acesso/cliente Wi-Fi."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 6f147183b8d2..4bd24970089a 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nu se poate conecta la Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" are o conexiune la internet slabă."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permiteți conectarea?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s dorește să se conecteze la %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"O aplicație"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Porniţi Wi-Fi Direct. Acest lucru va dezactiva clientul/hotspotul Wi-Fi."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 58dce279298a..48e4a23245ff 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не удалось подключиться к сети Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" – плохое интернет-соединение."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Разрешить подключение?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s запрашивает доступ на подключение к %2$s."</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Приложение"</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>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index a431ca32b24e..559e86534868 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -1303,8 +1303,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android ආරම්භ කරමින්…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ආචයනය ප්‍රශස්තිකරණය කිරීම."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1350,7 +1349,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi වෙත සම්බන්ධ විය නොහැක"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" දුබල අන්තර්ජාල සම්බන්ධතාවයක් ඇත."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"සම්බන්ධතාවයට ඉඩ දෙන්නද?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%2$s වෙත සම්බන්ධවීමට %1$s කැමතිය"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"යෙදුම් %1$s ක් WiFi ජාලය %2$s වෙත සබැඳීමට කැමතියි"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"යෙදුම"</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>
@@ -1881,8 +1880,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ඉල්ලීම DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ඉල්ලීම USSD ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ඉල්ලීම නව DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"ඇන්ඩ්රොයිඩ්"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB පර්යන්ත තොට"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5b43942173c6..f275f855d440 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepodarilo sa pripojiť k sieti Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má nekvalitné internetové pripojenie."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povoliť pripojenie?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"Zariadenie %1$s sa chce pripojiť k sieti %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikácia"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Priame pripojenie Wi-Fi"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustiť priame pripojenie siete Wi-Fi. Táto možnosť vypne sieť Wi-Fi v režime klient alebo hotspot."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 0387d641688f..a53aac83f39b 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Z omrežjem Wi-Fi se ni mogoče povezati"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima slabo internetno povezavo."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ali dovolite vzpostavitev povezave?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s želi vzpostaviti povezavo s tem: %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacija"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Zaženite Wi-Fi Direct. S tem boste izklopili odjemalca/dostopno točko Wi-Fi."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 04caa4dff3e1..b1510b6ab3bf 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Није могуће повезати са Wi-Fi мрежом"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лошу интернет везу."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Желите ли да дозволите повезивање?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s жели да се повеже са мрежом %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Апликација"</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>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 68a5987f195a..8fbf645ecc07 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android startar …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lagringsutrymmet optimeras."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerar app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> förbereds."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Appar startas."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Uppgraderingen är klar."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> körs"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Det gick inte att ansluta till Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dålig Internetanslutning."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Tillåt anslutning?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s vill ansluta till %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Appen %1$s vill ansluta till Wi-Fi-nätverket %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"En app"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi direkt"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Starta direkt Wi-Fi-användning. Detta inaktiverar Wi-Fi-användning med klient/trådlös surfzon."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-begäran har ändrats till en DIAL-begäran."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-begäran har ändrats till en USSD-begäran."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-begäran har ändrats till en ny SS-begäran."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Perifer USB-port"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 8a6943b8737a..b2b21e3bd42f 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Haikuweza kuunganisha kwa Mtandao-Hewa"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ina muunganisho duni wa Mtandao."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ungepenga kuruhusu muunganisho?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s angependa kuunganisha kwenye %2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Programu"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Mtandao hewa Moja kwa moja"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Anzisha Wi-Fi Moja kwa Moja. Hii itazima mteja/mtandao-hewa wa Wi-Fi."</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 0f00395cc8c2..c8deaa7de8b0 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android துவங்குகிறது..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"சேமிப்பகத்தை உகந்ததாக்குகிறது."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"வைஃபை உடன் இணைக்க முடியவில்லை"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" இணைய இணைப்பு மோசமாக உள்ளது."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"இணைப்பை அனுமதிக்கவா?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s , %2$s உடன் இணைக்க விரும்புகிறது"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%2$s வைஃபை நெட்வொர்க்குடன், %1$s பயன்பாடு இணைக்க விரும்புகிறது"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ஒரு பயன்பாடு"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"வைஃபை Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"வைஃபை Direct ஐத் தொடங்குக. இது வைஃபை க்ளையண்ட்/ஹாட்ஸ்பாட்டை முடக்கும்."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS கோரிக்கையானது DIAL கோரிக்கைக்கு மாற்றப்பட்டது."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS கோரிக்கையானது USSD கோரிக்கைக்கு மாற்றப்பட்டது."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS கோரிக்கையானது புதிய SS கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB பெரிபெரல் போர்ட்"</string>
</resources>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 1a7ef9393ae2..27eeb8895c57 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android ప్రారంభమవుతోంది…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"నిల్వను అనుకూలపరుస్తోంది."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fiకి కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" బలహీన ఇంటర్నెట్ కనెక్షన్‌ను కలిగి ఉంది."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"కనెక్షన్‌ని అనుమతించాలా?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s %2$sకి కనెక్ట్ చేయాలనుకుంటున్నారు"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s అనువర్తనం %2$s Wifi నెట్‌వర్క్‌కు కనెక్ట్ చేయాలనుకుంటోంది"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ఒక అనువర్తనం"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS అభ్యర్థన డయల్ అభ్యర్థనగా సవరించబడింది."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS అభ్యర్థన USSD అభ్యర్థనగా సవరించబడింది."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS అభ్యర్థన కొత్త SS అభ్యర్థనగా సవరించబడింది."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB పెరిఫెరాల్ పోర్ట్"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 76e4fab2a56c..a4ebcec6448c 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android กำลังเริ่มต้น…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"กำลังเพิ่มประสิทธิภาพพื้นที่จัดเก็บข้อมูล"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"กำลังเตรียม <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ไม่สามารถเชื่อมต่อ WiFi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" มีสัญญาณอินเทอร์เน็ตไม่ดี"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"อนุญาตการเชื่อมต่อใช่ไหม"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s ต้องการเชื่อมต่อ %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"แอปพลิเคชัน %1$s ต้องการเชื่อมต่อเครือข่าย Wi-Fi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"แอปพลิเคชัน"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WiFi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"เริ่มการทำงาน WiFi Direct ซึ่งจะเป็นการปิดการทำงาน WiFi ไคลเอ็นต์/ฮอตสปอต"</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ DIAL"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ USSD"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ SS ใหม่"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"อุปกรณ์สำหรับต่อพอร์ต USB"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index fcb691063ae8..518d1f5d02d0 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Nagsisimula ang Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ino-optimize ang storage."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ino-optimize ang app <xliff:g id="NUMBER_0">%1$d</xliff:g> ng <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Ihinahanda ang <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Sinisimulan ang apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Pagtatapos ng pag-boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Hindi makakonekta sa Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ay mayroong mahinang koneksyon sa Internet."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Payagan ang kuneksyon?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"gustong kumonekta ni %1$s sa %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Gustong kumonekta ng application na %1$s sa Wifi Network na %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Isang application"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Simulan ang Wi-Fi Direct. I-o-off nito ang client/hotspot ng Wi-Fi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Ginawang DIAL request ang SS request."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ginawang USSD request ang SS request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ginawang bagong SS request ang SS request."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Peripheral Port"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index c7a5cfefcb12..e62423e546ad 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -55,7 +55,7 @@
<string name="mmiComplete" msgid="8232527495411698359">"MMI tamamlandı."</string>
<string name="badPin" msgid="9015277645546710014">"Yazdığınız eski PIN doğru değil."</string>
<string name="badPuk" msgid="5487257647081132201">"Yazdığınız PUK doğru değil."</string>
- <string name="mismatchPin" msgid="609379054496863419">"Girdiğiniz PIN kodları eşleşmiyor"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"Girdiğiniz PIN\'ler eşleşmiyor"</string>
<string name="invalidPin" msgid="3850018445187475377">"4 ila 8 rakamdan oluşan bir PIN girin."</string>
<string name="invalidPuk" msgid="8761456210898036513">"8 veya daha uzun basamaklı bir PUK kodu yazın."</string>
<string name="needPuk" msgid="919668385956251611">"SIM kartınızın PUK kilidi devrede. Kilidi açmak için PUK kodunu yazın."</string>
@@ -192,7 +192,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"Kapat"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Hata raporu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hata raporu al"</string>
- <string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere mevcut cihazınızın durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Sessiz mod"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ses KAPALI"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ses AÇIK"</string>
@@ -269,13 +269,13 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD karta erişin."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Erişilebilirlik özellikleri"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Engelli kullanıcılara yardımcı olan teknolojinin istekte bulunabileceği özellikler."</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alın"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceleyin."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açın"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alma"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açma"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Dokunulan öğeler sesli olarak okunur ve ekranı keşfetmek için hareketler kullanılabilir."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Gelişmiş web erişilebilirliğini açın"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Gelişmiş web erişilebilirliğini açma"</string>
<string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Uygulamanın erişilebilirliğini artırmak için komut dosyaları yüklenebilir."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız metni izleyin"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız metni izleme"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredi kartı ve şifre gibi kişisel bilgiler içerir."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"durum çubuğunu devre dışı bırak veya değiştir"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Uygulamaya, durum çubuğunu devre dışı bırakma ve sistem simgelerini ekleyip kaldırma izni verir."</string>
@@ -817,11 +817,11 @@
<string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Ekran kilidini açarken yapılan yanlış şifre girme denemelerini izle ve çok fazla sayıda yanlış şifre girme denemesi yapılmışsa tableti kilitle veya tabletteki tüm verileri sil."</string>
<string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"Ekran kilidi açılırken girilen hatalı şifre sayısını takip etme ve çok fazla sayıda hatalı şifre girildiğinde TV\'yi kilitleme veya TV\'nin tüm verilerini silme."</string>
<string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Ekran kilidini açarken yapılan yanlış şifre girişi denemelerini izle ve çok sayıda yanlış şifre girişi denemesi yapılmışsa telefonu kilitle veya telefonun tüm verilerini sil."</string>
- <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekran kilidini açma şifresini değiştir"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekran kilidini açma şifresini değiştirme"</string>
<string name="policydesc_resetPassword" msgid="605963962301904458">"Ekran kilidini açma şifresini değiştirme."</string>
- <string name="policylab_forceLock" msgid="2274085384704248431">"Ekranı kilitle"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Ekranı kilitleme"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"Ekranın nasıl ve ne zaman kilitlendiğini denetleme."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"Tüm verileri sil"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Tüm verileri silme"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek tabletteki verileri uyarıda bulunmadan silme."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Fabrika ayarlarına sıfırlama yoluyla TV\'nin verilerini uyarı vermeksizin silme."</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek telefondaki verileri uyarıda bulunmadan silme."</string>
@@ -1348,12 +1348,13 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kablosuz bağlantısı kurulamadı"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" İnternet bağlantısı zayıf."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Bağlantıya izin verilsin mi?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s, %2$s ile bağlantı kurmak istiyor"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Bir uygulama"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Kablosuz Doğrudan Bağlantı"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Kablosuz Doğrudan Bağlantıyı başlat. Bu işlem, Kablosuz istemci/hotspot kullanımını kapatacak."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Kablosuz Doğrudan bağlantı başlatılamadı."</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Kablosuz Doğrudan özelliği açık"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Kablosuz Doğrudan Bağlantı\'yı başlat. Bu işlem, Kablosuz istemci/hotspot kullanımını kapatacak."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Kablosuz Doğrudan Bağlantı başlatılamadı."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Kablosuz Doğrudan Bağlantı özelliği açık"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Ayarlar için dokunun"</string>
<string name="accept" msgid="1645267259272829559">"Kabul et"</string>
<string name="decline" msgid="2112225451706137894">"Reddet"</string>
@@ -1524,7 +1525,7 @@
<string name="submit" msgid="1602335572089911941">"Gönder"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Araba modu etkin"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Araba modundan çıkmak için dokunun."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Doğrudan bağlantı veya ortak erişim noktası etkin"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering veya hotspot etkin"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"Kurulum için dokunun."</string>
<string name="back_button_label" msgid="2300470004503343439">"Geri"</string>
<string name="next_button_label" msgid="1080555104677992408">"İleri"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index c650daa5185f..47c364baa20f 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -879,9 +879,9 @@
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Указати"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"Дом."</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Домашній"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Мобільний"</string>
- <string name="phoneTypeWork" msgid="8863939667059911633">"Роб."</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>
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Запуск ОС Android…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимізація пам’яті."</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Підготовка додатка <xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не вдалося під’єднатися до мережі Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" має погане з’єднання з Інтернетом."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Дозволити з’єднання?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s хоче під’єднатися до %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Додаток %1$s хоче під’єднатися до мережі Wi-Fi \"%2$s\""</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Додаток"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Запит SS перетворено на запит DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Запит SS перетворено на запит USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Запит SS перетворено на новий запит SS."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Периферійний USB-порт"</string>
</resources>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 259dc0eb8ff3..ae7acf2a2c57 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"‏Android شروع ہو رہا ہے…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"اسٹوریج کو بہترین بنایا جا رہا ہے۔"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"‏Wi-Fi سے مربوط نہیں ہو سکا"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اس میں ایک کمزور انٹرنیٹ کنکشن ہے۔"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"کنکشن کی اجازت دیں؟"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"‏%2$s سے ‎%1$s‎ منسلک ہونا چاہے گا"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"‏ایپلیکیشن ‎%1$s Wifi نیٹ ورک ‎%2$s سے منسلک ہونا چاہتی ہے"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ایک ایپلیکیشن"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"‏SS درخواست میں ترمیم کر کے DIAL درخواست بنا دی گئی ہے۔"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"‏SS درخواست میں ترمیم کر کے USSD درخواست بنا دی گئی ہے۔"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"‏SS درخواست میں ترمیم کر کے نئی SS درخواست بنا دی گئی ہے۔"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"‏USB ملحقہ پورٹ"</string>
</resources>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 325712440f51..51d24ed8fd34 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android ishga tushmoqda…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Xotira optimallashtirilmoqda."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ilovalar optimallashtirilmoqda (<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>)."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> tayyorlanmoqda."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ilovalar ishga tushirilmoqda."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Tizimni yuklashni tugatish."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi’ga ulana olmadi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tezligi past Internetga ulangan."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ulanishga ruxsat berilsinmi?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s quyidagiga ulanmoqchi: %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s ilovasi %2$s Wi-Fi tarmog‘iga ulanmoqchi"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Ilova"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct’ni ishga tushirish. Bu Wi-Fi mijoz/ulanish nuqtasini o‘chiradi."</string>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS so‘rovi DIAL so‘roviga o‘zgartirildi."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS so‘rovi USSD so‘roviga o‘zgartirildi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS so‘rovi yangi SS so‘roviga o‘zgartirildi."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Tashqi USB porti"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 5ea9b666884c..a6172d74e097 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android đang khởi động..."</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tối ưu hóa lưu trữ."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Đang tối ưu hóa ứng dụng <xliff:g id="NUMBER_0">%1$d</xliff:g> trong tổng số <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"Đang chuẩn bị <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Khởi động ứng dụng."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Hoàn tất khởi động."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string>
@@ -1348,9 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Không thể kết nối với Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" có kết nối Internet không tốt."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Cho phép kết nối?"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for wifi_connect_alert_message (8930084523889618078) -->
- <skip />
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Ứng dụng %1$s muốn kết nối với Mạng Wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Ứng dụng"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Khởi động Wi-Fi Direct. Việc này sẽ tắt hoạt động của ứng dụng khách/điểm phát sóng Wi-Fi."</string>
@@ -1881,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Yêu cầu SS được sửa đổi thành yêu cầu DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Yêu cầu SS được sửa đổi thành yêu cầu USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Yêu cầu SS được sửa đổi thành yêu cầu SS mới."</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Cổng ngoại vi USB"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 605c9d76c179..d225e3f5ec1d 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"无法连接到WLAN"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互联网连接状况不佳。"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"要允许连接吗?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s想要连接到%2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"一款应用"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WLAN直连"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"启动WLAN直连。此操作将会关闭WLAN客户端/热点。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 8a8b5dc784aa..210e955303e3 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在優化儲存空間。"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"正在準備升級「<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"無法連線至 Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互聯網連線欠佳。"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"允許連線?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s 要求連線至 %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"「%1$s」應用程式要求連線至 WiFi 網路 %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"應用程式"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 要求已修改為 DIAL 要求。"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已修改為 USSD 要求。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已修改為新的 SS 要求。"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 週邊連接埠"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5e1c3ffe52a4..97d878a7ef57 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1301,8 +1301,7 @@
<string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在對儲存空間進行最佳化處理。"</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>
- <!-- no translation found for android_preparing_apk (8162599310274079154) -->
- <skip />
+ <string name="android_preparing_apk" msgid="8162599310274079154">"正在準備升級「<xliff:g id="APPNAME">%1$s</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>
@@ -1348,7 +1347,7 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"無法連線至 Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 的網際網路連線狀況不佳。"</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"允許連線?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"%1$s 要求連線至 %2$s"</string>
+ <string name="wifi_connect_alert_message" msgid="6451273376815958922">"「%1$s」應用程式要求連線至 WiFi 網路 %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"應用程式"</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>
@@ -1879,8 +1878,6 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 要求已改為 DIAL 要求。"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已改為 USSD 要求。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已改為新的 SS 要求。"</string>
- <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
- <skip />
- <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) -->
- <skip />
+ <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
+ <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 週邊連接埠"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 44f475079f32..f9eb8301fe39 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1348,7 +1348,8 @@
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ayikwazanga ukuxhuma kwi-Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" inoxhumano oluphansi lwe-inthanethi."</string>
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vumela ukuxhumeka?"</string>
- <string name="wifi_connect_alert_message" msgid="8930084523889618078">"U-%1$s angathanda ukuxhumeka ku-%2$s"</string>
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Uhlelo lokusebenza"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"I-Wi-Fi Eqondile"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Qala ukusebenza kwe-Wi-Fi Okuqondile. Lokhu kuzocima ikhasimende le-Wi-Fi/Ukusebenza okwe-hotspot"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 559d750e4340..ceb7b63faf9c 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1952,6 +1952,16 @@
<!-- Whether to clip window content to the outline of the window background. -->
<attr name="windowClipToOutline" format="boolean" />
+
+ <!-- If set, the status bar will be drawn such that it is compatible with a light
+ status bar background.
+ <p>For this to take effect, the window must be drawing the system bar backgrounds with
+ {@link android.R.attr#windowDrawsSystemBarBackgrounds} and the status bar must not
+ have been requested to be translucent with
+ {@link android.R.attr#windowTranslucentStatus}.
+ Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_STATUS_BAR} on
+ the decor view. -->
+ <attr name="windowHasLightStatusBar" format="boolean" />
</declare-styleable>
<!-- The set of attributes that describe a AlertDialog's theme. -->
@@ -2631,6 +2641,8 @@
<declare-styleable name="Include">
<attr name="id" />
<attr name="visibility" />
+ <attr name="layout_width" />
+ <attr name="layout_height" />
</declare-styleable>
<!-- Attributes that can be used with a {@link android.view.ViewGroup} or any
@@ -5078,14 +5090,31 @@
<!-- Describes an item (or child) of a LayerDrawable. -->
<declare-styleable name="LayerDrawableItem">
- <!-- Left coordinate of the layer. -->
+ <!-- Left inset to apply to the layer. -->
<attr name="left" />
- <!-- Top coordinate of the layer. -->
+ <!-- Top inset to apply to the layer. -->
<attr name="top" />
- <!-- Right coordinate of the layer. -->
+ <!-- Right inset to apply to the layer. -->
<attr name="right" />
- <!-- Bottom coordinate of the layer. -->
+ <!-- Bottom inset to apply to the layer. -->
<attr name="bottom" />
+ <!-- Start inset to apply to the layer. Overrides {@code left} or
+ {@code right} depending on layout direction. -->
+ <attr name="start" format="dimension" />
+ <!-- End inset to apply to the layer. Overrides {@code left} or
+ {@code right} depending on layout direction. -->
+ <attr name="end" format="dimension" />
+ <!-- Width of the layer. Defaults to the layer's intrinsic width. -->
+ <attr name="width" />
+ <!-- Height of the layer. Defaults to the layer's intrinsic height -->
+ <attr name="height" />
+ <!-- Gravity used to align the layer within its container. If no value
+ is specified, the default behavior depends on whether an explicit
+ width or height has been set, If no dimension is set, gravity in
+ that direction defaults to {@code fill_horizontal} or
+ {@code fill_vertical}; otherwise, it defaults to {@code left} or
+ {@code top}. -->
+ <attr name="gravity" />
<!-- Drawable used to render the layer. -->
<attr name="drawable" />
<!-- Identifier of the layer. This can be used to retrieve the layer
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index b9ed78ac4d04..84609cadaf14 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1017,7 +1017,7 @@
at the same time.
<p>The default value is <code>false</code> for applications with
- <code>targetSdkVersion</code> lesser than {@link android.os.Build.VERSION_CODE#MNC} and
+ <code>targetSdkVersion</code> lesser than {@link android.os.Build.VERSION_CODES#MNC} and
<code>true</code> otherwise.
<p>NOTE: A task's root activity value is applied to all additional activities launched in
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 11cc18120074..e2a0ec9ecaa3 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2611,6 +2611,9 @@
<public type="attr" name="trackTint" />
<public type="attr" name="trackTintMode" />
<public type="attr" name="resizeableActivity" />
+ <public type="attr" name="start" />
+ <public type="attr" name="end" />
+ <public type="attr" name="windowHasLightStatusBar" />
<public type="style" name="Widget.Material.Button.Colored" />
diff --git a/core/tests/coretests/src/android/net/StaticIpConfigurationTest.java b/core/tests/coretests/src/android/net/StaticIpConfigurationTest.java
new file mode 100644
index 000000000000..59f780fefb8b
--- /dev/null
+++ b/core/tests/coretests/src/android/net/StaticIpConfigurationTest.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.RouteInfo;
+import android.net.StaticIpConfiguration;
+import android.os.Parcel;
+
+import java.net.InetAddress;
+import java.util.HashSet;
+
+import junit.framework.TestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import static org.junit.Assert.*;
+
+
+public class StaticIpConfigurationTest extends TestCase {
+
+ private static final String ADDRSTR = "192.0.2.2/25";
+ private static final LinkAddress ADDR = new LinkAddress(ADDRSTR);
+ private static final InetAddress GATEWAY = IpAddress("192.0.2.1");
+ private static final InetAddress OFFLINKGATEWAY = IpAddress("192.0.2.129");
+ private static final InetAddress DNS1 = IpAddress("8.8.8.8");
+ private static final InetAddress DNS2 = IpAddress("8.8.4.4");
+ private static final InetAddress DNS3 = IpAddress("4.2.2.2");
+ private static final String IFACE = "eth0";
+
+ private static InetAddress IpAddress(String addr) {
+ return InetAddress.parseNumericAddress(addr);
+ }
+
+ private void checkEmpty(StaticIpConfiguration s) {
+ assertNull(s.ipAddress);
+ assertNull(s.gateway);
+ assertNull(s.domains);
+ assertEquals(0, s.dnsServers.size());
+ }
+
+ private boolean isEqual(StaticIpConfiguration s1, StaticIpConfiguration s2) {
+ return s1.equals(s2);
+ }
+
+ private void assertEquals(StaticIpConfiguration s1, StaticIpConfiguration s2) {
+ assertTrue(isEqual(s1, s2));
+ }
+
+ private void assertNotEquals(StaticIpConfiguration s1, StaticIpConfiguration s2) {
+ assertFalse(isEqual(s1, s2));
+ }
+
+ private StaticIpConfiguration makeTestObject() {
+ StaticIpConfiguration s = new StaticIpConfiguration();
+ s.ipAddress = ADDR;
+ s.gateway = GATEWAY;
+ s.dnsServers.add(DNS1);
+ s.dnsServers.add(DNS2);
+ s.dnsServers.add(DNS3);
+ s.domains = "google.com";
+ return s;
+ }
+
+ @SmallTest
+ public void testConstructor() {
+ StaticIpConfiguration s = new StaticIpConfiguration();
+ checkEmpty(s);
+ }
+
+ @SmallTest
+ public void testCopyAndClear() {
+ StaticIpConfiguration empty = new StaticIpConfiguration((StaticIpConfiguration) null);
+ checkEmpty(empty);
+
+ StaticIpConfiguration s1 = makeTestObject();
+ StaticIpConfiguration s2 = new StaticIpConfiguration(s1);
+ assertEquals(s1, s2);
+ s2.clear();
+ assertEquals(empty, s2);
+ }
+
+ @SmallTest
+ public void testHashCodeAndEquals() {
+ HashSet<Integer> hashCodes = new HashSet();
+ hashCodes.add(0);
+
+ StaticIpConfiguration s = new StaticIpConfiguration();
+ // Check that this hash code is nonzero and different from all the ones seen so far.
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.ipAddress = ADDR;
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.gateway = GATEWAY;
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.dnsServers.add(DNS1);
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.dnsServers.add(DNS2);
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.dnsServers.add(DNS3);
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ s.domains = "example.com";
+ assertTrue(hashCodes.add(s.hashCode()));
+
+ assertFalse(s.equals(null));
+ assertEquals(s, s);
+
+ StaticIpConfiguration s2 = new StaticIpConfiguration(s);
+ assertEquals(s, s2);
+
+ s.ipAddress = new LinkAddress(DNS1, 32);
+ assertNotEquals(s, s2);
+
+ s2 = new StaticIpConfiguration(s);
+ s.domains = "foo";
+ assertNotEquals(s, s2);
+
+ s2 = new StaticIpConfiguration(s);
+ s.gateway = DNS2;
+ assertNotEquals(s, s2);
+
+ s2 = new StaticIpConfiguration(s);
+ s.dnsServers.add(DNS3);
+ assertNotEquals(s, s2);
+ }
+
+ @SmallTest
+ public void testToLinkProperties() {
+ LinkProperties expected = new LinkProperties();
+ expected.setInterfaceName(IFACE);
+
+ StaticIpConfiguration s = new StaticIpConfiguration();
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ final RouteInfo connectedRoute = new RouteInfo(new IpPrefix(ADDRSTR), null, IFACE);
+ s.ipAddress = ADDR;
+ expected.addLinkAddress(ADDR);
+ expected.addRoute(connectedRoute);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.gateway = GATEWAY;
+ RouteInfo defaultRoute = new RouteInfo(new IpPrefix("0.0.0.0/0"), GATEWAY, IFACE);
+ expected.addRoute(defaultRoute);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.gateway = OFFLINKGATEWAY;
+ expected.removeRoute(defaultRoute);
+ defaultRoute = new RouteInfo(new IpPrefix("0.0.0.0/0"), OFFLINKGATEWAY, IFACE);
+ expected.addRoute(defaultRoute);
+
+ RouteInfo gatewayRoute = new RouteInfo(new IpPrefix("192.0.2.129/32"), null, IFACE);
+ expected.addRoute(gatewayRoute);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.dnsServers.add(DNS1);
+ expected.addDnsServer(DNS1);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.dnsServers.add(DNS2);
+ s.dnsServers.add(DNS3);
+ expected.addDnsServer(DNS2);
+ expected.addDnsServer(DNS3);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.domains = "google.com";
+ expected.setDomains("google.com");
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ s.gateway = null;
+ expected.removeRoute(defaultRoute);
+ expected.removeRoute(gatewayRoute);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+
+ // Without knowing the IP address, we don't have a directly-connected route, so we can't
+ // tell if the gateway is off-link or not and we don't add a host route. This isn't a real
+ // configuration, but we should at least not crash.
+ s.gateway = OFFLINKGATEWAY;
+ s.ipAddress = null;
+ expected.removeLinkAddress(ADDR);
+ expected.removeRoute(connectedRoute);
+ expected.addRoute(defaultRoute);
+ assertEquals(expected, s.toLinkProperties(IFACE));
+ }
+
+ private StaticIpConfiguration passThroughParcel(StaticIpConfiguration s) {
+ Parcel p = Parcel.obtain();
+ StaticIpConfiguration s2 = null;
+ try {
+ s.writeToParcel(p, 0);
+ p.setDataPosition(0);
+ s2 = StaticIpConfiguration.CREATOR.createFromParcel(p);
+ } finally {
+ p.recycle();
+ }
+ assertNotNull(s2);
+ return s2;
+ }
+
+ @SmallTest
+ public void testParceling() {
+ StaticIpConfiguration s = makeTestObject();
+ StaticIpConfiguration s2 = passThroughParcel(s);
+ assertEquals(s, s2);
+ }
+}
+
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
index 0002ba7459bd..7bf5f65f1d86 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
@@ -33,7 +33,8 @@ mainDexList:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -41,10 +42,11 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/multidexlegacyandexception/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList)
-
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
index c9dbb570a296..416c238bf64f 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
@@ -33,7 +33,7 @@ mainDexList:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -41,12 +41,14 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/multidexlegacytestapp/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList)
+endif
## The application with a full main dex
include $(CLEAR_VARS)
@@ -67,7 +69,7 @@ mainDexList2:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList2)
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -75,9 +77,11 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList2): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/multidexlegacytestapp/Test.class" >> $@
$(built_dex_intermediate): $(mainDexList2)
+endif \ No newline at end of file
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
index 16e396b7a704..83ead4b32f92 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
@@ -36,9 +36,10 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
$(built_dex_intermediate): $(mainDexList)
-
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
index c62238bed292..d706ca908bbe 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
@@ -32,7 +32,8 @@ mainDexList:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -40,9 +41,11 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
+endif \ No newline at end of file
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
index 8c0c5d514457..99b2a8b383dc 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
@@ -32,7 +32,8 @@ mainDexList:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -40,9 +41,11 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
index 002c1cc3ff90..3ee1c22b8d92 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
@@ -32,7 +32,8 @@ mainDexList:= \
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
-ifeq ($(LOCAL_USE_JACK),true)
+
+ifdef LOCAL_USE_JACK
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
endif
@@ -40,10 +41,12 @@ LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+ifndef LOCAL_USE_JACK
$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
$(hide) mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@
echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
$(built_dex_intermediate): $(mainDexList)
+endif
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index daf44271ef74..505bd1dacaf2 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -29,6 +29,8 @@ import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.LayoutDirection;
+import android.view.Gravity;
import android.view.View;
import com.android.internal.R;
@@ -54,6 +56,11 @@ import java.util.Collection;
* @attr ref android.R.styleable#LayerDrawableItem_top
* @attr ref android.R.styleable#LayerDrawableItem_right
* @attr ref android.R.styleable#LayerDrawableItem_bottom
+ * @attr ref android.R.styleable#LayerDrawableItem_start
+ * @attr ref android.R.styleable#LayerDrawableItem_end
+ * @attr ref android.R.styleable#LayerDrawableItem_width
+ * @attr ref android.R.styleable#LayerDrawableItem_height
+ * @attr ref android.R.styleable#LayerDrawableItem_gravity
* @attr ref android.R.styleable#LayerDrawableItem_drawable
* @attr ref android.R.styleable#LayerDrawableItem_id
*/
@@ -73,6 +80,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
*/
public static final int PADDING_MODE_STACK = 1;
+ /** Value used for undefined start and end insets. */
+ private static final int UNDEFINED_INSET = Integer.MIN_VALUE;
+
LayerState mLayerState;
private int mOpacityOverride = PixelFormat.UNKNOWN;
@@ -231,6 +241,16 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
R.styleable.LayerDrawableItem_right, layer.mInsetR);
layer.mInsetB = a.getDimensionPixelOffset(
R.styleable.LayerDrawableItem_bottom, layer.mInsetB);
+ layer.mInsetS = a.getDimensionPixelOffset(
+ R.styleable.LayerDrawableItem_start, layer.mInsetS);
+ layer.mInsetE = a.getDimensionPixelOffset(
+ R.styleable.LayerDrawableItem_end, layer.mInsetE);
+ layer.mWidth = a.getDimensionPixelSize(
+ R.styleable.LayerDrawableItem_width, layer.mWidth);
+ layer.mHeight = a.getDimensionPixelSize(
+ R.styleable.LayerDrawableItem_height, layer.mHeight);
+ layer.mGravity = a.getInteger(
+ R.styleable.LayerDrawableItem_gravity, layer.mGravity);
layer.mId = a.getResourceId(R.styleable.LayerDrawableItem_id, layer.mId);
final Drawable dr = a.getDrawable(R.styleable.LayerDrawableItem_drawable);
@@ -447,6 +467,89 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
/**
+ * Sets an explicit size for the specified layer.
+ * <p>
+ * <strong>Note:</strong> Setting an explicit layer size changes the
+ * default layer gravity behavior. See {@link #setLayerGravity(int, int)}
+ * for more information.
+ *
+ * @param index the index of the drawable to adjust
+ * @param w width in pixels, or -1 to use the intrinsic width
+ * @param h height in pixels, or -1 to use the intrinsic height
+ *
+ * @see #getLayerWidth(int)
+ * @see #getLayerHeight(int)
+ * @attr ref android.R.styleable#LayerDrawableItem_width
+ * @attr ref android.R.styleable#LayerDrawableItem_height
+ */
+ public void setLayerSize(int index, int w, int h) {
+ final ChildDrawable childDrawable = mLayerState.mChildren[index];
+ childDrawable.mWidth = w;
+ childDrawable.mHeight = h;
+ }
+
+ /**
+ * @param index the index of the drawable to adjust
+ * @return the explicit width of the layer, or -1 if not specified
+ *
+ * @see #setLayerSize(int, int, int)
+ * @attr ref android.R.styleable#LayerDrawableItem_width
+ */
+ public int getLayerWidth(int index) {
+ final ChildDrawable childDrawable = mLayerState.mChildren[index];
+ return childDrawable.mWidth;
+ }
+
+ /**
+ * @param index the index of the drawable to adjust
+ * @return the explicit height of the layer, or -1 if not specified
+ *
+ * @see #setLayerSize(int, int, int)
+ * @attr ref android.R.styleable#LayerDrawableItem_height
+ */
+ public int getLayerHeight(int index) {
+ final ChildDrawable childDrawable = mLayerState.mChildren[index];
+ return childDrawable.mHeight;
+ }
+
+ /**
+ * Sets the gravity used to position or stretch the specified layer within
+ * its container. Gravity is applied after any layer insets (see
+ * {@link #setLayerInset(int, int, int, int, int)}) or padding (see
+ * {@link #setPaddingMode(int)}).
+ * <p>
+ * If gravity is specified as {@link Gravity#NO_GRAVITY}, the default
+ * behavior depends on whether an explicit width or height has been set
+ * (see {@link #setLayerSize(int, int, int)}), If a dimension is not set,
+ * gravity in that direction defaults to {@link Gravity#FILL_HORIZONTAL} or
+ * {@link Gravity#FILL_VERTICAL}; otherwise, gravity in that direction
+ * defaults to {@link Gravity#LEFT} or {@link Gravity#TOP}.
+ *
+ * @param index the index of the drawable to adjust
+ * @param gravity the gravity to set for the layer
+ *
+ * @see #getLayerGravity(int)
+ * @attr ref android.R.styleable#LayerDrawableItem_gravity
+ */
+ public void setLayerGravity(int index, int gravity) {
+ final ChildDrawable childDrawable = mLayerState.mChildren[index];
+ childDrawable.mGravity = gravity;
+ }
+
+ /**
+ * @param index the index of the layer
+ * @return the gravity used to position or stretch the specified layer
+ * within its container
+ *
+ * @see #setLayerGravity(int, int)
+ * @attr ref android.R.styleable#LayerDrawableItem_gravity
+ */
+ public int getLayerGravity(int index) {
+ final ChildDrawable childDrawable = mLayerState.mChildren[index];
+ return childDrawable.mGravity;
+ }
+
+ /**
* Specifies the insets in pixels for the drawable at the specified index.
*
* @param index the index of the drawable to adjust
@@ -454,13 +557,43 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
* @param t number of pixels to add to the top bound
* @param r number of pixels to subtract from the right bound
* @param b number of pixels to subtract from the bottom bound
+ *
+ * @attr ref android.R.styleable#LayerDrawableItem_left
+ * @attr ref android.R.styleable#LayerDrawableItem_top
+ * @attr ref android.R.styleable#LayerDrawableItem_right
+ * @attr ref android.R.styleable#LayerDrawableItem_bottom
*/
public void setLayerInset(int index, int l, int t, int r, int b) {
+ setLayerInsetInternal(index, l, t, r, b, UNDEFINED_INSET, UNDEFINED_INSET);
+ }
+
+ /**
+ * Specifies the relative insets in pixels for the drawable at the
+ * specified index.
+ *
+ * @param index the index of the drawable to adjust
+ * @param s number of pixels to inset from the start bound
+ * @param t number of pixels to inset from the top bound
+ * @param e number of pixels to inset from the end bound
+ * @param b number of pixels to inset from the bottom bound
+ *
+ * @attr ref android.R.styleable#LayerDrawableItem_start
+ * @attr ref android.R.styleable#LayerDrawableItem_top
+ * @attr ref android.R.styleable#LayerDrawableItem_end
+ * @attr ref android.R.styleable#LayerDrawableItem_bottom
+ */
+ public void setLayerInsetRelative(int index, int s, int t, int e, int b) {
+ setLayerInsetInternal(index, 0, t, 0, b, s, e);
+ }
+
+ private void setLayerInsetInternal(int index, int l, int t, int r, int b, int s, int e) {
final ChildDrawable childDrawable = mLayerState.mChildren[index];
childDrawable.mInsetL = l;
childDrawable.mInsetT = t;
childDrawable.mInsetR = r;
childDrawable.mInsetB = b;
+ childDrawable.mInsetS = s;
+ childDrawable.mInsetE = e;
}
/**
@@ -770,7 +903,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
if (paddingChanged) {
- onBoundsChange(getBounds());
+ updateLayerBounds(getBounds());
}
return changed;
@@ -795,7 +928,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
if (paddingChanged) {
- onBoundsChange(getBounds());
+ updateLayerBounds(getBounds());
}
return changed;
@@ -803,18 +936,50 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
@Override
protected void onBoundsChange(Rect bounds) {
+ updateLayerBounds(bounds);
+ }
+
+ private void updateLayerBounds(Rect bounds) {
int padL = 0;
int padT = 0;
int padR = 0;
int padB = 0;
+ final Rect outRect = mTmpRect;
+ final int layoutDirection = getLayoutDirection();
final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable r = array[i];
- r.mDrawable.setBounds(bounds.left + r.mInsetL + padL, bounds.top + r.mInsetT + padT,
- bounds.right - r.mInsetR - padR, bounds.bottom - r.mInsetB - padB);
+ final Drawable d = r.mDrawable;
+ final Rect container = d.getBounds();
+
+ // 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.
+ final int insetL, insetR;
+ if (layoutDirection == LayoutDirection.RTL) {
+ insetL = r.mInsetE == UNDEFINED_INSET ? r.mInsetL : r.mInsetE;
+ insetR = r.mInsetS == UNDEFINED_INSET ? r.mInsetR : r.mInsetS;
+ } else {
+ insetL = r.mInsetS == UNDEFINED_INSET ? r.mInsetL : r.mInsetS;
+ insetR = r.mInsetE == UNDEFINED_INSET ? r.mInsetR : r.mInsetE;
+ }
+
+ // Establish containing region based on aggregate padding and
+ // requested insets for the current layer.
+ container.set(bounds.left + insetL + padL, bounds.top + r.mInsetT + padT,
+ bounds.right - insetR - padR, bounds.bottom - r.mInsetB - padB);
+
+ // Apply resolved gravity to drawable based on resolved size.
+ final int gravity = resolveGravity(r.mGravity, r.mWidth, r.mHeight);
+ final int w = r.mWidth < 0 ? d.getIntrinsicWidth() : r.mWidth;
+ final int h = r.mHeight < 0 ? d.getIntrinsicHeight() : r.mHeight;
+ Gravity.apply(gravity, w, h, container, outRect, layoutDirection);
+ d.setBounds(outRect);
if (nest) {
padL += mPaddingL[i];
@@ -825,6 +990,38 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
}
+ /**
+ * Resolves layer gravity given explicit gravity and dimensions.
+ * <p>
+ * If the client hasn't specified a gravity but has specified an explicit
+ * dimension, defaults to START or TOP. Otherwise, defaults to FILL to
+ * preserve legacy behavior.
+ *
+ * @param gravity
+ * @param width
+ * @param height
+ * @return
+ */
+ private int resolveGravity(int gravity, int width, int height) {
+ if (!Gravity.isHorizontal(gravity)) {
+ if (width < 0) {
+ gravity |= Gravity.FILL_HORIZONTAL;
+ } else {
+ gravity |= Gravity.START;
+ }
+ }
+
+ if (!Gravity.isVertical(gravity)) {
+ if (height < 0) {
+ gravity |= Gravity.FILL_VERTICAL;
+ } else {
+ gravity |= Gravity.TOP;
+ }
+ }
+
+ return gravity;
+ }
+
@Override
public int getIntrinsicWidth() {
int width = -1;
@@ -836,7 +1033,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
final int N = mLayerState.mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable r = array[i];
- final int w = r.mDrawable.getIntrinsicWidth() + r.mInsetL + r.mInsetR + padL + padR;
+ final int minWidth = r.mWidth < 0 ? r.mDrawable.getIntrinsicWidth() : r.mWidth;
+ final int w = minWidth + r.mInsetL + r.mInsetR + padL + padR;
if (w > width) {
width = w;
}
@@ -861,7 +1059,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
final int N = mLayerState.mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable r = array[i];
- int h = r.mDrawable.getIntrinsicHeight() + r.mInsetT + r.mInsetB + padT + padB;
+ final int minHeight = r.mHeight < 0 ? r.mDrawable.getIntrinsicHeight() : r.mHeight;
+ final int h = minHeight + r.mInsetT + r.mInsetB + padT + padB;
if (h > height) {
height = h;
}
@@ -948,18 +1147,24 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
/** @hide */
@Override
public void setLayoutDirection(int layoutDirection) {
+ super.setLayoutDirection(layoutDirection);
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
for (int i = 0; i < N; i++) {
array[i].mDrawable.setLayoutDirection(layoutDirection);
}
- super.setLayoutDirection(layoutDirection);
+ updateLayerBounds(getBounds());
}
static class ChildDrawable {
public Drawable mDrawable;
public int[] mThemeAttrs;
public int mInsetL, mInsetT, mInsetR, mInsetB;
+ public int mInsetS = UNDEFINED_INSET;
+ public int mInsetE = UNDEFINED_INSET;
+ public int mWidth = -1;
+ public int mHeight = -1;
+ public int mGravity = Gravity.NO_GRAVITY;
public int mId = View.NO_ID;
ChildDrawable() {
@@ -981,6 +1186,11 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
mInsetT = orig.mInsetT;
mInsetR = orig.mInsetR;
mInsetB = orig.mInsetB;
+ mInsetS = orig.mInsetS;
+ mInsetE = orig.mInsetE;
+ mWidth = orig.mWidth;
+ mHeight = orig.mHeight;
+ mGravity = orig.mGravity;
mId = orig.mId;
}
}
diff --git a/libs/hwui/Android.common.mk b/libs/hwui/Android.common.mk
index a05217f7dc44..e05dd5512c50 100644
--- a/libs/hwui/Android.common.mk
+++ b/libs/hwui/Android.common.mk
@@ -34,9 +34,9 @@ LOCAL_SRC_FILES := \
CanvasState.cpp \
ClipArea.cpp \
DamageAccumulator.cpp \
- DisplayList.cpp \
DeferredDisplayList.cpp \
DeferredLayerUpdater.cpp \
+ DisplayList.cpp \
DisplayListRenderer.cpp \
Dither.cpp \
DrawProfiler.cpp \
@@ -44,6 +44,7 @@ LOCAL_SRC_FILES := \
FboCache.cpp \
FontRenderer.cpp \
GammaFontRenderer.cpp \
+ GlopBuilder.cpp \
GradientCache.cpp \
Image.cpp \
Interpolator.cpp \
@@ -70,9 +71,9 @@ LOCAL_SRC_FILES := \
Snapshot.cpp \
SpotShadow.cpp \
TessellationCache.cpp \
+ TextDropShadowCache.cpp \
Texture.cpp \
- TextureCache.cpp \
- TextDropShadowCache.cpp
+ TextureCache.cpp
intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 03b8283b80e1..af1b1cdd09e8 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -199,7 +199,7 @@ void Caches::terminate() {
fboCache.clear();
programCache.clear();
- setProgram(nullptr);
+ mProgram = nullptr;
patchCache.clear();
diff --git a/libs/hwui/Glop.h b/libs/hwui/Glop.h
index 730d9dfe57dd..bbeb19ebe438 100644
--- a/libs/hwui/Glop.h
+++ b/libs/hwui/Glop.h
@@ -23,10 +23,13 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+#include <SkXfermode.h>
namespace android {
namespace uirenderer {
+class Program;
+
/*
* Enumerates optional vertex attributes
*
@@ -53,18 +56,16 @@ struct Glop {
Rect bounds;
struct Mesh {
- VertexAttribFlags vertexFlags = static_cast<VertexAttribFlags>(0);
+ VertexAttribFlags vertexFlags;
GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
- GLuint vertexBufferObject = 0;
- GLuint indexBufferObject = 0;
+ GLuint vertexBufferObject;
+ GLuint indexBufferObject;
int vertexCount;
GLsizei stride;
} mesh;
struct Fill {
Program* program;
- GLuint shaderId;
- GLuint textureId;
struct Color {
float a, r, g, b;
@@ -89,10 +90,8 @@ struct Glop {
} transform;
struct Blend {
- static const SkXfermode::Mode kDisable =
- static_cast<SkXfermode::Mode>(SkXfermode::kLastMode + 1);
- SkXfermode::Mode mode;
- bool swapSrcDst;
+ GLenum src;
+ GLenum dst;
} blend;
/**
diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp
new file mode 100644
index 000000000000..dafe087dcd62
--- /dev/null
+++ b/libs/hwui/GlopBuilder.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "GlopBuilder.h"
+
+#include "Caches.h"
+#include "Glop.h"
+#include "Matrix.h"
+#include "Texture.h"
+#include "renderstate/MeshState.h"
+#include "renderstate/RenderState.h"
+#include "utils/PaintUtils.h"
+
+#include <GLES2/gl2.h>
+#include <SkPaint.h>
+
+namespace android {
+namespace uirenderer {
+
+GlopBuilder::GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop)
+ : mRenderState(renderState)
+ , mCaches(caches)
+ , mOutGlop(outGlop){
+}
+
+GlopBuilder& GlopBuilder::setMeshUnitQuad() {
+ mOutGlop->mesh.vertexFlags = static_cast<VertexAttribFlags>(0);
+ mOutGlop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
+ mOutGlop->mesh.vertexBufferObject = mRenderState.meshState().getUnitQuadVBO();
+ mOutGlop->mesh.indexBufferObject = 0;
+ mOutGlop->mesh.vertexCount = 4;
+ mOutGlop->mesh.stride = kTextureVertexStride;
+ return *this;
+}
+
+GlopBuilder& GlopBuilder::setTransformAndRect(ModelViewMode mode,
+ const Matrix4& ortho, const Matrix4& transform,
+ float left, float top, float right, float bottom, bool offset) {
+ mOutGlop->transform.ortho.load(ortho);
+
+ mOutGlop->transform.modelView.loadTranslate(left, top, 0.0f);
+ if (mode == kModelViewMode_TranslateAndScale) {
+ mOutGlop->transform.modelView.scale(right - left, bottom - top, 1.0f);
+ }
+
+ mOutGlop->transform.canvas.load(transform);
+
+ mOutGlop->transform.offset = offset;
+
+ mOutGlop->bounds.set(left, top, right, bottom);
+ mOutGlop->transform.canvas.mapRect(mOutGlop->bounds);
+ return *this;
+}
+
+GlopBuilder& GlopBuilder::setPaint(const SkPaint* paint, float alphaScale) {
+ // TODO: support null paint
+ const SkShader* shader = paint->getShader();
+ const SkColorFilter* colorFilter = paint->getColorFilter();
+
+ SkXfermode::Mode mode = PaintUtils::getXfermode(paint->getXfermode());
+ if (mode != SkXfermode::kClear_Mode) {
+ int color = paint->getColor();
+ float alpha = (SkColorGetA(color) / 255.0f) * alphaScale;
+ if (shader) {
+ // shader discards color channels
+ color |= 0x00FFFFFF;
+ }
+ mOutGlop->fill.color = {
+ alpha,
+ alpha * SkColorGetR(color),
+ alpha * SkColorGetG(color),
+ alpha * SkColorGetB(color)
+ };
+ } else {
+ mOutGlop->fill.color = { 1, 0, 0, 0 };
+ }
+ const bool SWAP_SRC_DST = false;
+ const bool HAS_FRAMEBUFFER_FETCH = false; //mExtensions.hasFramebufferFetch();
+
+ mOutGlop->blend = {GL_ZERO, GL_ZERO};
+ if (mOutGlop->fill.color.a < 1.0f
+ || (shader && !shader->isOpaque())
+ || PaintUtils::isBlendedColorFilter(colorFilter)
+ || mode != SkXfermode::kSrcOver_Mode) {
+ if (CC_LIKELY(mode <= SkXfermode::kScreen_Mode)) {
+ Blend::getFactors(mode, SWAP_SRC_DST,
+ &mOutGlop->blend.src, &mOutGlop->blend.dst);
+ } else {
+ // These blend modes are not supported by OpenGL directly and have
+ // to be implemented using shaders. Since the shader will perform
+ // the blending, don't enable GL blending off here
+ // If the blend mode cannot be implemented using shaders, fall
+ // back to the default SrcOver blend mode instead
+ if (CC_UNLIKELY(HAS_FRAMEBUFFER_FETCH)) {
+ mDescription.framebufferMode = mode;
+ mDescription.swapSrcDst = SWAP_SRC_DST;
+ // blending in shader, don't enable
+ } else {
+ // unsupported
+ Blend::getFactors(SkXfermode::kSrcOver_Mode, SWAP_SRC_DST,
+ &mOutGlop->blend.src, &mOutGlop->blend.dst);
+ }
+ }
+ }
+
+ return *this;
+}
+
+GlopBuilder& GlopBuilder::setTexture(Texture* texture) {
+ LOG_ALWAYS_FATAL("not yet supported");
+ return *this;
+}
+
+void GlopBuilder::build() {
+ mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
+ mOutGlop->fill.program = mCaches.programCache.get(mDescription);
+}
+
+} /* namespace uirenderer */
+} /* namespace android */
+
diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h
new file mode 100644
index 000000000000..d243d769c37c
--- /dev/null
+++ b/libs/hwui/GlopBuilder.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef RENDERSTATE_GLOPBUILDER_H
+#define RENDERSTATE_GLOPBUILDER_H
+
+#include "OpenGLRenderer.h"
+#include "Program.h"
+#include "utils/Macros.h"
+
+class SkPaint;
+
+namespace android {
+namespace uirenderer {
+
+class Caches;
+struct Glop;
+class RenderState;
+class Texture;
+class Matrix4;
+
+class GlopBuilder {
+ PREVENT_COPY_AND_ASSIGN(GlopBuilder);
+public:
+ GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop);
+ GlopBuilder& setMeshUnitQuad();
+ GlopBuilder& setTransformAndRect(ModelViewMode mode,
+ const Matrix4& ortho, const Matrix4& transform,
+ float left, float top, float right, float bottom, bool offset);
+ GlopBuilder& setPaint(const SkPaint* paint, float alphaScale);
+ GlopBuilder& setTexture(Texture* texture);
+ void build();
+private:
+ ProgramDescription mDescription;
+ RenderState& mRenderState;
+ Caches& mCaches;
+ Glop* mOutGlop;
+};
+
+} /* namespace uirenderer */
+} /* namespace android */
+
+#endif // RENDERSTATE_GLOPBUILDER_H
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index b56ce4fda0b0..f4b12b62e0b0 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -19,10 +19,13 @@
#include "DeferredDisplayList.h"
#include "DisplayListRenderer.h"
#include "GammaFontRenderer.h"
+#include "Glop.h"
+#include "GlopBuilder.h"
#include "Patch.h"
#include "PathTessellator.h"
#include "Properties.h"
#include "RenderNode.h"
+#include "renderstate/MeshState.h"
#include "renderstate/RenderState.h"
#include "ShadowTessellator.h"
#include "SkiaShader.h"
@@ -100,7 +103,7 @@ OpenGLRenderer::OpenGLRenderer(RenderState& renderState)
memset(&mDrawModifiers, 0, sizeof(mDrawModifiers));
mDrawModifiers.mOverrideLayerAlpha = 1.0f;
- memcpy(mMeshVertices, kMeshVertices, sizeof(kMeshVertices));
+ memcpy(mMeshVertices, kUnitQuadVertices, sizeof(kUnitQuadVertices));
}
OpenGLRenderer::~OpenGLRenderer() {
@@ -1703,9 +1706,9 @@ void OpenGLRenderer::setupDrawBlending(const SkPaint* paint, bool blend, bool sw
// When the blending mode is kClear_Mode, we need to use a modulate color
// argb=1,0,0,0
accountForClear(mode);
- blend |= (mColorSet && mColorA < 1.0f) ||
- (getShader(paint) && !getShader(paint)->isOpaque()) ||
- PaintUtils::isBlendedColorFilter(getColorFilter(paint));
+ blend |= (mColorSet && mColorA < 1.0f)
+ || (getShader(paint) && !getShader(paint)->isOpaque())
+ || PaintUtils::isBlendedColorFilter(getColorFilter(paint));
chooseBlending(blend, mode, mDescription, swapSrcDst);
}
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index d6eff85e1fa8..e2caf8bb45f9 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -492,7 +492,9 @@ void PathCache::precache(const SkPath* path, const SkPaint* paint) {
if (mProcessor == nullptr) {
mProcessor = new PathProcessor(Caches::getInstance());
}
- mProcessor->add(task);
+ if (!mProcessor->add(task)) {
+ mProcessor->process(task);
+ }
}
}
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index a0a5a1c1a21a..659ef6c1600e 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -836,7 +836,6 @@ void RenderNode::issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T&
*/
template <class T>
void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) {
- const int level = handler.level();
if (mDisplayListData->isEmpty()) {
DISPLAY_LIST_LOGD("%*sEmpty display list (%p, %s)", level * 2, "", this, getName());
return;
@@ -860,7 +859,7 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) {
#if DEBUG_DISPLAY_LIST
const Rect& clipRect = renderer.getLocalClipBounds();
DISPLAY_LIST_LOGD("%*sStart display list (%p, %s), localClipBounds: %.0f, %.0f, %.0f, %.0f",
- level * 2, "", this, getName(),
+ handler.level() * 2, "", this, getName(),
clipRect.left, clipRect.top, clipRect.right, clipRect.bottom);
#endif
@@ -900,7 +899,7 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) {
for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
DisplayListOp *op = mDisplayListData->displayListOps[opIndex];
#if DEBUG_DISPLAY_LIST
- op->output(level + 1);
+ op->output(handler.level() + 1);
#endif
handler(op, saveCountOffset, properties().getClipToBounds());
diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h
index c6483ac31663..4333792afe42 100644
--- a/libs/hwui/ResourceCache.h
+++ b/libs/hwui/ResourceCache.h
@@ -81,7 +81,7 @@ private:
uint32_t mPixelRefStableID;
friend class ResourceCache;
- friend class android::key_value_pair_t<BitmapKey, SkBitmap*>;
+ friend struct android::key_value_pair_t<BitmapKey, SkBitmap*>;
};
class ANDROID_API ResourceCache: public Singleton<ResourceCache> {
diff --git a/libs/hwui/Snapshot.cpp b/libs/hwui/Snapshot.cpp
index 49fb4bae4cd6..597d95ce7973 100644
--- a/libs/hwui/Snapshot.cpp
+++ b/libs/hwui/Snapshot.cpp
@@ -203,8 +203,8 @@ void Snapshot::dump() const {
ALOGD("Snapshot %p, flags %x, prev %p, height %d, ignored %d, hasComplexClip %d",
this, flags, previous.get(), getViewportHeight(), isIgnored(), !mClipArea->isSimple());
const Rect& clipRect(mClipArea->getClipRect());
- ALOGD(" ClipRect (at %p) %.1f %.1f %.1f %.1f",
- clipRect, clipRect.left, clipRect.top, clipRect.right, clipRect.bottom);
+ ALOGD(" ClipRect %.1f %.1f %.1f %.1f",
+ clipRect.left, clipRect.top, clipRect.right, clipRect.bottom);
ALOGD(" Transform (at %p):", transform);
transform->dump();
}
diff --git a/libs/hwui/TessellationCache.cpp b/libs/hwui/TessellationCache.cpp
index 4f028d54ae66..66de33380413 100644
--- a/libs/hwui/TessellationCache.cpp
+++ b/libs/hwui/TessellationCache.cpp
@@ -385,7 +385,9 @@ void TessellationCache::precacheShadows(const Matrix4* drawTransform, const Rect
if (mShadowProcessor == nullptr) {
mShadowProcessor = new ShadowProcessor(Caches::getInstance());
}
- mShadowProcessor->add(task);
+ if (!mShadowProcessor->add(task)) {
+ mShadowProcessor->process(task);
+ }
task->incStrong(nullptr); // not using sp<>s, so manually ref while in the cache
mShadowCache.put(key, task.get());
@@ -421,7 +423,9 @@ TessellationCache::Buffer* TessellationCache::getOrCreateBuffer(
if (mProcessor == nullptr) {
mProcessor = new TessellationProcessor(Caches::getInstance());
}
- mProcessor->add(task);
+ if (!mProcessor->add(task)) {
+ mProcessor->process(task);
+ }
mCache.put(entry, buffer);
}
return buffer;
diff --git a/libs/hwui/renderstate/Blend.cpp b/libs/hwui/renderstate/Blend.cpp
index 3e7b72183362..93088e49f066 100644
--- a/libs/hwui/renderstate/Blend.cpp
+++ b/libs/hwui/renderstate/Blend.cpp
@@ -79,21 +79,10 @@ Blend::Blend()
}
void Blend::enable(SkXfermode::Mode mode, bool swapSrcDst) {
- // enable
- if (!mEnabled) {
- glEnable(GL_BLEND);
- mEnabled = true;
- }
-
- // select blend mode
- GLenum sourceMode = swapSrcDst ? kBlendsSwap[mode].src : kBlends[mode].src;
- GLenum destMode = swapSrcDst ? kBlendsSwap[mode].dst : kBlends[mode].dst;
-
- if (sourceMode != mSrcMode || destMode != mSrcMode) {
- glBlendFunc(sourceMode, destMode);
- mSrcMode = sourceMode;
- mDstMode = destMode;
- }
+ GLenum srcMode;
+ GLenum dstMode;
+ getFactors(mode, swapSrcDst, &srcMode, &dstMode);
+ setFactors(srcMode, dstMode);
}
void Blend::disable() {
@@ -116,6 +105,28 @@ void Blend::syncEnabled() {
}
}
+void Blend::getFactors(SkXfermode::Mode mode, bool swapSrcDst, GLenum* outSrc, GLenum* outDst) {
+ *outSrc = swapSrcDst ? kBlendsSwap[mode].src : kBlends[mode].src;
+ *outDst = swapSrcDst ? kBlendsSwap[mode].dst : kBlends[mode].dst;
+}
+
+void Blend::setFactors(GLenum srcMode, GLenum dstMode) {
+ if (srcMode == GL_ZERO && dstMode == GL_ZERO) {
+ disable();
+ } else {
+ if (!mEnabled) {
+ glEnable(GL_BLEND);
+ mEnabled = true;
+ }
+
+ if (srcMode != mSrcMode || dstMode != mSrcMode) {
+ glBlendFunc(srcMode, dstMode);
+ mSrcMode = srcMode;
+ mDstMode = dstMode;
+ }
+ }
+}
+
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h
index b82b477deb79..31d7dde23ba1 100644
--- a/libs/hwui/renderstate/Blend.h
+++ b/libs/hwui/renderstate/Blend.h
@@ -32,6 +32,9 @@ public:
void enable(SkXfermode::Mode mode, bool swapSrcDst);
void disable();
void syncEnabled();
+
+ static void getFactors(SkXfermode::Mode mode, bool swapSrcDst, GLenum* outSrc, GLenum* outDst);
+ void setFactors(GLenum src, GLenum dst);
private:
Blend();
void invalidate();
diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp
index 022faf7dcafc..50c09c85f837 100644
--- a/libs/hwui/renderstate/MeshState.cpp
+++ b/libs/hwui/renderstate/MeshState.cpp
@@ -29,11 +29,11 @@ MeshState::MeshState()
, mCurrentTexCoordsStride(0)
, mTexCoordsArrayEnabled(false) {
- glGenBuffers(1, &meshBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(kMeshVertices), kMeshVertices, GL_STATIC_DRAW);
+ glGenBuffers(1, &mUnitQuadBuffer);
+ glBindBuffer(GL_ARRAY_BUFFER, mUnitQuadBuffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(kUnitQuadVertices), kUnitQuadVertices, GL_STATIC_DRAW);
- mCurrentBuffer = meshBuffer;
+ mCurrentBuffer = mUnitQuadBuffer;
mCurrentIndicesBuffer = 0;
mCurrentPixelBuffer = 0;
@@ -45,7 +45,7 @@ MeshState::MeshState()
}
MeshState::~MeshState() {
- glDeleteBuffers(1, &meshBuffer);
+ glDeleteBuffers(1, &mUnitQuadBuffer);
mCurrentBuffer = 0;
glDeleteBuffers(1, &mQuadListIndices);
@@ -60,11 +60,11 @@ MeshState::~MeshState() {
///////////////////////////////////////////////////////////////////////////////
bool MeshState::bindMeshBuffer() {
- return bindMeshBuffer(meshBuffer);
+ return bindMeshBuffer(mUnitQuadBuffer);
}
bool MeshState::bindMeshBuffer(GLuint buffer) {
- if (!buffer) buffer = meshBuffer;
+ if (!buffer) buffer = mUnitQuadBuffer;
if (mCurrentBuffer != buffer) {
glBindBuffer(GL_ARRAY_BUFFER, buffer);
mCurrentBuffer = buffer;
diff --git a/libs/hwui/renderstate/MeshState.h b/libs/hwui/renderstate/MeshState.h
index 9b1021dc8830..5cb1143300c7 100644
--- a/libs/hwui/renderstate/MeshState.h
+++ b/libs/hwui/renderstate/MeshState.h
@@ -32,7 +32,7 @@ const uint32_t kMaxNumberOfQuads = 2048;
// This array is never used directly but used as a memcpy source in the
// OpenGLRenderer constructor
-const TextureVertex kMeshVertices[] = {
+const TextureVertex kUnitQuadVertices[] = {
{ 0, 0, 0, 0 },
{ 1, 0, 1, 0 },
{ 0, 1, 0, 1 },
@@ -110,12 +110,16 @@ public:
bool bindShadowIndicesBuffer();
bool unbindIndicesBuffer();
+ ///////////////////////////////////////////////////////////////////////////////
+ // Getters - for use in Glop building
+ ///////////////////////////////////////////////////////////////////////////////
+ GLuint getUnitQuadVBO() { return mUnitQuadBuffer; }
private:
MeshState();
bool bindIndicesBufferInternal(const GLuint buffer);
// VBO to draw with
- GLuint meshBuffer;
+ GLuint mUnitQuadBuffer;
GLuint mCurrentBuffer;
GLuint mCurrentIndicesBuffer;
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index 5e028447bf11..0cb3ddbe09e7 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -219,7 +219,7 @@ void RenderState::render(const Glop& glop) {
mCaches->setProgram(shader.program);
Glop::Fill::Color color = shader.color;
- shader.program->setColor(color.a, color.r, color.g, color.b);
+ shader.program->setColor(color.r, color.g, color.b, color.a);
shader.program->set(glop.transform.ortho,
glop.transform.modelView,
@@ -261,14 +261,13 @@ void RenderState::render(const Glop& glop) {
meshState().bindIndicesBufferInternal(mesh.indexBufferObject);
// ---------- GL state setup ----------
+ blend().setFactors(glop.blend.src, glop.blend.dst);
- if (glop.blend.mode != Glop::Blend::kDisable) {
- blend().enable(glop.blend.mode, glop.blend.swapSrcDst);
+ if (mesh.indexBufferObject) {
+ glDrawElements(glop.mesh.primitiveMode, glop.mesh.vertexCount, GL_UNSIGNED_BYTE, nullptr);
} else {
- blend().disable();
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, glop.mesh.vertexCount);
}
-
- glDrawElements(glop.mesh.primitiveMode, glop.mesh.vertexCount, GL_UNSIGNED_BYTE, nullptr);
}
} /* namespace uirenderer */
diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp
index a12dac78454f..1e7ba233791c 100644
--- a/libs/hwui/tests/main.cpp
+++ b/libs/hwui/tests/main.cpp
@@ -42,7 +42,8 @@ public:
static DisplayListRenderer* startRecording(RenderNode* node) {
DisplayListRenderer* renderer = new DisplayListRenderer();
- renderer->setViewport(node->getWidth(), node->getHeight());
+ renderer->setViewport(node->stagingProperties().getWidth(),
+ node->stagingProperties().getHeight());
renderer->prepare();
return renderer;
}
@@ -53,80 +54,174 @@ static void endRecording(DisplayListRenderer* renderer, RenderNode* node) {
delete renderer;
}
-sp<RenderNode> createCard(int x, int y, int width, int height) {
- sp<RenderNode> node = new RenderNode();
- node->mutateStagingProperties().setLeftTopRightBottom(x, y, x + width, y + height);
- node->mutateStagingProperties().setElevation(dp(16));
- node->mutateStagingProperties().mutableOutline().setRoundRect(0, 0, width, height, dp(10), 1);
- node->mutateStagingProperties().mutableOutline().setShouldClip(true);
- node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y | RenderNode::Z);
-
- DisplayListRenderer* renderer = startRecording(node.get());
- renderer->drawColor(0xFFEEEEEE, SkXfermode::kSrcOver_Mode);
- endRecording(renderer, node.get());
+class TreeContentAnimation {
+public:
+ virtual ~TreeContentAnimation() {}
+ virtual int getFrameCount() { return 150; }
+ virtual void createContent(int width, int height, DisplayListRenderer* renderer) = 0;
+ virtual void doFrame(int frameNr) = 0;
+
+ template <class T>
+ static void run() {
+ T animation;
+
+ TestContext testContext;
+
+ // create the native surface
+ const int width = gDisplay.w;
+ const int height = gDisplay.h;
+ sp<Surface> surface = testContext.surface();
+
+ RenderNode* rootNode = new RenderNode();
+ rootNode->incStrong(nullptr);
+ rootNode->mutateStagingProperties().setLeftTopRightBottom(0, 0, width, height);
+ rootNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+ rootNode->mutateStagingProperties().setClipToBounds(false);
+ rootNode->setPropertyFieldsDirty(RenderNode::GENERIC);
+
+ ContextFactory factory;
+ std::unique_ptr<RenderProxy> proxy(new RenderProxy(false, rootNode, &factory));
+ proxy->loadSystemProperties();
+ proxy->initialize(surface);
+ float lightX = width / 2.0;
+ proxy->setup(width, height, (Vector3){lightX, dp(-200.0f), dp(800.0f)},
+ dp(800.0f), 255 * 0.075, 255 * 0.15);
+
+ android::uirenderer::Rect DUMMY;
+
+ std::vector< sp<RenderNode> > cards;
+
+ DisplayListRenderer* renderer = startRecording(rootNode);
+ animation.createContent(width, height, renderer);
+ endRecording(renderer, rootNode);
+
+ for (int i = 0; i < 150; i++) {
+ testContext.waitForVsync();
+
+ ATRACE_NAME("UI-Draw Frame");
+ animation.doFrame(i);
+ nsecs_t frameTimeNs = systemTime(CLOCK_MONOTONIC);
+ proxy->syncAndDrawFrame(frameTimeNs, 0, gDisplay.density);
+ }
- return node;
-}
+ sleep(5);
-int main(int argc, char* argv[]) {
- TestContext testContext;
-
- // create the native surface
- const int width = gDisplay.w;
- const int height = gDisplay.h;
- sp<Surface> surface = testContext.surface();
-
- RenderNode* rootNode = new RenderNode();
- rootNode->incStrong(nullptr);
- rootNode->mutateStagingProperties().setLeftTopRightBottom(0, 0, width, height);
- rootNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
- rootNode->mutateStagingProperties().setClipToBounds(false);
- rootNode->setPropertyFieldsDirty(RenderNode::GENERIC);
-
- ContextFactory factory;
- std::unique_ptr<RenderProxy> proxy(new RenderProxy(false, rootNode, &factory));
- proxy->loadSystemProperties();
- proxy->initialize(surface);
- float lightX = width / 2.0;
- proxy->setup(width, height, (Vector3){lightX, dp(-200.0f), dp(800.0f)},
- dp(800.0f), 255 * 0.075, 255 * 0.15);
-
- android::uirenderer::Rect DUMMY;
+ rootNode->decStrong(nullptr);
+ }
+};
+class ShadowGridAnimation : public TreeContentAnimation {
+public:
std::vector< sp<RenderNode> > cards;
+ void createContent(int width, int height, DisplayListRenderer* renderer) override {
+ android::uirenderer::Rect DUMMY;
+
+ renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
+ renderer->insertReorderBarrier(true);
+
+ for (int x = dp(16); x < (width - dp(116)); x += dp(116)) {
+ for (int y = dp(16); y < (height - dp(116)); y += dp(116)) {
+ sp<RenderNode> card = createCard(x, y, dp(100), dp(100));
+ renderer->drawRenderNode(card.get(), DUMMY, 0);
+ cards.push_back(card);
+ }
+ }
- DisplayListRenderer* renderer = startRecording(rootNode);
- renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
- renderer->insertReorderBarrier(true);
-
- for (int x = dp(16); x < (width - dp(116)); x += dp(116)) {
- for (int y = dp(16); y < (height - dp(116)); y += dp(116)) {
- sp<RenderNode> card = createCard(x, y, dp(100), dp(100));
- renderer->drawRenderNode(card.get(), DUMMY, 0);
- cards.push_back(card);
+ renderer->insertReorderBarrier(false);
+ }
+ void doFrame(int frameNr) override {
+ for (size_t ci = 0; ci < cards.size(); ci++) {
+ cards[ci]->mutateStagingProperties().setTranslationX(frameNr);
+ cards[ci]->mutateStagingProperties().setTranslationY(frameNr);
+ cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
}
}
+private:
+ sp<RenderNode> createCard(int x, int y, int width, int height) {
+ sp<RenderNode> node = new RenderNode();
+ node->mutateStagingProperties().setLeftTopRightBottom(x, y, x + width, y + height);
+ node->mutateStagingProperties().setElevation(dp(16));
+ node->mutateStagingProperties().mutableOutline().setRoundRect(0, 0, width, height, dp(10), 1);
+ node->mutateStagingProperties().mutableOutline().setShouldClip(true);
+ node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y | RenderNode::Z);
+
+ DisplayListRenderer* renderer = startRecording(node.get());
+ renderer->drawColor(0xFFEEEEEE, SkXfermode::kSrcOver_Mode);
+ endRecording(renderer, node.get());
+ return node;
+ }
+};
- renderer->insertReorderBarrier(false);
- endRecording(renderer, rootNode);
+class RectGridAnimation : public TreeContentAnimation {
+public:
+ sp<RenderNode> card;
+ void createContent(int width, int height, DisplayListRenderer* renderer) override {
+ android::uirenderer::Rect DUMMY;
- for (int i = 0; i < 150; i++) {
- testContext.waitForVsync();
+ renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
+ renderer->insertReorderBarrier(true);
- ATRACE_NAME("UI-Draw Frame");
- for (size_t ci = 0; ci < cards.size(); ci++) {
- cards[ci]->mutateStagingProperties().setTranslationX(i);
- cards[ci]->mutateStagingProperties().setTranslationY(i);
- cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+ card = createCard(40, 40, 200, 200);
+ renderer->drawRenderNode(card.get(), DUMMY, 0);
+
+ renderer->insertReorderBarrier(false);
+ }
+ void doFrame(int frameNr) override {
+ card->mutateStagingProperties().setTranslationX(frameNr);
+ card->mutateStagingProperties().setTranslationY(frameNr);
+ card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+ }
+private:
+ sp<RenderNode> createCard(int x, int y, int width, int height) {
+ sp<RenderNode> node = new RenderNode();
+ node->mutateStagingProperties().setLeftTopRightBottom(x, y, x + width, y + height);
+ node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+
+ DisplayListRenderer* renderer = startRecording(node.get());
+ renderer->drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode);
+
+ float rects[width * height];
+ int index = 0;
+ for (int xOffset = 0; xOffset < width; xOffset+=2) {
+ for (int yOffset = 0; yOffset < height; yOffset+=2) {
+ rects[index++] = xOffset;
+ rects[index++] = yOffset;
+ rects[index++] = xOffset + 1;
+ rects[index++] = yOffset + 1;
+ }
}
- nsecs_t frameTimeNs = systemTime(CLOCK_MONOTONIC);
- proxy->syncAndDrawFrame(frameTimeNs, 0, gDisplay.density);
+ int count = width * height;
+
+ SkPaint paint;
+ paint.setColor(0xff00ffff);
+ renderer->drawRects(rects, count, &paint);
+
+ endRecording(renderer, node.get());
+ return node;
}
+};
- sleep(5);
+struct cstr_cmp {
+ bool operator()(const char *a, const char *b) const {
+ return std::strcmp(a, b) < 0;
+ }
+};
- rootNode->decStrong(nullptr);
+typedef void (*testProc)();
+std::map<const char*, testProc, cstr_cmp> gTestMap {
+ {"shadowgrid", TreeContentAnimation::run<ShadowGridAnimation>},
+ {"rectgrid", TreeContentAnimation::run<RectGridAnimation> },
+};
+
+int main(int argc, char* argv[]) {
+ const char* testName = argc > 1 ? argv[1] : "shadowgrid";
+ testProc proc = gTestMap[testName];
+ if(!proc) {
+ printf("Error: couldn't find test %s\n", testName);
+ return 1;
+ }
+ proc();
printf("Success!\n");
return 0;
}
diff --git a/libs/hwui/thread/TaskManager.cpp b/libs/hwui/thread/TaskManager.cpp
index 3c30aab8ad80..c69b2fd56383 100644
--- a/libs/hwui/thread/TaskManager.cpp
+++ b/libs/hwui/thread/TaskManager.cpp
@@ -105,6 +105,8 @@ bool TaskManager::WorkerThread::threadLoop() {
bool TaskManager::WorkerThread::addTask(TaskWrapper task) {
if (!isRunning()) {
run(mName.string(), PRIORITY_DEFAULT);
+ } else if (exitPending()) {
+ return false;
}
Mutex::Autolock l(mLock);
@@ -120,10 +122,6 @@ size_t TaskManager::WorkerThread::getTaskCount() const {
}
void TaskManager::WorkerThread::exit() {
- {
- Mutex::Autolock l(mLock);
- mTasks.clear();
- }
requestExit();
mSignal.signal();
}
diff --git a/libs/hwui/thread/TaskProcessor.h b/libs/hwui/thread/TaskProcessor.h
index eb4ab64a3e94..ec6519cf85ad 100644
--- a/libs/hwui/thread/TaskProcessor.h
+++ b/libs/hwui/thread/TaskProcessor.h
@@ -30,9 +30,6 @@ public:
TaskProcessorBase() { }
virtual ~TaskProcessorBase() { };
-private:
- friend class TaskManager;
-
virtual void process(const sp<TaskBase>& task) = 0;
};
@@ -44,9 +41,6 @@ public:
bool add(const sp<Task<T> >& task);
- virtual void onProcess(const sp<Task<T> >& task) = 0;
-
-private:
virtual void process(const sp<TaskBase>& task) override {
sp<Task<T> > realTask = static_cast<Task<T>* >(task.get());
// This is the right way to do it but sp<> doesn't play nice
@@ -54,6 +48,8 @@ private:
onProcess(realTask);
}
+ virtual void onProcess(const sp<Task<T> >& task) = 0;
+
TaskManager* mManager;
};
diff --git a/libs/hwui/utils/PaintUtils.h b/libs/hwui/utils/PaintUtils.h
index fa0ae03a69f7..2091705ff396 100644
--- a/libs/hwui/utils/PaintUtils.h
+++ b/libs/hwui/utils/PaintUtils.h
@@ -16,6 +16,9 @@
#ifndef PAINT_UTILS_H
#define PAINT_UTILS_H
+#include <SkColorFilter.h>
+#include <SkXfermode.h>
+
namespace android {
namespace uirenderer {
diff --git a/location/java/android/location/GpsSatellite.java b/location/java/android/location/GpsSatellite.java
index 17af4a647461..820f574653a9 100644
--- a/location/java/android/location/GpsSatellite.java
+++ b/location/java/android/location/GpsSatellite.java
@@ -40,13 +40,17 @@ public final class GpsSatellite {
* cached GpsStatus instance to the client's copy.
*/
void setStatus(GpsSatellite satellite) {
- mValid = satellite.mValid;
- mHasEphemeris = satellite.mHasEphemeris;
- mHasAlmanac = satellite.mHasAlmanac;
- mUsedInFix = satellite.mUsedInFix;
- mSnr = satellite.mSnr;
- mElevation = satellite.mElevation;
- mAzimuth = satellite.mAzimuth;
+ if (satellite == null) {
+ mValid = false;
+ } else {
+ mValid = satellite.mValid;
+ mHasEphemeris = satellite.mHasEphemeris;
+ mHasAlmanac = satellite.mHasAlmanac;
+ mUsedInFix = satellite.mUsedInFix;
+ mSnr = satellite.mSnr;
+ mElevation = satellite.mElevation;
+ mAzimuth = satellite.mAzimuth;
+ }
}
/**
diff --git a/location/java/android/location/GpsStatus.java b/location/java/android/location/GpsStatus.java
index 4af55a65b0e3..323f3269368e 100644
--- a/location/java/android/location/GpsStatus.java
+++ b/location/java/android/location/GpsStatus.java
@@ -16,6 +16,8 @@
package android.location;
+import android.util.SparseArray;
+
import java.util.Iterator;
import java.util.NoSuchElementException;
@@ -29,20 +31,24 @@ public final class GpsStatus {
/* These package private values are modified by the LocationManager class */
private int mTimeToFirstFix;
- private GpsSatellite mSatellites[] = new GpsSatellite[NUM_SATELLITES];
+ private final SparseArray<GpsSatellite> mSatellites = new SparseArray<>();
private final class SatelliteIterator implements Iterator<GpsSatellite> {
- private GpsSatellite[] mSatellites;
- int mIndex = 0;
+ private final SparseArray<GpsSatellite> mSatellites;
+ private final int mSatellitesCount;
+
+ private int mIndex = 0;
- SatelliteIterator(GpsSatellite[] satellites) {
+ SatelliteIterator(SparseArray<GpsSatellite> satellites) {
mSatellites = satellites;
+ mSatellitesCount = satellites.size();
}
public boolean hasNext() {
- for (int i = mIndex; i < mSatellites.length; i++) {
- if (mSatellites[i].mValid) {
+ for (; mIndex < mSatellitesCount; ++mIndex) {
+ GpsSatellite satellite = mSatellites.valueAt(mIndex);
+ if (satellite.mValid) {
return true;
}
}
@@ -50,8 +56,9 @@ public final class GpsStatus {
}
public GpsSatellite next() {
- while (mIndex < mSatellites.length) {
- GpsSatellite satellite = mSatellites[mIndex++];
+ while (mIndex < mSatellitesCount) {
+ GpsSatellite satellite = mSatellites.valueAt(mIndex);
+ ++mIndex;
if (satellite.mValid) {
return satellite;
}
@@ -106,7 +113,7 @@ public final class GpsStatus {
* <li> {@link GpsStatus#GPS_EVENT_SATELLITE_STATUS}
* </ul>
*
- * When this method is called, the client should call
+ * When this method is called, the client should call
* {@link LocationManager#getGpsStatus} to get additional
* status information.
*
@@ -127,11 +134,8 @@ public final class GpsStatus {
void onNmeaReceived(long timestamp, String nmea);
}
- GpsStatus() {
- for (int i = 0; i < mSatellites.length; i++) {
- mSatellites[i] = new GpsSatellite(i + 1);
- }
- }
+ // For API-compat a public ctor() is not available
+ GpsStatus() {}
/**
* Used internally within {@link LocationManager} to copy GPS status
@@ -141,18 +145,17 @@ public final class GpsStatus {
synchronized void setStatus(int svCount, int[] prns, float[] snrs,
float[] elevations, float[] azimuths, int ephemerisMask,
int almanacMask, int usedInFixMask) {
- int i;
+ clearSatellites();
+ for (int i = 0; i < svCount; i++) {
+ int prn = prns[i];
+ int prnShift = (1 << (prn - 1));
+ if (prn > 0 && prn <= NUM_SATELLITES) {
+ GpsSatellite satellite = mSatellites.get(prn);
+ if (satellite == null) {
+ satellite = new GpsSatellite(prn);
+ mSatellites.put(prn, satellite);
+ }
- for (i = 0; i < mSatellites.length; i++) {
- mSatellites[i].mValid = false;
- }
-
- for (i = 0; i < svCount; i++) {
- int prn = prns[i] - 1;
- int prnShift = (1 << prn);
- if (prn >= 0 && prn < mSatellites.length) {
- GpsSatellite satellite = mSatellites[prn];
-
satellite.mValid = true;
satellite.mSnr = snrs[i];
satellite.mElevation = elevations[i];
@@ -172,10 +175,38 @@ public final class GpsStatus {
*/
void setStatus(GpsStatus status) {
mTimeToFirstFix = status.getTimeToFirstFix();
+ clearSatellites();
+
+ SparseArray<GpsSatellite> otherSatellites = status.mSatellites;
+ int otherSatellitesCount = otherSatellites.size();
+ int satelliteIndex = 0;
+ // merge both sparse arrays, note that we have already invalidated the elements in the
+ // receiver array
+ for (int i = 0; i < otherSatellitesCount; ++i) {
+ GpsSatellite otherSatellite = otherSatellites.valueAt(i);
+ int otherSatellitePrn = otherSatellite.getPrn();
+
+ int satellitesCount = mSatellites.size();
+ while (satelliteIndex < satellitesCount
+ && mSatellites.valueAt(satelliteIndex).getPrn() < otherSatellitePrn) {
+ ++satelliteIndex;
+ }
- for (int i = 0; i < mSatellites.length; i++) {
- mSatellites[i].setStatus(status.mSatellites[i]);
- }
+ if (satelliteIndex < mSatellites.size()) {
+ GpsSatellite satellite = mSatellites.valueAt(satelliteIndex);
+ if (satellite.getPrn() == otherSatellitePrn) {
+ satellite.setStatus(otherSatellite);
+ } else {
+ satellite = new GpsSatellite(otherSatellitePrn);
+ satellite.setStatus(otherSatellite);
+ mSatellites.put(otherSatellitePrn, satellite);
+ }
+ } else {
+ GpsSatellite satellite = new GpsSatellite(otherSatellitePrn);
+ satellite.setStatus(otherSatellite);
+ mSatellites.append(otherSatellitePrn, satellite);
+ }
+ }
}
void setTimeToFirstFix(int ttff) {
@@ -183,7 +214,7 @@ public final class GpsStatus {
}
/**
- * Returns the time required to receive the first fix since the most recent
+ * Returns the time required to receive the first fix since the most recent
* restart of the GPS engine.
*
* @return time to first fix in milliseconds
@@ -211,4 +242,12 @@ public final class GpsStatus {
public int getMaxSatellites() {
return NUM_SATELLITES;
}
+
+ private void clearSatellites() {
+ int satellitesCount = mSatellites.size();
+ for (int i = 0; i < satellitesCount; i++) {
+ GpsSatellite satellite = mSatellites.valueAt(i);
+ satellite.mValid = false;
+ }
+ }
}
diff --git a/location/tests/locationtests/src/android/location/GpsStatusTest.java b/location/tests/locationtests/src/android/location/GpsStatusTest.java
new file mode 100644
index 000000000000..4808fafa272e
--- /dev/null
+++ b/location/tests/locationtests/src/android/location/GpsStatusTest.java
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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 junit.framework.TestCase;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * Unit tests for {@link GpsStatus}.
+ */
+@SmallTest
+public class GpsStatusTest extends TestCase {
+
+ private static final int MAX_VALUE = 250;
+
+ private final Random mRandom = new Random();
+
+ private GpsStatus mStatus;
+ private int mCount;
+ private int[] mPrns;
+ private float[] mSnrs;
+ private float[] mElevations;
+ private float[] mAzimuth;
+ private int mEphemerisMask;
+ private int mAlmanacMask;
+ private int mUsedInFixMask;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ mStatus = createGpsStatus();
+ generateSatellitesData(generateInt());
+ }
+
+ public void testEmptyGpsStatus() throws Exception {
+ verifyIsEmpty(mStatus);
+ }
+
+ public void testGpsStatusIterator() throws Exception {
+ generateSatellitesData(2);
+ setSatellites(mStatus);
+ Iterator<GpsSatellite> iterator = mStatus.getSatellites().iterator();
+ assertTrue("hasNext(1)", iterator.hasNext());
+ assertTrue("hasNext(1) does not overflow", iterator.hasNext());
+ GpsSatellite satellite1 = iterator.next();
+ assertNotNull("satellite", satellite1);
+ assertTrue("hasNext(2)", iterator.hasNext());
+ assertTrue("hasNext(2) does not overflow", iterator.hasNext());
+ GpsSatellite satellite2 = iterator.next();
+ assertNotNull("satellite", satellite2);
+ assertFalse("hasNext() no elements", iterator.hasNext());
+ }
+
+ public void testTtff() throws Exception {
+ int testTtff = generateInt();
+ set(mStatus, testTtff);
+ verifyTtff(mStatus, testTtff);
+ }
+
+ public void testCopyTtff() throws Exception {
+ int testTtff = generateInt();
+ verifyTtff(mStatus, 0);
+
+ GpsStatus otherStatus = createGpsStatus();
+ set(otherStatus, testTtff);
+ verifyTtff(otherStatus, testTtff);
+
+ set(mStatus, otherStatus);
+ verifyTtff(mStatus, testTtff);
+ }
+
+ public void testSetSatellites() throws Exception {
+ setSatellites(mStatus);
+ verifySatellites(mStatus);
+ }
+
+ public void testCopySatellites() throws Exception {
+ verifyIsEmpty(mStatus);
+
+ GpsStatus otherStatus = createGpsStatus();
+ setSatellites(otherStatus);
+ verifySatellites(otherStatus);
+
+ set(mStatus, otherStatus);
+ verifySatellites(mStatus);
+ }
+
+ public void testOverrideSatellites() throws Exception {
+ setSatellites(mStatus);
+ verifySatellites(mStatus);
+
+ GpsStatus otherStatus = createGpsStatus();
+ generateSatellitesData(mCount, true /* reusePrns */);
+ setSatellites(otherStatus);
+ verifySatellites(otherStatus);
+
+ set(mStatus, otherStatus);
+ verifySatellites(mStatus);
+ }
+
+ public void testAddSatellites() throws Exception {
+ int count = 10;
+ generateSatellitesData(count);
+ setSatellites(mStatus);
+ verifySatellites(mStatus);
+
+ GpsStatus otherStatus = createGpsStatus();
+ generateSatellitesData(count);
+ setSatellites(otherStatus);
+ verifySatellites(otherStatus);
+
+ set(mStatus, otherStatus);
+ verifySatellites(mStatus);
+ }
+
+ public void testAddMoreSatellites() throws Exception {
+ int count = 25;
+ generateSatellitesData(count);
+ setSatellites(mStatus);
+ verifySatellites(mStatus);
+
+ GpsStatus otherStatus = createGpsStatus();
+ generateSatellitesData(count * 2);
+ setSatellites(otherStatus);
+ verifySatellites(otherStatus);
+
+ set(mStatus, otherStatus);
+ verifySatellites(mStatus);
+ }
+
+ public void testAddLessSatellites() throws Exception {
+ int count = 25;
+ generateSatellitesData(count * 2);
+ setSatellites(mStatus);
+ verifySatellites(mStatus);
+
+ GpsStatus otherStatus = createGpsStatus();
+ generateSatellitesData(count);
+ setSatellites(otherStatus);
+ verifySatellites(otherStatus);
+
+ set(mStatus, otherStatus);
+ verifySatellites(mStatus);
+ }
+
+ private static void verifyIsEmpty(GpsStatus status) {
+ verifySatelliteCount(status, 0);
+ verifyTtff(status, 0);
+ }
+
+ private static void verifySatelliteCount(GpsStatus status, int expectedCount) {
+ int satellites = 0;
+ for (GpsSatellite s : status.getSatellites()) {
+ ++satellites;
+ }
+ assertEquals("GpsStatus::SatelliteCount", expectedCount, satellites);
+ }
+
+ private void verifySatellites(GpsStatus status) {
+ verifySatelliteCount(status, mCount);
+ verifySatellites(status, mCount, mPrns, mSnrs, mElevations, mAzimuth, mEphemerisMask,
+ mAlmanacMask, mUsedInFixMask);
+ }
+
+ private static void verifySatellites(
+ GpsStatus status,
+ int count,
+ int[] prns,
+ float[] snrs,
+ float[] elevations,
+ float[] azimuth,
+ int ephemerisMask,
+ int almanacMask,
+ int usedInFixMask) {
+ for (int i = 0; i < count; ++i) {
+ int prn = prns[i];
+ GpsSatellite satellite = getSatellite(status, prn);
+ assertNotNull(getSatelliteAssertInfo(i, prn, "non-null"), satellite);
+ assertEquals(getSatelliteAssertInfo(i, prn, "Snr"), snrs[i], satellite.getSnr());
+ assertEquals(
+ getSatelliteAssertInfo(i, prn, "Elevation"),
+ elevations[i],
+ satellite.getElevation());
+ assertEquals(
+ getSatelliteAssertInfo(i, prn, "Azimuth"),
+ azimuth[i],
+ satellite.getAzimuth());
+ int prnShift = 1 << (prn - 1);
+ assertEquals(
+ getSatelliteAssertInfo(i, prn, "ephemeris"),
+ (ephemerisMask & prnShift) != 0,
+ satellite.hasEphemeris());
+ assertEquals(
+ getSatelliteAssertInfo(i, prn, "almanac"),
+ (almanacMask & prnShift) != 0,
+ satellite.hasAlmanac());
+ assertEquals(
+ getSatelliteAssertInfo(i, prn, "usedInFix"),
+ (usedInFixMask & prnShift) != 0,
+ satellite.usedInFix());
+ }
+ }
+
+ private static void verifyTtff(GpsStatus status, int expectedTtff) {
+ assertEquals("GpsStatus::TTFF", expectedTtff, status.getTimeToFirstFix());
+ }
+
+ private static GpsStatus createGpsStatus() throws Exception {
+ Constructor<GpsStatus> ctor = GpsStatus.class.getDeclaredConstructor();
+ ctor.setAccessible(true);
+ return ctor.newInstance();
+ }
+
+ private static void set(GpsStatus status, int ttff) throws Exception {
+ Class<?> statusClass = status.getClass();
+ Method setTtff = statusClass.getDeclaredMethod("setTimeToFirstFix", Integer.TYPE);
+ setTtff.setAccessible(true);
+ setTtff.invoke(status, ttff);
+ }
+
+ private static void set(GpsStatus status, GpsStatus statusToSet) throws Exception {
+ Class<?> statusClass = status.getClass();
+ Method setStatus = statusClass.getDeclaredMethod("setStatus", statusClass);
+ setStatus.setAccessible(true);
+ setStatus.invoke(status, statusToSet);
+ }
+
+ private void setSatellites(GpsStatus status) throws Exception {
+ set(status, mCount, mPrns, mSnrs, mElevations, mAzimuth, mEphemerisMask, mAlmanacMask,
+ mUsedInFixMask);
+ }
+
+ private static void set(
+ GpsStatus status,
+ int count,
+ int[] prns,
+ float[] snrs,
+ float[] elevations,
+ float[] azimuth,
+ int ephemerisMask,
+ int almanacMask,
+ int usedInFixMask) throws Exception {
+ Class<?> statusClass = status.getClass();
+ Class<?> intClass = Integer.TYPE;
+ Class<?> floatArrayClass = Class.forName("[F");
+ Method setStatus = statusClass.getDeclaredMethod(
+ "setStatus",
+ intClass,
+ Class.forName("[I"),
+ floatArrayClass,
+ floatArrayClass,
+ floatArrayClass,
+ intClass,
+ intClass,
+ intClass);
+ setStatus.setAccessible(true);
+ setStatus.invoke(
+ status,
+ count,
+ prns,
+ snrs,
+ elevations,
+ azimuth,
+ ephemerisMask,
+ almanacMask,
+ usedInFixMask);
+ }
+
+ private int generateInt() {
+ return mRandom.nextInt(MAX_VALUE) + 1;
+ }
+
+ private int[] generateIntArray(int count) {
+ Set<Integer> generatedPrns = new HashSet<>();
+ int[] array = new int[count];
+ for(int i = 0; i < count; ++i) {
+ int generated;
+ do {
+ generated = generateInt();
+ } while (generatedPrns.contains(generated));
+ array[i] = generated;
+ generatedPrns.add(generated);
+ }
+ return array;
+ }
+
+ private float[] generateFloatArray(int count) {
+ float[] array = new float[count];
+ for(int i = 0; i < count; ++i) {
+ array[i] = generateInt();
+ }
+ return array;
+ }
+
+ private int generateMask(int[] prns) {
+ int mask = 0;
+ int prnsLength = prns.length;
+ for (int i = 0; i < prnsLength; ++i) {
+ if (mRandom.nextBoolean()) {
+ mask |= 1 << (prns[i] - 1);
+ }
+ }
+ return mask;
+ }
+
+ private void generateSatellitesData(int count) {
+ generateSatellitesData(count, false /* reusePrns */);
+ }
+
+ private void generateSatellitesData(int count, boolean reusePrns) {
+ mCount = count;
+ if (!reusePrns) {
+ mPrns = generateIntArray(count);
+ }
+ mSnrs = generateFloatArray(count);
+ mElevations = generateFloatArray(count);
+ mAzimuth = generateFloatArray(count);
+ mEphemerisMask = generateMask(mPrns);
+ mAlmanacMask = generateMask(mPrns);
+ mUsedInFixMask = generateMask(mPrns);
+ }
+
+ private static GpsSatellite getSatellite(GpsStatus status, int prn) {
+ for (GpsSatellite satellite : status.getSatellites()) {
+ if (satellite.getPrn() == prn) {
+ return satellite;
+ }
+ }
+ return null;
+ }
+
+ private static String getSatelliteAssertInfo(int index, int prn, String param) {
+ return String.format("Satellite::%s [i=%d, prn=%d]", param, index, prn);
+ }
+}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 489f5524d934..ca242e4bcbe0 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -709,7 +709,13 @@ public final class AudioAttributes implements Parcelable {
}
}
- /** @hide */
+ /**
+ * @hide
+ * Only use to get which stream type should be used for volume control, NOT for audio playback
+ * (all audio playback APIs are supposed to take AudioAttributes as input parameters)
+ * @param aa non-null AudioAttributes.
+ * @return a valid stream type for volume control that matches the attributes.
+ */
public static int toLegacyStreamType(AudioAttributes aa) {
// flags to stream type mapping
if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
diff --git a/media/java/android/media/AudioDevicePort.java b/media/java/android/media/AudioDevicePort.java
index b10736be1756..82da27dc9509 100644
--- a/media/java/android/media/AudioDevicePort.java
+++ b/media/java/android/media/AudioDevicePort.java
@@ -36,12 +36,13 @@ public class AudioDevicePort extends AudioPort {
private final int mType;
private final String mAddress;
- AudioDevicePort(AudioHandle handle, int[] samplingRates, int[] channelMasks,
+ AudioDevicePort(AudioHandle handle, String deviceName,
+ int[] samplingRates, int[] channelMasks,
int[] formats, AudioGain[] gains, int type, String address) {
super(handle,
(AudioManager.isInputDevice(type) == true) ?
AudioPort.ROLE_SOURCE : AudioPort.ROLE_SINK,
- samplingRates, channelMasks, formats, gains);
+ deviceName, samplingRates, channelMasks, formats, gains);
mType = type;
mAddress = address;
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index f448dc235ccd..912d644d1723 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -46,9 +46,9 @@ import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
-import java.util.HashMap;
import java.util.ArrayList;
-
+import java.util.HashMap;
+import java.util.Iterator;
/**
* AudioManager provides access to volume and ringer mode control.
@@ -3199,10 +3199,10 @@ public class AudioManager {
* @param name device name
* {@hide}
*/
- public void setWiredDeviceConnectionState(int device, int state, String name) {
+ public void setWiredDeviceConnectionState(int type, int state, String address, String name) {
IAudioService service = getService();
try {
- service.setWiredDeviceConnectionState(device, state, name);
+ service.setWiredDeviceConnectionState(type, state, address, name);
} catch (RemoteException e) {
Log.e(TAG, "Dead object in setWiredDeviceConnectionState "+e);
}
@@ -3598,11 +3598,13 @@ public class AudioManager {
newPorts.clear();
status = AudioSystem.listAudioPorts(newPorts, portGeneration);
if (status != SUCCESS) {
+ Log.w(TAG, "updateAudioPortCache: listAudioPorts failed");
return status;
}
newPatches.clear();
status = AudioSystem.listAudioPatches(newPatches, patchGeneration);
if (status != SUCCESS) {
+ Log.w(TAG, "updateAudioPortCache: listAudioPatches failed");
return status;
}
} while (patchGeneration[0] != portGeneration[0]);
@@ -3611,18 +3613,33 @@ public class AudioManager {
for (int j = 0; j < newPatches.get(i).sources().length; j++) {
AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sources()[j],
newPorts);
- if (portCfg == null) {
- return ERROR;
- }
newPatches.get(i).sources()[j] = portCfg;
}
for (int j = 0; j < newPatches.get(i).sinks().length; j++) {
AudioPortConfig portCfg = updatePortConfig(newPatches.get(i).sinks()[j],
newPorts);
+ newPatches.get(i).sinks()[j] = portCfg;
+ }
+ }
+ for (Iterator<AudioPatch> i = newPatches.iterator(); i.hasNext(); ) {
+ AudioPatch newPatch = i.next();
+ boolean hasInvalidPort = false;
+ for (AudioPortConfig portCfg : newPatch.sources()) {
if (portCfg == null) {
- return ERROR;
+ hasInvalidPort = true;
+ break;
}
- newPatches.get(i).sinks()[j] = portCfg;
+ }
+ for (AudioPortConfig portCfg : newPatch.sinks()) {
+ if (portCfg == null) {
+ hasInvalidPort = true;
+ break;
+ }
+ }
+ if (hasInvalidPort) {
+ // Temporarily remove patches with invalid ports. One who created the patch
+ // is responsible for dealing with the port change.
+ i.remove();
}
}
diff --git a/media/java/android/media/AudioMixPort.java b/media/java/android/media/AudioMixPort.java
index 1500a4394c59..9fac8d131d0c 100644
--- a/media/java/android/media/AudioMixPort.java
+++ b/media/java/android/media/AudioMixPort.java
@@ -26,9 +26,10 @@ package android.media;
public class AudioMixPort extends AudioPort {
- AudioMixPort(AudioHandle handle, int role, int[] samplingRates, int[] channelMasks,
+ AudioMixPort(AudioHandle handle, int role, String deviceName,
+ int[] samplingRates, int[] channelMasks,
int[] formats, AudioGain[] gains) {
- super(handle, role, samplingRates, channelMasks, formats, gains);
+ super(handle, role, deviceName, samplingRates, channelMasks, formats, gains);
}
/**
diff --git a/media/java/android/media/AudioPort.java b/media/java/android/media/AudioPort.java
index 1ab7e89273e9..b0467917d22d 100644
--- a/media/java/android/media/AudioPort.java
+++ b/media/java/android/media/AudioPort.java
@@ -15,7 +15,7 @@
*/
package android.media;
-
+import android.util.Slog;
/**
* An audio port is a node of the audio framework or hardware that can be connected to or
@@ -37,6 +37,7 @@ package android.media;
* @hide
*/
public class AudioPort {
+ private static final String TAG = "AudioPort";
/**
* For use by the audio framework.
@@ -68,16 +69,20 @@ public class AudioPort {
AudioHandle mHandle;
protected final int mRole;
+ private final String mName;
private final int[] mSamplingRates;
private final int[] mChannelMasks;
private final int[] mFormats;
private final AudioGain[] mGains;
private AudioPortConfig mActiveConfig;
- AudioPort(AudioHandle handle, int role, int[] samplingRates, int[] channelMasks,
+ AudioPort(AudioHandle handle, int role, String name,
+ int[] samplingRates, int[] channelMasks,
int[] formats, AudioGain[] gains) {
+
mHandle = handle;
mRole = role;
+ mName = name;
mSamplingRates = samplingRates;
mChannelMasks = channelMasks;
mFormats = formats;
@@ -96,6 +101,14 @@ public class AudioPort {
}
/**
+ * Get the human-readable name of this port. Perhaps an internal
+ * designation or an physical device.
+ */
+ public String name() {
+ return mName;
+ }
+
+ /**
* Get the list of supported sampling rates
* Empty array if sampling rate is not relevant for this audio port
*/
diff --git a/media/java/android/media/AudioRoutesInfo.java b/media/java/android/media/AudioRoutesInfo.java
index df9fc06fb034..3e0ec07fc30b 100644
--- a/media/java/android/media/AudioRoutesInfo.java
+++ b/media/java/android/media/AudioRoutesInfo.java
@@ -30,6 +30,7 @@ public class AudioRoutesInfo implements Parcelable {
static final int MAIN_HEADPHONES = 1<<1;
static final int MAIN_DOCK_SPEAKERS = 1<<2;
static final int MAIN_HDMI = 1<<3;
+ static final int MAIN_USB = 1<<4;
CharSequence mBluetoothName;
int mMainType = MAIN_SPEAKER;
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 98a43a8fc1ed..3e91e4c46939 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -356,6 +356,12 @@ public class AudioService extends IAudioService.Stub {
"STREAM_TTS"
};
+ public static final int DEFAULT_MUTE_STREAMS_AFFECTED =
+ (1 << AudioSystem.STREAM_MUSIC) |
+ (1 << AudioSystem.STREAM_RING) |
+ (1 << AudioSystem.STREAM_NOTIFICATION) |
+ (1 << AudioSystem.STREAM_SYSTEM);
+
private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
public void onError(int error) {
switch (error) {
@@ -536,6 +542,20 @@ public class AudioService extends IAudioService.Stub {
private AudioManagerInternal.RingerModeDelegate mRingerModeDelegate;
+ // Intent "extra" data keys.
+ public static final String CONNECT_INTENT_KEY_PORT_NAME = "portName";
+ public static final String CONNECT_INTENT_KEY_STATE = "state";
+ public static final String CONNECT_INTENT_KEY_ADDRESS = "address";
+ public static final String CONNECT_INTENT_KEY_HAS_PLAYBACK = "hasPlayback";
+ public static final String CONNECT_INTENT_KEY_HAS_CAPTURE = "hasCapture";
+ public static final String CONNECT_INTENT_KEY_HAS_MIDI = "hasMIDI";
+ public static final String CONNECT_INTENT_KEY_DEVICE_CLASS = "class";
+
+ // Defines the format for the connection "address" for ALSA devices
+ public static String makeAlsaAddressString(int card, int device) {
+ return "card=" + card + ";device=" + device + ";";
+ }
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -911,11 +931,8 @@ public class AudioService extends IAudioService.Stub {
}
mMuteAffectedStreams = System.getIntForUser(cr,
- System.MUTE_STREAMS_AFFECTED,
- ((1 << AudioSystem.STREAM_MUSIC)|
- (1 << AudioSystem.STREAM_RING)|
- (1 << AudioSystem.STREAM_SYSTEM)),
- UserHandle.USER_CURRENT);
+ System.MUTE_STREAMS_AFFECTED, DEFAULT_MUTE_STREAMS_AFFECTED,
+ UserHandle.USER_CURRENT);
boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE,
0, UserHandle.USER_CURRENT) == 1;
@@ -3433,14 +3450,32 @@ public class AudioService extends IAudioService.Stub {
return device;
}
- public void setWiredDeviceConnectionState(int device, int state, String name) {
+ /*
+ * A class just for packaging up a set of connection parameters.
+ */
+ private class WiredDeviceConnectionState {
+ public int mType;
+ public int mState;
+ public String mAddress;
+ public String mName;
+
+ public WiredDeviceConnectionState(int type, int state, String address, String name) {
+ mType = type;
+ mState = state;
+ mAddress = address;
+ mName = name;
+ }
+ }
+
+ public void setWiredDeviceConnectionState(int type, int state, String address,
+ String name) {
synchronized (mConnectedDevices) {
- int delay = checkSendBecomingNoisyIntent(device, state);
+ int delay = checkSendBecomingNoisyIntent(type, state);
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
- device,
- state,
- name,
+ 0,
+ 0,
+ new WiredDeviceConnectionState(type, state, address, name),
delay);
}
}
@@ -4172,7 +4207,8 @@ public class AudioService extends IAudioService.Stub {
AudioSystem.setDeviceConnectionState(
((Integer)device.getKey()).intValue(),
AudioSystem.DEVICE_STATE_AVAILABLE,
- (String)device.getValue());
+ (String)device.getValue(),
+ "unknown-device");
}
}
// Restore call state
@@ -4274,8 +4310,12 @@ public class AudioService extends IAudioService.Stub {
break;
case MSG_SET_WIRED_DEVICE_CONNECTION_STATE:
- onSetWiredDeviceConnectionState(msg.arg1, msg.arg2, (String)msg.obj);
- mAudioEventWakeLock.release();
+ { WiredDeviceConnectionState connectState =
+ (WiredDeviceConnectionState)msg.obj;
+ onSetWiredDeviceConnectionState(connectState.mType, connectState.mState,
+ connectState.mAddress, connectState.mName);
+ mAudioEventWakeLock.release();
+ }
break;
case MSG_SET_A2DP_SRC_CONNECTION_STATE:
@@ -4388,7 +4428,8 @@ public class AudioService extends IAudioService.Stub {
setBluetoothA2dpOnInt(true);
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_AVAILABLE,
- address);
+ address,
+ "a2dp-device");
// Reset A2DP suspend state each time a new sink is connected
AudioSystem.setParameters("A2dpSuspended=false");
mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP),
@@ -4406,7 +4447,8 @@ public class AudioService extends IAudioService.Stub {
}
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
- address);
+ address,
+ "a2dp-device");
mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
synchronized (mCurAudioRoutes) {
// Remove A2DP routes as well
@@ -4435,7 +4477,8 @@ public class AudioService extends IAudioService.Stub {
private void makeA2dpSrcAvailable(String address) {
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_AVAILABLE,
- address);
+ address,
+ "a2dp-device");
mConnectedDevices.put( new Integer(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP),
address);
}
@@ -4444,7 +4487,8 @@ public class AudioService extends IAudioService.Stub {
private void makeA2dpSrcUnavailable(String address) {
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
- address);
+ address,
+ "a2dp-device");
mConnectedDevices.remove(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP);
}
@@ -4560,22 +4604,26 @@ public class AudioService extends IAudioService.Stub {
}
}
- private boolean handleDeviceConnection(boolean connected, int device, String params) {
+ private boolean handleDeviceConnection(boolean connect, int device, String address, String deviceName) {
+ Slog.i(TAG, "handleDeviceConnection(" + connect +
+ " dev:" + Integer.toHexString(device) +
+ " address:" + address +
+ " name:" + deviceName + ")");
synchronized (mConnectedDevices) {
boolean isConnected = (mConnectedDevices.containsKey(device) &&
- (params.isEmpty() || mConnectedDevices.get(device).equals(params)));
+ (address.isEmpty() || mConnectedDevices.get(device).equals(address)));
- if (isConnected && !connected) {
+ if (isConnected && !connect) {
AudioSystem.setDeviceConnectionState(device,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
- mConnectedDevices.get(device));
+ address, deviceName);
mConnectedDevices.remove(device);
return true;
- } else if (!isConnected && connected) {
+ } else if (!isConnected && connect) {
AudioSystem.setDeviceConnectionState(device,
AudioSystem.DEVICE_STATE_AVAILABLE,
- params);
- mConnectedDevices.put(new Integer(device), params);
+ address, deviceName);
+ mConnectedDevices.put(new Integer(device), address);
return true;
}
}
@@ -4628,12 +4676,18 @@ public class AudioService extends IAudioService.Stub {
return delay;
}
- private void sendDeviceConnectionIntent(int device, int state, String name)
+ private void sendDeviceConnectionIntent(int device, int state, String address, String deviceName)
{
+ Slog.i(TAG, "sendDeviceConnectionIntent(dev:0x" + Integer.toHexString(device) +
+ " state:0x" + Integer.toHexString(state) +
+ " address:" + address +
+ " name:" + deviceName + ");");
Intent intent = new Intent();
- intent.putExtra("state", state);
- intent.putExtra("name", name);
+ intent.putExtra(CONNECT_INTENT_KEY_STATE, state);
+ intent.putExtra(CONNECT_INTENT_KEY_ADDRESS, address);
+ intent.putExtra(CONNECT_INTENT_KEY_PORT_NAME, deviceName);
+
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
int connType = 0;
@@ -4652,6 +4706,8 @@ public class AudioService extends IAudioService.Stub {
device == AudioSystem.DEVICE_OUT_HDMI_ARC) {
connType = AudioRoutesInfo.MAIN_HDMI;
configureHdmiPlugIntent(intent, state);
+ } else if (device == AudioSystem.DEVICE_OUT_USB_DEVICE) {
+ connType = AudioRoutesInfo.MAIN_USB;
}
synchronized (mCurAudioRoutes) {
@@ -4678,8 +4734,14 @@ public class AudioService extends IAudioService.Stub {
}
}
- private void onSetWiredDeviceConnectionState(int device, int state, String name)
+ private void onSetWiredDeviceConnectionState(int device, int state, String address,
+ String deviceName)
{
+ Slog.i(TAG, "onSetWiredDeviceConnectionState(dev:" + Integer.toHexString(device)
+ + " state:" + Integer.toHexString(state)
+ + " address:" + address
+ + " deviceName:" + deviceName + ");");
+
synchronized (mConnectedDevices) {
if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
(device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
@@ -4689,7 +4751,7 @@ public class AudioService extends IAudioService.Stub {
boolean isUsb = ((device & ~AudioSystem.DEVICE_OUT_ALL_USB) == 0) ||
(((device & AudioSystem.DEVICE_BIT_IN) != 0) &&
((device & ~AudioSystem.DEVICE_IN_ALL_USB) == 0));
- handleDeviceConnection((state == 1), device, (isUsb ? name : ""));
+ handleDeviceConnection(state == 1, device, address, deviceName);
if (state != 0) {
if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
(device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
@@ -4727,8 +4789,8 @@ public class AudioService extends IAudioService.Stub {
}
}
}
- if (!isUsb && (device != AudioSystem.DEVICE_IN_WIRED_HEADSET)) {
- sendDeviceConnectionIntent(device, state, name);
+ if (!isUsb && device != AudioSystem.DEVICE_IN_WIRED_HEADSET) {
+ sendDeviceConnectionIntent(device, state, address, deviceName);
}
}
}
@@ -4852,8 +4914,9 @@ public class AudioService extends IAudioService.Stub {
}
boolean connected = (state == BluetoothProfile.STATE_CONNECTED);
- boolean success = handleDeviceConnection(connected, outDevice, address) &&
- handleDeviceConnection(connected, inDevice, address);
+ boolean success =
+ handleDeviceConnection(connected, outDevice, address, "Bluetooth Headset") &&
+ handleDeviceConnection(connected, inDevice, address, "Bluetooth Headset");
if (success) {
synchronized (mScoClients) {
if (connected) {
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 46ab7e056164..70846569d5cc 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -534,7 +534,8 @@ public class AudioSystem
public static final int SYNC_EVENT_NONE = 0;
public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1;
- public static native int setDeviceConnectionState(int device, int state, String device_address);
+ public static native int setDeviceConnectionState(int device, int state,
+ String device_address, String device_name);
public static native int getDeviceConnectionState(int device, String device_address);
public static native int setPhoneState(int state);
public static native int setForceUse(int usage, int config);
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index bfb78a1286c4..dabd9c269ca8 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -189,7 +189,7 @@ interface IAudioService {
IRingtonePlayer getRingtonePlayer();
int getMasterStreamType();
- void setWiredDeviceConnectionState(int device, int state, String name);
+ void setWiredDeviceConnectionState(int type, int state, String address, String name);
int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state, int profile);
AudioRoutesInfo startWatchingRoutes(in IAudioRoutesObserver observer);
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index e74399cce971..6ac854ffcb6a 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -881,8 +881,8 @@ public final class MediaCodecInfo {
(int)(mAspectRatioRange.getUpper().doubleValue() * height));
return range;
} catch (IllegalArgumentException e) {
- // should not be here
- Log.w(TAG, "could not get supported widths for " + height , e);
+ // height is not supported because there are no suitable widths
+ Log.v(TAG, "could not get supported widths for " + height);
throw new IllegalArgumentException("unsupported height");
}
}
@@ -925,8 +925,8 @@ public final class MediaCodecInfo {
(int)(width / mAspectRatioRange.getLower().doubleValue()));
return range;
} catch (IllegalArgumentException e) {
- // should not be here
- Log.w(TAG, "could not get supported heights for " + width , e);
+ // width is not supported because there are no suitable heights
+ Log.v(TAG, "could not get supported heights for " + width);
throw new IllegalArgumentException("unsupported width");
}
}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 5b922664e15e..bc9722e264b4 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -756,8 +756,9 @@ public final class TvContract {
* </p><p>
* Note that this sub-directory also supports opening the logo as an asset file in write
* mode. Callers can create or replace the primary logo associated with this channel by
- * opening the asset file and writing the full-size photo contents into it. When the file
- * is closed, the image will be parsed, sized down if necessary, and stored.
+ * opening the asset file and writing the full-size photo contents into it. (Make sure there
+ * is no padding around the logo image.) When the file is closed, the image will be parsed,
+ * sized down if necessary, and stored.
* </p><p>
* Usage example:
* <pre>
diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp
index ea33a2f52fc3..e101709f4716 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/media/jni/android_media_Utils.cpp
@@ -232,28 +232,28 @@ status_t ConvertMessageToMap(
env,
hashMap,
hashMapPutID,
- StringPrintf("%s-left", key).c_str(),
+ AStringPrintf("%s-left", key).c_str(),
left);
SetMapInt32(
env,
hashMap,
hashMapPutID,
- StringPrintf("%s-top", key).c_str(),
+ AStringPrintf("%s-top", key).c_str(),
top);
SetMapInt32(
env,
hashMap,
hashMapPutID,
- StringPrintf("%s-right", key).c_str(),
+ AStringPrintf("%s-right", key).c_str(),
right);
SetMapInt32(
env,
hashMap,
hashMapPutID,
- StringPrintf("%s-bottom", key).c_str(),
+ AStringPrintf("%s-bottom", key).c_str(),
bottom);
break;
}
diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
index d8b0c7170a86..c023dc6dad39 100644
--- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java
+++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
@@ -41,7 +41,8 @@ public class CarrierText extends TextView {
private static CharSequence mSeparator;
- private LockPatternUtils mLockPatternUtils;
+ private final boolean mIsEmergencyCallCapable;
+
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
@@ -78,7 +79,8 @@ public class CarrierText extends TextView {
public CarrierText(Context context, AttributeSet attrs) {
super(context, attrs);
- mLockPatternUtils = new LockPatternUtils(mContext);
+ mIsEmergencyCallCapable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_voice_capable);
boolean useAllCaps;
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.CarrierText, 0, 0);
@@ -222,7 +224,7 @@ public class CarrierText extends TextView {
*/
private CharSequence makeCarrierStringOnEmergencyCapable(
CharSequence simMessage, CharSequence emergencyCallMessage) {
- if (mLockPatternUtils.isEmergencyCallCapable()) {
+ if (mIsEmergencyCallCapable) {
return concatenate(simMessage, emergencyCallMessage);
}
return simMessage;
diff --git a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java
index 4a9440cbfd1c..3627e3e2717b 100644
--- a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java
+++ b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java
@@ -21,7 +21,7 @@ import android.content.Intent;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.telephony.TelephonyManager;
+import android.telecom.TelecomManager;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
@@ -59,12 +59,19 @@ public class EmergencyButton extends Button {
private PowerManager mPowerManager;
private EmergencyButtonCallback mEmergencyButtonCallback;
+ private final boolean mIsVoiceCapable;
+ private final boolean mEnableEmergencyCallWhileSimLocked;
+
public EmergencyButton(Context context) {
this(context, null);
}
public EmergencyButton(Context context, AttributeSet attrs) {
super(context, attrs);
+ mIsVoiceCapable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_voice_capable);
+ mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked);
}
@Override
@@ -99,8 +106,8 @@ public class EmergencyButton extends Button {
// TODO: implement a shorter timeout once new PowerManager API is ready.
// should be the equivalent to the old userActivity(EMERGENCY_CALL_TIMEOUT)
mPowerManager.userActivity(SystemClock.uptimeMillis(), true);
- if (mLockPatternUtils.isInCall()) {
- mLockPatternUtils.resumeCall();
+ if (isInCall()) {
+ resumeCall();
if (mEmergencyButtonCallback != null) {
mEmergencyButtonCallback.onEmergencyButtonClickedWhenInCall();
}
@@ -116,24 +123,57 @@ public class EmergencyButton extends Button {
}
private void updateEmergencyCallButton() {
- boolean enabled = false;
- if (mLockPatternUtils.isInCall()) {
- enabled = true; // always show "return to call" if phone is off-hook
- } else if (mLockPatternUtils.isEmergencyCallCapable()) {
- final boolean simLocked = KeyguardUpdateMonitor.getInstance(mContext).isSimPinVoiceSecure();
- if (simLocked) {
- // Some countries can't handle emergency calls while SIM is locked.
- enabled = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
+ boolean visible = false;
+ if (mIsVoiceCapable) {
+ // Emergency calling requires voice capability.
+ if (isInCall()) {
+ visible = true; // always show "return to call" if phone is off-hook
+ } else {
+ final boolean simLocked = KeyguardUpdateMonitor.getInstance(mContext)
+ .isSimPinVoiceSecure();
+ if (simLocked) {
+ // Some countries can't handle emergency calls while SIM is locked.
+ visible = mEnableEmergencyCallWhileSimLocked;
+ } else {
+ // Only show if there is a secure screen (pin/pattern/SIM pin/SIM puk);
+ visible = mLockPatternUtils.isSecure();
+ }
+ }
+ }
+ if (visible) {
+ setVisibility(View.VISIBLE);
+
+ int textId;
+ if (isInCall()) {
+ textId = com.android.internal.R.string.lockscreen_return_to_call;
} else {
- // True if we need to show a secure screen (pin/pattern/SIM pin/SIM puk);
- // hides emergency button on "Slide" screen if device is not secure.
- enabled = mLockPatternUtils.isSecure();
+ textId = com.android.internal.R.string.lockscreen_emergency_call;
}
+ setText(textId);
+ } else {
+ setVisibility(View.GONE);
}
- mLockPatternUtils.updateEmergencyCallButtonState(this, enabled, false);
}
public void setCallback(EmergencyButtonCallback callback) {
mEmergencyButtonCallback = callback;
}
+
+ /**
+ * Resumes a call in progress.
+ */
+ private void resumeCall() {
+ getTelecommManager().showInCallScreen(false);
+ }
+
+ /**
+ * @return {@code true} if there is a call currently in progress.
+ */
+ private boolean isInCall() {
+ return getTelecommManager().isInCall();
+ }
+
+ private TelecomManager getTelecommManager() {
+ return (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+ }
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
index 107f4174345e..3eb31ad383c2 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
@@ -17,20 +17,16 @@ package com.android.keyguard;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
-import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.widget.LockPatternUtils;
-import java.util.List;
-
public class KeyguardSecurityModel {
/**
- * The different types of security available for {@link Mode#UnlockScreen}.
- * @see com.android.internal.policy.impl.LockPatternKeyguardView#getUnlockMode()
+ * The different types of security available.
+ * @see KeyguardSecurityContainer#showSecurityScreen
*/
public enum SecurityMode {
Invalid, // NULL state
@@ -42,12 +38,16 @@ public class KeyguardSecurityModel {
SimPuk // Unlock by entering a sim puk
}
- private Context mContext;
+ private final Context mContext;
+ private final boolean mIsPukScreenAvailable;
+
private LockPatternUtils mLockPatternUtils;
KeyguardSecurityModel(Context context) {
mContext = context;
mLockPatternUtils = new LockPatternUtils(context);
+ mIsPukScreenAvailable = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_enable_puk_unlock_screen);
}
void setLockPatternUtils(LockPatternUtils utils) {
@@ -56,39 +56,35 @@ public class KeyguardSecurityModel {
SecurityMode getSecurityMode() {
KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
- SecurityMode mode = SecurityMode.None;
+
if (SubscriptionManager.isValidSubscriptionId(
monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED))) {
- mode = SecurityMode.SimPin;
- } else if (SubscriptionManager.isValidSubscriptionId(
- monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))
- && mLockPatternUtils.isPukUnlockScreenEnable()) {
- mode = SecurityMode.SimPuk;
- } else {
- final int security = mLockPatternUtils.getKeyguardStoredPasswordQuality();
- switch (security) {
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
- mode = mLockPatternUtils.isLockPasswordEnabled() ?
- SecurityMode.PIN : SecurityMode.None;
- break;
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
- mode = mLockPatternUtils.isLockPasswordEnabled() ?
- SecurityMode.Password : SecurityMode.None;
- break;
+ return SecurityMode.SimPin;
+ }
+
+ if (mIsPukScreenAvailable && SubscriptionManager.isValidSubscriptionId(
+ monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))) {
+ return SecurityMode.SimPuk;
+ }
+
+ final int security = mLockPatternUtils.getActivePasswordQuality();
+ switch (security) {
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+ return SecurityMode.PIN;
+
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+ return SecurityMode.Password;
- case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
- case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
- mode = mLockPatternUtils.isLockPatternEnabled() ?
- SecurityMode.Pattern : SecurityMode.None;
- break;
+ case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+ return SecurityMode.Pattern;
+ case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
+ return SecurityMode.None;
- default:
- throw new IllegalStateException("Unknown security quality:" + security);
- }
+ default:
+ throw new IllegalStateException("Unknown security quality:" + security);
}
- return mode;
}
}
diff --git a/packages/PrintSpooler/res/layout/print_activity_controls.xml b/packages/PrintSpooler/res/layout/print_activity_controls.xml
index 0bf64aa4db3a..a87afe0a77a9 100644
--- a/packages/PrintSpooler/res/layout/print_activity_controls.xml
+++ b/packages/PrintSpooler/res/layout/print_activity_controls.xml
@@ -159,6 +159,34 @@
android:layout_marginEnd="16dip"
android:orientation="vertical">
+ <!-- Duplex -->
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:layout_marginStart="12dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:labelFor="@+id/duplex_spinner"
+ android:text="@string/label_duplex">
+ </TextView>
+
+ <Spinner
+ android:id="@+id/duplex_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="4dip">
+ </Spinner>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dip"
+ android:layout_marginEnd="16dip"
+ android:orientation="vertical">
+
<!-- Range options -->
<TextView
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
index 1a840e393901..923a38ca88fd 100644
--- a/packages/PrintSpooler/res/values-af/strings.xml
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papiergrootte"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papiergrootte:"</string>
<string name="label_color" msgid="1108690305218188969">"Kleur"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Oriëntasie"</string>
<string name="label_pages" msgid="7768589729282182230">"Bladsye"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Al <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Swart en wit"</item>
<item msgid="2762241247228983754">"Kleur"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Geen"</item>
+ <item msgid="7296563835355641719">"Lang rand"</item>
+ <item msgid="79513688117503758">"Kort rand"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portret"</item>
<item msgid="3199660090246166812">"Landskap"</item>
diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml
index 683d5854501c..8f4624970b5c 100644
--- a/packages/PrintSpooler/res/values-am/strings.xml
+++ b/packages/PrintSpooler/res/values-am/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"የወረቀት መጠን"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"የወረቀት መጠን፦"</string>
<string name="label_color" msgid="1108690305218188969">"ቀለም"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"አቀማመጠ ገፅ"</string>
<string name="label_pages" msgid="7768589729282182230">"ገፆች"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ሁሉም <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -33,7 +35,7 @@
<string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-እይታ የፒ ዲ ኤፍ መመልከቻ ይጫኑ"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"የአታሚ መተግበሪያ ተበላሽቷል"</string>
<string name="generating_print_job" msgid="3119608742651698916">"የህትመት ስራን በማመንጨት ላይ"</string>
- <string name="save_as_pdf" msgid="5718454119847596853">"እንደ ፒዲኤፍ አስቀምጥ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"እንደ PDF አስቀምጥ"</string>
<string name="all_printers" msgid="5018829726861876202">"ሁሉም አታሚዎች…"</string>
<string name="print_dialog" msgid="32628687461331979">"የህትመት መገናኛ"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"ጥቁር እና ነጭ"</item>
<item msgid="2762241247228983754">"ቀለም"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"ምንም"</item>
+ <item msgid="7296563835355641719">"ረጅም ጠርዝ"</item>
+ <item msgid="79513688117503758">"አጭር ጠርዝ"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"የቁም"</item>
<item msgid="3199660090246166812">"የወርድ"</item>
diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml
index 0a7d3012872d..9f931d5ddf0c 100644
--- a/packages/PrintSpooler/res/values-ar/strings.xml
+++ b/packages/PrintSpooler/res/values-ar/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"حجم الورق"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"حجم الورق:"</string>
<string name="label_color" msgid="1108690305218188969">"ألوان"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"الاتجاه"</string>
<string name="label_pages" msgid="7768589729282182230">"الصفحات"</string>
<string name="template_all_pages" msgid="3322235982020148762">"جميع الصفحات وعددها <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"أبيض وأسود"</item>
<item msgid="2762241247228983754">"ملونة"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"لا شيء"</item>
+ <item msgid="7296563835355641719">"حافة طويلة"</item>
+ <item msgid="79513688117503758">"حافة قصيرة"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"عمودي"</item>
<item msgid="3199660090246166812">"أفقي"</item>
diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml
index 8792349bc18f..981b4c10d654 100644
--- a/packages/PrintSpooler/res/values-bg/strings.xml
+++ b/packages/PrintSpooler/res/values-bg/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Размер на хартията"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Размер на хартията:"</string>
<string name="label_color" msgid="1108690305218188969">"Цвят"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Ориентация"</string>
<string name="label_pages" msgid="7768589729282182230">"Страници"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Всички <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Черно-бяло"</item>
<item msgid="2762241247228983754">"Цветно"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Без"</item>
+ <item msgid="7296563835355641719">"Дълъг ръб"</item>
+ <item msgid="79513688117503758">"Къс ръб"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Вертикално"</item>
<item msgid="3199660090246166812">"Хоризонтално"</item>
diff --git a/packages/PrintSpooler/res/values-bn-rBD/strings.xml b/packages/PrintSpooler/res/values-bn-rBD/strings.xml
index 5c5fabf14828..4d74ceb75b8a 100644
--- a/packages/PrintSpooler/res/values-bn-rBD/strings.xml
+++ b/packages/PrintSpooler/res/values-bn-rBD/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"কাগজের আকার"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"কাগজের আকার:"</string>
<string name="label_color" msgid="1108690305218188969">"রঙ"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"সজ্জা"</string>
<string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাগুলি"</string>
<string name="template_all_pages" msgid="3322235982020148762">"সমস্ত <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"কালো এবং সাদা"</item>
<item msgid="2762241247228983754">"রঙ"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"প্রতিকৃতি"</item>
<item msgid="3199660090246166812">"ভূদৃশ্য"</item>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
index a9677cbcddc8..ca7bafa39fb6 100644
--- a/packages/PrintSpooler/res/values-ca/strings.xml
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Mida del paper"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Mida del paper:"</string>
<string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientació"</string>
<string name="label_pages" msgid="7768589729282182230">"Pàgines"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Totes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Blanc i negre"</item>
<item msgid="2762241247228983754">"Color"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Cap"</item>
+ <item msgid="7296563835355641719">"Costat llarg"</item>
+ <item msgid="79513688117503758">"Costat curt"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertical"</item>
<item msgid="3199660090246166812">"Horitzontal"</item>
diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml
index 791e4854996d..77f338aeae87 100644
--- a/packages/PrintSpooler/res/values-cs/strings.xml
+++ b/packages/PrintSpooler/res/values-cs/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Velikost papíru"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Velikost papíru:"</string>
<string name="label_color" msgid="1108690305218188969">"Barva"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientace"</string>
<string name="label_pages" msgid="7768589729282182230">"Stránky"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Vše: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Černobíle"</item>
<item msgid="2762241247228983754">"Barevně"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Žádné"</item>
+ <item msgid="7296563835355641719">"Dlouhý okraj"</item>
+ <item msgid="79513688117503758">"Krátký okraj"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Na výšku"</item>
<item msgid="3199660090246166812">"Na šířku"</item>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
index c4a383ead99a..b497c1864f40 100644
--- a/packages/PrintSpooler/res/values-da/strings.xml
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papirstørrelse"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papirstørrelse:"</string>
<string name="label_color" msgid="1108690305218188969">"Farve"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Retning"</string>
<string name="label_pages" msgid="7768589729282182230">"Sider"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Sort/hvid"</item>
<item msgid="2762241247228983754">"Farve"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ingen"</item>
+ <item msgid="7296563835355641719">"Den lange led"</item>
+ <item msgid="79513688117503758">"Den korte led"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Stående"</item>
<item msgid="3199660090246166812">"Liggende"</item>
diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml
index 43be3dc6ce5f..1b9ce0937972 100644
--- a/packages/PrintSpooler/res/values-de/strings.xml
+++ b/packages/PrintSpooler/res/values-de/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papierformat"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papierformat:"</string>
<string name="label_color" msgid="1108690305218188969">"Farbe"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Ausrichtung"</string>
<string name="label_pages" msgid="7768589729282182230">"Seiten"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Schwarz-weiß"</item>
<item msgid="2762241247228983754">"Farbe"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ohne"</item>
+ <item msgid="7296563835355641719">"Lange Seite"</item>
+ <item msgid="79513688117503758">"Kurze Seite"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Hochformat"</item>
<item msgid="3199660090246166812">"Querformat"</item>
diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml
index 25f609b0e411..2908b6ace74e 100644
--- a/packages/PrintSpooler/res/values-el/strings.xml
+++ b/packages/PrintSpooler/res/values-el/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Μεγέθος χαρτιού"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Μέγεθος χαρτιού:"</string>
<string name="label_color" msgid="1108690305218188969">"Χρώμα"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Προσανατολισμός"</string>
<string name="label_pages" msgid="7768589729282182230">"Σελίδες"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Και οι <xliff:g id="PAGE_COUNT">%1$s</xliff:g> σελίδες"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Ασπρόμαυρο"</item>
<item msgid="2762241247228983754">"Χρώμα"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Κανένα"</item>
+ <item msgid="7296563835355641719">"Μεγάλη πλευρά"</item>
+ <item msgid="79513688117503758">"Μικρή πλευρά"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Πορτραίτο"</item>
<item msgid="3199660090246166812">"Οριζόντια"</item>
diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml
index 2198c7a47111..5fa53387f95b 100644
--- a/packages/PrintSpooler/res/values-en-rGB/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Paper size"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Paper size:"</string>
<string name="label_color" msgid="1108690305218188969">"Colour"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
<string name="label_pages" msgid="7768589729282182230">"Pages"</string>
<string name="template_all_pages" msgid="3322235982020148762">"All <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Colour"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"None"</item>
+ <item msgid="7296563835355641719">"Long edge"</item>
+ <item msgid="79513688117503758">"Short edge"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrait"</item>
<item msgid="3199660090246166812">"Landscape"</item>
diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml
index 2198c7a47111..5fa53387f95b 100644
--- a/packages/PrintSpooler/res/values-en-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Paper size"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Paper size:"</string>
<string name="label_color" msgid="1108690305218188969">"Colour"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
<string name="label_pages" msgid="7768589729282182230">"Pages"</string>
<string name="template_all_pages" msgid="3322235982020148762">"All <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Colour"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"None"</item>
+ <item msgid="7296563835355641719">"Long edge"</item>
+ <item msgid="79513688117503758">"Short edge"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrait"</item>
<item msgid="3199660090246166812">"Landscape"</item>
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
index e194f554b884..17ea7099bf86 100644
--- a/packages/PrintSpooler/res/values-es-rUS/strings.xml
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Tamaño del papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño de papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>
<string name="label_pages" msgid="7768589729282182230">"Páginas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Todas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Blanco y negro"</item>
<item msgid="2762241247228983754">"Color"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ninguno"</item>
+ <item msgid="7296563835355641719">"Borde largo"</item>
+ <item msgid="79513688117503758">"Borde corto"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertical"</item>
<item msgid="3199660090246166812">"Horizontal"</item>
diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml
index b0ab5293cc4d..c5971778ca29 100644
--- a/packages/PrintSpooler/res/values-es/strings.xml
+++ b/packages/PrintSpooler/res/values-es/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Tamaño del papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño del papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>
<string name="label_pages" msgid="7768589729282182230">"Páginas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Todas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Blanco y negro"</item>
<item msgid="2762241247228983754">"Color"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ninguna"</item>
+ <item msgid="7296563835355641719">"Borde largo"</item>
+ <item msgid="79513688117503758">"Borde corto"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertical"</item>
<item msgid="3199660090246166812">"Horizontal"</item>
diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml
index 6e75bbbd9f43..5e300da6516f 100644
--- a/packages/PrintSpooler/res/values-et-rEE/strings.xml
+++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Paberi suurus"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Paberi suurus:"</string>
<string name="label_color" msgid="1108690305218188969">"Värv"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Suund"</string>
<string name="label_pages" msgid="7768589729282182230">"Lehed"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Kõik <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Mustvalge"</item>
<item msgid="2762241247228983754">"Värv"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Puudub"</item>
+ <item msgid="7296563835355641719">"Pikk serv"</item>
+ <item msgid="79513688117503758">"Lühike serv"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertikaalpaigutus"</item>
<item msgid="3199660090246166812">"Horisontaalpaigutus"</item>
diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml
index 4f0f8fcc43e3..4e79c6095fd5 100644
--- a/packages/PrintSpooler/res/values-eu-rES/strings.xml
+++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Paperaren tamaina"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Paperaren tamaina:"</string>
<string name="label_color" msgid="1108690305218188969">"Koloretan"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientazioa"</string>
<string name="label_pages" msgid="7768589729282182230">"Orriak"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> orriak"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Zuri-beltza"</item>
<item msgid="2762241247228983754">"Koloretakoa"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Bertikala"</item>
<item msgid="3199660090246166812">"Horizontala"</item>
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
index d35a06390773..1bc934e9f1c1 100644
--- a/packages/PrintSpooler/res/values-fa/strings.xml
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"اندازه کاغذ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"اندازه کاغذ:"</string>
<string name="label_color" msgid="1108690305218188969">"رنگی"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"جهت"</string>
<string name="label_pages" msgid="7768589729282182230">"صفحه‌ها"</string>
<string name="template_all_pages" msgid="3322235982020148762">"همه <xliff:g id="PAGE_COUNT">%1$s</xliff:g> صفحه"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"سیاه و سفید"</item>
<item msgid="2762241247228983754">"رنگی"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"هیچ‌کدام"</item>
+ <item msgid="7296563835355641719">"طول"</item>
+ <item msgid="79513688117503758">"عرض"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"عمودی"</item>
<item msgid="3199660090246166812">"افقی"</item>
diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml
index 8e540f976a93..87dd636bb8f5 100644
--- a/packages/PrintSpooler/res/values-fi/strings.xml
+++ b/packages/PrintSpooler/res/values-fi/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Paperikoko"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Paperikoko:"</string>
<string name="label_color" msgid="1108690305218188969">"Väri"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Suunta"</string>
<string name="label_pages" msgid="7768589729282182230">"Sivut"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Kaikki <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Mustavalkoinen"</item>
<item msgid="2762241247228983754">"Väri"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ei mitään"</item>
+ <item msgid="7296563835355641719">"Pitkä reuna"</item>
+ <item msgid="79513688117503758">"Lyhyt reuna"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Pysty"</item>
<item msgid="3199660090246166812">"Vaaka"</item>
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
index 279a4679cead..fe038fd7ebcf 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Taille du papier"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Taille du papier :"</string>
<string name="label_color" msgid="1108690305218188969">"Couleur"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
<string name="label_pages" msgid="7768589729282182230">"Pages"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Toutes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Noir et blanc"</item>
<item msgid="2762241247228983754">"Couleur"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Aucune"</item>
+ <item msgid="7296563835355641719">"Bord long"</item>
+ <item msgid="79513688117503758">"Bord court"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrait"</item>
<item msgid="3199660090246166812">"Paysage"</item>
diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml
index ebfd5ded5043..23aaf51f8f97 100644
--- a/packages/PrintSpooler/res/values-fr/strings.xml
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Taille du papier"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Taille du papier :"</string>
<string name="label_color" msgid="1108690305218188969">"Couleur"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
<string name="label_pages" msgid="7768589729282182230">"Pages"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Toutes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Noir et blanc"</item>
<item msgid="2762241247228983754">"Couleur"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Aucun"</item>
+ <item msgid="7296563835355641719">"Bord long"</item>
+ <item msgid="79513688117503758">"Bord court"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrait"</item>
<item msgid="3199660090246166812">"Paysage"</item>
diff --git a/packages/PrintSpooler/res/values-gl-rES/strings.xml b/packages/PrintSpooler/res/values-gl-rES/strings.xml
index 6e542ea6819e..ba8432f74341 100644
--- a/packages/PrintSpooler/res/values-gl-rES/strings.xml
+++ b/packages/PrintSpooler/res/values-gl-rES/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Tamaño do papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño do papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Cor"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>
<string name="label_pages" msgid="7768589729282182230">"Páxinas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"As <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Branco e negro"</item>
<item msgid="2762241247228983754">"Cor"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertical"</item>
<item msgid="3199660090246166812">"Horizontal"</item>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index a3f7fef27291..b39efcb9aac7 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"काग़ज़ का आकार"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"काग़ज़ का आकार:"</string>
<string name="label_color" msgid="1108690305218188969">"रंग"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"अभिविन्‍यास"</string>
<string name="label_pages" msgid="7768589729282182230">"पृष्ठ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"सभी <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"श्याम और श्वेत"</item>
<item msgid="2762241247228983754">"रंग"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"कोई नहीं"</item>
+ <item msgid="7296563835355641719">"लंबा सिरा"</item>
+ <item msgid="79513688117503758">"छोटा सिरा"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"पोर्ट्रेट"</item>
<item msgid="3199660090246166812">"लैंडस्केप"</item>
diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml
index 8132d2123def..7e68f0919086 100644
--- a/packages/PrintSpooler/res/values-hr/strings.xml
+++ b/packages/PrintSpooler/res/values-hr/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Veličina papira"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Veličina papira:"</string>
<string name="label_color" msgid="1108690305218188969">"U boji"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orijentacija"</string>
<string name="label_pages" msgid="7768589729282182230">"Stranice"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Sve stranice (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Crno-bijelo"</item>
<item msgid="2762241247228983754">"U boji"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ništa"</item>
+ <item msgid="7296563835355641719">"Dulji rub"</item>
+ <item msgid="79513688117503758">"Kraći rub"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portret"</item>
<item msgid="3199660090246166812">"Pejzaž"</item>
diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml
index 3ebc450c4e6f..10b351d53568 100644
--- a/packages/PrintSpooler/res/values-hu/strings.xml
+++ b/packages/PrintSpooler/res/values-hu/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papírméret"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papírméret:"</string>
<string name="label_color" msgid="1108690305218188969">"Szín"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Tájolás"</string>
<string name="label_pages" msgid="7768589729282182230">"Oldalak"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Összes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Fekete-fehér"</item>
<item msgid="2762241247228983754">"Szín"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nincs"</item>
+ <item msgid="7296563835355641719">"Hosszabb él"</item>
+ <item msgid="79513688117503758">"Rövidebb él"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Álló"</item>
<item msgid="3199660090246166812">"Fekvő"</item>
diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
index 5ef15a5c4d47..08cb138ec7cd 100644
--- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml
+++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Թղթի չափը"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Թղթի չափը՝"</string>
<string name="label_color" msgid="1108690305218188969">"Գույնը"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Դիրքավորում"</string>
<string name="label_pages" msgid="7768589729282182230">"Էջեր"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Բոլորը՝ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Սև ու սպիտակ"</item>
<item msgid="2762241247228983754">"Գույնը"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ոչ մեկը"</item>
+ <item msgid="7296563835355641719">"Լայնեզր"</item>
+ <item msgid="79513688117503758">"Կարճեզր"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Դիմանկար"</item>
<item msgid="3199660090246166812">"Լանդշաֆտ"</item>
diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml
index 9714b0f2e958..666442cbc670 100644
--- a/packages/PrintSpooler/res/values-in/strings.xml
+++ b/packages/PrintSpooler/res/values-in/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Ukuran kertas"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Ukuran kertas:"</string>
<string name="label_color" msgid="1108690305218188969">"Warna"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>
<string name="label_pages" msgid="7768589729282182230">"Halaman"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Semua dari <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
<item msgid="2762241247228983754">"Warna"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Tidak ada"</item>
+ <item msgid="7296563835355641719">"Tepi panjang"</item>
+ <item msgid="79513688117503758">"Tepi pendek"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Potret"</item>
<item msgid="3199660090246166812">"Lanskap"</item>
diff --git a/packages/PrintSpooler/res/values-is-rIS/strings.xml b/packages/PrintSpooler/res/values-is-rIS/strings.xml
index 41a047d1b868..bb0c7ca0ab17 100644
--- a/packages/PrintSpooler/res/values-is-rIS/strings.xml
+++ b/packages/PrintSpooler/res/values-is-rIS/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Pappírsstærð"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Pappírsstærð:"</string>
<string name="label_color" msgid="1108690305218188969">"Litur"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Stefna"</string>
<string name="label_pages" msgid="7768589729282182230">"Síður"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Allar <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Svarthvítt"</item>
<item msgid="2762241247228983754">"Í lit"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Skammsnið"</item>
<item msgid="3199660090246166812">"Langsnið"</item>
diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml
index 3653c5686d3f..39043ee31c12 100644
--- a/packages/PrintSpooler/res/values-it/strings.xml
+++ b/packages/PrintSpooler/res/values-it/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Dimensioni carta"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Dimensioni carta:"</string>
<string name="label_color" msgid="1108690305218188969">"A colori"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientamento"</string>
<string name="label_pages" msgid="7768589729282182230">"Pagine"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Tutte e <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Bianco e nero"</item>
<item msgid="2762241247228983754">"A colori"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nessuno"</item>
+ <item msgid="7296563835355641719">"Lato lungo"</item>
+ <item msgid="79513688117503758">"Lato corto"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Verticale"</item>
<item msgid="3199660090246166812">"Orizzontale"</item>
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index ba293a0a98c0..1fd68e91bee3 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"גודל נייר"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"גודל נייר:"</string>
<string name="label_color" msgid="1108690305218188969">"צבע"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"כיוון"</string>
<string name="label_pages" msgid="7768589729282182230">"עמודים"</string>
<string name="template_all_pages" msgid="3322235982020148762">"הכל <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"שחור ולבן"</item>
<item msgid="2762241247228983754">"צבע"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"ללא"</item>
+ <item msgid="7296563835355641719">"צד ארוך"</item>
+ <item msgid="79513688117503758">"צד קצר"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"לאורך"</item>
<item msgid="3199660090246166812">"לרוחב"</item>
diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
index f3fed3b5d4dc..3cc7e8ea644a 100644
--- a/packages/PrintSpooler/res/values-ja/strings.xml
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"用紙サイズ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"用紙サイズ:"</string>
<string name="label_color" msgid="1108690305218188969">"カラー選択"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"方向"</string>
<string name="label_pages" msgid="7768589729282182230">"ページ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ページすべて"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"モノクロ"</item>
<item msgid="2762241247228983754">"カラー"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"なし"</item>
+ <item msgid="7296563835355641719">"長辺"</item>
+ <item msgid="79513688117503758">"短辺"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"縦向き"</item>
<item msgid="3199660090246166812">"横向き"</item>
diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
index 061e9fba043a..4a55dfe10962 100644
--- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml
+++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"ფურცლის ზომა"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"ფურცლის ზომა:"</string>
<string name="label_color" msgid="1108690305218188969">"ფერი"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"ორიენტაცია"</string>
<string name="label_pages" msgid="7768589729282182230">"გვერდები"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ყველა <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"შავ-თეთრი"</item>
<item msgid="2762241247228983754">"ფერი"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"არც ერთი"</item>
+ <item msgid="7296563835355641719">"გრძელი კიდე"</item>
+ <item msgid="79513688117503758">"მოკლე კიდე"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"პორტრეტი"</item>
<item msgid="3199660090246166812">"პეიზაჟის რეჟიმი"</item>
diff --git a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml
index b02714befc59..362d790840e1 100644
--- a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml
+++ b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Қағаз өлшемі"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Қағаз өлшемі:"</string>
<string name="label_color" msgid="1108690305218188969">"Түс"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Бағыты"</string>
<string name="label_pages" msgid="7768589729282182230">"Беттер"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Барлық <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Қара &amp; Ақ"</item>
<item msgid="2762241247228983754">"Түс"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Портреттік"</item>
<item msgid="3199660090246166812">"Ландшафт"</item>
diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml
index 63d710a8a631..9bc3362df324 100644
--- a/packages/PrintSpooler/res/values-km-rKH/strings.xml
+++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"ទំហំ​​ក្រដាស"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"ទំហំ​ក្រដាស៖"</string>
<string name="label_color" msgid="1108690305218188969">"ពណ៌"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"ទិស"</string>
<string name="label_pages" msgid="7768589729282182230">"ទំព័រ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> ទាំងអស់"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"ស &amp; ខ្មៅ"</item>
<item msgid="2762241247228983754">"ពណ៌"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"គ្មាន"</item>
+ <item msgid="7296563835355641719">"គែម​វែង"</item>
+ <item msgid="79513688117503758">"គែម​ខ្លី"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"បញ្ឈរ"</item>
<item msgid="3199660090246166812">"ផ្ដេក"</item>
diff --git a/packages/PrintSpooler/res/values-kn-rIN/strings.xml b/packages/PrintSpooler/res/values-kn-rIN/strings.xml
index 3950866029c3..61065e0fa54d 100644
--- a/packages/PrintSpooler/res/values-kn-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-kn-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"ಪೇಪರ್ ಗಾತ್ರ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"ಪೇಪರ್ ಗಾತ್ರ:"</string>
<string name="label_color" msgid="1108690305218188969">"ಬಣ್ಣ"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"ಓರಿಯಂಟೇಶನ್"</string>
<string name="label_pages" msgid="7768589729282182230">"ಪುಟಗಳು"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ಎಲ್ಲಾ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"ಕಪ್ಪು &amp; ಬಿಳುಪು"</item>
<item msgid="2762241247228983754">"ಬಣ್ಣ"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"ಪೋಟ್ರೇಟ್"</item>
<item msgid="3199660090246166812">"ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್"</item>
diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml
index f1a4869bf64c..448896c18990 100644
--- a/packages/PrintSpooler/res/values-ko/strings.xml
+++ b/packages/PrintSpooler/res/values-ko/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"용지 크기"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"용지 크기:"</string>
<string name="label_color" msgid="1108690305218188969">"색상"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"방향"</string>
<string name="label_pages" msgid="7768589729282182230">"페이지"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>페이지 모두"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"흑백"</item>
<item msgid="2762241247228983754">"컬러"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"없음"</item>
+ <item msgid="7296563835355641719">"옆으로 넘김"</item>
+ <item msgid="79513688117503758">"위로 넘김"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"세로"</item>
<item msgid="3199660090246166812">"가로"</item>
diff --git a/packages/PrintSpooler/res/values-ky-rKG/strings.xml b/packages/PrintSpooler/res/values-ky-rKG/strings.xml
index 602f6605606b..64bd5853813e 100644
--- a/packages/PrintSpooler/res/values-ky-rKG/strings.xml
+++ b/packages/PrintSpooler/res/values-ky-rKG/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Барактын өлчөмү"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Барактын өлчөмү:"</string>
<string name="label_color" msgid="1108690305218188969">"Түс"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Багыттоо"</string>
<string name="label_pages" msgid="7768589729282182230">"Баракчалар"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Бардыгы <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Кара-ак"</item>
<item msgid="2762241247228983754">"Түстүү"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Тикесинен"</item>
<item msgid="3199660090246166812">"Туурасынан"</item>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
index 3a3f6bb32762..9bd4d83bd6c4 100644
--- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"​ຂະ​ໜາດ​ເຈ້ຍ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"​ຂະ​ໜາດ​ເຈ້ຍ:"</string>
<string name="label_color" msgid="1108690305218188969">"ສີ"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"ລວງ"</string>
<string name="label_pages" msgid="7768589729282182230">"ໜ້າ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ທັງ​ໝົດ <xliff:g id="PAGE_COUNT">%1$s</xliff:g> ໜ້າ"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"ຂາວດຳ"</item>
<item msgid="2762241247228983754">"ສີ"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"ບໍ່ມີ"</item>
+ <item msgid="7296563835355641719">"ຂອບຍາວ"</item>
+ <item msgid="79513688117503758">"ຂອບສັ້ນ"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"ລວງຕັ້ງ"</item>
<item msgid="3199660090246166812">"ລວງນອນ"</item>
diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml
index 6262a1551ad6..1116f6de9277 100644
--- a/packages/PrintSpooler/res/values-lt/strings.xml
+++ b/packages/PrintSpooler/res/values-lt/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Popieriaus dydis"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Popieriaus dydis:"</string>
<string name="label_color" msgid="1108690305218188969">"Spalva"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientacija"</string>
<string name="label_pages" msgid="7768589729282182230">"Puslapiai"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Visi <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Nespalvotas"</item>
<item msgid="2762241247228983754">"Spalva"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nėra"</item>
+ <item msgid="7296563835355641719">"Ilgasis kraštas"</item>
+ <item msgid="79513688117503758">"Trumpasis kraštas"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Stačias"</item>
<item msgid="3199660090246166812">"Gulsčias"</item>
diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml
index 3a60ee548b32..d079ea999f78 100644
--- a/packages/PrintSpooler/res/values-lv/strings.xml
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papīra izmērs"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papīra izmērs:"</string>
<string name="label_color" msgid="1108690305218188969">"Krāsa"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Virziens"</string>
<string name="label_pages" msgid="7768589729282182230">"Lapas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Visas <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Melnbalts"</item>
<item msgid="2762241247228983754">"Krāsa"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nav"</item>
+ <item msgid="7296563835355641719">"Garā mala"</item>
+ <item msgid="79513688117503758">"Īsā mala"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrets"</item>
<item msgid="3199660090246166812">"Ainava"</item>
diff --git a/packages/PrintSpooler/res/values-mk-rMK/strings.xml b/packages/PrintSpooler/res/values-mk-rMK/strings.xml
index 91b5763fed80..fec4841b797d 100644
--- a/packages/PrintSpooler/res/values-mk-rMK/strings.xml
+++ b/packages/PrintSpooler/res/values-mk-rMK/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Големина на хартија"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Големина на хартија:"</string>
<string name="label_color" msgid="1108690305218188969">"Боја"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Ориентација"</string>
<string name="label_pages" msgid="7768589729282182230">"Страници"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Сите <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Црно-бела"</item>
<item msgid="2762241247228983754">"Во боја"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Портрет"</item>
<item msgid="3199660090246166812">"Пејзаж"</item>
diff --git a/packages/PrintSpooler/res/values-ml-rIN/strings.xml b/packages/PrintSpooler/res/values-ml-rIN/strings.xml
index a06ca7d53d0a..743827f77ca2 100644
--- a/packages/PrintSpooler/res/values-ml-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-ml-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"പേപ്പർ വലുപ്പം"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"പേപ്പർ വലുപ്പം:"</string>
<string name="label_color" msgid="1108690305218188969">"നിറം"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"ഓറിയന്‍റേഷന്‍‌"</string>
<string name="label_pages" msgid="7768589729282182230">"പേജുകൾ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"എല്ലാ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"കറുപ്പ് &amp; വെള്ള"</item>
<item msgid="2762241247228983754">"നിറം"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"പോർട്രെയ്‌റ്റ്"</item>
<item msgid="3199660090246166812">"ലാൻഡ്‌സ്‌കേപ്പ്"</item>
diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
index 022addac6fce..8d0604aa39c9 100644
--- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml
+++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Цаасны хэмжээ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Цаасны хэмжээ:"</string>
<string name="label_color" msgid="1108690305218188969">"Өнгө"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Чиглэл"</string>
<string name="label_pages" msgid="7768589729282182230">"Хуудас"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Нийт <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Хар &amp; Цагаан"</item>
<item msgid="2762241247228983754">"Өнгө"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Хоосон"</item>
+ <item msgid="7296563835355641719">"Урт ирмэг"</item>
+ <item msgid="79513688117503758">"Богино ирмэг"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Босоо"</item>
<item msgid="3199660090246166812">"Хэвтээ"</item>
diff --git a/packages/PrintSpooler/res/values-mr-rIN/strings.xml b/packages/PrintSpooler/res/values-mr-rIN/strings.xml
index 1fade660548e..9036e0ec6f34 100644
--- a/packages/PrintSpooler/res/values-mr-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-mr-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"कागद आकार"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"कागद आकार:"</string>
<string name="label_color" msgid="1108690305218188969">"रंग"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"अभिमुखता"</string>
<string name="label_pages" msgid="7768589729282182230">"पृष्ठे"</string>
<string name="template_all_pages" msgid="3322235982020148762">"सर्व <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"कृष्‍ण धवल"</item>
<item msgid="2762241247228983754">"रंग"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"पोट्रेट"</item>
<item msgid="3199660090246166812">"भूदृश्य"</item>
diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
index a392b76e540f..0c7ecfb02d34 100644
--- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml
+++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Saiz kertas"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Saiz kertas:"</string>
<string name="label_color" msgid="1108690305218188969">"Warna"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>
<string name="label_pages" msgid="7768589729282182230">"Halaman"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Semua <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
<item msgid="2762241247228983754">"Warna"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Tiada"</item>
+ <item msgid="7296563835355641719">"Sisi panjang"</item>
+ <item msgid="79513688117503758">"Sisi pendek"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Potret"</item>
<item msgid="3199660090246166812">"Landskap"</item>
diff --git a/packages/PrintSpooler/res/values-my-rMM/strings.xml b/packages/PrintSpooler/res/values-my-rMM/strings.xml
index d6eb38035c27..bbf2de48d8d4 100644
--- a/packages/PrintSpooler/res/values-my-rMM/strings.xml
+++ b/packages/PrintSpooler/res/values-my-rMM/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"စက္ကူ ဆိုက်"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"စက္ကူ ဆိုက်:"</string>
<string name="label_color" msgid="1108690305218188969">"ရောင်စုံ"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"အနေအထား"</string>
<string name="label_pages" msgid="7768589729282182230">"စာမျက်နှာများ"</string>
<string name="template_all_pages" msgid="3322235982020148762">"အားလုံး <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"အဖြူ အမည်း"</item>
<item msgid="2762241247228983754">"ရောင်စုံ"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"ထောင်လိုက်"</item>
<item msgid="3199660090246166812">"အလျားလိုက်"</item>
diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml
index bf1106883802..1df90a9624af 100644
--- a/packages/PrintSpooler/res/values-nb/strings.xml
+++ b/packages/PrintSpooler/res/values-nb/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papirstørrelse"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papirstørrelse:"</string>
<string name="label_color" msgid="1108690305218188969">"Farge"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Retning"</string>
<string name="label_pages" msgid="7768589729282182230">"Sider"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Svart og hvitt"</item>
<item msgid="2762241247228983754">"Farge"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ingen"</item>
+ <item msgid="7296563835355641719">"Langsiden"</item>
+ <item msgid="79513688117503758">"Kortsiden"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Stående"</item>
<item msgid="3199660090246166812">"Liggende"</item>
diff --git a/packages/PrintSpooler/res/values-ne-rNP/strings.xml b/packages/PrintSpooler/res/values-ne-rNP/strings.xml
index eb9753050f8e..c2ecc3bdebb9 100644
--- a/packages/PrintSpooler/res/values-ne-rNP/strings.xml
+++ b/packages/PrintSpooler/res/values-ne-rNP/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"कागजको आकार"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"कागजको आकार:"</string>
<string name="label_color" msgid="1108690305218188969">"रङ्ग"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"अभिमुखिकरण"</string>
<string name="label_pages" msgid="7768589729282182230">"पृष्ठहरू"</string>
<string name="template_all_pages" msgid="3322235982020148762">"सबै <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"कालो &amp; सेतो"</item>
<item msgid="2762241247228983754">"रङ्ग"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"कुनै पनि होइन"</item>
+ <item msgid="7296563835355641719">"लामो किनारा"</item>
+ <item msgid="79513688117503758">"छोटो किनारा"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"पोट्रेट"</item>
<item msgid="3199660090246166812">"परिदृश्य"</item>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 5ea52a03710f..2a6c4c20e8c4 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Papierformaat"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Papierformaat:"</string>
<string name="label_color" msgid="1108690305218188969">"Kleur"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Stand"</string>
<string name="label_pages" msgid="7768589729282182230">"Pagina\'s"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Zwart-wit"</item>
<item msgid="2762241247228983754">"Kleur"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Geen"</item>
+ <item msgid="7296563835355641719">"Lange zijde"</item>
+ <item msgid="79513688117503758">"Korte zijde"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portret"</item>
<item msgid="3199660090246166812">"Landschap"</item>
diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml
index 609e6e9c6a0a..a74a89095507 100644
--- a/packages/PrintSpooler/res/values-pl/strings.xml
+++ b/packages/PrintSpooler/res/values-pl/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Rozmiar papieru"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Rozmiar papieru:"</string>
<string name="label_color" msgid="1108690305218188969">"Kolor"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientacja"</string>
<string name="label_pages" msgid="7768589729282182230">"Strony"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Wszystkie <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Czarno-białe"</item>
<item msgid="2762241247228983754">"Kolor"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Brak"</item>
+ <item msgid="7296563835355641719">"Długa krawędź"</item>
+ <item msgid="79513688117503758">"Krótka krawędź"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Pionowa"</item>
<item msgid="3199660090246166812">"Pozioma"</item>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index 7b47f4c3572f..10b32ca63f13 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Tamanho do papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Tamanho do papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Cor"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>
<string name="label_pages" msgid="7768589729282182230">"Páginas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Todas as <xliff:g id="PAGE_COUNT">%1$s</xliff:g> páginas"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Preto e branco"</item>
<item msgid="2762241247228983754">"Cor"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nenhum"</item>
+ <item msgid="7296563835355641719">"Limite grande"</item>
+ <item msgid="79513688117503758">"Limite curto"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Vertical"</item>
<item msgid="3199660090246166812">"Horizontal"</item>
diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml
index 3038a7fe9639..eb1d9a0eeca6 100644
--- a/packages/PrintSpooler/res/values-pt/strings.xml
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Tamanho do papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Tamanho do papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Cor"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>
<string name="label_pages" msgid="7768589729282182230">"Páginas"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Todas as <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Preto e branco"</item>
<item msgid="2762241247228983754">"Cor"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Nenhum"</item>
+ <item msgid="7296563835355641719">"Borda longa"</item>
+ <item msgid="79513688117503758">"Borda curta"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Retrato"</item>
<item msgid="3199660090246166812">"Paisagem"</item>
diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml
index 1446a53bbc61..15ccb7dbcacd 100644
--- a/packages/PrintSpooler/res/values-ro/strings.xml
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Formatul hârtiei"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Formatul hârtiei:"</string>
<string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientare"</string>
<string name="label_pages" msgid="7768589729282182230">"Pagini"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Toate cele <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Alb-negru"</item>
<item msgid="2762241247228983754">"Color"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Fără"</item>
+ <item msgid="7296563835355641719">"Latura lungă"</item>
+ <item msgid="79513688117503758">"Latura scurtă"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portret"</item>
<item msgid="3199660090246166812">"Peisaj"</item>
diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml
index c2a19bb2d5cb..f2d5bef3aede 100644
--- a/packages/PrintSpooler/res/values-ru/strings.xml
+++ b/packages/PrintSpooler/res/values-ru/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Размер бумаги"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Размер бумаги:"</string>
<string name="label_color" msgid="1108690305218188969">"Печать"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Ориентация"</string>
<string name="label_pages" msgid="7768589729282182230">"Страницы"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Все <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Черно-белая"</item>
<item msgid="2762241247228983754">"Цветная"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Нет"</item>
+ <item msgid="7296563835355641719">"Длинный край"</item>
+ <item msgid="79513688117503758">"Короткий край"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Книга"</item>
<item msgid="3199660090246166812">"Альбом"</item>
diff --git a/packages/PrintSpooler/res/values-si-rLK/strings.xml b/packages/PrintSpooler/res/values-si-rLK/strings.xml
index 386ce8db5777..f1b40c64ad3d 100644
--- a/packages/PrintSpooler/res/values-si-rLK/strings.xml
+++ b/packages/PrintSpooler/res/values-si-rLK/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"කඩදාසියේ ප්‍රමාණය"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"කඩදාසියේ ප්‍රමාණය:"</string>
<string name="label_color" msgid="1108690305218188969">"වර්ණය"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"දිශානතිය"</string>
<string name="label_pages" msgid="7768589729282182230">"පිටු"</string>
<string name="template_all_pages" msgid="3322235982020148762">"සියලුම <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"කළු සහ සුදු"</item>
<item msgid="2762241247228983754">"වර්ණය"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"කිසිවක් නැත"</item>
+ <item msgid="7296563835355641719">"දිගු දාරය"</item>
+ <item msgid="79513688117503758">"කෙටි දාරය"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"ප්‍රතිමුර්ති"</item>
<item msgid="3199660090246166812">"තිරස් දර්ශනය"</item>
diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml
index 5be2034515ce..fbf2bc70dd33 100644
--- a/packages/PrintSpooler/res/values-sk/strings.xml
+++ b/packages/PrintSpooler/res/values-sk/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Veľkosť papiera"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Veľkosť papiera:"</string>
<string name="label_color" msgid="1108690305218188969">"Farba"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientácia"</string>
<string name="label_pages" msgid="7768589729282182230">"Strany"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Všetky: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Čiernobiele"</item>
<item msgid="2762241247228983754">"Farba"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Žiadne"</item>
+ <item msgid="7296563835355641719">"Dlhý okraj"</item>
+ <item msgid="79513688117503758">"Krátky okraj"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Na výšku"</item>
<item msgid="3199660090246166812">"Na šírku"</item>
diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml
index ee151034484b..a441d7c31561 100644
--- a/packages/PrintSpooler/res/values-sl/strings.xml
+++ b/packages/PrintSpooler/res/values-sl/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Velikost papirja"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Velikost papirja:"</string>
<string name="label_color" msgid="1108690305218188969">"Barvno"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Postavitev"</string>
<string name="label_pages" msgid="7768589729282182230">"Strani"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Vse (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Črno-belo"</item>
<item msgid="2762241247228983754">"Barvno"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Brez"</item>
+ <item msgid="7296563835355641719">"Dolgi rob"</item>
+ <item msgid="79513688117503758">"Kratki rob"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Pokončno"</item>
<item msgid="3199660090246166812">"Ležeče"</item>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
index 6ca94aad0edd..622c84bebd47 100644
--- a/packages/PrintSpooler/res/values-sr/strings.xml
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Величина папира"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Величина папира:"</string>
<string name="label_color" msgid="1108690305218188969">"Боја"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Положај"</string>
<string name="label_pages" msgid="7768589729282182230">"Странице"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Све странице (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Црно-бело"</item>
<item msgid="2762241247228983754">"Боја"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ништа"</item>
+ <item msgid="7296563835355641719">"Дуга ивица"</item>
+ <item msgid="79513688117503758">"Кратка ивица"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Усправно"</item>
<item msgid="3199660090246166812">"Водоравно"</item>
diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml
index 4c439be8bdef..09ce6ee6382e 100644
--- a/packages/PrintSpooler/res/values-sv/strings.xml
+++ b/packages/PrintSpooler/res/values-sv/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Pappersstorlek"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Pappersstorlek:"</string>
<string name="label_color" msgid="1108690305218188969">"Färg"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Orientering"</string>
<string name="label_pages" msgid="7768589729282182230">"Sidor"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Alla <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Svartvit"</item>
<item msgid="2762241247228983754">"Färg"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Ingen"</item>
+ <item msgid="7296563835355641719">"Långsidan"</item>
+ <item msgid="79513688117503758">"Kortsidan"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Stående"</item>
<item msgid="3199660090246166812">"Liggande"</item>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
index e454704ce285..a0497e64519f 100644
--- a/packages/PrintSpooler/res/values-sw/strings.xml
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Ukubwa wa karatasi"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Ukubwa wa karatasi:"</string>
<string name="label_color" msgid="1108690305218188969">"Rangi"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Mkao"</string>
<string name="label_pages" msgid="7768589729282182230">"Kurasa"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Kurasa zote <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Nyeusi na Nyeupe"</item>
<item msgid="2762241247228983754">"Rangi"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Hamna"</item>
+ <item msgid="7296563835355641719">"Ukingo mrefu"</item>
+ <item msgid="79513688117503758">"Ukingo mfupi"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Wima"</item>
<item msgid="3199660090246166812">"Mlalo"</item>
diff --git a/packages/PrintSpooler/res/values-ta-rIN/strings.xml b/packages/PrintSpooler/res/values-ta-rIN/strings.xml
index 0421bd6b01c4..a50470a32c5b 100644
--- a/packages/PrintSpooler/res/values-ta-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-ta-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"காகித அளவு"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"காகித அளவு:"</string>
<string name="label_color" msgid="1108690305218188969">"வண்ணம்"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"திசையமைப்பு"</string>
<string name="label_pages" msgid="7768589729282182230">"பக்கங்கள்"</string>
<string name="template_all_pages" msgid="3322235982020148762">"எல்லாம்: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"கருப்பு &amp; வெள்ளை"</item>
<item msgid="2762241247228983754">"வண்ணம்"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"உறுவப்படம்"</item>
<item msgid="3199660090246166812">"நிலத்தோற்றம்"</item>
diff --git a/packages/PrintSpooler/res/values-te-rIN/strings.xml b/packages/PrintSpooler/res/values-te-rIN/strings.xml
index edb6e60b5efc..b35520d69468 100644
--- a/packages/PrintSpooler/res/values-te-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-te-rIN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"కాగితపు పరిమాణం"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"కాగితపు పరిమాణం:"</string>
<string name="label_color" msgid="1108690305218188969">"రంగు"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"దృగ్విన్యాసం"</string>
<string name="label_pages" msgid="7768589729282182230">"పేజీలు"</string>
<string name="template_all_pages" msgid="3322235982020148762">"మొత్తం <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"నలుపు &amp; తెలుపు"</item>
<item msgid="2762241247228983754">"రంగు"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"పోర్ట్రెయిట్"</item>
<item msgid="3199660090246166812">"ల్యాండ్‌స్కేప్"</item>
diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml
index cfffa0b7e8e6..9c8d55c1ff1d 100644
--- a/packages/PrintSpooler/res/values-th/strings.xml
+++ b/packages/PrintSpooler/res/values-th/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"ขนาดของกระดาษ"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"ขนาดของกระดาษ:"</string>
<string name="label_color" msgid="1108690305218188969">"สี"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"การวางแนว"</string>
<string name="label_pages" msgid="7768589729282182230">"หน้า"</string>
<string name="template_all_pages" msgid="3322235982020148762">"ทั้ง <xliff:g id="PAGE_COUNT">%1$s</xliff:g> หน้า"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"ขาวดำ"</item>
<item msgid="2762241247228983754">"สี"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"ไม่มี"</item>
+ <item msgid="7296563835355641719">"ขอบยาว"</item>
+ <item msgid="79513688117503758">"ขอบสั้น"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"แนวตั้ง"</item>
<item msgid="3199660090246166812">"แนวนอน"</item>
diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml
index dfb045086787..9e4c7bed7a8c 100644
--- a/packages/PrintSpooler/res/values-tl/strings.xml
+++ b/packages/PrintSpooler/res/values-tl/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Laki ng papel"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Laki ng papel:"</string>
<string name="label_color" msgid="1108690305218188969">"Kulay"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Oryentasyon"</string>
<string name="label_pages" msgid="7768589729282182230">"Mga Page"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Lahat ng <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Black &amp; White"</item>
<item msgid="2762241247228983754">"Kulay"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Wala"</item>
+ <item msgid="7296563835355641719">"Long edge"</item>
+ <item msgid="79513688117503758">"Short edge"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Portrait"</item>
<item msgid="3199660090246166812">"Landscape"</item>
diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml
index 50befbafbbe2..902f4ce34bf5 100644
--- a/packages/PrintSpooler/res/values-tr/strings.xml
+++ b/packages/PrintSpooler/res/values-tr/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Kağıt boyutu"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Kağıt boyutu:"</string>
<string name="label_color" msgid="1108690305218188969">"Renkli"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Sayfa yönü"</string>
<string name="label_pages" msgid="7768589729282182230">"Sayfa"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> sayfanın tamamı"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Siyah Beyaz"</item>
<item msgid="2762241247228983754">"Renkli"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Yok"</item>
+ <item msgid="7296563835355641719">"Uzun kenar"</item>
+ <item msgid="79513688117503758">"Kısa kenar"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Dikey"</item>
<item msgid="3199660090246166812">"Yatay"</item>
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
index 8a924e6210ad..71f9d61b0b29 100644
--- a/packages/PrintSpooler/res/values-uk/strings.xml
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Розмір паперу"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Розмір паперу:"</string>
<string name="label_color" msgid="1108690305218188969">"Колір"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Орієнтація"</string>
<string name="label_pages" msgid="7768589729282182230">"Сторінки"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Усі <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Чорно-білий"</item>
<item msgid="2762241247228983754">"Колір"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Немає"</item>
+ <item msgid="7296563835355641719">"Довгий край"</item>
+ <item msgid="79513688117503758">"Короткий край"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Книжкова"</item>
<item msgid="3199660090246166812">"Альбомна"</item>
diff --git a/packages/PrintSpooler/res/values-ur-rPK/strings.xml b/packages/PrintSpooler/res/values-ur-rPK/strings.xml
index 722d027d9c60..2b32c30d7e6e 100644
--- a/packages/PrintSpooler/res/values-ur-rPK/strings.xml
+++ b/packages/PrintSpooler/res/values-ur-rPK/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"کاغذ کا سائز"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"کاغذ کا سائز:"</string>
<string name="label_color" msgid="1108690305218188969">"رنگ"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"سمت بندی"</string>
<string name="label_pages" msgid="7768589729282182230">"صفحات"</string>
<string name="template_all_pages" msgid="3322235982020148762">"سبھی <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"سیاہ و سفید"</item>
<item msgid="2762241247228983754">"رنگ"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"پورٹریٹ"</item>
<item msgid="3199660090246166812">"لینڈ اسکیپ"</item>
diff --git a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml
index f62728fe1c65..57103d40229c 100644
--- a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml
+++ b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Qog‘oz o‘lchami"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Qog‘oz o‘lchami:"</string>
<string name="label_color" msgid="1108690305218188969">"Rang"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Joylashuv"</string>
<string name="label_pages" msgid="7768589729282182230">"Sahifalar"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Barchasi (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
@@ -77,6 +79,9 @@
<item msgid="7602948745415174937">"Oq &amp; qora"</item>
<item msgid="2762241247228983754">"Rang"</item>
</string-array>
+ <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) -->
+ <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) -->
+ <!-- no translation found for duplex_mode_labels:2 (79513688117503758) -->
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Bo‘yiga"</item>
<item msgid="3199660090246166812">"Eniga"</item>
diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml
index fa0d26eb2b08..3a9f8d4cc124 100644
--- a/packages/PrintSpooler/res/values-vi/strings.xml
+++ b/packages/PrintSpooler/res/values-vi/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Khổ giấy"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Khổ giấy:"</string>
<string name="label_color" msgid="1108690305218188969">"Màu"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Hướng"</string>
<string name="label_pages" msgid="7768589729282182230">"Trang"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Tất cả <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Đen trắng"</item>
<item msgid="2762241247228983754">"Màu"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Không có"</item>
+ <item msgid="7296563835355641719">"Cạnh dài"</item>
+ <item msgid="79513688117503758">"Cạnh ngắn"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Dọc"</item>
<item msgid="3199660090246166812">"Ngang"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index 77ecb21ad72f..80bab12c6684 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"纸张尺寸"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"纸张尺寸:"</string>
<string name="label_color" msgid="1108690305218188969">"颜色"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"方向"</string>
<string name="label_pages" msgid="7768589729282182230">"页数"</string>
<string name="template_all_pages" msgid="3322235982020148762">"全部<xliff:g id="PAGE_COUNT">%1$s</xliff:g>页"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"无"</item>
+ <item msgid="7296563835355641719">"长边"</item>
+ <item msgid="79513688117503758">"短边"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"纵向"</item>
<item msgid="3199660090246166812">"横向"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
index d2fa629728fa..bf6262c17a2a 100644
--- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"紙張大小"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"紙張大小:"</string>
<string name="label_color" msgid="1108690305218188969">"顏色"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"方向"</string>
<string name="label_pages" msgid="7768589729282182230">"頁數"</string>
<string name="template_all_pages" msgid="3322235982020148762">"全部 <xliff:g id="PAGE_COUNT">%1$s</xliff:g> 頁"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"無"</item>
+ <item msgid="7296563835355641719">"長邊"</item>
+ <item msgid="79513688117503758">"短邊"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"直向"</item>
<item msgid="3199660090246166812">"橫向"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
index 3e26a5e88d09..d822b4121760 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"紙張大小"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"紙張大小:"</string>
<string name="label_color" msgid="1108690305218188969">"色彩"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"方向"</string>
<string name="label_pages" msgid="7768589729282182230">"頁面"</string>
<string name="template_all_pages" msgid="3322235982020148762">"全部 <xliff:g id="PAGE_COUNT">%1$s</xliff:g> 頁"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"無"</item>
+ <item msgid="7296563835355641719">"長邊"</item>
+ <item msgid="79513688117503758">"短邊"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"縱向"</item>
<item msgid="3199660090246166812">"橫向"</item>
diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml
index f8a27bce630d..2b05cb0e6d9b 100644
--- a/packages/PrintSpooler/res/values-zu/strings.xml
+++ b/packages/PrintSpooler/res/values-zu/strings.xml
@@ -24,6 +24,8 @@
<string name="label_paper_size" msgid="908654383827777759">"Usayizi wekhasi"</string>
<string name="label_paper_size_summary" msgid="5668204981332138168">"Usayizi wekhasi"</string>
<string name="label_color" msgid="1108690305218188969">"Umbala"</string>
+ <!-- no translation found for label_duplex (1263181386446435253) -->
+ <skip />
<string name="label_orientation" msgid="2853142581990496477">"Umumo"</string>
<string name="label_pages" msgid="7768589729282182230">"Amakhasi"</string>
<string name="template_all_pages" msgid="3322235982020148762">"Konke <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
@@ -77,6 +79,11 @@
<item msgid="7602948745415174937">"Okumnyama nokumhlophe"</item>
<item msgid="2762241247228983754">"Umbala"</item>
</string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"Lutho"</item>
+ <item msgid="7296563835355641719">"Emaphethelweni amade"</item>
+ <item msgid="79513688117503758">"Emaphethelweni amafushane"</item>
+ </string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Ukuma ngobude"</item>
<item msgid="3199660090246166812">"Ukwakheka kwezwe"</item>
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index ab633eaf259e..9d67ccc7cbff 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -40,6 +40,9 @@
<!-- Label of the color mode widget. [CHAR LIMIT=20] -->
<string name="label_color">Color</string>
+ <!-- Label of the duplex mode widget. [CHAR LIMIT=20] -->
+ <string name="label_duplex">Duplex</string>
+
<!-- Label of the orientation widget. [CHAR LIMIT=20] -->
<string name="label_orientation">Orientation</string>
@@ -188,12 +191,22 @@
<!-- Color mode labels. -->
<string-array name="color_mode_labels">
- <!-- Color modelabel: Monochrome color scheme, e.g. one color is used. [CHAR LIMIT=20] -->
+ <!-- Color mode label: Monochrome color scheme, e.g. one color is used. [CHAR LIMIT=20] -->
<item>Black &amp; White</item>
<!-- Color mode label: Color color scheme, e.g. many colors are used. [CHAR LIMIT=20] -->
<item>Color</item>
</string-array>
+ <!-- Duplex mode labels. -->
+ <string-array name="duplex_mode_labels">
+ <!-- Duplex mode label: No duplex supported. [CHAR LIMIT=20] -->
+ <item>None</item>
+ <!-- Duplex mode label: Turn page sideways along the long edge like a book. [CHAR LIMIT=20] -->
+ <item>Long edge</item>
+ <!-- Duplex mode label: Turn page upwards along the short edge like a notepad. [CHAR LIMIT=20] -->
+ <item>Short edge</item>
+ </string-array>
+
<!-- Orientation labels. -->
<string-array name="orientation_labels">
<!-- Orientation label: Portrait page orientation. [CHAR LIMIT=30] -->
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
index 2cc5e049e3aa..377d2d5276ce 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
@@ -695,6 +695,7 @@ public final class PrintSpoolerService extends Service {
private static final String TAG_MARGINS = "margins";
private static final String ATTR_COLOR_MODE = "colorMode";
+ private static final String ATTR_DUPLEX_MODE = "duplexMode";
private static final String ATTR_LOCAL_ID = "localId";
private static final String ATTR_SERVICE_NAME = "serviceName";
@@ -823,6 +824,10 @@ public final class PrintSpoolerService extends Service {
serializer.attribute(null, ATTR_COLOR_MODE,
String.valueOf(colorMode));
+ final int duplexMode = attributes.getDuplexMode();
+ serializer.attribute(null, ATTR_DUPLEX_MODE,
+ String.valueOf(duplexMode));
+
MediaSize mediaSize = attributes.getMediaSize();
if (mediaSize != null) {
serializer.startTag(null, TAG_MEDIA_SIZE);
@@ -1057,6 +1062,12 @@ public final class PrintSpoolerService extends Service {
String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE);
builder.setColorMode(Integer.parseInt(colorMode));
+ String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE);
+ // Duplex mode was added later, so null check is needed.
+ if (duplexMode != null) {
+ builder.setDuplexMode(Integer.parseInt(duplexMode));
+ }
+
parser.next();
skipEmptyTextTags(parser);
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index f3a5c95a43d0..4ba04e53db2a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -184,6 +184,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
private Spinner mColorModeSpinner;
private ArrayAdapter<SpinnerItem<Integer>> mColorModeSpinnerAdapter;
+ private Spinner mDuplexModeSpinner;
+ private ArrayAdapter<SpinnerItem<Integer>> mDuplexModeSpinnerAdapter;
+
private Spinner mOrientationSpinner;
private ArrayAdapter<SpinnerItem<Integer>> mOrientationSpinnerAdapter;
@@ -767,6 +770,21 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
}
}
}
+
+ // Take the duplex mode only if the current printer supports it.
+ final int currDuplexMode = currAttributes.getDuplexMode();
+ final int newDuplexMode = newAttributes.getDuplexMode();
+ if (currDuplexMode != newDuplexMode) {
+ final int duplexModeCount = mDuplexModeSpinner.getCount();
+ for (int i = 0; i < duplexModeCount; i++) {
+ final int supportedDuplexMode = mDuplexModeSpinnerAdapter.getItem(i).value;
+ if (supportedDuplexMode == newDuplexMode) {
+ currAttributes.setDuplexMode(newDuplexMode);
+ mDuplexModeSpinner.setSelection(i);
+ break;
+ }
+ }
+ }
}
// Handle selected page changes making sure they are in the doc.
@@ -985,6 +1003,12 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
attributes.setColorMode(defaults.getColorMode());
}
+ // Duplex mode.
+ final int duplexMode = attributes.getDuplexMode();
+ if ((capabilities.getDuplexModes() & duplexMode) == 0) {
+ attributes.setDuplexMode(defaults.getDuplexMode());
+ }
+
// Resolution
Resolution resolution = attributes.getResolution();
if (resolution == null || !capabilities.getResolutions().contains(resolution)) {
@@ -1111,6 +1135,13 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
mColorModeSpinner.setAdapter(mColorModeSpinnerAdapter);
mColorModeSpinner.setOnItemSelectedListener(itemSelectedListener);
+ // Duplex mode.
+ mDuplexModeSpinnerAdapter = new ArrayAdapter<>(
+ this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1);
+ mDuplexModeSpinner = (Spinner) findViewById(R.id.duplex_spinner);
+ mDuplexModeSpinner.setAdapter(mDuplexModeSpinnerAdapter);
+ mDuplexModeSpinner.setOnItemSelectedListener(itemSelectedListener);
+
// Orientation
mOrientationSpinnerAdapter = new ArrayAdapter<>(
this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1);
@@ -1187,6 +1218,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
mCopiesEditText.setFocusable(false);
mMediaSizeSpinner.setEnabled(false);
mColorModeSpinner.setEnabled(false);
+ mDuplexModeSpinner.setEnabled(false);
mOrientationSpinner.setEnabled(false);
mRangeOptionsSpinner.setEnabled(false);
mPageRangeEditText.setEnabled(false);
@@ -1202,6 +1234,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
mCopiesEditText.setFocusable(false);
mMediaSizeSpinner.setEnabled(false);
mColorModeSpinner.setEnabled(false);
+ mDuplexModeSpinner.setEnabled(false);
mOrientationSpinner.setEnabled(false);
mRangeOptionsSpinner.setEnabled(false);
mPageRangeEditText.setEnabled(false);
@@ -1317,7 +1350,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
final int colorMode = 1 << colorBitOffset;
if (colorMode == oldColorMode) {
// Update the index of the old selection.
- oldColorModeNewIndex = colorBitOffset;
+ oldColorModeNewIndex = mColorModeSpinnerAdapter.getCount();
}
remainingColorModes &= ~colorMode;
mColorModeSpinnerAdapter.add(new SpinnerItem<>(colorMode,
@@ -1339,11 +1372,81 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
mColorModeSpinner.setSelection(i);
}
attributes.setColorMode(selectedColorMode);
+ break;
}
}
}
}
+ // Duplex mode.
+ mDuplexModeSpinner.setEnabled(true);
+ final int duplexModes = capabilities.getDuplexModes();
+
+ // If the duplex modes changed, we update the adapter and the spinner.
+ // Note that we use bit count +1 to account for the no duplex option.
+ boolean duplexModesChanged = false;
+ if (Integer.bitCount(duplexModes) != mDuplexModeSpinnerAdapter.getCount()) {
+ duplexModesChanged = true;
+ } else {
+ int remainingDuplexModes = duplexModes;
+ int adapterIndex = 0;
+ while (remainingDuplexModes != 0) {
+ final int duplexBitOffset = Integer.numberOfTrailingZeros(remainingDuplexModes);
+ final int duplexMode = 1 << duplexBitOffset;
+ remainingDuplexModes &= ~duplexMode;
+ if (duplexMode != mDuplexModeSpinnerAdapter.getItem(adapterIndex).value) {
+ duplexModesChanged = true;
+ break;
+ }
+ adapterIndex++;
+ }
+ }
+ if (duplexModesChanged) {
+ // Remember the old duplex mode to try selecting it again. Also the fallback
+ // is no duplexing which is always the first item in the dropdown.
+ int oldDuplexModeNewIndex = AdapterView.INVALID_POSITION;
+ final int oldDuplexMode = attributes.getDuplexMode();
+
+ // Rebuild the adapter data.
+ mDuplexModeSpinnerAdapter.clear();
+ String[] duplexModeLabels = getResources().getStringArray(R.array.duplex_mode_labels);
+ int remainingDuplexModes = duplexModes;
+ while (remainingDuplexModes != 0) {
+ final int duplexBitOffset = Integer.numberOfTrailingZeros(remainingDuplexModes);
+ final int duplexMode = 1 << duplexBitOffset;
+ if (duplexMode == oldDuplexMode) {
+ // Update the index of the old selection.
+ oldDuplexModeNewIndex = mDuplexModeSpinnerAdapter.getCount();
+ }
+ remainingDuplexModes &= ~duplexMode;
+ mDuplexModeSpinnerAdapter.add(new SpinnerItem<>(duplexMode,
+ duplexModeLabels[duplexBitOffset]));
+ }
+
+ if (oldDuplexModeNewIndex != AdapterView.INVALID_POSITION) {
+ // Select the old duplex mode - nothing really changed.
+ if (mDuplexModeSpinner.getSelectedItemPosition() != oldDuplexModeNewIndex) {
+ mDuplexModeSpinner.setSelection(oldDuplexModeNewIndex);
+ }
+ } else {
+ // Select the default.
+ final int selectedDuplexMode = defaultAttributes.getDuplexMode();
+ final int itemCount = mDuplexModeSpinnerAdapter.getCount();
+ for (int i = 0; i < itemCount; i++) {
+ SpinnerItem<Integer> item = mDuplexModeSpinnerAdapter.getItem(i);
+ if (selectedDuplexMode == item.value) {
+ if (mDuplexModeSpinner.getSelectedItemPosition() != i) {
+ mDuplexModeSpinner.setSelection(i);
+ }
+ attributes.setDuplexMode(selectedDuplexMode);
+ break;
+ }
+ }
+ }
+ }
+
+ mDuplexModeSpinner.setEnabled(mDuplexModeSpinnerAdapter.getCount() > 1);
+
// Orientation
mOrientationSpinner.setEnabled(true);
MediaSize mediaSize = attributes.getMediaSize();
@@ -2173,6 +2276,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
} else if (spinner == mColorModeSpinner) {
SpinnerItem<Integer> colorModeItem = mColorModeSpinnerAdapter.getItem(position);
mPrintJob.getAttributes().setColorMode(colorModeItem.value);
+ } else if (spinner == mDuplexModeSpinner) {
+ SpinnerItem<Integer> duplexModeItem = mDuplexModeSpinnerAdapter.getItem(position);
+ mPrintJob.getAttributes().setDuplexMode(duplexModeItem.value);
} else if (spinner == mOrientationSpinner) {
SpinnerItem<Integer> orientationItem = mOrientationSpinnerAdapter.getItem(position);
PrintAttributes attributes = mPrintJob.getAttributes();
diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml
new file mode 100644
index 000000000000..a52ed698c9f4
--- /dev/null
+++ b/packages/SettingsLib/res/values/arrays.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2015 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Wi-Fi settings -->
+
+ <!-- Match this with the order of NetworkInfo.DetailedState. --> <skip />
+ <!-- Wi-Fi settings. The status messages when the network is unknown. -->
+ <string-array name="wifi_status">
+ <!-- Status message of Wi-Fi when it is idle. -->
+ <item></item>
+ <!-- Status message of Wi-Fi when it is scanning. -->
+ <item>Scanning\u2026</item>
+ <!-- Status message of Wi-Fi when it is connecting. -->
+ <item>Connecting\u2026</item>
+ <!-- Status message of Wi-Fi when it is authenticating. -->
+ <item>Authenticating\u2026</item>
+ <!-- Status message of Wi-Fi when it is obtaining IP address. -->
+ <item>Obtaining IP address\u2026</item>
+ <!-- Status message of Wi-Fi when it is connected. -->
+ <item>Connected</item>
+ <!-- Status message of Wi-Fi when it is suspended. -->
+ <item>Suspended</item>
+ <!-- Status message of Wi-Fi when it is disconnecting. -->
+ <item>Disconnecting\u2026</item>
+ <!-- Status message of Wi-Fi when it is disconnected. -->
+ <item>Disconnected</item>
+ <!-- Status message of Wi-Fi when it is a failure. -->
+ <item>Unsuccessful</item>
+ <!-- Status message of Wi-Fi when it is blocked. -->
+ <item>Blocked</item>
+ <!-- Status message of Wi-Fi when connectiong is being verified. -->
+ <item>Temporarily avoiding poor connection</item>
+ </string-array>
+
+ <!-- Match this with the order of NetworkInfo.DetailedState. --> <skip />
+ <!-- Wi-Fi settings. The status messages when the network is known. -->
+ <string-array name="wifi_status_with_ssid">
+ <!-- Status message of Wi-Fi when it is idle. -->
+ <item></item>
+ <!-- Status message of Wi-Fi when it is scanning. -->
+ <item>Scanning\u2026</item>
+ <!-- Status message of Wi-Fi when it is connecting to a network. -->
+ <item>Connecting to <xliff:g id="network_name">%1$s</xliff:g>\u2026</item>
+ <!-- Status message of Wi-Fi when it is authenticating with a network. -->
+ <item>Authenticating with <xliff:g id="network_name">%1$s</xliff:g>\u2026</item>
+ <!-- Status message of Wi-Fi when it is obtaining IP address from a network. -->
+ <item>Obtaining IP address from <xliff:g id="network_name">%1$s</xliff:g>\u2026</item>
+ <!-- Status message of Wi-Fi when it is connected to a network. -->
+ <item>Connected to <xliff:g id="network_name">%1$s</xliff:g></item>
+ <!-- Status message of Wi-Fi when it is suspended. -->
+ <item>Suspended</item>
+ <!-- Status message of Wi-Fi when it is disconnecting from a network. -->
+ <item>Disconnecting from <xliff:g id="network_name">%1$s</xliff:g>\u2026</item>
+ <!-- Status message of Wi-Fi when it is disconnected. -->
+ <item>Disconnected</item>
+ <!-- Status message of Wi-Fi when it is a failure. -->
+ <item>Unsuccessful</item>
+ <!-- Status message of Wi-Fi when it is blocked. -->
+ <item>Blocked</item>
+ <!-- Status message of Wi-Fi when connectiong is being verified. -->
+ <item>Temporarily avoiding poor connection</item>
+ </string-array>
+</resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index a0993b1a951b..f055a2c0b0ed 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -18,4 +18,53 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Toast message when Wi-Fi cannot scan for networks -->
+ <string name="wifi_fail_to_scan">Can\'t scan for networks</string>
+ <!-- Do not translate. Concise terminology for wifi with WEP security -->
+ <string name="wifi_security_short_wep">WEP</string>
+ <!-- Do not translate. Concise terminology for wifi with WPA security -->
+ <string name="wifi_security_short_wpa">WPA</string>
+ <!-- Do not translate. Concise terminology for wifi with WPA2 security -->
+ <string name="wifi_security_short_wpa2">WPA2</string>
+ <!-- Do not translate. Concise terminology for wifi with both WPA/WPA2 security -->
+ <string name="wifi_security_short_wpa_wpa2">WPA/WPA2</string>
+ <!-- Do not translate. Concise terminology for wifi with unknown PSK type -->
+ <string name="wifi_security_short_psk_generic">@string/wifi_security_short_wpa_wpa2</string>
+ <!-- Do not translate. Concise terminology for wifi with 802.1x EAP security -->
+ <string name="wifi_security_short_eap">802.1x</string>
+
+ <!-- Used in Wi-Fi settings dialogs when Wi-Fi does not have any security. -->
+ <string name="wifi_security_none">None</string>
+
+ <!-- Do not translate. Terminology for wifi with WEP security -->
+ <string name="wifi_security_wep">WEP</string>
+ <!-- Do not translate. Terminology for wifi with WPA security -->
+ <string name="wifi_security_wpa">WPA PSK</string>
+ <!-- Do not translate. Terminology for wifi with WPA2 security -->
+ <string name="wifi_security_wpa2">WPA2 PSK</string>
+ <!-- Do not translate. Terminology for wifi with both WPA/WPA2 security, or unknown -->
+ <string name="wifi_security_wpa_wpa2">WPA/WPA2 PSK</string>
+ <!-- Do not translate. Terminology for wifi with unknown PSK type -->
+ <string name="wifi_security_psk_generic">@string/wifi_security_wpa_wpa2</string>
+ <!-- Do not translate. Concise terminology for wifi with 802.1x EAP security -->
+ <string name="wifi_security_eap">802.1x EAP</string>
+
+ <!-- Summary for the remembered network. -->
+ <string name="wifi_remembered">Saved</string>
+ <!-- Status for networks disabled for unknown reason -->
+ <string name="wifi_disabled_generic">Disabled</string>
+ <!-- Status for networked disabled from a DNS or DHCP failure -->
+ <string name="wifi_disabled_network_failure">IP Configuration Failure</string>
+ <!-- Status for networked disabled from a wifi association failure -->
+ <string name="wifi_disabled_wifi_failure">WiFi Connection Failure</string>
+ <!-- Status for networks disabled from authentication failure (wrong password
+ or certificate). -->
+ <string name="wifi_disabled_password_failure">Authentication problem</string>
+ <!-- Summary for the remembered network but currently not in range. -->
+ <string name="wifi_not_in_range">Not in range</string>
+ <!-- Summary for the remembered network but no internet connection was detected. -->
+ <string name="wifi_no_internet">No Internet Access Detected, won\'t automatically reconnect.</string>
+
+ <!-- Status message of Wi-Fi when it is connected by a Wi-Fi assistant application. [CHAR LIMIT=NONE] -->
+ <string name="connected_via_wfa">Connected via Wi\u2011Fi assistant</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/Blank.java b/packages/SettingsLib/src/com/android/settingslib/Blank.java
deleted file mode 100644
index e69de29bb2d1..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/Blank.java
+++ /dev/null
diff --git a/packages/SettingsLib/src/com/android/settingslib/WirelessUtils.java b/packages/SettingsLib/src/com/android/settingslib/WirelessUtils.java
new file mode 100644
index 000000000000..0346a7715fdf
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/WirelessUtils.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib;
+
+import android.content.Context;
+import android.provider.Settings;
+
+public class WirelessUtils {
+
+ public static boolean isRadioAllowed(Context context, String type) {
+ if (!isAirplaneModeOn(context)) {
+ return true;
+ }
+ String toggleable = Settings.Global.getString(context.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ return toggleable != null && toggleable.contains(type);
+ }
+
+ public static boolean isAirplaneModeOn(Context context) {
+ return Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
+ }
+
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
new file mode 100644
index 000000000000..e8ab220dddf2
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -0,0 +1,739 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib.wifi;
+
+import android.content.Context;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.NetworkInfo.State;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.LruCache;
+
+import com.android.settingslib.R;
+
+import java.util.Map;
+
+
+public class AccessPoint implements Comparable<AccessPoint> {
+ static final String TAG = "SettingsLib.AccessPoint";
+
+ /**
+ * Lower bound on the 2.4 GHz (802.11b/g/n) WLAN channels
+ */
+ public static final int LOWER_FREQ_24GHZ = 2400;
+
+ /**
+ * Upper bound on the 2.4 GHz (802.11b/g/n) WLAN channels
+ */
+ public static final int HIGHER_FREQ_24GHZ = 2500;
+
+ /**
+ * Lower bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels
+ */
+ public static final int LOWER_FREQ_5GHZ = 4900;
+
+ /**
+ * Upper bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels
+ */
+ public static final int HIGHER_FREQ_5GHZ = 5900;
+
+
+ /**
+ * Experimental: we should be able to show the user the list of BSSIDs and bands
+ * for that SSID.
+ * For now this data is used only with Verbose Logging so as to show the band and number
+ * of BSSIDs on which that network is seen.
+ */
+ public LruCache<String, ScanResult> mScanResultCache;
+ private static final String KEY_NETWORKINFO = "key_networkinfo";
+ private static final String KEY_WIFIINFO = "key_wifiinfo";
+ private static final String KEY_SCANRESULT = "key_scanresult";
+ private static final String KEY_CONFIG = "key_config";
+
+ /**
+ * These values are matched in string arrays -- changes must be kept in sync
+ */
+ public static final int SECURITY_NONE = 0;
+ public static final int SECURITY_WEP = 1;
+ public static final int SECURITY_PSK = 2;
+ public static final int SECURITY_EAP = 3;
+
+ private static final int PSK_UNKNOWN = 0;
+ private static final int PSK_WPA = 1;
+ private static final int PSK_WPA2 = 2;
+ private static final int PSK_WPA_WPA2 = 3;
+
+ private static final int VISIBILITY_OUTDATED_AGE_IN_MILLI = 20000;
+ private final Context mContext;
+
+ private String ssid;
+ private int security;
+ private int networkId = WifiConfiguration.INVALID_NETWORK_ID;
+
+ private int pskType = PSK_UNKNOWN;
+
+ private WifiConfiguration mConfig;
+ private ScanResult mScanResult;
+
+ private int mRssi = Integer.MAX_VALUE;
+ private long mSeen = 0;
+
+ private WifiInfo mInfo;
+ private NetworkInfo mNetworkInfo;
+ private AccessPointListener mAccessPointListener;
+
+ private Object mTag;
+
+ public AccessPoint(Context context, Bundle savedState) {
+ mContext = context;
+ mConfig = savedState.getParcelable(KEY_CONFIG);
+ if (mConfig != null) {
+ loadConfig(mConfig);
+ }
+ mScanResult = (ScanResult) savedState.getParcelable(KEY_SCANRESULT);
+ if (mScanResult != null) {
+ loadResult(mScanResult);
+ }
+ mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO);
+ if (savedState.containsKey(KEY_NETWORKINFO)) {
+ mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO);
+ }
+ update(mInfo, mNetworkInfo);
+ }
+
+ AccessPoint(Context context, ScanResult result) {
+ mContext = context;
+ loadResult(result);
+ }
+
+ AccessPoint(Context context, WifiConfiguration config) {
+ mContext = context;
+ loadConfig(config);
+ }
+
+ @Override
+ public int compareTo(AccessPoint other) {
+ // Active one goes first.
+ if (isActive() && !other.isActive()) return -1;
+ if (!isActive() && other.isActive()) return 1;
+
+ // Reachable one goes before unreachable one.
+ if (mRssi != Integer.MAX_VALUE && other.mRssi == Integer.MAX_VALUE) return -1;
+ if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1;
+
+ // Configured one goes before unconfigured one.
+ if (networkId != WifiConfiguration.INVALID_NETWORK_ID
+ && other.networkId == WifiConfiguration.INVALID_NETWORK_ID) return -1;
+ if (networkId == WifiConfiguration.INVALID_NETWORK_ID
+ && other.networkId != WifiConfiguration.INVALID_NETWORK_ID) return 1;
+
+ // Sort by signal strength.
+ int difference = WifiManager.compareSignalLevel(other.mRssi, mRssi);
+ if (difference != 0) {
+ return difference;
+ }
+ // Sort by ssid.
+ return ssid.compareToIgnoreCase(other.ssid);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof AccessPoint)) return false;
+ return (this.compareTo((AccessPoint) other) == 0);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 0;
+ if (mInfo != null) result += 13 * mInfo.hashCode();
+ result += 19 * mRssi;
+ result += 23 * networkId;
+ result += 29 * ssid.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder().append("AccessPoint(")
+ .append(ssid);
+ if (isSaved()) {
+ builder.append(',').append("saved");
+ }
+ if (isActive()) {
+ builder.append(',').append("active");
+ }
+ if (isEphemeral()) {
+ builder.append(',').append("ephemeral");
+ }
+ if (isConnectable()) {
+ builder.append(',').append("connectable");
+ }
+ if (security != SECURITY_NONE) {
+ builder.append(',').append(securityToString(security, pskType));
+ }
+ return builder.append(')').toString();
+ }
+
+ public boolean matches(ScanResult result) {
+ return ssid.equals(result.SSID) && security == getSecurity(result);
+ }
+
+ public boolean matches(WifiConfiguration config) {
+ return ssid.equals(removeDoubleQuotes(config.SSID)) && security == getSecurity(config);
+ }
+
+ public WifiConfiguration getConfig() {
+ return mConfig;
+ }
+
+ public void clearConfig() {
+ mConfig = null;
+ networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ }
+
+ public WifiInfo getInfo() {
+ return mInfo;
+ }
+
+ public int getLevel() {
+ if (mRssi == Integer.MAX_VALUE) {
+ return -1;
+ }
+ return WifiManager.calculateSignalLevel(mRssi, 4);
+ }
+
+ public NetworkInfo getNetworkInfo() {
+ return mNetworkInfo;
+ }
+
+ public int getSecurity() {
+ return security;
+ }
+
+ public String getSecurityString(boolean concise) {
+ Context context = mContext;
+ switch(security) {
+ case SECURITY_EAP:
+ return concise ? context.getString(R.string.wifi_security_short_eap) :
+ context.getString(R.string.wifi_security_eap);
+ case SECURITY_PSK:
+ switch (pskType) {
+ case PSK_WPA:
+ return concise ? context.getString(R.string.wifi_security_short_wpa) :
+ context.getString(R.string.wifi_security_wpa);
+ case PSK_WPA2:
+ return concise ? context.getString(R.string.wifi_security_short_wpa2) :
+ context.getString(R.string.wifi_security_wpa2);
+ case PSK_WPA_WPA2:
+ return concise ? context.getString(R.string.wifi_security_short_wpa_wpa2) :
+ context.getString(R.string.wifi_security_wpa_wpa2);
+ case PSK_UNKNOWN:
+ default:
+ return concise ? context.getString(R.string.wifi_security_short_psk_generic)
+ : context.getString(R.string.wifi_security_psk_generic);
+ }
+ case SECURITY_WEP:
+ return concise ? context.getString(R.string.wifi_security_short_wep) :
+ context.getString(R.string.wifi_security_wep);
+ case SECURITY_NONE:
+ default:
+ return concise ? "" : context.getString(R.string.wifi_security_none);
+ }
+ }
+
+ public String getSsid() {
+ return ssid;
+ }
+
+ public DetailedState getDetailedState() {
+ return mNetworkInfo != null ? mNetworkInfo.getDetailedState() : null;
+ }
+
+ public String getSummary() {
+ // Update to new summary
+ StringBuilder summary = new StringBuilder();
+
+ if (isActive()) { // This is the active connection
+ summary.append(getSummary(mContext, getDetailedState(),
+ networkId == WifiConfiguration.INVALID_NETWORK_ID));
+ } else if (mConfig != null
+ && mConfig.hasNoInternetAccess()) {
+ summary.append(mContext.getString(R.string.wifi_no_internet));
+ } else if (mConfig != null && ((mConfig.status == WifiConfiguration.Status.DISABLED &&
+ mConfig.disableReason != WifiConfiguration.DISABLED_UNKNOWN_REASON)
+ || mConfig.autoJoinStatus
+ >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE)) {
+ if (mConfig.autoJoinStatus
+ >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE) {
+ if (mConfig.disableReason == WifiConfiguration.DISABLED_DHCP_FAILURE) {
+ summary.append(mContext.getString(R.string.wifi_disabled_network_failure));
+ } else if (mConfig.disableReason == WifiConfiguration.DISABLED_AUTH_FAILURE) {
+ summary.append(mContext.getString(R.string.wifi_disabled_password_failure));
+ } else {
+ summary.append(mContext.getString(R.string.wifi_disabled_wifi_failure));
+ }
+ } else {
+ switch (mConfig.disableReason) {
+ case WifiConfiguration.DISABLED_AUTH_FAILURE:
+ summary.append(mContext.getString(R.string.wifi_disabled_password_failure));
+ break;
+ case WifiConfiguration.DISABLED_DHCP_FAILURE:
+ case WifiConfiguration.DISABLED_DNS_FAILURE:
+ summary.append(mContext.getString(R.string.wifi_disabled_network_failure));
+ break;
+ case WifiConfiguration.DISABLED_UNKNOWN_REASON:
+ case WifiConfiguration.DISABLED_ASSOCIATION_REJECT:
+ summary.append(mContext.getString(R.string.wifi_disabled_generic));
+ break;
+ }
+ }
+ } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range
+ summary.append(mContext.getString(R.string.wifi_not_in_range));
+ } else { // In range, not disabled.
+ if (mConfig != null) { // Is saved network
+ summary.append(mContext.getString(R.string.wifi_remembered));
+ }
+ }
+
+ if (WifiTracker.sVerboseLogging > 0) {
+ // Add RSSI/band information for this config, what was seen up to 6 seconds ago
+ // verbose WiFi Logging is only turned on thru developers settings
+ if (mInfo != null && mNetworkInfo != null) { // This is the active connection
+ summary.append(" f=" + Integer.toString(mInfo.getFrequency()));
+ }
+ summary.append(" " + getVisibilityStatus());
+ if (mConfig != null && mConfig.autoJoinStatus > 0) {
+ summary.append(" (" + mConfig.autoJoinStatus);
+ if (mConfig.blackListTimestamp > 0) {
+ long now = System.currentTimeMillis();
+ long diff = (now - mConfig.blackListTimestamp)/1000;
+ long sec = diff%60; //seconds
+ long min = (diff/60)%60; //minutes
+ long hour = (min/60)%60; //hours
+ summary.append(", ");
+ if (hour > 0) summary.append(Long.toString(hour) + "h ");
+ summary.append( Long.toString(min) + "m ");
+ summary.append( Long.toString(sec) + "s ");
+ }
+ summary.append(")");
+ }
+ if (mConfig != null && mConfig.numIpConfigFailures > 0) {
+ summary.append(" ipf=").append(mConfig.numIpConfigFailures);
+ }
+ if (mConfig != null && mConfig.numConnectionFailures > 0) {
+ summary.append(" cf=").append(mConfig.numConnectionFailures);
+ }
+ if (mConfig != null && mConfig.numAuthFailures > 0) {
+ summary.append(" authf=").append(mConfig.numAuthFailures);
+ }
+ if (mConfig != null && mConfig.numNoInternetAccessReports > 0) {
+ summary.append(" noInt=").append(mConfig.numNoInternetAccessReports);
+ }
+ }
+ return summary.toString();
+ }
+
+ /**
+ * Returns the visibility status of the WifiConfiguration.
+ *
+ * @return autojoin debugging information
+ * TODO: use a string formatter
+ * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"]
+ * For instance [-40,5/-30,2]
+ */
+ private String getVisibilityStatus() {
+ StringBuilder visibility = new StringBuilder();
+ StringBuilder scans24GHz = null;
+ StringBuilder scans5GHz = null;
+ String bssid = null;
+
+ long now = System.currentTimeMillis();
+
+ if (mInfo != null) {
+ bssid = mInfo.getBSSID();
+ if (bssid != null) {
+ visibility.append(" ").append(bssid);
+ }
+ visibility.append(" rssi=").append(mInfo.getRssi());
+ visibility.append(" ");
+ visibility.append(" score=").append(mInfo.score);
+ visibility.append(String.format(" tx=%.1f,", mInfo.txSuccessRate));
+ visibility.append(String.format("%.1f,", mInfo.txRetriesRate));
+ visibility.append(String.format("%.1f ", mInfo.txBadRate));
+ visibility.append(String.format("rx=%.1f", mInfo.rxSuccessRate));
+ }
+
+ if (mScanResultCache != null) {
+ int rssi5 = WifiConfiguration.INVALID_RSSI;
+ int rssi24 = WifiConfiguration.INVALID_RSSI;
+ int num5 = 0;
+ int num24 = 0;
+ int numBlackListed = 0;
+ int n24 = 0; // Number scan results we included in the string
+ int n5 = 0; // Number scan results we included in the string
+ Map<String, ScanResult> list = mScanResultCache.snapshot();
+ // TODO: sort list by RSSI or age
+ for (ScanResult result : list.values()) {
+ if (result.seen == 0)
+ continue;
+
+ if (result.autoJoinStatus != ScanResult.ENABLED) numBlackListed++;
+
+ if (result.frequency >= LOWER_FREQ_5GHZ
+ && result.frequency <= HIGHER_FREQ_5GHZ) {
+ // Strictly speaking: [4915, 5825]
+ // number of known BSSID on 5GHz band
+ num5 = num5 + 1;
+ } else if (result.frequency >= LOWER_FREQ_24GHZ
+ && result.frequency <= HIGHER_FREQ_24GHZ) {
+ // Strictly speaking: [2412, 2482]
+ // number of known BSSID on 2.4Ghz band
+ num24 = num24 + 1;
+ }
+
+ // Ignore results seen, older than 20 seconds
+ if (now - result.seen > VISIBILITY_OUTDATED_AGE_IN_MILLI) continue;
+
+ if (result.frequency >= LOWER_FREQ_5GHZ
+ && result.frequency <= HIGHER_FREQ_5GHZ) {
+ if (result.level > rssi5) {
+ rssi5 = result.level;
+ }
+ if (n5 < 4) {
+ if (scans5GHz == null) scans5GHz = new StringBuilder();
+ scans5GHz.append(" \n{").append(result.BSSID);
+ if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*");
+ scans5GHz.append("=").append(result.frequency);
+ scans5GHz.append(",").append(result.level);
+ if (result.autoJoinStatus != 0) {
+ scans5GHz.append(",st=").append(result.autoJoinStatus);
+ }
+ if (result.numIpConfigFailures != 0) {
+ scans5GHz.append(",ipf=").append(result.numIpConfigFailures);
+ }
+ scans5GHz.append("}");
+ n5++;
+ }
+ } else if (result.frequency >= LOWER_FREQ_24GHZ
+ && result.frequency <= HIGHER_FREQ_24GHZ) {
+ if (result.level > rssi24) {
+ rssi24 = result.level;
+ }
+ if (n24 < 4) {
+ if (scans24GHz == null) scans24GHz = new StringBuilder();
+ scans24GHz.append(" \n{").append(result.BSSID);
+ if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*");
+ scans24GHz.append("=").append(result.frequency);
+ scans24GHz.append(",").append(result.level);
+ if (result.autoJoinStatus != 0) {
+ scans24GHz.append(",st=").append(result.autoJoinStatus);
+ }
+ if (result.numIpConfigFailures != 0) {
+ scans24GHz.append(",ipf=").append(result.numIpConfigFailures);
+ }
+ scans24GHz.append("}");
+ n24++;
+ }
+ }
+ }
+ visibility.append(" [");
+ if (num24 > 0) {
+ visibility.append("(").append(num24).append(")");
+ if (n24 <= 4) {
+ if (scans24GHz != null) {
+ visibility.append(scans24GHz.toString());
+ }
+ } else {
+ visibility.append("max=").append(rssi24);
+ if (scans24GHz != null) {
+ visibility.append(",").append(scans24GHz.toString());
+ }
+ }
+ }
+ visibility.append(";");
+ if (num5 > 0) {
+ visibility.append("(").append(num5).append(")");
+ if (n5 <= 4) {
+ if (scans5GHz != null) {
+ visibility.append(scans5GHz.toString());
+ }
+ } else {
+ visibility.append("max=").append(rssi5);
+ if (scans5GHz != null) {
+ visibility.append(",").append(scans5GHz.toString());
+ }
+ }
+ }
+ if (numBlackListed > 0)
+ visibility.append("!").append(numBlackListed);
+ visibility.append("]");
+ } else {
+ if (mRssi != Integer.MAX_VALUE) {
+ visibility.append(" rssi=");
+ visibility.append(mRssi);
+ if (mScanResult != null) {
+ visibility.append(", f=");
+ visibility.append(mScanResult.frequency);
+ }
+ }
+ }
+
+ return visibility.toString();
+ }
+
+ /**
+ * Return whether this is the active connection.
+ * For ephemeral connections (networkId is invalid), this returns false if the network is
+ * disconnected.
+ */
+ public boolean isActive() {
+ return mNetworkInfo != null &&
+ (networkId != WifiConfiguration.INVALID_NETWORK_ID ||
+ mNetworkInfo.getState() != State.DISCONNECTED);
+ }
+
+ public boolean isConnectable() {
+ return getLevel() != -1 && getDetailedState() == null;
+ }
+
+ public boolean isEphemeral() {
+ return !isSaved() && mNetworkInfo != null && mNetworkInfo.getState() != State.DISCONNECTED;
+ }
+
+ /** Return whether the given {@link WifiInfo} is for this access point. */
+ private boolean isInfoForThisAccessPoint(WifiInfo info) {
+ if (networkId != WifiConfiguration.INVALID_NETWORK_ID) {
+ return networkId == info.getNetworkId();
+ } else {
+ // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID.
+ // (Note that we only do this if the WifiConfiguration explicitly equals INVALID).
+ // TODO: Handle hex string SSIDs.
+ return ssid.equals(removeDoubleQuotes(info.getSSID()));
+ }
+ }
+
+ public boolean isSaved() {
+ return networkId != WifiConfiguration.INVALID_NETWORK_ID;
+ }
+
+ public Object getTag() {
+ return mTag;
+ }
+
+ public void setTag(Object tag) {
+ mTag = tag;
+ }
+
+ /**
+ * Generate and save a default wifiConfiguration with common values.
+ * Can only be called for unsecured networks.
+ */
+ public void generateOpenNetworkConfig() {
+ if (security != SECURITY_NONE)
+ throw new IllegalStateException();
+ if (mConfig != null)
+ return;
+ mConfig = new WifiConfiguration();
+ mConfig.SSID = AccessPoint.convertToQuotedString(ssid);
+ mConfig.allowedKeyManagement.set(KeyMgmt.NONE);
+ }
+
+ void loadConfig(WifiConfiguration config) {
+ ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
+ security = getSecurity(config);
+ networkId = config.networkId;
+ mConfig = config;
+ }
+
+ private void loadResult(ScanResult result) {
+ ssid = result.SSID;
+ security = getSecurity(result);
+ if (security == SECURITY_PSK)
+ pskType = getPskType(result);
+ mRssi = result.level;
+ mScanResult = result;
+ if (result.seen > mSeen) {
+ mSeen = result.seen;
+ }
+ }
+
+ public void saveWifiState(Bundle savedState) {
+ savedState.putParcelable(KEY_CONFIG, mConfig);
+ savedState.putParcelable(KEY_SCANRESULT, mScanResult);
+ savedState.putParcelable(KEY_WIFIINFO, mInfo);
+ if (mNetworkInfo != null) {
+ savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo);
+ }
+ }
+
+ public void setListener(AccessPointListener listener) {
+ mAccessPointListener = listener;
+ }
+
+ boolean update(ScanResult result) {
+ if (result.seen > mSeen) {
+ mSeen = result.seen;
+ }
+ if (WifiTracker.sVerboseLogging > 0) {
+ if (mScanResultCache == null) {
+ mScanResultCache = new LruCache<String, ScanResult>(32);
+ }
+ mScanResultCache.put(result.BSSID, result);
+ }
+
+ if (ssid.equals(result.SSID) && security == getSecurity(result)) {
+ if (WifiManager.compareSignalLevel(result.level, mRssi) > 0) {
+ int oldLevel = getLevel();
+ mRssi = result.level;
+ if (getLevel() != oldLevel && mAccessPointListener != null) {
+ mAccessPointListener.onLevelChanged(this);
+ }
+ }
+ // This flag only comes from scans, is not easily saved in config
+ if (security == SECURITY_PSK) {
+ pskType = getPskType(result);
+ }
+ mScanResult = result;
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ boolean update(WifiInfo info, NetworkInfo networkInfo) {
+ boolean reorder = false;
+ if (info != null && isInfoForThisAccessPoint(info)) {
+ reorder = (mInfo == null);
+ mRssi = info.getRssi();
+ mInfo = info;
+ mNetworkInfo = networkInfo;
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ } else if (mInfo != null) {
+ reorder = true;
+ mInfo = null;
+ mNetworkInfo = null;
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ }
+ return reorder;
+ }
+
+ public static String getSummary(Context context, String ssid, DetailedState state,
+ boolean isEphemeral) {
+ if (state == DetailedState.CONNECTED && isEphemeral && ssid == null) {
+ // Special case for connected + ephemeral networks.
+ return context.getString(R.string.connected_via_wfa);
+ }
+
+ String[] formats = context.getResources().getStringArray((ssid == null)
+ ? R.array.wifi_status : R.array.wifi_status_with_ssid);
+ int index = state.ordinal();
+
+ if (index >= formats.length || formats[index].length() == 0) {
+ return null;
+ }
+ return String.format(formats[index], ssid);
+ }
+
+ public static String getSummary(Context context, DetailedState state, boolean isEphemeral) {
+ return getSummary(context, null, state, isEphemeral);
+ }
+
+ public static String convertToQuotedString(String string) {
+ return "\"" + string + "\"";
+ }
+
+ private static int getPskType(ScanResult result) {
+ boolean wpa = result.capabilities.contains("WPA-PSK");
+ boolean wpa2 = result.capabilities.contains("WPA2-PSK");
+ if (wpa2 && wpa) {
+ return PSK_WPA_WPA2;
+ } else if (wpa2) {
+ return PSK_WPA2;
+ } else if (wpa) {
+ return PSK_WPA;
+ } else {
+ Log.w(TAG, "Received abnormal flag string: " + result.capabilities);
+ return PSK_UNKNOWN;
+ }
+ }
+
+ private static int getSecurity(ScanResult result) {
+ if (result.capabilities.contains("WEP")) {
+ return SECURITY_WEP;
+ } else if (result.capabilities.contains("PSK")) {
+ return SECURITY_PSK;
+ } else if (result.capabilities.contains("EAP")) {
+ return SECURITY_EAP;
+ }
+ return SECURITY_NONE;
+ }
+
+ static int getSecurity(WifiConfiguration config) {
+ if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
+ return SECURITY_PSK;
+ }
+ if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
+ config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
+ return SECURITY_EAP;
+ }
+ return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE;
+ }
+
+ public static String securityToString(int security, int pskType) {
+ if (security == SECURITY_WEP) {
+ return "WEP";
+ } else if (security == SECURITY_PSK) {
+ if (pskType == PSK_WPA) {
+ return "WPA";
+ } else if (pskType == PSK_WPA2) {
+ return "WPA2";
+ } else if (pskType == PSK_WPA_WPA2) {
+ return "WPA_WPA2";
+ }
+ return "PSK";
+ } else if (security == SECURITY_EAP) {
+ return "EAP";
+ }
+ return "NONE";
+ }
+
+ static String removeDoubleQuotes(String string) {
+ int length = string.length();
+ if ((length > 1) && (string.charAt(0) == '"')
+ && (string.charAt(length - 1) == '"')) {
+ return string.substring(1, length - 1);
+ }
+ return string;
+ }
+
+ public interface AccessPointListener {
+ void onAccessPointChanged(AccessPoint accessPoint);
+ void onLevelChanged(AccessPoint accessPoint);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
new file mode 100644
index 000000000000..c3e23d245de4
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib.wifi;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.Message;
+import android.widget.Toast;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.R;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Tracks saved or available wifi networks and their state.
+ */
+public class WifiTracker {
+ private static final String TAG = "WifiTracker";
+
+ /** verbose logging flag. this flag is set thru developer debugging options
+ * and used so as to assist with in-the-field WiFi connectivity debugging */
+ public static int sVerboseLogging = 0;
+
+ // TODO: Allow control of this?
+ // Combo scans can take 5-6s to complete - set to 10s.
+ private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
+
+ private final Context mContext;
+ private final WifiManager mWifiManager;
+ private final IntentFilter mFilter;
+
+ private final AtomicBoolean mConnected = new AtomicBoolean(false);
+ private final WifiListener mListener;
+ private final boolean mIncludeSaved;
+ private final boolean mIncludeScans;
+
+ private boolean mSavedNetworksExist;
+ private boolean mRegistered;
+ private ArrayList<AccessPoint> mAccessPoints = new ArrayList<>();
+ private ArrayList<AccessPoint> mCachedAccessPoints = new ArrayList<>();
+
+ private NetworkInfo mLastNetworkInfo;
+ private WifiInfo mLastInfo;
+
+ @VisibleForTesting
+ Scanner mScanner;
+
+ public WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved,
+ boolean includeScans) {
+ this(context, wifiListener, includeSaved, includeScans,
+ (WifiManager) context.getSystemService(Context.WIFI_SERVICE));
+ }
+
+ @VisibleForTesting
+ WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved,
+ boolean includeScans, WifiManager wifiManager) {
+ if (!includeSaved && !includeScans) {
+ throw new IllegalArgumentException("Must include either saved or scans");
+ }
+ mContext = context;
+ mWifiManager = wifiManager;
+ mIncludeSaved = includeSaved;
+ mIncludeScans = includeScans;
+ mListener = wifiListener;
+
+ // check if verbose logging has been turned on or off
+ sVerboseLogging = mWifiManager.getVerboseLoggingLevel();
+
+ mFilter = new IntentFilter();
+ mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
+ mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+ }
+
+ /**
+ * Forces an update of the wifi networks when not scanning.
+ */
+ public void forceUpdate() {
+ updateAccessPoints();
+ }
+
+ /**
+ * Force a scan for wifi networks to happen now.
+ */
+ public void forceScan() {
+ if (mWifiManager.isWifiEnabled() && mScanner != null) {
+ mScanner.forceScan();
+ }
+ }
+
+ /**
+ * Temporarily stop scanning for wifi networks.
+ */
+ public void pauseScanning() {
+ if (mScanner != null) {
+ mScanner.pause();
+ }
+ }
+
+ /**
+ * Resume scanning for wifi networks after it has been paused.
+ */
+ public void resumeScanning() {
+ if (mWifiManager.isWifiEnabled()) {
+ if (mScanner == null) {
+ mScanner = new Scanner();
+ }
+ mScanner.resume();
+ }
+ updateAccessPoints();
+ }
+
+ /**
+ * Start tracking wifi networks.
+ * Registers listeners and starts scanning for wifi networks. If this is not called
+ * then forceUpdate() must be called to populate getAccessPoints().
+ */
+ public void startTracking() {
+ resumeScanning();
+ if (!mRegistered) {
+ mContext.registerReceiver(mReceiver, mFilter);
+ mRegistered = true;
+ }
+ }
+
+ /**
+ * Stop tracking wifi networks.
+ * Unregisters all listeners and stops scanning for wifi networks. This should always
+ * be called when done with a WifiTracker (if startTracking was called) to ensure
+ * proper cleanup.
+ */
+ public void stopTracking() {
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ mRegistered = false;
+ }
+ pauseScanning();
+ }
+
+ /**
+ * Gets the current list of access points.
+ */
+ public List<AccessPoint> getAccessPoints() {
+ return mAccessPoints;
+ }
+
+ public WifiManager getManager() {
+ return mWifiManager;
+ }
+
+ public boolean isWifiEnabled() {
+ return mWifiManager.isWifiEnabled();
+ }
+
+ /**
+ * @return true when there are saved networks on the device, regardless
+ * of whether the WifiTracker is tracking saved networks.
+ */
+ public boolean doSavedNetworksExist() {
+ return mSavedNetworksExist;
+ }
+
+ public boolean isConnected() {
+ return mConnected.get();
+ }
+
+ public void dump(PrintWriter pw) {
+ pw.println(" - wifi tracker ------");
+ for (AccessPoint accessPoint : mAccessPoints) {
+ pw.println(" " + accessPoint);
+ }
+ }
+
+ private void updateAccessPoints() {
+ // Swap the current access points into a cached list.
+ ArrayList<AccessPoint> tmpSwp = mAccessPoints;
+ mAccessPoints = mCachedAccessPoints;
+ mCachedAccessPoints = tmpSwp;
+ // Clear out the configs so we don't think something is saved when it isn't.
+ for (AccessPoint accessPoint : mCachedAccessPoints) {
+ accessPoint.clearConfig();
+ }
+
+ mAccessPoints.clear();
+
+ /** Lookup table to more quickly update AccessPoints by only considering objects with the
+ * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */
+ Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
+
+ final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ if (configs != null) {
+ mSavedNetworksExist = configs.size() != 0;
+ for (WifiConfiguration config : configs) {
+ if (config.selfAdded && config.numAssociation == 0) {
+ continue;
+ }
+ AccessPoint accessPoint = getCachedOrCreate(config);
+ if (mLastInfo != null && mLastNetworkInfo != null) {
+ accessPoint.update(mLastInfo, mLastNetworkInfo);
+ }
+ if (mIncludeSaved) {
+ mAccessPoints.add(accessPoint);
+ apMap.put(accessPoint.getSsid(), accessPoint);
+ } else {
+ // If we aren't using saved networks, drop them into the cache so that
+ // we have access to their saved info.
+ mCachedAccessPoints.add(accessPoint);
+ }
+ }
+ }
+
+ final List<ScanResult> results = mWifiManager.getScanResults();
+ if (results != null) {
+ for (ScanResult result : results) {
+ // Ignore hidden and ad-hoc networks.
+ if (result.SSID == null || result.SSID.length() == 0 ||
+ result.capabilities.contains("[IBSS]")) {
+ continue;
+ }
+
+ boolean found = false;
+ for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
+ if (accessPoint.update(result)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found && mIncludeScans) {
+ AccessPoint accessPoint = getCachedOrCreate(result);
+ if (mLastInfo != null && mLastNetworkInfo != null) {
+ accessPoint.update(mLastInfo, mLastNetworkInfo);
+ }
+ mAccessPoints.add(accessPoint);
+ apMap.put(accessPoint.getSsid(), accessPoint);
+ }
+ }
+ }
+
+ // Pre-sort accessPoints to speed preference insertion
+ Collections.sort(mAccessPoints);
+ if (mListener != null) {
+ mListener.onAccessPointsChanged();
+ }
+ }
+
+ private AccessPoint getCachedOrCreate(ScanResult result) {
+ final int N = mCachedAccessPoints.size();
+ for (int i = 0; i < N; i++) {
+ if (mCachedAccessPoints.get(i).matches(result)) {
+ AccessPoint ret = mCachedAccessPoints.remove(i);
+ ret.update(result);
+ return ret;
+ }
+ }
+ return new AccessPoint(mContext, result);
+ }
+
+ private AccessPoint getCachedOrCreate(WifiConfiguration config) {
+ final int N = mCachedAccessPoints.size();
+ for (int i = 0; i < N; i++) {
+ if (mCachedAccessPoints.get(i).matches(config)) {
+ AccessPoint ret = mCachedAccessPoints.remove(i);
+ ret.loadConfig(config);
+ return ret;
+ }
+ }
+ return new AccessPoint(mContext, config);
+ }
+
+ private void updateNetworkInfo(NetworkInfo networkInfo) {
+ /* sticky broadcasts can call this when wifi is disabled */
+ if (!mWifiManager.isWifiEnabled()) {
+ mScanner.pause();
+ return;
+ }
+
+ if (networkInfo != null &&
+ networkInfo.getDetailedState() == DetailedState.OBTAINING_IPADDR) {
+ mScanner.pause();
+ } else {
+ mScanner.resume();
+ }
+
+ mLastInfo = mWifiManager.getConnectionInfo();
+ if (networkInfo != null) {
+ mLastNetworkInfo = networkInfo;
+ }
+
+ boolean reorder = false;
+ for (int i = mAccessPoints.size() - 1; i >= 0; --i) {
+ if (mAccessPoints.get(i).update(mLastInfo, mLastNetworkInfo)) {
+ reorder = true;
+ }
+ }
+ if (reorder) {
+ Collections.sort(mAccessPoints);
+ if (mListener != null) {
+ mListener.onAccessPointsChanged();
+ }
+ }
+ }
+
+ private void updateWifiState(int state) {
+ if (state == WifiManager.WIFI_STATE_ENABLED) {
+ mScanner.resume();
+ } else {
+ mLastInfo = null;
+ mLastNetworkInfo = null;
+ mScanner.pause();
+ }
+ if (mListener != null) {
+ mListener.onWifiStateChanged(state);
+ }
+ }
+
+ public static List<AccessPoint> getCurrentAccessPoints(Context context, boolean includeSaved,
+ boolean includeScans) {
+ WifiTracker tracker = new WifiTracker(context, null, includeSaved, includeScans);
+ tracker.forceUpdate();
+ return tracker.getAccessPoints();
+ }
+
+ @VisibleForTesting
+ final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
+ updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+ WifiManager.WIFI_STATE_UNKNOWN));
+ } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
+ WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
+ WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
+ updateAccessPoints();
+ } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
+ NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
+ WifiManager.EXTRA_NETWORK_INFO);
+ mConnected.set(info.isConnected());
+ if (mListener != null) {
+ mListener.onConnectedChanged();
+ }
+ updateAccessPoints();
+ updateNetworkInfo(info);
+ } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
+ updateNetworkInfo(null);
+ }
+ }
+ };
+
+ @VisibleForTesting
+ class Scanner extends Handler {
+ private int mRetry = 0;
+
+ void resume() {
+ if (!hasMessages(0)) {
+ sendEmptyMessage(0);
+ }
+ }
+
+ void forceScan() {
+ removeMessages(0);
+ sendEmptyMessage(0);
+ }
+
+ void pause() {
+ mRetry = 0;
+ removeMessages(0);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ if (mWifiManager.startScan()) {
+ mRetry = 0;
+ } else if (++mRetry >= 3) {
+ mRetry = 0;
+ if (mContext != null) {
+ Toast.makeText(mContext, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG).show();
+ }
+ return;
+ }
+ sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);
+ }
+ }
+
+ /** A restricted multimap for use in constructAccessPoints */
+ private static class Multimap<K,V> {
+ private final HashMap<K,List<V>> store = new HashMap<K,List<V>>();
+ /** retrieve a non-null list of values with key K */
+ List<V> getAll(K key) {
+ List<V> values = store.get(key);
+ return values != null ? values : Collections.<V>emptyList();
+ }
+
+ void put(K key, V val) {
+ List<V> curVals = store.get(key);
+ if (curVals == null) {
+ curVals = new ArrayList<V>(3);
+ store.put(key, curVals);
+ }
+ curVals.add(val);
+ }
+ }
+
+ public interface WifiListener {
+ /**
+ * Called when the state of Wifi has changed, the state will be one of
+ * the following.
+ *
+ * <li>{@link WifiManager#WIFI_STATE_DISABLED}</li>
+ * <li>{@link WifiManager#WIFI_STATE_ENABLED}</li>
+ * <li>{@link WifiManager#WIFI_STATE_DISABLING}</li>
+ * <li>{@link WifiManager#WIFI_STATE_ENABLING}</li>
+ * <li>{@link WifiManager#WIFI_STATE_UNKNOWN}</li>
+ * <p>
+ *
+ * @param state The new state of wifi.
+ */
+ void onWifiStateChanged(int state);
+
+ /**
+ * Called when the connection state of wifi has changed and isConnected
+ * should be called to get the updated state.
+ */
+ void onConnectedChanged();
+
+ /**
+ * Called to indicate the list of AccessPoints has been updated and
+ * getAccessPoints should be called to get the latest information.
+ */
+ void onAccessPointsChanged();
+ }
+}
diff --git a/packages/SettingsLib/tests/Android.mk b/packages/SettingsLib/tests/Android.mk
new file mode 100644
index 000000000000..d3ffffa5bef5
--- /dev/null
+++ b/packages/SettingsLib/tests/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
+
+LOCAL_PACKAGE_NAME := SettingsLibTests
+
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target
+
+include frameworks/base/packages/SettingsLib/common.mk
+
+include $(BUILD_PACKAGE)
diff --git a/packages/SettingsLib/tests/AndroidManifest.xml b/packages/SettingsLib/tests/AndroidManifest.xml
new file mode 100644
index 000000000000..00d16fc79d88
--- /dev/null
+++ b/packages/SettingsLib/tests/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.settingslib"
+ android:label="Tests for SettingsLib">
+ </instrumentation>
+</manifest>
diff --git a/packages/SettingsLib/tests/src/com/android/settingslib/BaseTest.java b/packages/SettingsLib/tests/src/com/android/settingslib/BaseTest.java
new file mode 100644
index 000000000000..04a568ed4c72
--- /dev/null
+++ b/packages/SettingsLib/tests/src/com/android/settingslib/BaseTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib;
+
+import android.test.AndroidTestCase;
+
+public class BaseTest extends AndroidTestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // Mockito stuff.
+ System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath());
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+ }
+
+}
diff --git a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/AccessPointTest.java
new file mode 100644
index 000000000000..4ac461d0bf86
--- /dev/null
+++ b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib.wifi;
+
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+
+import com.android.settingslib.BaseTest;
+import com.android.settingslib.wifi.AccessPoint.AccessPointListener;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+// TODO: Add some coverage
+public class AccessPointTest extends BaseTest {
+
+ private static final String TEST_SSID = "TestSsid";
+ private static final int NETWORK_ID = 0;
+
+ private AccessPointListener mAccessPointListener;
+ private AccessPoint mAccessPoint;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mAccessPointListener = Mockito.mock(AccessPointListener.class);
+
+ WifiConfiguration wifiConfig = new WifiConfiguration();
+ wifiConfig.networkId = NETWORK_ID;
+ wifiConfig.SSID = TEST_SSID;
+
+ mAccessPoint = new AccessPoint(mContext, wifiConfig);
+ mAccessPoint.setListener(mAccessPointListener);
+ }
+
+ public void testOnLevelChanged() {
+ ScanResult result = new ScanResult();
+ result.capabilities = "";
+ result.SSID = TEST_SSID;
+
+ // Give it a level.
+ result.level = WifiTrackerTest.levelToRssi(1);
+ mAccessPoint.update(result);
+ verifyOnLevelChangedCallback(1);
+
+ // Give it a better level.
+ result.level = WifiTrackerTest.levelToRssi(2);
+ mAccessPoint.update(result);
+ verifyOnLevelChangedCallback(1);
+ }
+
+ public void testOnAccessPointChangedCallback() {
+ WifiInfo wifiInfo = Mockito.mock(WifiInfo.class);
+ Mockito.when(wifiInfo.getNetworkId()).thenReturn(NETWORK_ID);
+
+ mAccessPoint.update(wifiInfo, null);
+ verifyOnAccessPointsCallback(1);
+
+ mAccessPoint.update(null, null);
+ verifyOnAccessPointsCallback(2);
+
+ ScanResult result = new ScanResult();
+ result.capabilities = "";
+ result.SSID = TEST_SSID;
+ mAccessPoint.update(result);
+ verifyOnAccessPointsCallback(3);
+ }
+
+ private void verifyOnLevelChangedCallback(int num) {
+ ArgumentCaptor<AccessPoint> accessPoint = ArgumentCaptor.forClass(AccessPoint.class);
+ Mockito.verify(mAccessPointListener, Mockito.atLeast(num))
+ .onLevelChanged(accessPoint.capture());
+ assertEquals(mAccessPoint, accessPoint.getValue());
+ }
+
+ private void verifyOnAccessPointsCallback(int num) {
+ ArgumentCaptor<AccessPoint> accessPoint = ArgumentCaptor.forClass(AccessPoint.class);
+ Mockito.verify(mAccessPointListener, Mockito.atLeast(num))
+ .onAccessPointChanged(accessPoint.capture());
+ assertEquals(mAccessPoint, accessPoint.getValue());
+ }
+
+}
diff --git a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java
new file mode 100644
index 000000000000..73d49380b524
--- /dev/null
+++ b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.settingslib.wifi;
+
+import android.content.Intent;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.State;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiSsid;
+import android.util.Log;
+
+import com.android.settingslib.BaseTest;
+import com.android.settingslib.wifi.WifiTracker.WifiListener;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class WifiTrackerTest extends BaseTest {
+
+ private static final String TAG = "WifiTrackerTest";
+
+ private static final String[] TEST_SSIDS = new String[] {
+ "TEST_SSID_1",
+ "TEST_SSID_2",
+ "TEST_SSID_3",
+ "TEST_SSID_4",
+ "TEST_SSID_5",
+ };
+ private static final int NUM_NETWORKS = 5;
+
+ private WifiManager mWifiManager;
+ private WifiListener mWifiListener;
+
+ private WifiTracker mWifiTracker;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mWifiManager = Mockito.mock(WifiManager.class);
+ mWifiListener = Mockito.mock(WifiListener.class);
+ mWifiTracker = new WifiTracker(mContext, mWifiListener, true, true, mWifiManager);
+ mWifiTracker.mScanner = mWifiTracker.new Scanner();
+ Mockito.when(mWifiManager.isWifiEnabled()).thenReturn(true);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ mWifiTracker.dump(pw);
+ pw.flush();
+ Log.d(TAG, sw.toString());
+ super.tearDown();
+ }
+
+ public void testAccessPointsCallback() {
+ sendScanResultsAvailable();
+
+ Mockito.verify(mWifiListener, Mockito.atLeastOnce()).onAccessPointsChanged();
+ }
+
+ public void testConnectedCallback() {
+ sendConnected();
+
+ Mockito.verify(mWifiListener, Mockito.atLeastOnce()).onConnectedChanged();
+ assertEquals(true, mWifiTracker.isConnected());
+ }
+
+ public void testWifiStateCallback() {
+ final int TEST_WIFI_STATE = WifiManager.WIFI_STATE_ENABLED;
+
+ Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ i.putExtra(WifiManager.EXTRA_WIFI_STATE, TEST_WIFI_STATE);
+ mWifiTracker.mReceiver.onReceive(mContext, i);
+
+ ArgumentCaptor<Integer> wifiState = ArgumentCaptor.forClass(Integer.class);
+ Mockito.verify(mWifiListener, Mockito.atLeastOnce())
+ .onWifiStateChanged(wifiState.capture());
+ assertEquals(TEST_WIFI_STATE, (int) wifiState.getValue());
+ }
+
+ public void testScanner() {
+ // TODO: Figure out how to verify more of the Scanner functionality.
+ // Make scans be successful.
+ Mockito.when(mWifiManager.startScan()).thenReturn(true);
+
+ mWifiTracker.mScanner.handleMessage(null);
+ Mockito.verify(mWifiManager, Mockito.atLeastOnce()).startScan();
+ }
+
+ public void testNetworkSorting() {
+ List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
+ List<ScanResult> scanResults = new ArrayList<ScanResult>();
+ String[] expectedSsids = generateTestNetworks(wifiConfigs, scanResults, true);
+
+ // Tell WifiTracker we are connected now.
+ sendConnected();
+
+ // Send all of the configs and scan results to the tracker.
+ Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
+ Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
+ sendScanResultsAvailable();
+
+ List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+ assertEquals("Expected number of results", NUM_NETWORKS, accessPoints.size());
+ for (int i = 0; i < NUM_NETWORKS; i++) {
+ assertEquals("Verifying slot " + i, expectedSsids[i], accessPoints.get(i).getSsid());
+ }
+ }
+
+ public void testSavedOnly() {
+ mWifiTracker = new WifiTracker(mContext, mWifiListener, true, false, mWifiManager);
+ mWifiTracker.mScanner = mWifiTracker.new Scanner();
+
+ List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
+ List<ScanResult> scanResults = new ArrayList<ScanResult>();
+ generateTestNetworks(wifiConfigs, scanResults, true);
+
+ // Tell WifiTracker we are connected now.
+ sendConnected();
+
+ // Send all of the configs and scan results to the tracker.
+ Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
+ Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
+ sendScanResultsAvailable();
+
+ List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+ // Only expect the first two to come back in the results.
+ assertEquals("Expected number of results", 2, accessPoints.size());
+ assertEquals(TEST_SSIDS[1], accessPoints.get(0).getSsid());
+ assertEquals(TEST_SSIDS[0], accessPoints.get(1).getSsid());
+ }
+
+ public void testAvailableOnly() {
+ mWifiTracker = new WifiTracker(mContext, mWifiListener, false, true, mWifiManager);
+ mWifiTracker.mScanner = mWifiTracker.new Scanner();
+
+ List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
+ List<ScanResult> scanResults = new ArrayList<ScanResult>();
+ String[] expectedSsids = generateTestNetworks(wifiConfigs, scanResults, true);
+
+ // Tell WifiTracker we are connected now.
+ sendConnected();
+
+ // Send all of the configs and scan results to the tracker.
+ Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
+ Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
+ sendScanResultsAvailable();
+
+ // Expect the last one (sorted order) to be left off since its only saved.
+ List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+ assertEquals("Expected number of results", NUM_NETWORKS - 1, accessPoints.size());
+ for (int i = 0; i < NUM_NETWORKS - 1; i++) {
+ assertEquals("Verifying slot " + i, expectedSsids[i], accessPoints.get(i).getSsid());
+ }
+ }
+
+ public void testNonEphemeralConnected() {
+ mWifiTracker = new WifiTracker(mContext, mWifiListener, false, true, mWifiManager);
+ mWifiTracker.mScanner = mWifiTracker.new Scanner();
+
+ List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
+ List<ScanResult> scanResults = new ArrayList<ScanResult>();
+ String[] expectedSsids = generateTestNetworks(wifiConfigs, scanResults, false);
+
+ // Tell WifiTracker we are connected now.
+ sendConnected();
+
+ // Send all of the configs and scan results to the tracker.
+ Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
+ Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
+ sendScanResultsAvailable();
+ // Do this twice to catch a bug that was happening in the caching, making things ephemeral.
+ sendScanResultsAvailable();
+
+ List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+ assertEquals("Expected number of results", NUM_NETWORKS - 1, accessPoints.size());
+ assertFalse("Connection is not ephemeral", accessPoints.get(0).isEphemeral());
+ assertTrue("Connected to wifi", accessPoints.get(0).isActive());
+ }
+
+ private String[] generateTestNetworks(List<WifiConfiguration> wifiConfigs,
+ List<ScanResult> scanResults, boolean connectedIsEphemeral) {
+ String[] expectedSsids = new String[NUM_NETWORKS];
+
+ // First is just saved;
+ addConfig(wifiConfigs, TEST_SSIDS[0]);
+ // This should come last since its not available.
+ expectedSsids[4] = TEST_SSIDS[0];
+
+ // Second is saved and available.
+ addConfig(wifiConfigs, TEST_SSIDS[1]);
+ addResult(scanResults, TEST_SSIDS[1], 0);
+ // This one is going to have a couple extra results, to verify de-duplication.
+ addResult(scanResults, TEST_SSIDS[1], 2);
+ addResult(scanResults, TEST_SSIDS[1], 1);
+ // This should come second since it is available and saved but not connected.
+ expectedSsids[1] = TEST_SSIDS[1];
+
+ // Third is just available, but higher rssi.
+ addResult(scanResults, TEST_SSIDS[2], 3);
+ // This comes after the next one since it has a lower rssi.
+ expectedSsids[3] = TEST_SSIDS[2];
+
+ // Fourth also just available but with even higher rssi.
+ addResult(scanResults, TEST_SSIDS[3], 4);
+ // This is the highest rssi but not saved so it should be after the saved+availables.
+ expectedSsids[2] = TEST_SSIDS[3];
+
+ // Last is going to be connected.
+ int netId = WifiConfiguration.INVALID_NETWORK_ID;
+ if (!connectedIsEphemeral) {
+ netId = addConfig(wifiConfigs, TEST_SSIDS[4]);
+ }
+ addResult(scanResults, TEST_SSIDS[4], 2);
+ // Setup wifi connection to be this one.
+ WifiInfo wifiInfo = Mockito.mock(WifiInfo.class);
+ Mockito.when(wifiInfo.getSSID()).thenReturn(TEST_SSIDS[4]);
+ Mockito.when(wifiInfo.getNetworkId()).thenReturn(netId);
+ Mockito.when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+ // This should come first since it is connected.
+ expectedSsids[0] = TEST_SSIDS[4];
+
+ return expectedSsids;
+ }
+
+ private void addResult(List<ScanResult> results, String ssid, int level) {
+ results.add(new ScanResult(WifiSsid.createFromAsciiEncoded(ssid),
+ ssid, ssid, levelToRssi(level), AccessPoint.LOWER_FREQ_24GHZ, 0));
+ }
+
+ public static int levelToRssi(int level) {
+ // Reverse level to rssi calculation based off from WifiManager.calculateSignalLevel.
+ final int MAX_RSSI = -55;
+ final int MIN_RSSI = -100;
+ final int NUM_LEVELS = 4;
+ return level * (MAX_RSSI - MIN_RSSI) / (NUM_LEVELS - 1) + MIN_RSSI;
+ }
+
+ private int addConfig(List<WifiConfiguration> configs, String ssid) {
+ WifiConfiguration config = new WifiConfiguration();
+ config.networkId = configs.size();
+ config.SSID = '"' + ssid + '"';
+ configs.add(config);
+ return config.networkId;
+ }
+
+ private void sendConnected() {
+ NetworkInfo networkInfo = Mockito.mock(NetworkInfo.class);
+ Mockito.when(networkInfo.isConnected()).thenReturn(true);
+ Mockito.when(networkInfo.getState()).thenReturn(State.CONNECTED);
+ Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
+ mWifiTracker.mReceiver.onReceive(mContext, intent);
+ }
+
+ private void sendScanResultsAvailable() {
+ Intent i = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
+ mWifiTracker.mReceiver.onReceive(mContext, i);
+ }
+
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 175b4244dd16..6a05af11757b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2236,10 +2236,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
ringerModeAffectedStreams);
loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED,
- ((1 << AudioManager.STREAM_MUSIC) |
- (1 << AudioManager.STREAM_RING) |
- (1 << AudioManager.STREAM_NOTIFICATION) |
- (1 << AudioManager.STREAM_SYSTEM)));
+ AudioService.DEFAULT_MUTE_STREAMS_AFFECTED);
} finally {
if (stmt != null) stmt.close();
}
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index a061b431970f..cee541e225cf 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -282,18 +282,12 @@
<string name="recents_search_bar_label" msgid="8074997400187836677">"maghanap"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Hindi masimulan <xliff:g id="APP">%s</xliff:g>."</string>
<string name="recents_dismiss_all_message" msgid="8495275386693095768">"I-dismiss ang lahat ng application"</string>
- <!-- no translation found for recents_multistack_add_stack (5044995965068125420) -->
- <skip />
- <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) -->
- <skip />
- <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) -->
- <skip />
- <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) -->
- <skip />
- <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) -->
- <skip />
- <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) -->
- <skip />
+ <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string>
+ <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string>
+ <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nasingil na"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nagcha-charge"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> hanggang mapuno"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 1b7353be40bd..21f1472e4b8c 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -144,7 +144,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Kablosuz"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM kart yok."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth İnternet paylaşımı"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçak modu."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Pil yüzdesi: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistem ayarları."</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index a7783fc006cb..4c0cea8488ca 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -30,7 +30,7 @@
<color name="notification_list_shadow_top">#80000000</color>
<drawable name="recents_callout_line">#99ffffff</drawable>
<drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable>
- <color name="batterymeter_frame_color">#66FFFFFF</color><!-- 40% white -->
+ <color name="batterymeter_frame_color">#4DFFFFFF</color><!-- 30% white -->
<color name="batterymeter_charge_color">#FFFFFFFF</color>
<color name="batterymeter_bolt_color">#FFFFFFFF</color>
<color name="qs_batterymeter_frame_color">#FF404040</color>
@@ -129,4 +129,5 @@
<color name="segmented_button_selected">#FFFFFFFF</color>
<color name="segmented_button_unselected">#B3B0BEC5</color><!-- 70% blue grey 200 -->
<color name="volume_panel_divider">#1FFFFFFF</color><!-- 12% white -->
+ <color name="light_mode_icon_color">#FF616161</color><!-- grey 700 -->
</resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 68dc2690346e..aa53a3e19a5d 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -40,5 +40,11 @@
<item type="id" name="notification_power"/>
<item type="id" name="notification_screenshot"/>
<item type="id" name="notification_hidden"/>
+
+ <!-- Whether the icon is from a notification for which targetSdk < L -->
+ <item type="id" name="icon_is_pre_L"/>
+
+ <!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale -->
+ <item type="id" name="icon_is_grayscale" />
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 40bf13f64c98..6afca8afa511 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -630,10 +630,6 @@
<string name="quick_settings_done">Done</string>
<!-- QuickSettings: Control panel: Label for connected device. [CHAR LIMIT=NONE] -->
<string name="quick_settings_connected">Connected</string>
- <!-- QuickSettings: Control panel: Label for a connected Wi-Fi access point when the connection is established by a Wi-Fi assistant application. [CHAR LIMIT=NONE] -->
- <string name="quick_settings_connected_via_wfa">Connected via Wi\u2011Fi assistant</string>
- <!-- QuickSettings: Control panel: Label for saved device or connection. [CHAR LIMIT=NONE] -->
- <string name="quick_settings_saved">Saved</string>
<!-- QuickSettings: Control panel: Label for connecting device. [CHAR LIMIT=NONE] -->
<string name="quick_settings_connecting">Connecting...</string>
<!-- QuickSettings: Tethering. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 7bdbd0a3337c..f2f087ff427c 100755
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -23,8 +23,12 @@ import android.content.IntentFilter;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.os.BatteryManager;
@@ -56,12 +60,13 @@ public class BatteryMeterView extends View implements DemoMode,
private float mSubpixelSmoothingRight;
private final Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint;
private float mTextHeight, mWarningTextHeight;
+ private int mIconTint = Color.WHITE;
private int mHeight;
private int mWidth;
private String mWarningString;
private final int mCriticalLevel;
- private final int mChargeColor;
+ private int mChargeColor;
private final float[] mBoltPoints;
private final Path mBoltPath = new Path();
@@ -292,11 +297,27 @@ public class BatteryMeterView extends View implements DemoMode,
for (int i=0; i<mColors.length; i+=2) {
thresh = mColors[i];
color = mColors[i+1];
- if (percent <= thresh) return color;
+ if (percent <= thresh) {
+
+ // Respect tinting for "normal" level
+ if (i == mColors.length-2) {
+ return mIconTint;
+ } else {
+ return color;
+ }
+ }
}
return color;
}
+ public void setIconTint(int tint) {
+ mIconTint = tint;
+ mFramePaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.SRC_ATOP));
+ mBoltPaint.setColor(tint);
+ mChargeColor = tint;
+ invalidate();
+ }
+
@Override
public void draw(Canvas c) {
BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index bd4dbe6f4d4a..70746c746976 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -16,6 +16,8 @@
package com.android.systemui.qs.tiles;
+import java.util.List;
+
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -24,16 +26,15 @@ import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import com.android.settingslib.wifi.AccessPoint;
import com.android.systemui.R;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTileView;
import com.android.systemui.qs.SignalTileView;
-import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
-import com.android.systemui.statusbar.policy.NetworkController.AccessPointController.AccessPoint;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
/** Quick settings tile: Wifi **/
@@ -282,10 +283,10 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
}
@Override
- public void onAccessPointsChanged(final AccessPoint[] accessPoints) {
- mAccessPoints = accessPoints;
+ public void onAccessPointsChanged(final List<AccessPoint> accessPoints) {
+ mAccessPoints = accessPoints.toArray(new AccessPoint[accessPoints.size()]);
updateItems();
- if (accessPoints != null && accessPoints.length > 0) {
+ if (accessPoints != null && accessPoints.size() > 0) {
fireScanStateChanged(false);
}
}
@@ -299,7 +300,7 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
public void onDetailItemClick(Item item) {
if (item == null || item.tag == null) return;
final AccessPoint ap = (AccessPoint) item.tag;
- if (!ap.isConnected) {
+ if (!ap.isActive()) {
if (mWifiController.connect(ap)) {
mHost.collapsePanels();
}
@@ -326,16 +327,10 @@ public class WifiTile extends QSTile<QSTile.SignalState> {
final AccessPoint ap = mAccessPoints[i];
final Item item = new Item();
item.tag = ap;
- item.icon = ap.iconId;
- item.line1 = ap.ssid;
- if (ap.isConnected) {
- item.line2 = mContext.getString(ap.isConfigured ?
- R.string.quick_settings_connected :
- R.string.quick_settings_connected_via_wfa);
- } else if (ap.networkId >= 0) {
- item.line2 = mContext.getString(R.string.quick_settings_saved);
- }
- item.overlay = ap.hasSecurity
+ item.icon = mWifiController.getIcon(ap);
+ item.line1 = ap.getSsid();
+ item.line2 = ap.getSummary();
+ item.overlay = ap.getSecurity() != AccessPoint.SECURITY_NONE
? mContext.getDrawable(R.drawable.qs_ic_wifi_lock)
: null;
items[i] = item;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 1bed55345de9..ea4c4baa547d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -74,7 +74,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
RecentsViewLayoutAlgorithm mLayoutAlgorithm;
ArrayList<TaskStack> mStacks;
- List<TaskStackView> mImmutableTaskStackViews = new ArrayList<TaskStackView>();
+ List<TaskStackView> mTaskStackViews = new ArrayList<>();
View mSearchBar;
RecentsViewCallbacks mCb;
@@ -133,24 +133,18 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
public void setTaskStacks(ArrayList<TaskStack> stacks) {
int numStacks = stacks.size();
- // Make a list of the stack view children only
- ArrayList<TaskStackView> stackViewsList = new ArrayList<TaskStackView>();
- List<TaskStackView> stackViews = getTaskStackViews();
-
// Remove all/extra stack views
int numTaskStacksToKeep = 0; // Keep no tasks if we are recreating the layout
if (mConfig.launchedReuseTaskStackViews) {
- numTaskStacksToKeep = Math.min(stackViews.size(), numStacks);
+ numTaskStacksToKeep = Math.min(mTaskStackViews.size(), numStacks);
}
- for (int i = stackViews.size() - 1; i >= numTaskStacksToKeep; i--) {
- removeView(stackViews.get(i));
- stackViews.remove(i);
+ for (int i = mTaskStackViews.size() - 1; i >= numTaskStacksToKeep; i--) {
+ removeView(mTaskStackViews.remove(i));
}
- stackViewsList.addAll(stackViews);
// Update the stack views that we are keeping
for (int i = 0; i < numTaskStacksToKeep; i++) {
- TaskStackView tsv = stackViews.get(i);
+ TaskStackView tsv = mTaskStackViews.get(i);
// If onRecentsHidden is not triggered, we need to the stack view again here
tsv.reset();
tsv.setStack(stacks.get(i));
@@ -158,21 +152,18 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
// Add remaining/recreate stack views
mStacks = stacks;
- for (int i = stackViews.size(); i < numStacks; i++) {
+ for (int i = mTaskStackViews.size(); i < numStacks; i++) {
TaskStack stack = stacks.get(i);
TaskStackView stackView = new TaskStackView(getContext(), stack);
stackView.setCallbacks(this);
addView(stackView);
- stackViewsList.add(stackView);
+ mTaskStackViews.add(stackView);
}
- // Set the immutable stack views list
- mImmutableTaskStackViews = Collections.unmodifiableList(stackViewsList);
-
// Enable debug mode drawing on all the stacks if necessary
if (mConfig.debugModeEnabled) {
- for (int i = mImmutableTaskStackViews.size() - 1; i >= 0; i--) {
- TaskStackView stackView = mImmutableTaskStackViews.get(i);
+ for (int i = mTaskStackViews.size() - 1; i >= 0; i--) {
+ TaskStackView stackView = mTaskStackViews.get(i);
stackView.setDebugOverlay(mDebugOverlay);
}
}
@@ -188,7 +179,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
/** Gets the list of task views */
List<TaskStackView> getTaskStackViews() {
- return mImmutableTaskStackViews;
+ return mTaskStackViews;
}
/** Launches the focused task from the first stack if possible */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index dda52d42d302..a0ea25f518f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -773,11 +773,7 @@ public abstract class BaseStatusBar extends SystemUI implements
}
if (entry.icon != null) {
- if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
- entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
- } else {
- entry.icon.setColorFilter(null);
- }
+ entry.icon.setTag(R.id.icon_is_pre_L, entry.targetSdk < Build.VERSION_CODES.LOLLIPOP);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 6310234bfa28..728690789185 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -17,6 +17,9 @@
package com.android.systemui.statusbar;
import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
import android.telephony.SubscriptionInfo;
import android.util.AttributeSet;
import android.util.Log;
@@ -55,6 +58,7 @@ public class SignalClusterView
private int mAirplaneContentDescription;
private String mWifiDescription;
private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
+ private int mIconTint = Color.WHITE;
ViewGroup mWifiGroup;
ImageView mVpn, mWifi, mAirplane, mNoSims;
@@ -121,6 +125,7 @@ public class SignalClusterView
}
apply();
+ applyIconTint();
}
@Override
@@ -187,6 +192,9 @@ public class SignalClusterView
for (int i = 0; i < n; i++) {
inflatePhoneState(subs.get(i).getSubscriptionId());
}
+ if (isAttachedToWindow()) {
+ applyIconTint();
+ }
}
private PhoneState getOrInflateState(int subId) {
@@ -315,6 +323,29 @@ public class SignalClusterView
setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
}
+ public void setIconTint(int tint) {
+ boolean changed = tint != mIconTint;
+ mIconTint = tint;
+ if (changed && isAttachedToWindow()) {
+ applyIconTint();
+ }
+ }
+
+ private void applyIconTint() {
+ setTint(mVpn, mIconTint);
+ setTint(mWifi, mIconTint);
+ setTint(mNoSims, mIconTint);
+ setTint(mAirplane, mIconTint);
+ for (int i = 0; i < mPhoneStates.size(); i++) {
+ mPhoneStates.get(i).setIconTint(mIconTint);
+ }
+ }
+
+ private void setTint(ImageView v, int tint) {
+ v.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
+ v.setImageTintList(ColorStateList.valueOf(tint));
+ }
+
private class PhoneState {
private final int mSubId;
private boolean mMobileVisible = false;
@@ -369,6 +400,11 @@ public class SignalClusterView
event.getText().add(mMobileGroup.getContentDescription());
}
}
+
+ public void setIconTint(int tint) {
+ setTint(mMobile, tint);
+ setTint(mMobileType, tint);
+ }
}
}
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 4ffe9b188fb0..3ee7fb2d422e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -49,6 +49,7 @@ import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Point;
@@ -225,6 +226,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
/** Allow some time inbetween the long press for back and recents. */
private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
+ private int mLightModeIconColor;
+
PhoneStatusBarPolicy mIconPolicy;
// These are no longer handled by the policy, because we need custom strategies for them
@@ -531,6 +534,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
updateDisplaySize();
mScrimSrcModeEnabled = mContext.getResources().getBoolean(
R.bool.config_status_bar_scrim_behind_use_src);
+ mLightModeIconColor = mContext.getResources().getColor(R.color.light_mode_icon_color,
+ mContext.getTheme());
+
super.start(); // calls createAndAddWindows()
mMediaSessionManager
@@ -2223,6 +2229,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE;
}
+ if ((diff & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0 || sbModeChanged) {
+ boolean isTransparentBar = (mStatusBarMode == MODE_TRANSPARENT
+ || mStatusBarMode == MODE_LIGHTS_OUT_TRANSPARENT);
+ boolean allowLight = isTransparentBar && !mBatteryController.isPowerSave();
+ boolean light = (vis & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0;
+
+ mIconController.setIconTint(
+ (allowLight && light) ? mLightModeIconColor : Color.WHITE);
+
+ }
// restore the recents bit
if (wasRecentsVisible) {
mSystemUiVisibility |= View.RECENT_APPS_VISIBLE;
@@ -2515,6 +2531,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
if (mSecurityController != null) {
mSecurityController.dump(fd, pw, args);
}
+ if (mHeadsUpNotificationView != null) {
+ mHeadsUpNotificationView.dump(fd, pw, args);
+ } else {
+ pw.println(" mHeadsUpNotificationView: null");
+ }
+
pw.println("SharedPreferences:");
for (Map.Entry<String, ?> entry : mContext.getSharedPreferences(mContext.getPackageName(),
Context.MODE_PRIVATE).getAll().entrySet()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 6147e307bde4..5622993d07ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -16,20 +16,26 @@
package com.android.systemui.statusbar.phone;
-import android.app.Notification;
import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.statusbar.StatusBarIcon;
+import com.android.internal.util.NotificationColorUtil;
+import com.android.systemui.BatteryMeterView;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarIconView;
import java.io.PrintWriter;
@@ -46,28 +52,37 @@ public class StatusBarIconController {
private PhoneStatusBar mPhoneStatusBar;
private Interpolator mLinearOutSlowIn;
private DemoStatusIcons mDemoStatusIcons;
+ private NotificationColorUtil mNotificationColorUtil;
private LinearLayout mSystemIconArea;
private LinearLayout mStatusIcons;
+ private SignalClusterView mSignalCluster;
private LinearLayout mStatusIconsKeyguard;
private IconMerger mNotificationIcons;
private View mNotificationIconArea;
+ private ImageView mMoreIcon;
+ private BatteryMeterView mBatteryMeterView;
private TextView mClock;
private int mIconSize;
private int mIconHPadding;
+ private int mIconTint = Color.WHITE;
+
public StatusBarIconController(Context context, View statusBar, View keyguardStatusBar,
PhoneStatusBar phoneStatusBar) {
mContext = context;
mPhoneStatusBar = phoneStatusBar;
+ mNotificationColorUtil = NotificationColorUtil.getInstance(context);
mSystemIconArea = (LinearLayout) statusBar.findViewById(R.id.system_icon_area);
mStatusIcons = (LinearLayout) statusBar.findViewById(R.id.statusIcons);
+ mSignalCluster = (SignalClusterView) statusBar.findViewById(R.id.signal_cluster);
mNotificationIconArea = statusBar.findViewById(R.id.notification_icon_area_inner);
mNotificationIcons = (IconMerger) statusBar.findViewById(R.id.notificationIcons);
- View moreIcon = statusBar.findViewById(R.id.moreIcon);
- mNotificationIcons.setOverflowIndicator(moreIcon);
+ mMoreIcon = (ImageView) statusBar.findViewById(R.id.moreIcon);
+ mNotificationIcons.setOverflowIndicator(mMoreIcon);
mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons);
+ mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery);
mClock = (TextView) statusBar.findViewById(R.id.clock);
mLinearOutSlowIn = AnimationUtils.loadInterpolator(mContext,
android.R.interpolator.linear_out_slow_in);
@@ -91,6 +106,7 @@ public class StatusBarIconController {
view.set(icon);
mStatusIconsKeyguard.addView(view, viewIndex, new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize));
+ applyIconTint();
}
public void updateSystemIcon(String slot, int index, int viewIndex,
@@ -99,6 +115,7 @@ public class StatusBarIconController {
view.set(icon);
view = (StatusBarIconView) mStatusIconsKeyguard.getChildAt(viewIndex);
view.set(icon);
+ applyIconTint();
}
public void removeSystemIcon(String slot, int index, int viewIndex) {
@@ -156,6 +173,8 @@ public class StatusBarIconController {
mNotificationIcons.removeView(expected);
mNotificationIcons.addView(expected, i);
}
+
+ applyNotificationIconsTint();
}
public void hideSystemIconArea(boolean animate) {
@@ -247,4 +266,43 @@ public class StatusBarIconController {
.start();
}
}
+
+ public void setIconTint(int tint) {
+ mIconTint = tint;
+ applyIconTint();
+ }
+
+ private void applyIconTint() {
+ for (int i = 0; i < mStatusIcons.getChildCount(); i++) {
+ StatusBarIconView v = (StatusBarIconView) mStatusIcons.getChildAt(i);
+ v.setImageTintList(ColorStateList.valueOf(mIconTint));
+ }
+ mSignalCluster.setIconTint(mIconTint);
+ mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
+ mBatteryMeterView.setIconTint(mIconTint);
+ mClock.setTextColor(mIconTint);
+ applyNotificationIconsTint();
+ }
+
+ private void applyNotificationIconsTint() {
+ for (int i = 0; i < mNotificationIcons.getChildCount(); i++) {
+ StatusBarIconView v = (StatusBarIconView) mNotificationIcons.getChildAt(i);
+ boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L));
+ boolean colorize = !isPreL || isGrayscale(v);
+ if (colorize) {
+ v.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
+ v.setImageTintList(ColorStateList.valueOf(mIconTint));
+ }
+ }
+ }
+
+ private boolean isGrayscale(StatusBarIconView v) {
+ Object isGrayscale = v.getTag(R.id.icon_is_grayscale);
+ if (isGrayscale != null) {
+ return Boolean.TRUE.equals(isGrayscale);
+ }
+ boolean grayscale = mNotificationColorUtil.isGrayscaleIcon(v.getDrawable());
+ v.setTag(R.id.icon_is_grayscale, grayscale);
+ return grayscale;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
index ad4c2110d24e..18983ff41bc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
@@ -17,35 +17,25 @@
package com.android.systemui.statusbar.policy;
import android.app.ActivityManager;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.ActionListener;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.WifiTracker;
+import com.android.settingslib.wifi.WifiTracker.WifiListener;
import com.android.systemui.R;
+import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
-
-// TODO: Unify this logic with platform settings (see WifiSettings and AccessPoint). There is a
-// fair amount of complexity here in statuses and logic beyond just connected/disconnected.
-public class AccessPointControllerImpl implements NetworkController.AccessPointController {
+public class AccessPointControllerImpl
+ implements NetworkController.AccessPointController, WifiListener {
private static final String TAG = "AccessPointController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -63,25 +53,18 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
private final Context mContext;
private final ArrayList<AccessPointCallback> mCallbacks = new ArrayList<AccessPointCallback>();
- private final WifiManager mWifiManager;
+ private final WifiTracker mWifiTracker;
private final UserManager mUserManager;
- private final Receiver mReceiver = new Receiver();
- private NetworkControllerImpl mNetworkController;
- private boolean mScanning;
private int mCurrentUser;
public AccessPointControllerImpl(Context context) {
mContext = context;
- mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mWifiTracker = new WifiTracker(context, this, false, true);
mCurrentUser = ActivityManager.getCurrentUser();
}
- void setNetworkController(NetworkControllerImpl networkController) {
- mNetworkController = networkController;
- }
-
public boolean canConfigWifi() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI,
new UserHandle(mCurrentUser));
@@ -96,7 +79,9 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
if (callback == null || mCallbacks.contains(callback)) return;
if (DEBUG) Log.d(TAG, "addCallback " + callback);
mCallbacks.add(callback);
- mReceiver.setListening(!mCallbacks.isEmpty());
+ if (mCallbacks.size() == 1) {
+ mWifiTracker.startTracking();
+ }
}
@Override
@@ -104,37 +89,40 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
if (callback == null) return;
if (DEBUG) Log.d(TAG, "removeCallback " + callback);
mCallbacks.remove(callback);
- mReceiver.setListening(!mCallbacks.isEmpty());
+ if (mCallbacks.isEmpty()) {
+ mWifiTracker.stopTracking();
+ }
}
@Override
public void scanForAccessPoints() {
- if (mScanning) return;
if (DEBUG) Log.d(TAG, "scan!");
- mScanning = mWifiManager.startScan();
- // Grab current networks immediately while we wait for scan.
- updateAccessPoints();
+ mWifiTracker.forceScan();
+ }
+
+ @Override
+ public int getIcon(AccessPoint ap) {
+ int level = ap.getLevel();
+ return ICONS[level >= 0 ? level : 0];
}
public boolean connect(AccessPoint ap) {
if (ap == null) return false;
- if (DEBUG) Log.d(TAG, "connect networkId=" + ap.networkId);
- if (ap.networkId < 0) {
+ if (DEBUG) Log.d(TAG, "connect networkId=" + ap.getConfig().networkId);
+ if (ap.isSaved()) {
+ mWifiTracker.getManager().connect(ap.getConfig().networkId, mConnectListener);
+ } else {
// Unknown network, need to add it.
- if (ap.hasSecurity) {
+ if (ap.getSecurity() != AccessPoint.SECURITY_NONE) {
Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
- intent.putExtra(EXTRA_START_CONNECT_SSID, ap.ssid);
+ intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsid());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
fireSettingsIntentCallback(intent);
return true;
} else {
- WifiConfiguration config = new WifiConfiguration();
- config.SSID = "\"" + ap.ssid + "\"";
- config.allowedKeyManagement.set(KeyMgmt.NONE);
- mWifiManager.connect(config, mConnectListener);
+ ap.generateOpenNetworkConfig();
+ mWifiTracker.getManager().connect(ap.getConfig(), mConnectListener);
}
- } else {
- mWifiManager.connect(ap.networkId, mConnectListener);
}
return false;
}
@@ -145,76 +133,28 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
}
}
- private void fireAcccessPointsCallback(AccessPoint[] aps) {
+ private void fireAcccessPointsCallback(List<AccessPoint> aps) {
for (AccessPointCallback callback : mCallbacks) {
callback.onAccessPointsChanged(aps);
}
}
- private static String trimDoubleQuotes(String v) {
- return v != null && v.length() >= 2 && v.charAt(0) == '\"'
- && v.charAt(v.length() - 1) == '\"' ? v.substring(1, v.length() - 1) : v;
+ public void dump(PrintWriter pw) {
+ mWifiTracker.dump(pw);
}
- private int getConnectedNetworkId(WifiInfo wifiInfo) {
- return wifiInfo != null ? wifiInfo.getNetworkId() : AccessPoint.NO_NETWORK;
+ @Override
+ public void onWifiStateChanged(int state) {
}
- private ArrayMap<String, WifiConfiguration> getConfiguredNetworksBySsid() {
- final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
- if (configs == null || configs.size() == 0) return ArrayMap.EMPTY;
- final ArrayMap<String, WifiConfiguration> rt = new ArrayMap<String, WifiConfiguration>();
- for (WifiConfiguration config : configs) {
- rt.put(trimDoubleQuotes(config.SSID), config);
- }
- return rt;
+ @Override
+ public void onConnectedChanged() {
+ fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
}
- private void updateAccessPoints() {
- final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
- final int connectedNetworkId = getConnectedNetworkId(wifiInfo);
- if (DEBUG) Log.d(TAG, "connectedNetworkId: " + connectedNetworkId);
- final List<ScanResult> scanResults = mWifiManager.getScanResults();
- final ArrayMap<String, WifiConfiguration> configured = getConfiguredNetworksBySsid();
- if (DEBUG) Log.d(TAG, "scanResults: " + scanResults);
- final List<AccessPoint> aps = new ArrayList<AccessPoint>(scanResults.size());
- final ArraySet<String> ssids = new ArraySet<String>();
- for (ScanResult scanResult : scanResults) {
- if (scanResult == null) {
- continue;
- }
- final String ssid = scanResult.SSID;
- if (TextUtils.isEmpty(ssid) || ssids.contains(ssid)) continue;
- ssids.add(ssid);
- final WifiConfiguration config = configured.get(ssid);
- final int level = WifiManager.calculateSignalLevel(scanResult.level, ICONS.length);
- final AccessPoint ap = new AccessPoint();
- ap.isConfigured = config != null;
- ap.networkId = config != null ? config.networkId : AccessPoint.NO_NETWORK;
- ap.ssid = ssid;
- // Connected if either:
- // -The network ID in the active WifiInfo matches this network's ID.
- // -The network is ephemeral (no configuration) but the SSID matches.
- ap.isConnected = (ap.networkId != AccessPoint.NO_NETWORK
- && ap.networkId == connectedNetworkId) ||
- (ap.networkId == WifiConfiguration.INVALID_NETWORK_ID && wifiInfo != null &&
- ap.ssid.equals(trimDoubleQuotes(wifiInfo.getSSID())));
- if (ap.isConnected && mNetworkController != null) {
- // Ensure we have the connected network's RSSI.
- ap.level = mNetworkController.getConnectedWifiLevel();
- } else {
- ap.level = level;
- }
- ap.iconId = ICONS[ap.level];
- // Based on Settings AccessPoint#getSecurity, keep up to date
- // with better methods of determining no security or not.
- ap.hasSecurity = scanResult.capabilities.contains("WEP")
- || scanResult.capabilities.contains("PSK")
- || scanResult.capabilities.contains("EAP");
- aps.add(ap);
- }
- Collections.sort(aps, mByStrength);
- fireAcccessPointsCallback(aps.toArray(new AccessPoint[aps.size()]));
+ @Override
+ public void onAccessPointsChanged() {
+ fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
}
private final ActionListener mConnectListener = new ActionListener() {
@@ -228,49 +168,4 @@ public class AccessPointControllerImpl implements NetworkController.AccessPointC
if (DEBUG) Log.d(TAG, "connect failure reason=" + reason);
}
};
-
- private final Comparator<AccessPoint> mByStrength = new Comparator<AccessPoint> () {
- @Override
- public int compare(AccessPoint lhs, AccessPoint rhs) {
- return -Integer.compare(score(lhs), score(rhs));
- }
-
- private int score(AccessPoint ap) {
- return ap.level + (ap.isConnected ? 20 : 0) + (ap.isConfigured ? 10 : 0);
- }
- };
-
- private final class Receiver extends BroadcastReceiver {
- private boolean mRegistered;
-
- public void setListening(boolean listening) {
- if (listening && !mRegistered) {
- if (DEBUG) Log.d(TAG, "Registering receiver");
- final IntentFilter filter = new IntentFilter();
- filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
- filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
- filter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
- filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
- filter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
- filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
- filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
- filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
- mContext.registerReceiver(this, filter);
- mRegistered = true;
- } else if (!listening && mRegistered) {
- if (DEBUG) Log.d(TAG, "Unregistering receiver");
- mContext.unregisterReceiver(this);
- mRegistered = false;
- }
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (DEBUG) Log.d(TAG, "onReceive " + intent.getAction());
- if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
- updateAccessPoints();
- mScanning = false;
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
index 2e3e67ad47ed..2e96dd5e4e69 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
@@ -44,6 +44,8 @@ import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback,
@@ -442,6 +444,27 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
mUser = user;
}
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("HeadsUpNotificationView state:");
+ pw.print(" mTouchSensitivityDelay="); pw.println(mTouchSensitivityDelay);
+ pw.print(" mSnoozeLengthMs="); pw.println(mSnoozeLengthMs);
+ pw.print(" mMostRecentPackageName="); pw.println(mMostRecentPackageName);
+ pw.print(" mStartTouchTime="); pw.println(mStartTouchTime);
+ pw.print(" now="); pw.println(SystemClock.elapsedRealtime());
+ pw.print(" mUser="); pw.println(mUser);
+ if (mHeadsUp == null) {
+ pw.println(" mHeadsUp=null");
+ } else {
+ pw.print(" mHeadsUp="); pw.println(mHeadsUp.notification.getKey());
+ }
+ int N = mSnoozedPackages.size();
+ pw.println(" snoozed packages: " + N);
+ for (int i = 0; i < N; i++) {
+ pw.print(" "); pw.print(mSnoozedPackages.valueAt(i));
+ pw.print(", "); pw.println(mSnoozedPackages.keyAt(i));
+ }
+ }
+
private class EdgeSwipeHelper implements Gefingerpoken {
private static final boolean DEBUG_EDGE_SWIPE = false;
private final float mTouchSlop;
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 3cffc850fc83..92128379bb90 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -18,6 +18,10 @@ package com.android.systemui.statusbar.policy;
import android.content.Intent;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.List;
+
public interface NetworkController {
boolean hasMobileDataFeature();
@@ -50,25 +54,14 @@ public interface NetworkController {
void addAccessPointCallback(AccessPointCallback callback);
void removeAccessPointCallback(AccessPointCallback callback);
void scanForAccessPoints();
+ int getIcon(AccessPoint ap);
boolean connect(AccessPoint ap);
boolean canConfigWifi();
public interface AccessPointCallback {
- void onAccessPointsChanged(AccessPoint[] accessPoints);
+ void onAccessPointsChanged(List<AccessPoint> accessPoints);
void onSettingsActivityTriggered(Intent settingsIntent);
}
-
- public static class AccessPoint {
- public static final int NO_NETWORK = -1; // see WifiManager
-
- public int networkId;
- public int iconId;
- public String ssid;
- public boolean isConnected;
- public boolean isConfigured;
- public boolean hasSecurity;
- public int level; // 0 - 5
- }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 1d37ee3c05df..af6757c8b66e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -166,7 +166,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
// AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
updateAirplaneMode(true /* force callback */);
- mAccessPoints.setNetworkController(this);
}
private void registerListeners() {
@@ -669,6 +668,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
mobileSignalController.dump(pw);
}
mWifiSignalController.dump(pw);
+
+ mAccessPoints.dump(pw);
}
private boolean mDemoMode;
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 1aa7366de0d3..6771988adbea 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -3479,6 +3479,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
if (!mForcedNavigationBarColor) {
mNavigationBarColor = a.getColor(R.styleable.Window_navigationBarColor, 0xFF000000);
}
+ if (a.getBoolean(R.styleable.Window_windowHasLightStatusBar, false)) {
+ decor.setSystemUiVisibility(
+ decor.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ }
if (mAlwaysReadCloseOnTouchAttr || getContext().getApplicationInfo().targetSdkVersion
>= android.os.Build.VERSION_CODES.HONEYCOMB) {
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java
index 4e895669653e..e979a1bed7a7 100644
--- a/rs/java/android/renderscript/Allocation.java
+++ b/rs/java/android/renderscript/Allocation.java
@@ -1882,4 +1882,15 @@ public class Allocation extends BaseObj {
}
}
+ /**
+ * For USAGE_IO_OUTPUT, destroy() implies setSurface(null).
+ *
+ */
+ @Override
+ public void destroy() {
+ if((mUsage & USAGE_IO_OUTPUT) != 0) {
+ setSurface(null);
+ }
+ super.destroy();
+ }
}
diff --git a/rs/java/android/renderscript/FieldPacker.java b/rs/java/android/renderscript/FieldPacker.java
index 20b07e7592ac..0f967fcae26a 100644
--- a/rs/java/android/renderscript/FieldPacker.java
+++ b/rs/java/android/renderscript/FieldPacker.java
@@ -241,8 +241,7 @@ public class FieldPacker {
addI64(0);
addI64(0);
addI64(0);
- }
- else {
+ } else {
addI32((int)obj.getID(null));
}
} else {
@@ -619,6 +618,289 @@ public class FieldPacker {
return mPos;
}
+ private static void addToPack(FieldPacker fp, Object obj) {
+ if (obj instanceof Boolean) {
+ fp.addBoolean(((Boolean)obj).booleanValue());
+ return;
+ }
+
+ if (obj instanceof Byte) {
+ fp.addI8(((Byte)obj).byteValue());
+ return;
+ }
+
+ if (obj instanceof Short) {
+ fp.addI16(((Short)obj).shortValue());
+ return;
+ }
+
+ if (obj instanceof Integer) {
+ fp.addI32(((Integer)obj).intValue());
+ return;
+ }
+
+ if (obj instanceof Long) {
+ fp.addI64(((Long)obj).longValue());
+ return;
+ }
+
+ if (obj instanceof Float) {
+ fp.addF32(((Float)obj).floatValue());
+ return;
+ }
+
+ if (obj instanceof Double) {
+ fp.addF64(((Double)obj).doubleValue());
+ return;
+ }
+
+ if (obj instanceof Byte2) {
+ fp.addI8((Byte2)obj);
+ return;
+ }
+
+ if (obj instanceof Byte3) {
+ fp.addI8((Byte3)obj);
+ return;
+ }
+
+ if (obj instanceof Byte4) {
+ fp.addI8((Byte4)obj);
+ return;
+ }
+
+ if (obj instanceof Short2) {
+ fp.addI16((Short2)obj);
+ return;
+ }
+
+ if (obj instanceof Short3) {
+ fp.addI16((Short3)obj);
+ return;
+ }
+
+ if (obj instanceof Short4) {
+ fp.addI16((Short4)obj);
+ return;
+ }
+
+ if (obj instanceof Int2) {
+ fp.addI32((Int2)obj);
+ return;
+ }
+
+ if (obj instanceof Int3) {
+ fp.addI32((Int3)obj);
+ return;
+ }
+
+ if (obj instanceof Int4) {
+ fp.addI32((Int4)obj);
+ return;
+ }
+
+ if (obj instanceof Long2) {
+ fp.addI64((Long2)obj);
+ return;
+ }
+
+ if (obj instanceof Long3) {
+ fp.addI64((Long3)obj);
+ return;
+ }
+
+ if (obj instanceof Long4) {
+ fp.addI64((Long4)obj);
+ return;
+ }
+
+ if (obj instanceof Float2) {
+ fp.addF32((Float2)obj);
+ return;
+ }
+
+ if (obj instanceof Float3) {
+ fp.addF32((Float3)obj);
+ return;
+ }
+
+ if (obj instanceof Float4) {
+ fp.addF32((Float4)obj);
+ return;
+ }
+
+ if (obj instanceof Double2) {
+ fp.addF64((Double2)obj);
+ return;
+ }
+
+ if (obj instanceof Double3) {
+ fp.addF64((Double3)obj);
+ return;
+ }
+
+ if (obj instanceof Double4) {
+ fp.addF64((Double4)obj);
+ return;
+ }
+
+ if (obj instanceof Matrix2f) {
+ fp.addMatrix((Matrix2f)obj);
+ return;
+ }
+
+ if (obj instanceof Matrix3f) {
+ fp.addMatrix((Matrix3f)obj);
+ return;
+ }
+
+ if (obj instanceof Matrix4f) {
+ fp.addMatrix((Matrix4f)obj);
+ return;
+ }
+
+ if (obj instanceof BaseObj) {
+ fp.addObj((BaseObj)obj);
+ return;
+ }
+ }
+
+ private static int getPackedSize(Object obj) {
+ if (obj instanceof Boolean) {
+ return 1;
+ }
+
+ if (obj instanceof Byte) {
+ return 1;
+ }
+
+ if (obj instanceof Short) {
+ return 2;
+ }
+
+ if (obj instanceof Integer) {
+ return 4;
+ }
+
+ if (obj instanceof Long) {
+ return 8;
+ }
+
+ if (obj instanceof Float) {
+ return 4;
+ }
+
+ if (obj instanceof Double) {
+ return 8;
+ }
+
+ if (obj instanceof Byte2) {
+ return 2;
+ }
+
+ if (obj instanceof Byte3) {
+ return 3;
+ }
+
+ if (obj instanceof Byte4) {
+ return 4;
+ }
+
+ if (obj instanceof Short2) {
+ return 4;
+ }
+
+ if (obj instanceof Short3) {
+ return 6;
+ }
+
+ if (obj instanceof Short4) {
+ return 8;
+ }
+
+ if (obj instanceof Int2) {
+ return 8;
+ }
+
+ if (obj instanceof Int3) {
+ return 12;
+ }
+
+ if (obj instanceof Int4) {
+ return 16;
+ }
+
+ if (obj instanceof Long2) {
+ return 16;
+ }
+
+ if (obj instanceof Long3) {
+ return 24;
+ }
+
+ if (obj instanceof Long4) {
+ return 32;
+ }
+
+ if (obj instanceof Float2) {
+ return 8;
+ }
+
+ if (obj instanceof Float3) {
+ return 12;
+ }
+
+ if (obj instanceof Float4) {
+ return 16;
+ }
+
+ if (obj instanceof Double2) {
+ return 16;
+ }
+
+ if (obj instanceof Double3) {
+ return 24;
+ }
+
+ if (obj instanceof Double4) {
+ return 32;
+ }
+
+ if (obj instanceof Matrix2f) {
+ return 16;
+ }
+
+ if (obj instanceof Matrix3f) {
+ return 36;
+ }
+
+ if (obj instanceof Matrix4f) {
+ return 64;
+ }
+
+ if (obj instanceof BaseObj) {
+ if (RenderScript.sPointerSize == 8) {
+ return 32;
+ } else {
+ return 4;
+ }
+ }
+
+ return 0;
+ }
+
+ static FieldPacker createFieldPack(Object[] args) {
+ int len = 0;
+ for (Object arg : args) {
+ len += getPackedSize(arg);
+ }
+ FieldPacker fp = new FieldPacker(len);
+ for (Object arg : args) {
+ addToPack(fp, arg);
+ }
+ return fp;
+ }
+
private final byte mData[];
private int mPos;
private int mLen;
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java
index f37519ec7d51..94aa8578d233 100644
--- a/rs/java/android/renderscript/RenderScript.java
+++ b/rs/java/android/renderscript/RenderScript.java
@@ -313,6 +313,15 @@ public class RenderScript {
sizes, depClosures, depFieldIDs);
}
+ native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
+ long[] fieldIDs, long[] values, int[] sizes);
+ synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
+ long[] fieldIDs, long[] values, int[] sizes) {
+ validate();
+ return rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
+ values, sizes);
+ }
+
native void rsnClosureSetArg(long con, long closureID, int index,
long value, int size);
synchronized void nClosureSetArg(long closureID, int index, long value,
@@ -745,6 +754,12 @@ public class RenderScript {
return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
}
+ native long rsnScriptInvokeIDCreate(long con, long sid, int slot);
+ synchronized long nScriptInvokeIDCreate(long sid, int slot) {
+ validate();
+ return rsnScriptInvokeIDCreate(mContext, sid, slot);
+ }
+
native long rsnScriptFieldIDCreate(long con, long sid, int slot);
synchronized long nScriptFieldIDCreate(long sid, int slot) {
validate();
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
index eb1687a37a49..d35213057eef 100644
--- a/rs/java/android/renderscript/Script.java
+++ b/rs/java/android/renderscript/Script.java
@@ -66,6 +66,46 @@ public class Script extends BaseObj {
}
/**
+ * @hide Pending API review
+ * InvokeID is an identifier for an invoke function. It is used
+ * as an identifier for ScriptGroup creation.
+ *
+ * This class should not be directly created. Instead use the method in the
+ * reflected or intrinsic code "getInvokeID_funcname()".
+ *
+ */
+ public static final class InvokeID extends BaseObj {
+ Script mScript;
+ int mSlot;
+ InvokeID(long id, RenderScript rs, Script s, int slot) {
+ super(id, rs);
+ mScript = s;
+ mSlot = slot;
+ }
+ }
+
+ private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
+ /**
+ * @hide Pending API review
+ * Only to be used by generated reflected classes.
+ */
+ protected InvokeID createInvokeID(int slot) {
+ InvokeID i = mIIDs.get(slot);
+ if (i != null) {
+ return i;
+ }
+
+ long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
+ if (id == 0) {
+ throw new RSDriverException("Failed to create KernelID");
+ }
+
+ i = new InvokeID(id, mRS, this, slot);
+ mIIDs.put(slot, i);
+ return i;
+ }
+
+ /**
* FieldID is an identifier for a Script + exported field pair. It is used
* as an identifier for ScriptGroup creation.
*
diff --git a/rs/java/android/renderscript/ScriptGroup2.java b/rs/java/android/renderscript/ScriptGroup2.java
index 366039e3342a..113b89616d8d 100644
--- a/rs/java/android/renderscript/ScriptGroup2.java
+++ b/rs/java/android/renderscript/ScriptGroup2.java
@@ -34,6 +34,8 @@ public class ScriptGroup2 extends BaseObj {
private Future mReturnFuture;
private Map<Script.FieldID, Future> mGlobalFuture;
+ private FieldPacker mFP;
+
private static final String TAG = "Closure";
public Closure(long id, RenderScript rs) {
@@ -89,6 +91,44 @@ public class ScriptGroup2 extends BaseObj {
setID(id);
}
+ public Closure(RenderScript rs, Script.InvokeID invokeID,
+ Object[] args, Map<Script.FieldID, Object> globals) {
+ super(0, rs);
+ mFP = FieldPacker.createFieldPack(args);
+
+ mBindings = new HashMap<Script.FieldID, Object>();
+ mGlobalFuture = new HashMap<Script.FieldID, Future>();
+
+ int numValues = globals.size();
+
+ long[] fieldIDs = new long[numValues];
+ long[] values = new long[numValues];
+ int[] sizes = new int[numValues];
+ long[] depClosures = new long[numValues];
+ long[] depFieldIDs = new long[numValues];
+
+ int i = 0;
+ for (Map.Entry<Script.FieldID, Object> entry : globals.entrySet()) {
+ Object obj = entry.getValue();
+ Script.FieldID fieldID = entry.getKey();
+ fieldIDs[i] = fieldID.getID(rs);
+ if (obj instanceof UnboundValue) {
+ UnboundValue unbound = (UnboundValue)obj;
+ unbound.addReference(this, fieldID);
+ } else {
+ // TODO(yangni): Verify obj not a future.
+ retrieveValueAndDependenceInfo(rs, i, obj, values,
+ sizes, depClosures, depFieldIDs);
+ }
+ i++;
+ }
+
+ long id = rs.nInvokeClosureCreate(invokeID.getID(rs), mFP.getData(), fieldIDs,
+ values, sizes);
+
+ setID(id);
+ }
+
private static void retrieveValueAndDependenceInfo(RenderScript rs,
int index, Object obj, long[] values, int[] sizes, long[] depClosures,
long[] depFieldIDs) {
@@ -99,6 +139,12 @@ public class ScriptGroup2 extends BaseObj {
depClosures[index] = f.getClosure().getID(rs);
Script.FieldID fieldID = f.getFieldID();
depFieldIDs[index] = fieldID != null ? fieldID.getID(rs) : 0;
+ if (obj == null) {
+ // Value is originally created by the owner closure
+ values[index] = 0;
+ sizes[index] = 0;
+ return;
+ }
} else {
depClosures[index] = 0;
depFieldIDs[index] = 0;
@@ -121,6 +167,10 @@ public class ScriptGroup2 extends BaseObj {
Future f = mGlobalFuture.get(field);
if (f == null) {
+ // If the field is not bound to this closure, this will return a future
+ // without an associated value (reference). So this is not working for
+ // cross-module (cross-script) linking in this case where a field not
+ // explicitly bound.
f = new Future(this, field, mBindings.get(field));
mGlobalFuture.put(field, f);
}
@@ -160,7 +210,6 @@ public class ScriptGroup2 extends BaseObj {
size = 8;
}
}
-
public long value;
public int size;
}
@@ -297,6 +346,13 @@ public class ScriptGroup2 extends BaseObj {
return c;
}
+ public Closure addInvoke(Script.InvokeID invoke, Object[] args,
+ Map<Script.FieldID, Object> globalBindings) {
+ Closure c = new Closure(mRS, invoke, args, globalBindings);
+ mClosures.add(c);
+ return c;
+ }
+
public UnboundValue addInput() {
UnboundValue unbound = new UnboundValue();
mInputs.add(unbound);
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index cbcba398073c..7387af0d5c0f 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -242,6 +242,37 @@ nClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
depFieldIDs, (size_t)depFieldIDs_length);
}
+static jlong
+nInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID,
+ jbyteArray paramArray, jlongArray fieldIDArray, jlongArray valueArray,
+ jintArray sizeArray) {
+ jbyte* jParams = _env->GetByteArrayElements(paramArray, nullptr);
+ jsize jParamLength = _env->GetArrayLength(paramArray);
+
+ jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
+ jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
+ RsScriptFieldID* fieldIDs =
+ (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * fieldIDs_length);
+ for (int i = 0; i< fieldIDs_length; i++) {
+ fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
+ }
+
+ jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
+ jsize values_length = _env->GetArrayLength(valueArray);
+ uintptr_t* values = (uintptr_t*)alloca(sizeof(uintptr_t) * values_length);
+ for (int i = 0; i < values_length; i++) {
+ values[i] = (uintptr_t)jValues[i];
+ }
+
+ jint* sizes = _env->GetIntArrayElements(sizeArray, nullptr);
+ jsize sizes_length = _env->GetArrayLength(sizeArray);
+
+ return (jlong)(uintptr_t)rsInvokeClosureCreate(
+ (RsContext)con, (RsScriptInvokeID)invokeID, jParams, jParamLength,
+ fieldIDs, (size_t)fieldIDs_length, values, (size_t)values_length,
+ (size_t*)sizes, (size_t)sizes_length);
+}
+
static void
nClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
jint index, jlong value, jint size) {
@@ -1488,6 +1519,16 @@ nScriptKernelIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint sl
}
static jlong
+nScriptInvokeIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
+{
+ if (kLogApi) {
+ ALOGD("nScriptInvokeIDCreate, con(%p) script(%p), slot(%i), sig(%i)", (RsContext)con,
+ (void *)sid, slot);
+ }
+ return (jlong)(uintptr_t)rsScriptInvokeIDCreate((RsContext)con, (RsScript)sid, slot);
+}
+
+static jlong
nScriptFieldIDCreate(JNIEnv *_env, jobject _this, jlong con, jlong sid, jint slot)
{
if (kLogApi) {
@@ -1935,6 +1976,7 @@ static JNINativeMethod methods[] = {
{"rsnContextResume", "(J)V", (void*)nContextResume },
{"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage },
{"rsnClosureCreate", "(JJJ[J[J[I[J[J)J", (void*)nClosureCreate },
+{"rsnInvokeClosureCreate", "(JJ[B[J[J[I)J", (void*)nInvokeClosureCreate },
{"rsnClosureSetArg", "(JJIJI)V", (void*)nClosureSetArg },
{"rsnClosureSetGlobal", "(JJJJI)V", (void*)nClosureSetGlobal },
{"rsnAssignName", "(JJ[B)V", (void*)nAssignName },
@@ -2009,6 +2051,7 @@ static JNINativeMethod methods[] = {
{"rsnScriptCCreate", "(JLjava/lang/String;Ljava/lang/String;[BI)J", (void*)nScriptCCreate },
{"rsnScriptIntrinsicCreate", "(JIJ)J", (void*)nScriptIntrinsicCreate },
{"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate },
+{"rsnScriptInvokeIDCreate", "(JJI)J", (void*)nScriptInvokeIDCreate },
{"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate },
{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate },
{"rsnScriptGroup2Create", "(JLjava/lang/String;[J)J", (void*)nScriptGroup2Create },
diff --git a/services/core/java/com/android/server/WiredAccessoryManager.java b/services/core/java/com/android/server/WiredAccessoryManager.java
index bffbb4c212a1..c9a83ec1f58f 100644
--- a/services/core/java/com/android/server/WiredAccessoryManager.java
+++ b/services/core/java/com/android/server/WiredAccessoryManager.java
@@ -219,6 +219,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
mWakeLock.acquire();
+ Log.i(TAG, "MSG_NEW_DEVICE_STATE ");
Message msg = mHandler.obtainMessage(MSG_NEW_DEVICE_STATE, headsetState,
mHeadsetState, newName);
mHandler.sendMessage(msg);
@@ -286,14 +287,16 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
return;
}
- if (LOG)
- Slog.v(TAG, "device "+headsetName+((state == 1) ? " connected" : " disconnected"));
+ if (LOG) {
+ Slog.v(TAG, "headsetName: " + headsetName +
+ (state == 1 ? " connected" : " disconnected"));
+ }
if (outDevice != 0) {
- mAudioManager.setWiredDeviceConnectionState(outDevice, state, headsetName);
+ mAudioManager.setWiredDeviceConnectionState(outDevice, state, "", headsetName);
}
if (inDevice != 0) {
- mAudioManager.setWiredDeviceConnectionState(inDevice, state, headsetName);
+ mAudioManager.setWiredDeviceConnectionState(inDevice, state, "", headsetName);
}
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b58a505cba75..7a493c6d0e3b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -170,6 +170,7 @@ import android.os.FileUtils;
import android.os.Handler;
import android.os.IBinder;
import android.os.IPermissionController;
+import android.os.IProcessInfoService;
import android.os.IRemoteCallback;
import android.os.IUserManager;
import android.os.Looper;
@@ -1920,6 +1921,7 @@ public final class ActivityManagerService extends ActivityManagerNative
ServiceManager.addService("cpuinfo", new CpuBinder(this));
}
ServiceManager.addService("permission", new PermissionController(this));
+ ServiceManager.addService("processinfo", new ProcessInfoService(this));
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
"android", STOCK_PM_FLAGS);
@@ -6287,7 +6289,46 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
}
-
+
+ // =========================================================
+ // PROCESS INFO
+ // =========================================================
+
+ static class ProcessInfoService extends IProcessInfoService.Stub {
+ final ActivityManagerService mActivityManagerService;
+ ProcessInfoService(ActivityManagerService activityManagerService) {
+ mActivityManagerService = activityManagerService;
+ }
+
+ @Override
+ public void getProcessStatesFromPids(/*in*/ int[] pids, /*out*/ int[] states) {
+ mActivityManagerService.getProcessStatesForPIDs(/*in*/ pids, /*out*/ states);
+ }
+ }
+
+ /**
+ * For each PID in the given input array, write the current process state
+ * for that process into the output array, or -1 to indicate that no
+ * process with the given PID exists.
+ */
+ public void getProcessStatesForPIDs(/*in*/ int[] pids, /*out*/ int[] states) {
+ if (pids == null) {
+ throw new NullPointerException("pids");
+ } else if (states == null) {
+ throw new NullPointerException("states");
+ } else if (pids.length != states.length) {
+ throw new IllegalArgumentException("input and output arrays have different lengths!");
+ }
+
+ synchronized (mPidsSelfLocked) {
+ for (int i = 0; i < pids.length; i++) {
+ ProcessRecord pr = mPidsSelfLocked.get(pids[i]);
+ states[i] = (pr == null) ? ActivityManager.PROCESS_STATE_NONEXISTENT :
+ pr.curProcState;
+ }
+ }
+ }
+
// =========================================================
// PERMISSIONS
// =========================================================
@@ -15060,30 +15101,6 @@ public final class ActivityManagerService extends ActivityManagerNative
// BROADCASTS
// =========================================================
- private final List getStickiesLocked(String action, IntentFilter filter,
- List cur, int userId) {
- final ContentResolver resolver = mContext.getContentResolver();
- ArrayMap<String, ArrayList<Intent>> stickies = mStickyBroadcasts.get(userId);
- if (stickies == null) {
- return cur;
- }
- final ArrayList<Intent> list = stickies.get(action);
- if (list == null) {
- return cur;
- }
- int N = list.size();
- for (int i=0; i<N; i++) {
- Intent intent = list.get(i);
- if (filter.match(resolver, intent, true, TAG) >= 0) {
- if (cur == null) {
- cur = new ArrayList<Intent>();
- }
- cur.add(intent);
- }
- }
- return cur;
- }
-
boolean isPendingBroadcastProcessLocked(int pid) {
return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid)
|| mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid);
@@ -15108,10 +15125,11 @@ public final class ActivityManagerService extends ActivityManagerNative
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter, String permission, int userId) {
enforceNotIsolatedCaller("registerReceiver");
+ ArrayList<Intent> stickyIntents = null;
+ ProcessRecord callerApp = null;
int callingUid;
int callingPid;
synchronized(this) {
- ProcessRecord callerApp = null;
if (caller != null) {
callerApp = getRecordForAppLocked(caller);
if (callerApp == null) {
@@ -15134,39 +15152,66 @@ public final class ActivityManagerService extends ActivityManagerNative
callingPid = Binder.getCallingPid();
}
- userId = this.handleIncomingUser(callingPid, callingUid, userId,
+ userId = handleIncomingUser(callingPid, callingUid, userId,
true, ALLOW_FULL_ONLY, "registerReceiver", callerPackage);
- List allSticky = null;
+ Iterator<String> actions = filter.actionsIterator();
+ if (actions == null) {
+ ArrayList<String> noAction = new ArrayList<String>(1);
+ noAction.add(null);
+ actions = noAction.iterator();
+ }
+
+ // Collect stickies of users
+ int[] userIds = { UserHandle.USER_ALL, UserHandle.getUserId(callingUid) };
+ while (actions.hasNext()) {
+ String action = actions.next();
+ for (int id : userIds) {
+ ArrayMap<String, ArrayList<Intent>> stickies = mStickyBroadcasts.get(id);
+ if (stickies != null) {
+ ArrayList<Intent> intents = stickies.get(action);
+ if (intents != null) {
+ if (stickyIntents == null) {
+ stickyIntents = new ArrayList<Intent>();
+ }
+ stickyIntents.addAll(intents);
+ }
+ }
+ }
+ }
+ }
+ ArrayList<Intent> allSticky = null;
+ if (stickyIntents != null) {
+ final ContentResolver resolver = mContext.getContentResolver();
// Look for any matching sticky broadcasts...
- Iterator actions = filter.actionsIterator();
- if (actions != null) {
- while (actions.hasNext()) {
- String action = (String)actions.next();
- allSticky = getStickiesLocked(action, filter, allSticky,
- UserHandle.USER_ALL);
- allSticky = getStickiesLocked(action, filter, allSticky,
- UserHandle.getUserId(callingUid));
+ for (int i = 0, N = stickyIntents.size(); i < N; i++) {
+ Intent intent = stickyIntents.get(i);
+ // If intent has scheme "content", it will need to acccess
+ // provider that needs to lock mProviderMap in ActivityThread
+ // and also it may need to wait application response, so we
+ // cannot lock ActivityManagerService here.
+ if (filter.match(resolver, intent, true, TAG) >= 0) {
+ if (allSticky == null) {
+ allSticky = new ArrayList<Intent>();
+ }
+ allSticky.add(intent);
}
- } else {
- allSticky = getStickiesLocked(null, filter, allSticky,
- UserHandle.USER_ALL);
- allSticky = getStickiesLocked(null, filter, allSticky,
- UserHandle.getUserId(callingUid));
}
+ }
- // The first sticky in the list is returned directly back to
- // the client.
- Intent sticky = allSticky != null ? (Intent)allSticky.get(0) : null;
-
- if (DEBUG_BROADCAST) Slog.v(TAG, "Register receiver " + filter
- + ": " + sticky);
+ // The first sticky in the list is returned directly back to the client.
+ Intent sticky = allSticky != null ? allSticky.get(0) : null;
+ if (DEBUG_BROADCAST) Slog.v(TAG, "Register receiver " + filter + ": " + sticky);
+ if (receiver == null) {
+ return sticky;
+ }
- if (receiver == null) {
- return sticky;
+ synchronized (this) {
+ if (callerApp != null && callerApp.pid == 0) {
+ // Caller already died
+ return null;
}
-
ReceiverList rl
= (ReceiverList)mRegisteredReceivers.get(receiver.asBinder());
if (rl == null) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index b989bc630a1b..58104a8e0a5e 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2606,9 +2606,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
final ActivityRecord r = stack.topRunningActivityLocked(null);
- final TaskRecord topTask = r.task;
- if (!topTask.mResizeable) {
- Slog.w(TAG, "resizeStack: top task " + topTask + " not resizeable.");
+ if (r != null && !r.task.mResizeable) {
+ Slog.w(TAG, "resizeStack: top task " + r.task + " not resizeable.");
return;
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index f900d0db0308..87f78c1bb448 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -28,6 +28,7 @@ import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
+import android.net.ProxyInfo;
import android.net.TrafficStats;
import android.net.Uri;
import android.net.wifi.WifiInfo;
@@ -656,12 +657,36 @@ public class NetworkMonitor extends StateMachine {
int httpResponseCode = 599;
try {
URL url = new URL("http", mServer, "/generate_204");
+ // On networks with a PAC instead of fetching a URL that should result in a 204
+ // reponse, we instead simply fetch the PAC script. This is done for a few reasons:
+ // 1. At present our PAC code does not yet handle multiple PACs on multiple networks
+ // until something like https://android-review.googlesource.com/#/c/115180/ lands.
+ // Network.openConnection() will ignore network-specific PACs and instead fetch
+ // using NO_PROXY. If a PAC is in place, the only fetch we know will succeed with
+ // NO_PROXY is the fetch of the PAC itself.
+ // 2. To proxy the generate_204 fetch through a PAC would require a number of things
+ // happen before the fetch can commence, namely:
+ // a) the PAC script be fetched
+ // b) a PAC script resolver service be fired up and resolve mServer
+ // Network validation could be delayed until these prerequisities are satisifed or
+ // could simply be left to race them. Neither is an optimal solution.
+ // 3. PAC scripts are sometimes used to block or restrict Internet access and may in
+ // fact block fetching of the generate_204 URL which would lead to false negative
+ // results for network validation.
+ boolean fetchPac = false;
+ {
+ final ProxyInfo proxyInfo = mNetworkAgentInfo.linkProperties.getHttpProxy();
+ if (proxyInfo != null && !Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
+ url = new URL(proxyInfo.getPacFileUrl().toString());
+ fetchPac = true;
+ }
+ }
if (DBG) {
log("Checking " + url.toString() + " on " +
mNetworkAgentInfo.networkInfo.getExtraInfo());
}
urlConnection = (HttpURLConnection) mNetworkAgentInfo.network.openConnection(url);
- urlConnection.setInstanceFollowRedirects(false);
+ urlConnection.setInstanceFollowRedirects(fetchPac);
urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS);
urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS);
urlConnection.setUseCaches(false);
@@ -695,6 +720,11 @@ public class NetworkMonitor extends StateMachine {
httpResponseCode = 204;
}
+ if (httpResponseCode == 200 && fetchPac) {
+ if (DBG) log("PAC fetch 200 response interpreted as 204 response.");
+ httpResponseCode = 204;
+ }
+
sendNetworkConditionsBroadcast(true /* response received */,
httpResponseCode != 204 /* isCaptivePortal */,
requestTimestamp, responseTimestamp);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 8241cdc5d85d..4f458e60022f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -904,7 +904,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
// Note that we don't set any name to ARC.
mService.getAudioManager().setWiredDeviceConnectionState(
AudioSystem.DEVICE_OUT_HDMI_ARC,
- enabled ? 1 : 0, "");
+ enabled ? 1 : 0, "", "");
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 59dab080cf9d..1c9dfe0ca596 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -90,12 +90,17 @@ public class TaskStack {
// stack bounds once the stack is no longer forced to fullscreen.
final private Rect mPreForceFullscreenBounds;
+ // When true this stack is at the top of the screen and should be layed out to extend under
+ // the status bar.
+ boolean mUnderStatusBar;
+
TaskStack(WindowManagerService service, int stackId) {
mService = service;
mStackId = stackId;
mOverrideConfig = Configuration.EMPTY;
mForceFullscreen = false;
mPreForceFullscreenBounds = new Rect();
+ mUnderStatusBar = true;
// TODO: remove bounds from log, they are always 0.
EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId, mBounds.left, mBounds.top,
mBounds.right, mBounds.bottom);
@@ -110,8 +115,6 @@ public class TaskStack {
}
void resizeWindows() {
- final boolean underStatusBar = mBounds.top == 0;
-
final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
final ArrayList<AppWindowToken> activities = mTasks.get(taskNdx).mAppTokens;
@@ -124,7 +127,6 @@ public class TaskStack {
"setBounds: Resizing " + win);
resizingWindows.add(win);
}
- win.mUnderStatusBar = underStatusBar;
}
}
}
@@ -155,6 +157,7 @@ public class TaskStack {
mDimLayer.setBounds(bounds);
mAnimationBackgroundSurface.setBounds(bounds);
mBounds.set(bounds);
+ mUnderStatusBar = (mBounds.top == 0);
updateOverrideConfiguration();
return true;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 98f00de37424..bb9530575d4b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -342,10 +342,6 @@ final class WindowState implements WindowManagerPolicy.WindowState {
/** When true this window can be displayed on screens owther than mOwnerUid's */
private boolean mShowToOwnerOnly;
- /** When true this window is at the top of the screen and should be layed out to extend under
- * the status bar */
- boolean mUnderStatusBar = true;
-
WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
WindowState attachedWindow, int appOp, int seq, WindowManager.LayoutParams a,
int viewVisibility, final DisplayContent displayContent) {
@@ -509,8 +505,8 @@ final class WindowState implements WindowManagerPolicy.WindowState {
TaskStack stack = mAppToken != null ? getStack() : null;
if (stack != null && !stack.isFullscreen()) {
- getStackBounds(stack, mContainingFrame);
- if (mUnderStatusBar) {
+ stack.getBounds(mContainingFrame);
+ if (stack.mUnderStatusBar) {
mContainingFrame.top = pf.top;
}
} else {
@@ -588,12 +584,13 @@ final class WindowState implements WindowManagerPolicy.WindowState {
y = mAttrs.y;
}
+ // Make sure window fits in containing frame required by {@link Gravity#apply} call.
+ w = Math.min(w, pw);
+ h = Math.min(h, ph);
Gravity.apply(mAttrs.gravity, w, h, mContainingFrame,
(int) (x + mAttrs.horizontalMargin * pw),
(int) (y + mAttrs.verticalMargin * ph), mFrame);
- //System.out.println("Out: " + mFrame);
-
// Now make sure the window fits in the overall display.
Gravity.applyDisplay(mAttrs.gravity, df, mFrame);
@@ -808,10 +805,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
void getStackBounds(Rect bounds) {
- getStackBounds(getStack(), bounds);
- }
-
- private void getStackBounds(TaskStack stack, Rect bounds) {
+ final TaskStack stack = getStack();
if (stack != null) {
stack.getBounds(bounds);
return;
@@ -1471,7 +1465,11 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
void dump(PrintWriter pw, String prefix, boolean dumpAll) {
+ final TaskStack stack = getStack();
pw.print(prefix); pw.print("mDisplayId="); pw.print(getDisplayId());
+ if (stack != null) {
+ pw.print(" stackId="); pw.print(stack.mStackId);
+ }
pw.print(" mSession="); pw.print(mSession);
pw.print(" mClient="); pw.println(mClient.asBinder());
pw.print(prefix); pw.print("mOwnerUid="); pw.print(mOwnerUid);
diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
index b508c89b5047..9d13d3c1e348 100644
--- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java
+++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
@@ -24,6 +24,7 @@ import android.content.res.Resources;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
+import android.media.AudioService;
import android.media.AudioSystem;
import android.media.IAudioService;
import android.midi.MidiDeviceInfo;
@@ -179,15 +180,16 @@ public final class UsbAlsaManager {
" alsaDevice: " + alsaDevice);
return;
}
- String params = ("card=" + alsaCard + ";device=" + alsaDevice);
+ String address = AudioService.makeAlsaAddressString(alsaCard, alsaDevice);
try {
// Playback Device
if (audioDevice.mHasPlayback) {
int device = (audioDevice == mAccessoryAudioDevice ?
AudioSystem.DEVICE_OUT_USB_ACCESSORY :
AudioSystem.DEVICE_OUT_USB_DEVICE);
- mAudioService.setWiredDeviceConnectionState(device, state, params);
+ mAudioService.setWiredDeviceConnectionState(
+ device, state, address, audioDevice.mDeviceName);
}
// Capture Device
@@ -195,7 +197,8 @@ public final class UsbAlsaManager {
int device = (audioDevice == mAccessoryAudioDevice ?
AudioSystem.DEVICE_IN_USB_ACCESSORY :
AudioSystem.DEVICE_IN_USB_DEVICE);
- mAudioService.setWiredDeviceConnectionState(device, state, params);
+ mAudioService.setWiredDeviceConnectionState(
+ device, state, address, audioDevice.mDeviceName);
}
} catch (RemoteException e) {
Slog.e(TAG, "RemoteException in setWiredDeviceConnectionState");
diff --git a/services/usb/java/com/android/server/usb/UsbAudioDevice.java b/services/usb/java/com/android/server/usb/UsbAudioDevice.java
index 069d917e85a0..bdd28e4fc326 100644
--- a/services/usb/java/com/android/server/usb/UsbAudioDevice.java
+++ b/services/usb/java/com/android/server/usb/UsbAudioDevice.java
@@ -53,7 +53,6 @@ public final class UsbAudioDevice {
sb.append("UsbAudioDevice: [card: " + mCard);
sb.append(", device: " + mDevice);
sb.append(", name: " + mDeviceName);
- sb.append(", description: " + mDeviceDescription);
sb.append(", hasPlayback: " + mHasPlayback);
sb.append(", hasCapture: " + mHasCapture);
sb.append(", class: 0x" + Integer.toHexString(mDeviceClass) + "]");
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 052a481f1ab2..a94c2f6487a4 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -40,15 +40,13 @@ import java.util.MissingResourceException;
/**
* Represents a distinct method to place or receive a phone call. Apps which can place calls and
* want those calls to be integrated into the dialer and in-call UI should build an instance of
- * this class and register it with the system using {@link TelecomManager#registerPhoneAccount}.
+ * this class and register it with the system using {@link TelecomManager}.
* <p>
* {@link TelecomManager} uses registered {@link PhoneAccount}s to present the user with
* alternative options when placing a phone call. When building a {@link PhoneAccount}, the app
- * should supply a valid {@link PhoneAccountHandle} that references the {@link ConnectionService}
+ * should supply a valid {@link PhoneAccountHandle} that references the connection service
* implementation Telecom will use to interact with the app.
- * @hide
*/
-@SystemApi
public class PhoneAccount implements Parcelable {
/**
@@ -62,7 +60,9 @@ public class PhoneAccount implements Parcelable {
* if the user has explicitly selected it to be used as the default connection manager.
* <p>
* See {@link #getCapabilities}
+ * @hide
*/
+ @SystemApi
public static final int CAPABILITY_CONNECTION_MANAGER = 0x1;
/**
@@ -76,6 +76,7 @@ public class PhoneAccount implements Parcelable {
* <p>
* {@hide}
*/
+ @SystemApi
public static final int CAPABILITY_CALL_PROVIDER = 0x2;
/**
@@ -94,6 +95,7 @@ public class PhoneAccount implements Parcelable {
* See {@link #getCapabilities}
* @hide
*/
+ @SystemApi
public static final int CAPABILITY_VIDEO_CALLING = 0x8;
/**
@@ -111,6 +113,7 @@ public class PhoneAccount implements Parcelable {
* See {@link #getCapabilities}
* @hide
*/
+ @SystemApi
public static final int CAPABILITY_MULTI_USER = 0x20;
/**
@@ -203,6 +206,7 @@ public class PhoneAccount implements Parcelable {
}
/** @hide */
+ @SystemApi
public Builder setAccountHandle(PhoneAccountHandle accountHandle) {
mAccountHandle = accountHandle;
return this;
@@ -333,6 +337,7 @@ public class PhoneAccount implements Parcelable {
* @return The builder.
* @hide
*/
+ @SystemApi
public Builder addSupportedUriScheme(String uriScheme) {
if (!TextUtils.isEmpty(uriScheme) && !mSupportedUriSchemes.contains(uriScheme)) {
this.mSupportedUriSchemes.add(uriScheme);
@@ -423,6 +428,7 @@ public class PhoneAccount implements Parcelable {
* @return The builder.
* @hide
*/
+ @SystemApi
public Builder toBuilder() { return new Builder(this); }
/**
diff --git a/telecomm/java/android/telecom/PhoneAccountHandle.java b/telecomm/java/android/telecom/PhoneAccountHandle.java
index 97af41afd31a..570f5fdf2ffa 100644
--- a/telecomm/java/android/telecom/PhoneAccountHandle.java
+++ b/telecomm/java/android/telecom/PhoneAccountHandle.java
@@ -29,16 +29,13 @@ import java.util.Objects;
* The unique identifier for a {@link PhoneAccount}. A {@code PhoneAccountHandle} is made of two
* parts:
* <ul>
- * <li>The component name of the associated {@link ConnectionService}.</li>
+ * <li>The component name of the associated connection service.</li>
* <li>A string identifier that is unique across {@code PhoneAccountHandle}s with the same
* component name.</li>
* </ul>
*
- * See {@link PhoneAccount},
- * {@link TelecomManager#registerPhoneAccount TelecomManager.registerPhoneAccount}.
- * @hide
+ * See {@link PhoneAccount}, {@link TelecomManager}.
*/
-@SystemApi
public class PhoneAccountHandle implements Parcelable {
private final ComponentName mComponentName;
private final String mId;
@@ -51,6 +48,7 @@ public class PhoneAccountHandle implements Parcelable {
}
/** @hide */
+ @SystemApi
public PhoneAccountHandle(
ComponentName componentName,
String id,
@@ -61,8 +59,8 @@ public class PhoneAccountHandle implements Parcelable {
}
/**
- * The {@code ComponentName} of the {@link android.telecom.ConnectionService} which is
- * responsible for making phone calls using this {@code PhoneAccountHandle}.
+ * The {@code ComponentName} of the connection service which is responsible for making phone
+ * calls using this {@code PhoneAccountHandle}.
*
* @return A suitable {@code ComponentName}.
*/
@@ -72,9 +70,9 @@ public class PhoneAccountHandle implements Parcelable {
/**
* A string that uniquely distinguishes this particular {@code PhoneAccountHandle} from all the
- * others supported by the {@link ConnectionService} that created it.
+ * others supported by the connection service that created it.
* <p>
- * A {@code ConnectionService} must select identifiers that are stable for the lifetime of
+ * A connection service must select identifiers that are stable for the lifetime of
* their users' relationship with their service, across many Android devices. For example, a
* good set of identifiers might be the email addresses with which with users registered for
* their accounts with a particular service. Depending on how a service chooses to operate,
@@ -92,6 +90,7 @@ public class PhoneAccountHandle implements Parcelable {
* @return the {@link UserHandle} to use when connecting to this PhoneAccount.
* @hide
*/
+ @SystemApi
public UserHandle getUserHandle() {
return mUserHandle;
}
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index 43a92cb576e7..a9b725be133f 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -60,11 +60,16 @@ final class RemoteConnectionService {
mPendingConnections.remove(connection);
// Unconditionally initialize the connection ...
connection.setConnectionCapabilities(parcel.getConnectionCapabilities());
- connection.setAddress(
- parcel.getHandle(), parcel.getHandlePresentation());
- connection.setCallerDisplayName(
- parcel.getCallerDisplayName(),
- parcel.getCallerDisplayNamePresentation());
+ if (parcel.getHandle() != null
+ || parcel.getState() != Connection.STATE_DISCONNECTED) {
+ connection.setAddress(parcel.getHandle(), parcel.getHandlePresentation());
+ }
+ if (parcel.getCallerDisplayName() != null
+ || parcel.getState() != Connection.STATE_DISCONNECTED) {
+ connection.setCallerDisplayName(
+ parcel.getCallerDisplayName(),
+ parcel.getCallerDisplayNamePresentation());
+ }
// Set state after handle so that the client can identify the connection.
if (parcel.getState() == Connection.STATE_DISCONNECTED) {
connection.setDisconnected(parcel.getDisconnectCause());
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 1a6b2928af8e..6c5f1c62a539 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -106,7 +106,6 @@ public class TelecomManager {
* {@link VideoProfile.VideoState#BIDIRECTIONAL},
* {@link VideoProfile.VideoState#RX_ENABLED},
* {@link VideoProfile.VideoState#TX_ENABLED}.
- * @hide
*/
public static final String EXTRA_START_CALL_WITH_VIDEO_STATE =
"android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
@@ -117,9 +116,7 @@ public class TelecomManager {
* {@link PhoneAccountHandle} to use when making the call.
* <p class="note">
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
- * @hide
*/
- @SystemApi
public static final String EXTRA_PHONE_ACCOUNT_HANDLE =
"android.telecom.extra.PHONE_ACCOUNT_HANDLE";
@@ -139,10 +136,7 @@ public class TelecomManager {
* {@link android.content.Intent#ACTION_DIAL} {@code Intent} containing a {@link Bundle}
* which contains metadata about the call. This {@link Bundle} will be saved into
* {@code Call.Details}.
- *
- * @hide
*/
- @SystemApi
public static final String EXTRA_OUTGOING_CALL_EXTRAS =
"android.telecom.extra.OUTGOING_CALL_EXTRAS";
@@ -554,9 +548,7 @@ public class TelecomManager {
*
* @param account The {@link PhoneAccountHandle}.
* @return The {@link PhoneAccount} object.
- * @hide
*/
- @SystemApi
public PhoneAccount getPhoneAccount(PhoneAccountHandle account) {
try {
if (isServiceConnected()) {
diff --git a/telecomm/java/android/telecom/VideoProfile.java b/telecomm/java/android/telecom/VideoProfile.java
index f5cb054b0f50..e62e9949bff2 100644
--- a/telecomm/java/android/telecom/VideoProfile.java
+++ b/telecomm/java/android/telecom/VideoProfile.java
@@ -21,8 +21,6 @@ import android.os.Parcelable;
/**
* Represents attributes of video calls.
- *
- * {@hide}
*/
public class VideoProfile implements Parcelable {
/**