diff options
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} <= -2 EV</code></p> * <p><code>Max.exposure compensation * {@link CameraCharacteristics#CONTROL_AE_COMPENSATION_STEP android.control.aeCompensationStep} >= 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 Binary files differdeleted file mode 100644 index d43e4d1fa266..000000000000 --- a/core/res/res/drawable-mdpi/ic_clear_mtrl_alpha.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png Binary files differdeleted file mode 100644 index ddacb59ff51d..000000000000 --- a/core/res/res/drawable-xhdpi/ic_clear_mtrl_alpha.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png Binary files differdeleted file mode 100644 index 21ed91440ff3..000000000000 --- a/core/res/res/drawable-xxhdpi/ic_clear_mtrl_alpha.png +++ /dev/null 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">"<Χωρίς τίτλο>"</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 & 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 & 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 & 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">"Қара & Ақ"</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">"ស & ខ្មៅ"</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">"ಕಪ್ಪು & ಬಿಳುಪು"</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">"കറുപ്പ് & വെള്ള"</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">"Хар & Цагаан"</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 & 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">"कालो & सेतो"</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">"கருப்பு & வெள்ளை"</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">"నలుపు & తెలుపు"</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 & 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 & 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 & 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 { /** |