diff options
484 files changed, 9563 insertions, 5950 deletions
diff --git a/api/current.txt b/api/current.txt index c13c435bc30c..3c2f9021db0b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -861,8 +861,6 @@ package android { field public static final int minResizeWidth = 16843669; // 0x1010395 field public static final int minSdkVersion = 16843276; // 0x101020c field public static final int minWidth = 16843071; // 0x101013f - field public static final int minimalHeight = 16844067; // 0x1010523 - field public static final int minimalWidth = 16844022; // 0x10104f6 field public static final int minimumHorizontalAngle = 16843901; // 0x101047d field public static final int minimumVerticalAngle = 16843902; // 0x101047e field public static final int mipMap = 16843725; // 0x10103cd @@ -943,7 +941,7 @@ package android { field public static final deprecated int phoneNumber = 16843111; // 0x1010167 field public static final int pivotX = 16843189; // 0x10101b5 field public static final int pivotY = 16843190; // 0x10101b6 - field public static final int pointerShape = 16844042; // 0x101050a + field public static final int pointerIcon = 16844042; // 0x101050a field public static final int popupAnimationStyle = 16843465; // 0x10102c9 field public static final int popupBackground = 16843126; // 0x1010176 field public static final int popupCharacters = 16843332; // 0x1010244 @@ -3479,7 +3477,6 @@ package android.app { method public boolean isInMultiWindowMode(); method public boolean isInPictureInPictureMode(); method public boolean isLocalVoiceInteractionSupported(); - method public boolean isOverlayWithDecorCaptionEnabled(); method public boolean isTaskRoot(); method public boolean isVoiceInteraction(); method public boolean isVoiceInteractionRoot(); @@ -3601,7 +3598,6 @@ package android.app { method public void setImmersive(boolean); method public void setIntent(android.content.Intent); method public final void setMediaController(android.media.session.MediaController); - method public void setOverlayWithDecorCaptionEnabled(boolean); method public final deprecated void setProgress(int); method public final deprecated void setProgressBarIndeterminate(boolean); method public final deprecated void setProgressBarIndeterminateVisibility(boolean); @@ -4925,7 +4921,7 @@ package android.app { field public static final int DEFAULT_VIBRATE = 2; // 0x2 field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri"; field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText"; - field public static final java.lang.String EXTRA_CHRONOMETER_COUNTS_DOWN = "android.chronometerCountsDown"; + field public static final java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown"; field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions"; field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle"; field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText"; @@ -5084,7 +5080,7 @@ package android.app { method public android.app.Notification.Builder setActions(android.app.Notification.Action...); method public android.app.Notification.Builder setAutoCancel(boolean); method public android.app.Notification.Builder setCategory(java.lang.String); - method public android.app.Notification.Builder setChronometerCountsDown(boolean); + method public android.app.Notification.Builder setChronometerCountDown(boolean); method public android.app.Notification.Builder setColor(int); method public deprecated android.app.Notification.Builder setContent(android.widget.RemoteViews); method public deprecated android.app.Notification.Builder setContentInfo(java.lang.CharSequence); @@ -5632,7 +5628,6 @@ package android.app { public final class UiAutomation { method public void clearWindowAnimationFrameStats(); method public boolean clearWindowContentFrameStats(int); - method public void destroy(); method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException; method public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String); method public android.view.accessibility.AccessibilityNodeInfo findFocus(int); @@ -5776,7 +5771,9 @@ package android.app { method public void clearWallpaperOffsets(android.os.IBinder); method public void forgetLoadedWallpaper(); method public android.graphics.drawable.Drawable getBuiltInDrawable(); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int); method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float, int); method public android.content.Intent getCropAndSetWallpaperIntent(android.net.Uri); method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); @@ -5787,7 +5784,7 @@ package android.app { method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); method public boolean hasResourceWallpaper(int); - method public boolean isWallpaperSettingAllowed(); + method public boolean isSetWallpaperAllowed(); method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); @@ -6326,9 +6323,9 @@ package android.app.job { method public long getInitialBackoffMillis(); method public long getIntervalMillis(); method public long getMaxExecutionDelayMillis(); + method public static final long getMinFlexMillis(); method public long getMinLatencyMillis(); - method public static final long getMinimumFlex(); - method public static final long getMinimumPeriod(); + method public static final long getMinPeriodMillis(); method public int getNetworkType(); method public android.content.ComponentName getService(); method public long getTriggerContentMaxDelay(); @@ -9327,8 +9324,8 @@ package android.content.pm { field public final int gravity; field public final int height; field public final float heightFraction; - field public final int minimalHeight; - field public final int minimalWidth; + field public final int minHeight; + field public final int minWidth; field public final int width; field public final float widthFraction; } @@ -10117,14 +10114,14 @@ package android.content.res { method public int diff(android.content.res.Configuration); method public boolean equals(android.content.res.Configuration); method public int getLayoutDirection(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public boolean isLayoutSizeAtLeast(int); method public boolean isScreenRound(); method public static boolean needNewResources(int, int); method public void readFromParcel(android.os.Parcel); method public void setLayoutDirection(java.util.Locale); method public void setLocale(java.util.Locale); - method public void setLocales(android.util.LocaleList); + method public void setLocales(android.os.LocaleList); method public void setTo(android.content.res.Configuration); method public void setToDefaults(); method public int updateFrom(android.content.res.Configuration); @@ -12036,7 +12033,7 @@ package android.graphics { method public void getTextBounds(java.lang.String, int, int, android.graphics.Rect); method public void getTextBounds(char[], int, int, android.graphics.Rect); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public void getTextPath(char[], int, int, float, float, android.graphics.Path); method public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path); method public float getTextScaleX(); @@ -12092,7 +12089,7 @@ package android.graphics { method public void setSubpixelText(boolean); method public void setTextAlign(android.graphics.Paint.Align); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSkewX(float); @@ -22881,7 +22878,7 @@ package android.media.tv { public static final class TvInputInfo.Builder { ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); - method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public android.media.tv.TvInputInfo build(); method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setExtras(android.os.Bundle); method public android.media.tv.TvInputInfo.Builder setTunerCount(int); @@ -28676,6 +28673,24 @@ package android.os { method public abstract android.os.IBinder asBinder(); } + public final class LocaleList implements android.os.Parcelable { + ctor public LocaleList(java.util.Locale...); + method public int describeContents(); + method public static android.os.LocaleList forLanguageTags(java.lang.String); + method public java.util.Locale get(int); + method public static android.os.LocaleList getAdjustedDefault(); + method public static android.os.LocaleList getDefault(); + method public static android.os.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); + method public int indexOf(java.util.Locale); + method public boolean isEmpty(); + method public static void setDefault(android.os.LocaleList); + method public int size(); + method public java.lang.String toLanguageTags(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.os.LocaleList> CREATOR; + } + public final class Looper { method public void dump(android.util.Printer, java.lang.String); method public static android.os.Looper getMainLooper(); @@ -29369,7 +29384,6 @@ package android.os.health { } public class SystemHealthManager { - method public static android.os.health.SystemHealthManager from(android.content.Context); method public android.os.health.HealthStats takeMyUidSnapshot(); method public android.os.health.HealthStats takeUidSnapshot(int); method public android.os.health.HealthStats[] takeUidSnapshots(int[]); @@ -39216,11 +39230,11 @@ package android.text.style { public class LocaleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan { ctor public LocaleSpan(java.util.Locale); - ctor public LocaleSpan(android.util.LocaleList); + ctor public LocaleSpan(android.os.LocaleList); ctor public LocaleSpan(android.os.Parcel); method public int describeContents(); method public java.util.Locale getLocale(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public int getSpanTypeId(); method public void updateDrawState(android.text.TextPaint); method public void updateMeasureState(android.text.TextPaint); @@ -40239,24 +40253,6 @@ package android.util { field public static final int RTL = 1; // 0x1 } - public final class LocaleList implements android.os.Parcelable { - ctor public LocaleList(java.util.Locale...); - method public int describeContents(); - method public static android.util.LocaleList forLanguageTags(java.lang.String); - method public java.util.Locale get(int); - method public static android.util.LocaleList getAdjustedDefault(); - method public static android.util.LocaleList getDefault(); - method public static android.util.LocaleList getEmptyLocaleList(); - method public java.util.Locale getFirstMatch(java.lang.String[]); - method public int indexOf(java.util.Locale); - method public boolean isEmpty(); - method public static void setDefault(android.util.LocaleList); - method public int size(); - method public java.lang.String toLanguageTags(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR; - } - public final class Log { method public static int d(java.lang.String, java.lang.String); method public static int d(java.lang.String, java.lang.String, java.lang.Throwable); @@ -40827,7 +40823,6 @@ package android.view { } public static final class Display.HdrCapabilities implements android.os.Parcelable { - ctor public Display.HdrCapabilities(int[], float, float, float); method public int describeContents(); method public float getDesiredMaxAverageLuminance(); method public float getDesiredMaxLuminance(); @@ -41939,35 +41934,35 @@ package android.view { } public final class PointerIcon implements android.os.Parcelable { - method public static android.view.PointerIcon createCustomIcon(android.graphics.Bitmap, float, float); + method public static android.view.PointerIcon create(android.graphics.Bitmap, float, float); method public int describeContents(); method public static android.view.PointerIcon getSystemIcon(android.content.Context, int); - method public static android.view.PointerIcon loadCustomIcon(android.content.res.Resources, int); + method public static android.view.PointerIcon load(android.content.res.Resources, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.PointerIcon> CREATOR; - field public static final int STYLE_ALIAS = 1010; // 0x3f2 - field public static final int STYLE_ALL_SCROLL = 1013; // 0x3f5 - field public static final int STYLE_ARROW = 1000; // 0x3e8 - field public static final int STYLE_CELL = 1006; // 0x3ee - field public static final int STYLE_CONTEXT_MENU = 1001; // 0x3e9 - field public static final int STYLE_COPY = 1011; // 0x3f3 - field public static final int STYLE_CROSSHAIR = 1007; // 0x3ef - field public static final int STYLE_DEFAULT = 1000; // 0x3e8 - field public static final int STYLE_GRAB = 1020; // 0x3fc - field public static final int STYLE_GRABBING = 1021; // 0x3fd - field public static final int STYLE_HAND = 1002; // 0x3ea - field public static final int STYLE_HELP = 1003; // 0x3eb - field public static final int STYLE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 - field public static final int STYLE_NO_DROP = 1012; // 0x3f4 - field public static final int STYLE_NULL = 0; // 0x0 - field public static final int STYLE_TEXT = 1008; // 0x3f0 - field public static final int STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 - field public static final int STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 - field public static final int STYLE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 - field public static final int STYLE_VERTICAL_TEXT = 1009; // 0x3f1 - field public static final int STYLE_WAIT = 1004; // 0x3ec - field public static final int STYLE_ZOOM_IN = 1018; // 0x3fa - field public static final int STYLE_ZOOM_OUT = 1019; // 0x3fb + field public static final int TYPE_ALIAS = 1010; // 0x3f2 + field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5 + field public static final int TYPE_ARROW = 1000; // 0x3e8 + field public static final int TYPE_CELL = 1006; // 0x3ee + field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9 + field public static final int TYPE_COPY = 1011; // 0x3f3 + field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef + field public static final int TYPE_DEFAULT = 1000; // 0x3e8 + field public static final int TYPE_GRAB = 1020; // 0x3fc + field public static final int TYPE_GRABBING = 1021; // 0x3fd + field public static final int TYPE_HAND = 1002; // 0x3ea + field public static final int TYPE_HELP = 1003; // 0x3eb + field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 + field public static final int TYPE_NO_DROP = 1012; // 0x3f4 + field public static final int TYPE_NULL = 0; // 0x0 + field public static final int TYPE_TEXT = 1008; // 0x3f0 + field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 + field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 + field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 + field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1 + field public static final int TYPE_WAIT = 1004; // 0x3ec + field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa + field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb } public class ScaleGestureDetector { @@ -42333,7 +42328,7 @@ package android.view { method public android.view.ViewParent getParentForAccessibility(); method public float getPivotX(); method public float getPivotY(); - method public android.view.PointerIcon getPointerIcon(android.view.MotionEvent, float, float); + method public android.view.PointerIcon getPointerIcon(); method public android.content.res.Resources getResources(); method public final int getRight(); method protected float getRightFadingEdgeStrength(); @@ -42484,6 +42479,7 @@ package android.view { method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public void onProvideStructure(android.view.ViewStructure); method public void onProvideVirtualStructure(android.view.ViewStructure); + method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int); method protected void onRestoreInstanceState(android.os.Parcelable); method public void onRtlPropertiesChanged(int); method protected android.os.Parcelable onSaveInstanceState(); @@ -42530,6 +42526,7 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); + method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); @@ -42620,7 +42617,6 @@ package android.view { method public void setPaddingRelative(int, int, int, int); method public void setPivotX(float); method public void setPivotY(float); - method public void setPointerCapture(); method public void setPointerIcon(android.view.PointerIcon); method public void setPressed(boolean); method public final void setRight(int); @@ -44656,7 +44652,7 @@ package android.view.inputmethod { field public android.os.Bundle extras; field public int fieldId; field public java.lang.String fieldName; - field public android.util.LocaleList hintLocales; + field public android.os.LocaleList hintLocales; field public java.lang.CharSequence hintText; field public int imeOptions; field public int initialCapsMode; @@ -47943,7 +47939,7 @@ package android.widget { method public int getHyphenationFrequency(); method public int getImeActionId(); method public java.lang.CharSequence getImeActionLabel(); - method public android.util.LocaleList getImeHintLocales(); + method public android.os.LocaleList getImeHintLocales(); method public int getImeOptions(); method public boolean getIncludeFontPadding(); method public android.os.Bundle getInputExtras(boolean); @@ -47982,7 +47978,7 @@ package android.widget { method public java.lang.CharSequence getText(); method public final android.content.res.ColorStateList getTextColors(); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public float getTextScaleX(); method public float getTextSize(); method public int getTotalPaddingBottom(); @@ -48050,7 +48046,7 @@ package android.widget { method public void setHorizontallyScrolling(boolean); method public void setHyphenationFrequency(int); method public void setImeActionLabel(java.lang.CharSequence, int); - method public void setImeHintLocales(android.util.LocaleList); + method public void setImeHintLocales(android.os.LocaleList); method public void setImeOptions(int); method public void setIncludeFontPadding(boolean); method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; @@ -48096,7 +48092,7 @@ package android.widget { method public final void setTextKeepState(java.lang.CharSequence); method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSize(int, float); @@ -51410,7 +51406,6 @@ package java.lang { method public java.lang.StringBuffer insert(int, double); method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String); method public synchronized java.lang.StringBuffer reverse(); - method public synchronized java.lang.String toString(); } public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable { @@ -51448,7 +51443,6 @@ package java.lang { method public java.lang.StringBuilder insert(int, double); method public java.lang.StringBuilder replace(int, int, java.lang.String); method public java.lang.StringBuilder reverse(); - method public java.lang.String toString(); } public class StringIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException { @@ -51812,9 +51806,7 @@ package java.lang.reflect { } public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -51899,7 +51891,6 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); method public java.lang.Class<?> getDeclaringClass(); method public java.lang.Object getDefaultValue(); diff --git a/api/removed.txt b/api/removed.txt index a1602184ddbe..42c64ea62cce 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -1,3 +1,17 @@ +package android { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + package android.app { public class Notification implements android.os.Parcelable { @@ -483,3 +497,17 @@ package android.widget { } +package com.android.internal { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + diff --git a/api/system-current.txt b/api/system-current.txt index 61cd00a702be..5ea2ee045002 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -967,8 +967,6 @@ package android { field public static final int minResizeWidth = 16843669; // 0x1010395 field public static final int minSdkVersion = 16843276; // 0x101020c field public static final int minWidth = 16843071; // 0x101013f - field public static final int minimalHeight = 16844067; // 0x1010523 - field public static final int minimalWidth = 16844022; // 0x10104f6 field public static final int minimumHorizontalAngle = 16843901; // 0x101047d field public static final int minimumVerticalAngle = 16843902; // 0x101047e field public static final int mipMap = 16843725; // 0x10103cd @@ -1049,7 +1047,7 @@ package android { field public static final deprecated int phoneNumber = 16843111; // 0x1010167 field public static final int pivotX = 16843189; // 0x10101b5 field public static final int pivotY = 16843190; // 0x10101b6 - field public static final int pointerShape = 16844042; // 0x101050a + field public static final int pointerIcon = 16844042; // 0x101050a field public static final int popupAnimationStyle = 16843465; // 0x10102c9 field public static final int popupBackground = 16843126; // 0x1010176 field public static final int popupCharacters = 16843332; // 0x1010244 @@ -3606,7 +3604,6 @@ package android.app { method public boolean isInMultiWindowMode(); method public boolean isInPictureInPictureMode(); method public boolean isLocalVoiceInteractionSupported(); - method public boolean isOverlayWithDecorCaptionEnabled(); method public boolean isTaskRoot(); method public boolean isVoiceInteraction(); method public boolean isVoiceInteractionRoot(); @@ -3729,7 +3726,6 @@ package android.app { method public void setImmersive(boolean); method public void setIntent(android.content.Intent); method public final void setMediaController(android.media.session.MediaController); - method public void setOverlayWithDecorCaptionEnabled(boolean); method public final deprecated void setProgress(int); method public final deprecated void setProgressBarIndeterminate(boolean); method public final deprecated void setProgressBarIndeterminateVisibility(boolean); @@ -5070,7 +5066,7 @@ package android.app { field public static final int DEFAULT_VIBRATE = 2; // 0x2 field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri"; field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText"; - field public static final java.lang.String EXTRA_CHRONOMETER_COUNTS_DOWN = "android.chronometerCountsDown"; + field public static final java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown"; field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions"; field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle"; field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText"; @@ -5231,7 +5227,7 @@ package android.app { method public android.app.Notification.Builder setActions(android.app.Notification.Action...); method public android.app.Notification.Builder setAutoCancel(boolean); method public android.app.Notification.Builder setCategory(java.lang.String); - method public android.app.Notification.Builder setChronometerCountsDown(boolean); + method public android.app.Notification.Builder setChronometerCountDown(boolean); method public android.app.Notification.Builder setColor(int); method public deprecated android.app.Notification.Builder setContent(android.widget.RemoteViews); method public deprecated android.app.Notification.Builder setContentInfo(java.lang.CharSequence); @@ -5779,7 +5775,6 @@ package android.app { public final class UiAutomation { method public void clearWindowAnimationFrameStats(); method public boolean clearWindowContentFrameStats(int); - method public void destroy(); method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException; method public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String); method public android.view.accessibility.AccessibilityNodeInfo findFocus(int); @@ -5925,7 +5920,9 @@ package android.app { method public void clearWallpaperOffsets(android.os.IBinder); method public void forgetLoadedWallpaper(); method public android.graphics.drawable.Drawable getBuiltInDrawable(); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int); method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float, int); method public android.content.Intent getCropAndSetWallpaperIntent(android.net.Uri); method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); @@ -5936,7 +5933,7 @@ package android.app { method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); method public boolean hasResourceWallpaper(int); - method public boolean isWallpaperSettingAllowed(); + method public boolean isSetWallpaperAllowed(); method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); @@ -6607,9 +6604,9 @@ package android.app.job { method public long getInitialBackoffMillis(); method public long getIntervalMillis(); method public long getMaxExecutionDelayMillis(); + method public static final long getMinFlexMillis(); method public long getMinLatencyMillis(); - method public static final long getMinimumFlex(); - method public static final long getMinimumPeriod(); + method public static final long getMinPeriodMillis(); method public int getNetworkType(); method public android.content.ComponentName getService(); method public long getTriggerContentMaxDelay(); @@ -8886,7 +8883,6 @@ package android.content { field public static final java.lang.String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED"; field public static final java.lang.String ACTION_INSERT = "android.intent.action.INSERT"; field public static final java.lang.String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT"; - field public static final java.lang.String ACTION_INSTALL_EPHEMERAL_PACKAGE = "android.intent.action.INSTALL_EPHEMERAL_PACKAGE"; field public static final java.lang.String ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE"; field public static final java.lang.String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"; field public static final java.lang.String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED"; @@ -8944,7 +8940,6 @@ package android.content { field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK"; field public static final java.lang.String ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW"; field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT"; - field public static final java.lang.String ACTION_RESOLVE_EPHEMERAL_PACKAGE = "android.intent.action.RESOLVE_EPHEMERAL_PACKAGE"; field public static final java.lang.String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS"; field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN"; field public static final java.lang.String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF"; @@ -9040,8 +9035,6 @@ package android.content { field public static final int EXTRA_DOCK_STATE_UNDOCKED = 0; // 0x0 field public static final java.lang.String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP"; field public static final java.lang.String EXTRA_EMAIL = "android.intent.extra.EMAIL"; - field public static final java.lang.String EXTRA_EPHEMERAL_FAILURE = "android.intent.extra.EPHEMERAL_FAILURE"; - field public static final java.lang.String EXTRA_EPHEMERAL_SUCCESS = "android.intent.extra.EPHEMERAL_SUCCESS"; field public static final java.lang.String EXTRA_EXCLUDE_COMPONENTS = "android.intent.extra.EXCLUDE_COMPONENTS"; field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT"; field public static final java.lang.String EXTRA_INDEX = "android.intent.extra.INDEX"; @@ -9671,8 +9664,8 @@ package android.content.pm { field public final int gravity; field public final int height; field public final float heightFraction; - field public final int minimalHeight; - field public final int minimalWidth; + field public final int minHeight; + field public final int minWidth; field public final int width; field public final float widthFraction; } @@ -10558,14 +10551,14 @@ package android.content.res { method public int diff(android.content.res.Configuration); method public boolean equals(android.content.res.Configuration); method public int getLayoutDirection(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public boolean isLayoutSizeAtLeast(int); method public boolean isScreenRound(); method public static boolean needNewResources(int, int); method public void readFromParcel(android.os.Parcel); method public void setLayoutDirection(java.util.Locale); method public void setLocale(java.util.Locale); - method public void setLocales(android.util.LocaleList); + method public void setLocales(android.os.LocaleList); method public void setTo(android.content.res.Configuration); method public void setToDefaults(); method public int updateFrom(android.content.res.Configuration); @@ -12477,7 +12470,7 @@ package android.graphics { method public void getTextBounds(java.lang.String, int, int, android.graphics.Rect); method public void getTextBounds(char[], int, int, android.graphics.Rect); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public void getTextPath(char[], int, int, float, float, android.graphics.Path); method public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path); method public float getTextScaleX(); @@ -12533,7 +12526,7 @@ package android.graphics { method public void setSubpixelText(boolean); method public void setTextAlign(android.graphics.Paint.Align); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSkewX(float); @@ -24583,7 +24576,7 @@ package android.media.tv { public static final class TvInputInfo.Builder { ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); - method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public android.media.tv.TvInputInfo build(); method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setExtras(android.os.Bundle); method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo); @@ -31119,6 +31112,24 @@ package android.os { method public abstract android.os.IBinder asBinder(); } + public final class LocaleList implements android.os.Parcelable { + ctor public LocaleList(java.util.Locale...); + method public int describeContents(); + method public static android.os.LocaleList forLanguageTags(java.lang.String); + method public java.util.Locale get(int); + method public static android.os.LocaleList getAdjustedDefault(); + method public static android.os.LocaleList getDefault(); + method public static android.os.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); + method public int indexOf(java.util.Locale); + method public boolean isEmpty(); + method public static void setDefault(android.os.LocaleList); + method public int size(); + method public java.lang.String toLanguageTags(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.os.LocaleList> CREATOR; + } + public final class Looper { method public void dump(android.util.Printer, java.lang.String); method public static android.os.Looper getMainLooper(); @@ -31763,6 +31774,7 @@ package android.os { method public android.os.UserHandle getUserForSerialNumber(long); method public java.lang.String getUserName(); method public java.util.List<android.os.UserHandle> getUserProfiles(); + method public int getUserRestrictionSource(java.lang.String, android.os.UserHandle); method public android.os.Bundle getUserRestrictions(); method public android.os.Bundle getUserRestrictions(android.os.UserHandle); method public boolean hasUserRestriction(java.lang.String); @@ -31815,10 +31827,17 @@ package android.os { field public static final java.lang.String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer"; field public static final java.lang.String ENSURE_VERIFY_APPS = "ensure_verify_apps"; field public static final java.lang.String KEY_RESTRICTIONS_PENDING = "restrictions_pending"; + field public static final int RESTRICTION_NOT_SET = 0; // 0x0 + field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2 + field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4 + field public static final int RESTRICTION_SOURCE_SYSTEM = 1; // 0x1 field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1 field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2 } + public static abstract class UserManager.UserRestrictionSource implements java.lang.annotation.Annotation { + } + public abstract class Vibrator { method public abstract void cancel(); method public abstract boolean hasVibrator(); @@ -31897,7 +31916,6 @@ package android.os.health { } public class SystemHealthManager { - method public static android.os.health.SystemHealthManager from(android.content.Context); method public android.os.health.HealthStats takeMyUidSnapshot(); method public android.os.health.HealthStats takeUidSnapshot(int); method public android.os.health.HealthStats[] takeUidSnapshots(int[]); @@ -42210,11 +42228,11 @@ package android.text.style { public class LocaleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan { ctor public LocaleSpan(java.util.Locale); - ctor public LocaleSpan(android.util.LocaleList); + ctor public LocaleSpan(android.os.LocaleList); ctor public LocaleSpan(android.os.Parcel); method public int describeContents(); method public java.util.Locale getLocale(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public int getSpanTypeId(); method public void updateDrawState(android.text.TextPaint); method public void updateMeasureState(android.text.TextPaint); @@ -43233,24 +43251,6 @@ package android.util { field public static final int RTL = 1; // 0x1 } - public final class LocaleList implements android.os.Parcelable { - ctor public LocaleList(java.util.Locale...); - method public int describeContents(); - method public static android.util.LocaleList forLanguageTags(java.lang.String); - method public java.util.Locale get(int); - method public static android.util.LocaleList getAdjustedDefault(); - method public static android.util.LocaleList getDefault(); - method public static android.util.LocaleList getEmptyLocaleList(); - method public java.util.Locale getFirstMatch(java.lang.String[]); - method public int indexOf(java.util.Locale); - method public boolean isEmpty(); - method public static void setDefault(android.util.LocaleList); - method public int size(); - method public java.lang.String toLanguageTags(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR; - } - public final class Log { method public static int d(java.lang.String, java.lang.String); method public static int d(java.lang.String, java.lang.String, java.lang.Throwable); @@ -43821,7 +43821,6 @@ package android.view { } public static final class Display.HdrCapabilities implements android.os.Parcelable { - ctor public Display.HdrCapabilities(int[], float, float, float); method public int describeContents(); method public float getDesiredMaxAverageLuminance(); method public float getDesiredMaxLuminance(); @@ -44933,35 +44932,35 @@ package android.view { } public final class PointerIcon implements android.os.Parcelable { - method public static android.view.PointerIcon createCustomIcon(android.graphics.Bitmap, float, float); + method public static android.view.PointerIcon create(android.graphics.Bitmap, float, float); method public int describeContents(); method public static android.view.PointerIcon getSystemIcon(android.content.Context, int); - method public static android.view.PointerIcon loadCustomIcon(android.content.res.Resources, int); + method public static android.view.PointerIcon load(android.content.res.Resources, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.PointerIcon> CREATOR; - field public static final int STYLE_ALIAS = 1010; // 0x3f2 - field public static final int STYLE_ALL_SCROLL = 1013; // 0x3f5 - field public static final int STYLE_ARROW = 1000; // 0x3e8 - field public static final int STYLE_CELL = 1006; // 0x3ee - field public static final int STYLE_CONTEXT_MENU = 1001; // 0x3e9 - field public static final int STYLE_COPY = 1011; // 0x3f3 - field public static final int STYLE_CROSSHAIR = 1007; // 0x3ef - field public static final int STYLE_DEFAULT = 1000; // 0x3e8 - field public static final int STYLE_GRAB = 1020; // 0x3fc - field public static final int STYLE_GRABBING = 1021; // 0x3fd - field public static final int STYLE_HAND = 1002; // 0x3ea - field public static final int STYLE_HELP = 1003; // 0x3eb - field public static final int STYLE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 - field public static final int STYLE_NO_DROP = 1012; // 0x3f4 - field public static final int STYLE_NULL = 0; // 0x0 - field public static final int STYLE_TEXT = 1008; // 0x3f0 - field public static final int STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 - field public static final int STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 - field public static final int STYLE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 - field public static final int STYLE_VERTICAL_TEXT = 1009; // 0x3f1 - field public static final int STYLE_WAIT = 1004; // 0x3ec - field public static final int STYLE_ZOOM_IN = 1018; // 0x3fa - field public static final int STYLE_ZOOM_OUT = 1019; // 0x3fb + field public static final int TYPE_ALIAS = 1010; // 0x3f2 + field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5 + field public static final int TYPE_ARROW = 1000; // 0x3e8 + field public static final int TYPE_CELL = 1006; // 0x3ee + field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9 + field public static final int TYPE_COPY = 1011; // 0x3f3 + field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef + field public static final int TYPE_DEFAULT = 1000; // 0x3e8 + field public static final int TYPE_GRAB = 1020; // 0x3fc + field public static final int TYPE_GRABBING = 1021; // 0x3fd + field public static final int TYPE_HAND = 1002; // 0x3ea + field public static final int TYPE_HELP = 1003; // 0x3eb + field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 + field public static final int TYPE_NO_DROP = 1012; // 0x3f4 + field public static final int TYPE_NULL = 0; // 0x0 + field public static final int TYPE_TEXT = 1008; // 0x3f0 + field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 + field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 + field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 + field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1 + field public static final int TYPE_WAIT = 1004; // 0x3ec + field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa + field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb } public class ScaleGestureDetector { @@ -45327,7 +45326,7 @@ package android.view { method public android.view.ViewParent getParentForAccessibility(); method public float getPivotX(); method public float getPivotY(); - method public android.view.PointerIcon getPointerIcon(android.view.MotionEvent, float, float); + method public android.view.PointerIcon getPointerIcon(); method public android.content.res.Resources getResources(); method public final int getRight(); method protected float getRightFadingEdgeStrength(); @@ -45478,6 +45477,7 @@ package android.view { method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public void onProvideStructure(android.view.ViewStructure); method public void onProvideVirtualStructure(android.view.ViewStructure); + method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int); method protected void onRestoreInstanceState(android.os.Parcelable); method public void onRtlPropertiesChanged(int); method protected android.os.Parcelable onSaveInstanceState(); @@ -45524,6 +45524,7 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); + method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); @@ -45614,7 +45615,6 @@ package android.view { method public void setPaddingRelative(int, int, int, int); method public void setPivotX(float); method public void setPivotY(float); - method public void setPointerCapture(); method public void setPointerIcon(android.view.PointerIcon); method public void setPressed(boolean); method public final void setRight(int); @@ -47653,7 +47653,7 @@ package android.view.inputmethod { field public android.os.Bundle extras; field public int fieldId; field public java.lang.String fieldName; - field public android.util.LocaleList hintLocales; + field public android.os.LocaleList hintLocales; field public java.lang.CharSequence hintText; field public int imeOptions; field public int initialCapsMode; @@ -51294,7 +51294,7 @@ package android.widget { method public int getHyphenationFrequency(); method public int getImeActionId(); method public java.lang.CharSequence getImeActionLabel(); - method public android.util.LocaleList getImeHintLocales(); + method public android.os.LocaleList getImeHintLocales(); method public int getImeOptions(); method public boolean getIncludeFontPadding(); method public android.os.Bundle getInputExtras(boolean); @@ -51333,7 +51333,7 @@ package android.widget { method public java.lang.CharSequence getText(); method public final android.content.res.ColorStateList getTextColors(); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public float getTextScaleX(); method public float getTextSize(); method public int getTotalPaddingBottom(); @@ -51401,7 +51401,7 @@ package android.widget { method public void setHorizontallyScrolling(boolean); method public void setHyphenationFrequency(int); method public void setImeActionLabel(java.lang.CharSequence, int); - method public void setImeHintLocales(android.util.LocaleList); + method public void setImeHintLocales(android.os.LocaleList); method public void setImeOptions(int); method public void setIncludeFontPadding(boolean); method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; @@ -51447,7 +51447,7 @@ package android.widget { method public final void setTextKeepState(java.lang.CharSequence); method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSize(int, float); @@ -54761,7 +54761,6 @@ package java.lang { method public java.lang.StringBuffer insert(int, double); method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String); method public synchronized java.lang.StringBuffer reverse(); - method public synchronized java.lang.String toString(); } public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable { @@ -54799,7 +54798,6 @@ package java.lang { method public java.lang.StringBuilder insert(int, double); method public java.lang.StringBuilder replace(int, int, java.lang.String); method public java.lang.StringBuilder reverse(); - method public java.lang.String toString(); } public class StringIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException { @@ -55163,9 +55161,7 @@ package java.lang.reflect { } public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -55250,7 +55246,6 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); method public java.lang.Class<?> getDeclaringClass(); method public java.lang.Object getDefaultValue(); diff --git a/api/system-removed.txt b/api/system-removed.txt index 3f2613ed17f3..4873605d4e1d 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -1,3 +1,17 @@ +package android { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + package android.app { public class Notification implements android.os.Parcelable { @@ -481,3 +495,17 @@ package android.widget { } +package com.android.internal { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + diff --git a/api/test-current.txt b/api/test-current.txt index 9165cb0018bb..0e9953a6626e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -861,8 +861,6 @@ package android { field public static final int minResizeWidth = 16843669; // 0x1010395 field public static final int minSdkVersion = 16843276; // 0x101020c field public static final int minWidth = 16843071; // 0x101013f - field public static final int minimalHeight = 16844067; // 0x1010523 - field public static final int minimalWidth = 16844022; // 0x10104f6 field public static final int minimumHorizontalAngle = 16843901; // 0x101047d field public static final int minimumVerticalAngle = 16843902; // 0x101047e field public static final int mipMap = 16843725; // 0x10103cd @@ -943,7 +941,7 @@ package android { field public static final deprecated int phoneNumber = 16843111; // 0x1010167 field public static final int pivotX = 16843189; // 0x10101b5 field public static final int pivotY = 16843190; // 0x10101b6 - field public static final int pointerShape = 16844042; // 0x101050a + field public static final int pointerIcon = 16844042; // 0x101050a field public static final int popupAnimationStyle = 16843465; // 0x10102c9 field public static final int popupBackground = 16843126; // 0x1010176 field public static final int popupCharacters = 16843332; // 0x1010244 @@ -3479,7 +3477,6 @@ package android.app { method public boolean isInMultiWindowMode(); method public boolean isInPictureInPictureMode(); method public boolean isLocalVoiceInteractionSupported(); - method public boolean isOverlayWithDecorCaptionEnabled(); method public boolean isTaskRoot(); method public boolean isVoiceInteraction(); method public boolean isVoiceInteractionRoot(); @@ -3601,7 +3598,6 @@ package android.app { method public void setImmersive(boolean); method public void setIntent(android.content.Intent); method public final void setMediaController(android.media.session.MediaController); - method public void setOverlayWithDecorCaptionEnabled(boolean); method public final deprecated void setProgress(int); method public final deprecated void setProgressBarIndeterminate(boolean); method public final deprecated void setProgressBarIndeterminateVisibility(boolean); @@ -4926,7 +4922,7 @@ package android.app { field public static final int DEFAULT_VIBRATE = 2; // 0x2 field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri"; field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText"; - field public static final java.lang.String EXTRA_CHRONOMETER_COUNTS_DOWN = "android.chronometerCountsDown"; + field public static final java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown"; field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions"; field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle"; field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText"; @@ -5085,7 +5081,7 @@ package android.app { method public android.app.Notification.Builder setActions(android.app.Notification.Action...); method public android.app.Notification.Builder setAutoCancel(boolean); method public android.app.Notification.Builder setCategory(java.lang.String); - method public android.app.Notification.Builder setChronometerCountsDown(boolean); + method public android.app.Notification.Builder setChronometerCountDown(boolean); method public android.app.Notification.Builder setColor(int); method public deprecated android.app.Notification.Builder setContent(android.widget.RemoteViews); method public deprecated android.app.Notification.Builder setContentInfo(java.lang.CharSequence); @@ -5781,7 +5777,9 @@ package android.app { method public void clearWallpaperOffsets(android.os.IBinder); method public void forgetLoadedWallpaper(); method public android.graphics.drawable.Drawable getBuiltInDrawable(); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int); method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float); + method public android.graphics.drawable.Drawable getBuiltInDrawable(int, int, boolean, float, float, int); method public android.content.Intent getCropAndSetWallpaperIntent(android.net.Uri); method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); @@ -5792,7 +5790,7 @@ package android.app { method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); method public boolean hasResourceWallpaper(int); - method public boolean isWallpaperSettingAllowed(); + method public boolean isSetWallpaperAllowed(); method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); @@ -6331,9 +6329,9 @@ package android.app.job { method public long getInitialBackoffMillis(); method public long getIntervalMillis(); method public long getMaxExecutionDelayMillis(); + method public static final long getMinFlexMillis(); method public long getMinLatencyMillis(); - method public static final long getMinimumFlex(); - method public static final long getMinimumPeriod(); + method public static final long getMinPeriodMillis(); method public int getNetworkType(); method public android.content.ComponentName getService(); method public long getTriggerContentMaxDelay(); @@ -9335,8 +9333,8 @@ package android.content.pm { field public final int gravity; field public final int height; field public final float heightFraction; - field public final int minimalHeight; - field public final int minimalWidth; + field public final int minHeight; + field public final int minWidth; field public final int width; field public final float widthFraction; } @@ -10129,14 +10127,14 @@ package android.content.res { method public int diff(android.content.res.Configuration); method public boolean equals(android.content.res.Configuration); method public int getLayoutDirection(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public boolean isLayoutSizeAtLeast(int); method public boolean isScreenRound(); method public static boolean needNewResources(int, int); method public void readFromParcel(android.os.Parcel); method public void setLayoutDirection(java.util.Locale); method public void setLocale(java.util.Locale); - method public void setLocales(android.util.LocaleList); + method public void setLocales(android.os.LocaleList); method public void setTo(android.content.res.Configuration); method public void setToDefaults(); method public int updateFrom(android.content.res.Configuration); @@ -12048,7 +12046,7 @@ package android.graphics { method public void getTextBounds(java.lang.String, int, int, android.graphics.Rect); method public void getTextBounds(char[], int, int, android.graphics.Rect); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public void getTextPath(char[], int, int, float, float, android.graphics.Path); method public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path); method public float getTextScaleX(); @@ -12104,7 +12102,7 @@ package android.graphics { method public void setSubpixelText(boolean); method public void setTextAlign(android.graphics.Paint.Align); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSkewX(float); @@ -22949,7 +22947,7 @@ package android.media.tv { public static final class TvInputInfo.Builder { ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); - method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public android.media.tv.TvInputInfo build(); method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setExtras(android.os.Bundle); method public android.media.tv.TvInputInfo.Builder setTunerCount(int); @@ -28744,6 +28742,24 @@ package android.os { method public abstract android.os.IBinder asBinder(); } + public final class LocaleList implements android.os.Parcelable { + ctor public LocaleList(java.util.Locale...); + method public int describeContents(); + method public static android.os.LocaleList forLanguageTags(java.lang.String); + method public java.util.Locale get(int); + method public static android.os.LocaleList getAdjustedDefault(); + method public static android.os.LocaleList getDefault(); + method public static android.os.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); + method public int indexOf(java.util.Locale); + method public boolean isEmpty(); + method public static void setDefault(android.os.LocaleList); + method public int size(); + method public java.lang.String toLanguageTags(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.os.LocaleList> CREATOR; + } + public final class Looper { method public void dump(android.util.Printer, java.lang.String); method public static android.os.Looper getMainLooper(); @@ -29438,7 +29454,6 @@ package android.os.health { } public class SystemHealthManager { - method public static android.os.health.SystemHealthManager from(android.content.Context); method public android.os.health.HealthStats takeMyUidSnapshot(); method public android.os.health.HealthStats takeUidSnapshot(int); method public android.os.health.HealthStats[] takeUidSnapshots(int[]); @@ -39294,11 +39309,11 @@ package android.text.style { public class LocaleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan { ctor public LocaleSpan(java.util.Locale); - ctor public LocaleSpan(android.util.LocaleList); + ctor public LocaleSpan(android.os.LocaleList); ctor public LocaleSpan(android.os.Parcel); method public int describeContents(); method public java.util.Locale getLocale(); - method public android.util.LocaleList getLocales(); + method public android.os.LocaleList getLocales(); method public int getSpanTypeId(); method public void updateDrawState(android.text.TextPaint); method public void updateMeasureState(android.text.TextPaint); @@ -40317,24 +40332,6 @@ package android.util { field public static final int RTL = 1; // 0x1 } - public final class LocaleList implements android.os.Parcelable { - ctor public LocaleList(java.util.Locale...); - method public int describeContents(); - method public static android.util.LocaleList forLanguageTags(java.lang.String); - method public java.util.Locale get(int); - method public static android.util.LocaleList getAdjustedDefault(); - method public static android.util.LocaleList getDefault(); - method public static android.util.LocaleList getEmptyLocaleList(); - method public java.util.Locale getFirstMatch(java.lang.String[]); - method public int indexOf(java.util.Locale); - method public boolean isEmpty(); - method public static void setDefault(android.util.LocaleList); - method public int size(); - method public java.lang.String toLanguageTags(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR; - } - public final class Log { method public static int d(java.lang.String, java.lang.String); method public static int d(java.lang.String, java.lang.String, java.lang.Throwable); @@ -40905,7 +40902,6 @@ package android.view { } public static final class Display.HdrCapabilities implements android.os.Parcelable { - ctor public Display.HdrCapabilities(int[], float, float, float); method public int describeContents(); method public float getDesiredMaxAverageLuminance(); method public float getDesiredMaxLuminance(); @@ -42017,35 +42013,35 @@ package android.view { } public final class PointerIcon implements android.os.Parcelable { - method public static android.view.PointerIcon createCustomIcon(android.graphics.Bitmap, float, float); + method public static android.view.PointerIcon create(android.graphics.Bitmap, float, float); method public int describeContents(); method public static android.view.PointerIcon getSystemIcon(android.content.Context, int); - method public static android.view.PointerIcon loadCustomIcon(android.content.res.Resources, int); + method public static android.view.PointerIcon load(android.content.res.Resources, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.PointerIcon> CREATOR; - field public static final int STYLE_ALIAS = 1010; // 0x3f2 - field public static final int STYLE_ALL_SCROLL = 1013; // 0x3f5 - field public static final int STYLE_ARROW = 1000; // 0x3e8 - field public static final int STYLE_CELL = 1006; // 0x3ee - field public static final int STYLE_CONTEXT_MENU = 1001; // 0x3e9 - field public static final int STYLE_COPY = 1011; // 0x3f3 - field public static final int STYLE_CROSSHAIR = 1007; // 0x3ef - field public static final int STYLE_DEFAULT = 1000; // 0x3e8 - field public static final int STYLE_GRAB = 1020; // 0x3fc - field public static final int STYLE_GRABBING = 1021; // 0x3fd - field public static final int STYLE_HAND = 1002; // 0x3ea - field public static final int STYLE_HELP = 1003; // 0x3eb - field public static final int STYLE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 - field public static final int STYLE_NO_DROP = 1012; // 0x3f4 - field public static final int STYLE_NULL = 0; // 0x0 - field public static final int STYLE_TEXT = 1008; // 0x3f0 - field public static final int STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 - field public static final int STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 - field public static final int STYLE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 - field public static final int STYLE_VERTICAL_TEXT = 1009; // 0x3f1 - field public static final int STYLE_WAIT = 1004; // 0x3ec - field public static final int STYLE_ZOOM_IN = 1018; // 0x3fa - field public static final int STYLE_ZOOM_OUT = 1019; // 0x3fb + field public static final int TYPE_ALIAS = 1010; // 0x3f2 + field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5 + field public static final int TYPE_ARROW = 1000; // 0x3e8 + field public static final int TYPE_CELL = 1006; // 0x3ee + field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9 + field public static final int TYPE_COPY = 1011; // 0x3f3 + field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef + field public static final int TYPE_DEFAULT = 1000; // 0x3e8 + field public static final int TYPE_GRAB = 1020; // 0x3fc + field public static final int TYPE_GRABBING = 1021; // 0x3fd + field public static final int TYPE_HAND = 1002; // 0x3ea + field public static final int TYPE_HELP = 1003; // 0x3eb + field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6 + field public static final int TYPE_NO_DROP = 1012; // 0x3f4 + field public static final int TYPE_NULL = 0; // 0x0 + field public static final int TYPE_TEXT = 1008; // 0x3f0 + field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9 + field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8 + field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7 + field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1 + field public static final int TYPE_WAIT = 1004; // 0x3ec + field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa + field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb } public class ScaleGestureDetector { @@ -42411,7 +42407,7 @@ package android.view { method public android.view.ViewParent getParentForAccessibility(); method public float getPivotX(); method public float getPivotY(); - method public android.view.PointerIcon getPointerIcon(android.view.MotionEvent, float, float); + method public android.view.PointerIcon getPointerIcon(); method public android.content.res.Resources getResources(); method public final int getRight(); method protected float getRightFadingEdgeStrength(); @@ -42562,6 +42558,7 @@ package android.view { method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public void onProvideStructure(android.view.ViewStructure); method public void onProvideVirtualStructure(android.view.ViewStructure); + method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int); method protected void onRestoreInstanceState(android.os.Parcelable); method public void onRtlPropertiesChanged(int); method protected android.os.Parcelable onSaveInstanceState(); @@ -42608,6 +42605,7 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); + method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); @@ -42698,7 +42696,6 @@ package android.view { method public void setPaddingRelative(int, int, int, int); method public void setPivotX(float); method public void setPivotY(float); - method public void setPointerCapture(); method public void setPointerIcon(android.view.PointerIcon); method public void setPressed(boolean); method public final void setRight(int); @@ -44734,7 +44731,7 @@ package android.view.inputmethod { field public android.os.Bundle extras; field public int fieldId; field public java.lang.String fieldName; - field public android.util.LocaleList hintLocales; + field public android.os.LocaleList hintLocales; field public java.lang.CharSequence hintText; field public int imeOptions; field public int initialCapsMode; @@ -48021,7 +48018,7 @@ package android.widget { method public int getHyphenationFrequency(); method public int getImeActionId(); method public java.lang.CharSequence getImeActionLabel(); - method public android.util.LocaleList getImeHintLocales(); + method public android.os.LocaleList getImeHintLocales(); method public int getImeOptions(); method public boolean getIncludeFontPadding(); method public android.os.Bundle getInputExtras(boolean); @@ -48060,7 +48057,7 @@ package android.widget { method public java.lang.CharSequence getText(); method public final android.content.res.ColorStateList getTextColors(); method public java.util.Locale getTextLocale(); - method public android.util.LocaleList getTextLocales(); + method public android.os.LocaleList getTextLocales(); method public float getTextScaleX(); method public float getTextSize(); method public int getTotalPaddingBottom(); @@ -48128,7 +48125,7 @@ package android.widget { method public void setHorizontallyScrolling(boolean); method public void setHyphenationFrequency(int); method public void setImeActionLabel(java.lang.CharSequence, int); - method public void setImeHintLocales(android.util.LocaleList); + method public void setImeHintLocales(android.os.LocaleList); method public void setImeOptions(int); method public void setIncludeFontPadding(boolean); method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; @@ -48174,7 +48171,7 @@ package android.widget { method public final void setTextKeepState(java.lang.CharSequence); method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType); method public void setTextLocale(java.util.Locale); - method public void setTextLocales(android.util.LocaleList); + method public void setTextLocales(android.os.LocaleList); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSize(int, float); @@ -51489,7 +51486,6 @@ package java.lang { method public java.lang.StringBuffer insert(int, double); method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String); method public synchronized java.lang.StringBuffer reverse(); - method public synchronized java.lang.String toString(); } public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable { @@ -51527,7 +51523,6 @@ package java.lang { method public java.lang.StringBuilder insert(int, double); method public java.lang.StringBuilder replace(int, int, java.lang.String); method public java.lang.StringBuilder reverse(); - method public java.lang.String toString(); } public class StringIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException { @@ -51891,9 +51886,7 @@ package java.lang.reflect { } public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public java.lang.Class<T> getDeclaringClass(); method public java.lang.Class<?>[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -51978,7 +51971,6 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public boolean equals(java.lang.Object); method public A getAnnotation(java.lang.Class<A>); method public java.lang.Class<?> getDeclaringClass(); method public java.lang.Object getDefaultValue(); diff --git a/api/test-removed.txt b/api/test-removed.txt index a1602184ddbe..42c64ea62cce 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -1,3 +1,17 @@ +package android { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + package android.app { public class Notification implements android.os.Parcelable { @@ -483,3 +497,17 @@ package android.widget { } +package com.android.internal { + + public static final class R.attr { + field public static final int minimalHeight = 16844067; // 0x1010523 + field public static final int minimalWidth = 16844022; // 0x10104f6 + } + + public static final class R.styleable { + field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6 + field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5 + } + +} + diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 19cb927bd582..4470eda0a2fa 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -301,14 +301,13 @@ public final class Pm { private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() { @Override - public int send(int code, Intent intent, String resolvedType, + public void send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { try { mResult.offer(intent, 5, TimeUnit.SECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } - return 0; } }; diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index fecfdaec74bc..6d405f6bbd0e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1688,7 +1688,7 @@ public class Activity extends ContextThemeWrapper } /** - * Request the Keyboard Shortcuts screen to show up. If it succeeds, this will trigger + * Request the Keyboard Shortcuts screen to show up. This will trigger * {@link #onProvideKeyboardShortcuts} to retrieve the shortcuts for the foreground activity. */ public final void requestShowKeyboardShortcuts() { @@ -7007,6 +7007,8 @@ public class Activity extends ContextThemeWrapper * @return True if caption is displayed on content, false if it pushes the content down. * * @see {@link #setOverlayWithDecorCaptionEnabled(boolean)} + * + * @hide */ public boolean isOverlayWithDecorCaptionEnabled() { return mWindow.isOverlayWithDecorCaptionEnabled(); @@ -7018,6 +7020,8 @@ public class Activity extends ContextThemeWrapper * This affects only freeform windows since they display the caption and only the main * window of the activity. The caption is used to drag the window around and also shows * maximize and close action buttons. + * + * @hide */ public void setOverlayWithDecorCaptionEnabled(boolean enabled) { mWindow.setOverlayWithDecorCaptionEnabled(enabled); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 8a92b5477caf..31fe39027fb0 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -702,6 +702,14 @@ public class ActivityManager { public static boolean windowsAreScaleable(int stackId) { return stackId == PINNED_STACK_ID; } + + /** + * Returns true if windows in this stack should be given move animations + * by default. + */ + public static boolean hasMovementAnimations(int stackId) { + return stackId != PINNED_STACK_ID; + } } /** @@ -2370,6 +2378,8 @@ public class ActivityManager { public int displayId; public int userId; public boolean visible; + // Index of the stack in the display's stack list, can be used for comparison of stack order + public int position; @Override public int describeContents() { @@ -2397,6 +2407,7 @@ public class ActivityManager { dest.writeInt(displayId); dest.writeInt(userId); dest.writeInt(visible ? 1 : 0); + dest.writeInt(position); if (topActivity != null) { dest.writeInt(1); topActivity.writeToParcel(dest, 0); @@ -2426,6 +2437,7 @@ public class ActivityManager { displayId = source.readInt(); userId = source.readInt(); visible = source.readInt() > 0; + position = source.readInt(); if (source.readInt() > 0) { topActivity = ComponentName.readFromParcel(source); } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index a4f404f18ed6..6ba6b0f07bc5 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2977,6 +2977,22 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } + case SEND_INTENT_SENDER_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IIntentSender sender = IIntentSender.Stub.asInterface(data.readStrongBinder()); + int scode = data.readInt(); + Intent intent = data.readInt() != 0 ? Intent.CREATOR.createFromParcel(data) : null; + String resolvedType = data.readString(); + IIntentReceiver finishedReceiver = IIntentReceiver.Stub.asInterface( + data.readStrongBinder()); + String requiredPermission = data.readString(); + Bundle options = data.readInt() != 0 ? Bundle.CREATOR.createFromParcel(data) : null; + int result = sendIntentSender(sender, scode, intent, resolvedType, finishedReceiver, + requiredPermission, options); + reply.writeNoException(); + reply.writeInt(result); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -6973,5 +6989,37 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + public int sendIntentSender(IIntentSender target, int code, Intent intent, String resolvedType, + IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) + throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(target.asBinder()); + data.writeInt(code); + if ((intent!=null)) { + data.writeInt(1); + intent.writeToParcel(data, 0); + } + else { + data.writeInt(0); + } + data.writeString(resolvedType); + data.writeStrongBinder((((finishedReceiver!=null))?(finishedReceiver.asBinder()):(null))); + data.writeString(requiredPermission); + if ((options!=null)) { + data.writeInt(1); + options.writeToParcel(data, 0); + } + else { + data.writeInt(0); + } + mRemote.transact(SEND_INTENT_SENDER_TRANSACTION, data, reply, 0); + final int res = reply.readInt(); + data.recycle(); + reply.recycle(); + return res; + } + private IBinder mRemote; } diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index a30f6299a4d9..4c8ddc7eb6b1 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -161,10 +161,10 @@ public class ActivityOptions { private static final String KEY_LAUNCH_TASK_ID = "android.activity.launchTaskId"; /** - * See {@link #setAvoidMoveToFront}. + * See {@link #setTaskOverlay}. * @hide */ - private static final String KEY_DONT_MOVE_TO_FRONT = "android.activity.dontMoveToFront"; + private static final String KEY_TASK_OVERLAY = "android.activity.taskOverlay"; /** * Where the docked stack should be positioned. @@ -239,7 +239,7 @@ public class ActivityOptions { private int mLaunchStackId = INVALID_STACK_ID; private int mLaunchTaskId = -1; private int mDockCreateMode = DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; - private boolean mAvoidMoveToFront; + private boolean mTaskOverlay; private AppTransitionAnimationSpec mAnimSpecs[]; /** @@ -782,7 +782,7 @@ public class ActivityOptions { } mLaunchStackId = opts.getInt(KEY_LAUNCH_STACK_ID, INVALID_STACK_ID); mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1); - mAvoidMoveToFront = opts.getBoolean(KEY_DONT_MOVE_TO_FRONT, false); + mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false); mDockCreateMode = opts.getInt(KEY_DOCK_CREATE_MODE, DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT); if (opts.containsKey(KEY_ANIM_SPECS)) { Parcelable[] specs = opts.getParcelableArray(KEY_ANIM_SPECS); @@ -961,20 +961,20 @@ public class ActivityOptions { } /** - * Set's whether the task should be moved to the front. This is different from - * {@link #getLaunchTaskBehind()} as we don't want to have an animation at all when launching - * an activity that shouldn't be moved to the front. + * Set's whether the activity launched with this option should be a task overlay. That is the + * activity will always be the top activity of the task and doesn't cause the task to be moved + * to the front when it is added. * @hide */ - public void setAvoidMoveToFront(boolean avoidMoveToFront) { - mAvoidMoveToFront = avoidMoveToFront; + public void setTaskOverlay(boolean taskOverlay) { + mTaskOverlay = taskOverlay; } /** * @hide */ - public boolean getAvoidMoveToFront() { - return mAvoidMoveToFront; + public boolean getTaskOverlay() { + return mTaskOverlay; } /** @hide */ @@ -1130,7 +1130,7 @@ public class ActivityOptions { } b.putInt(KEY_LAUNCH_STACK_ID, mLaunchStackId); b.putInt(KEY_LAUNCH_TASK_ID, mLaunchTaskId); - b.putBoolean(KEY_DONT_MOVE_TO_FRONT, mAvoidMoveToFront); + b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay); b.putInt(KEY_DOCK_CREATE_MODE, mDockCreateMode); if (mAnimSpecs != null) { b.putParcelableArray(KEY_ANIM_SPECS, mAnimSpecs); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index cfffe34486e3..a30a60673aa3 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -102,7 +102,6 @@ import android.view.Window; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.renderscript.RenderScriptCacheDir; -import android.security.keystore.AndroidKeyStoreProvider; import android.system.Os; import android.system.OsConstants; import android.system.ErrnoException; @@ -4937,6 +4936,7 @@ public final class ActivityThread { // Isolated processes aren't going to do UI. return; } + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setupGraphicsSupport"); try { int uid = Process.myUid(); String[] packages = getPackageManager().getPackagesForUid(uid); @@ -4949,6 +4949,8 @@ public final class ActivityThread { } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } } @@ -5131,6 +5133,7 @@ public final class ActivityThread { /** * Initialize the default http proxy in this process for the reasons we set the time zone. */ + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Setup proxies"); final IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); if (b != null) { // In pre-boot mode (doing initial launch to collect password), not @@ -5141,9 +5144,11 @@ public final class ActivityThread { final ProxyInfo proxyInfo = service.getProxyForNetwork(null); Proxy.setHttpProxySystemProperty(proxyInfo); } catch (RemoteException e) { + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw e.rethrowFromSystemServer(); } } + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); // Instrumentation info affects the class loader, so load it before // setting up the app context. @@ -5215,7 +5220,9 @@ public final class ActivityThread { // Install the Network Security Config Provider. This must happen before the application // code is loaded to prevent issues with instances of TLS objects being created before // the provider is installed. + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "NetworkSecurityConfigProvider.install"); NetworkSecurityConfigProvider.install(appContext); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); // Continue loading instrumentation. if (ii != null) { @@ -5983,8 +5990,6 @@ public final class ActivityThread { // Set the reporter for event logging in libcore EventLogger.setReporter(new EventLoggingReporter()); - AndroidKeyStoreProvider.install(); - // Make sure TrustedCertificateStore looks in the right place for CA certificates final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId()); TrustedCertificateStore.setDefaultUserDirectory(configDir); diff --git a/core/java/android/app/ApplicationLoaders.java b/core/java/android/app/ApplicationLoaders.java index c86994438096..6a73829da154 100644 --- a/core/java/android/app/ApplicationLoaders.java +++ b/core/java/android/app/ApplicationLoaders.java @@ -65,7 +65,9 @@ class ApplicationLoaders { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setupVulkanLayerPath"); setupVulkanLayerPath(pathClassloader, librarySearchPath); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); mLoaders.put(zip, pathClassloader); return pathClassloader; diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 2fcad0d3ced0..81788da78e83 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -653,6 +653,10 @@ public interface IActivityManager extends IInterface { public void startConfirmDeviceCredentialIntent(Intent intent) throws RemoteException; + public int sendIntentSender(IIntentSender target, int code, Intent intent, String resolvedType, + IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) + throws RemoteException; + /* * Private non-Binder interfaces */ @@ -1038,4 +1042,5 @@ public interface IActivityManager extends IInterface { int NOTIFY_LOCKED_PROFILE = IBinder.FIRST_CALL_TRANSACTION + 373; int START_CONFIRM_DEVICE_CREDENTIAL_INTENT = IBinder.FIRST_CALL_TRANSACTION + 374; int SEND_IDLE_JOB_TRIGGER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 375; + int SEND_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 376; } diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl index a42aed6fe28a..a0762b94a040 100644 --- a/core/java/android/app/IWallpaperManager.aidl +++ b/core/java/android/app/IWallpaperManager.aidl @@ -123,7 +123,7 @@ interface IWallpaperManager { /** * Check whether setting of wallpapers are allowed for the calling user. */ - boolean isWallpaperSettingAllowed(in String callingPackage); + boolean isSetWallpaperAllowed(in String callingPackage); /* * Backup: is the current system wallpaper image eligible for off-device backup? diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 7d43a1155e61..1f3dfa729a92 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -458,8 +458,14 @@ public final class LoadedApk { } } - final List<String> zipPaths = new ArrayList<>(); - final List<String> libPaths = new ArrayList<>(); + // Lists for the elements of zip/code and native libraries. + // + // Both lists are usually not empty. We expect on average one APK for the zip component, + // but shared libraries and splits are not uncommon. We expect at least three elements + // for native libraries (app-based, system, vendor). As such, give both some breathing + // space and initialize to a small value (instead of incurring growth code). + final List<String> zipPaths = new ArrayList<>(10); + final List<String> libPaths = new ArrayList<>(10); makePaths(mActivityThread, mApplicationInfo, zipPaths, libPaths); final boolean isBundledApp = mApplicationInfo.isSystemApp() @@ -495,8 +501,11 @@ public final class LoadedApk { /* * With all the combination done (if necessary, actually create the java class * loader and set up JIT profiling support if necessary. + * + * In many cases this is a single APK, so try to avoid the StringBuilder in TextUtils. */ - final String zip = TextUtils.join(File.pathSeparator, zipPaths); + final String zip = (zipPaths.size() == 1) ? zipPaths.get(0) : + TextUtils.join(File.pathSeparator, zipPaths); if (ActivityThread.localLOGV) Slog.v(ActivityThread.TAG, "Class path: " + zip + @@ -806,6 +815,8 @@ public final class LoadedApk { return mApplication; } + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication"); + Application app = null; String appClass = mApplicationInfo.className; @@ -816,7 +827,10 @@ public final class LoadedApk { try { java.lang.ClassLoader cl = getClassLoader(); if (!mPackageName.equals("android")) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, + "initializeJavaContextClassLoader"); initializeJavaContextClassLoader(); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( @@ -824,6 +838,7 @@ public final class LoadedApk { appContext.setOuterContext(app); } catch (Exception e) { if (!mActivityThread.mInstrumentation.onException(app, e)) { + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to instantiate application " + appClass + ": " + e.toString(), e); @@ -837,6 +852,7 @@ public final class LoadedApk { instrumentation.callApplicationOnCreate(app); } catch (Exception e) { if (!instrumentation.onException(app, e)) { + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); @@ -857,6 +873,8 @@ public final class LoadedApk { rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id); } + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + return app; } @@ -1046,11 +1064,17 @@ public final class LoadedApk { @Override public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) { - LoadedApk.ReceiverDispatcher rd = mDispatcher.get(); + final LoadedApk.ReceiverDispatcher rd; + if (intent == null) { + Log.wtf(TAG, "Null intent received"); + rd = null; + } else { + rd = mDispatcher.get(); + } if (ActivityThread.DEBUG_BROADCAST) { int seq = intent.getIntExtra("seq", -1); - Slog.i(ActivityThread.TAG, "Receiving broadcast " + intent.getAction() + " seq=" + seq - + " to " + (rd != null ? rd.mReceiver : null)); + Slog.i(ActivityThread.TAG, "Receiving broadcast " + intent.getAction() + + " seq=" + seq + " to " + (rd != null ? rd.mReceiver : null)); } if (rd != null) { rd.performReceive(intent, resultCode, data, extras, diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 460640e104a5..bd94a17de402 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -55,11 +55,9 @@ import android.text.style.RelativeSizeSpan; import android.text.style.TextAppearanceSpan; import android.util.Log; import android.util.SparseArray; -import android.util.TypedValue; import android.view.Gravity; import android.view.NotificationHeaderView; import android.view.View; -import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.RemoteViews; @@ -867,8 +865,9 @@ public class Notification implements Parcelable /** * {@link #extras} key: whether the chronometer set on the notification should count down * instead of counting up. Is only relevant if key {@link #EXTRA_SHOW_CHRONOMETER} is present. + * This extra is a boolean. The default is false. */ - public static final String EXTRA_CHRONOMETER_COUNTS_DOWN = "android.chronometerCountsDown"; + public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown"; /** * {@link #extras} key: whether {@link #when} should be shown, @@ -934,12 +933,13 @@ public class Notification implements Parcelable /** * {@link #extras} key: the username to be displayed for all messages sent by the user including * direct replies - * {@link android.app.Notification.MessagingStyle} notification. + * {@link android.app.Notification.MessagingStyle} notification. This extra is a + * {@link CharSequence} */ public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName"; /** - * {@link #extras} key: a {@link String} to be displayed as the title to a conversation + * {@link #extras} key: a {@link CharSequence} to be displayed as the title to a conversation * represented by a {@link android.app.Notification.MessagingStyle} */ public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle"; @@ -947,7 +947,8 @@ public class Notification implements Parcelable /** * {@link #extras} key: an array of {@link android.app.Notification.MessagingStyle.Message} * bundles provided by a - * {@link android.app.Notification.MessagingStyle} notification. + * {@link android.app.Notification.MessagingStyle} notification. This extra is a parcelable + * array of bundles. */ public static final String EXTRA_MESSAGES = "android.messages"; @@ -2337,11 +2338,11 @@ public class Notification implements Parcelable * Useful when showing an elapsed time (like an ongoing phone call). * * The counter can also be set to count down to <code>when</code> when using - * {@link #setChronometerCountsDown(boolean)}. + * {@link #setChronometerCountDown(boolean)}. * * @see android.widget.Chronometer * @see Notification#when - * @see #setChronometerCountsDown(boolean) + * @see #setChronometerCountDown(boolean) */ public Builder setUsesChronometer(boolean b) { mN.extras.putBoolean(EXTRA_SHOW_CHRONOMETER, b); @@ -2356,8 +2357,8 @@ public class Notification implements Parcelable * * @see #setUsesChronometer(boolean) */ - public Builder setChronometerCountsDown(boolean countsDown) { - mN.extras.putBoolean(EXTRA_CHRONOMETER_COUNTS_DOWN, countsDown); + public Builder setChronometerCountDown(boolean countDown) { + mN.extras.putBoolean(EXTRA_CHRONOMETER_COUNT_DOWN, countDown); return this; } @@ -3288,7 +3289,7 @@ public class Notification implements Parcelable contentView.setLong(R.id.chronometer, "setBase", mN.when + (SystemClock.elapsedRealtime() - System.currentTimeMillis())); contentView.setBoolean(R.id.chronometer, "setStarted", true); - boolean countsDown = mN.extras.getBoolean(EXTRA_CHRONOMETER_COUNTS_DOWN); + boolean countsDown = mN.extras.getBoolean(EXTRA_CHRONOMETER_COUNT_DOWN); contentView.setChronometerCountDown(R.id.chronometer, countsDown); } else { contentView.setViewVisibility(R.id.time, View.VISIBLE); @@ -3368,7 +3369,7 @@ public class Notification implements Parcelable * otherwise */ private boolean showsTimeOrChronometer() { - return mN.showsTimeOrChronometer(); + return mN.showsTime() || mN.showsChronometer(); } private void resetStandardTemplateWithActions(RemoteViews big) { @@ -3559,8 +3560,8 @@ public class Notification implements Parcelable savedBundle.getBoolean(EXTRA_SHOW_WHEN)); publicExtras.putBoolean(EXTRA_SHOW_CHRONOMETER, savedBundle.getBoolean(EXTRA_SHOW_CHRONOMETER)); - publicExtras.putBoolean(EXTRA_CHRONOMETER_COUNTS_DOWN, - savedBundle.getBoolean(EXTRA_CHRONOMETER_COUNTS_DOWN)); + publicExtras.putBoolean(EXTRA_CHRONOMETER_COUNT_DOWN, + savedBundle.getBoolean(EXTRA_CHRONOMETER_COUNT_DOWN)); publicExtras.putCharSequence(EXTRA_TITLE, mContext.getString(R.string.notification_hidden_text)); mN.extras = publicExtras; @@ -3864,15 +3865,22 @@ public class Notification implements Parcelable } /** - * @return true if the notification will show the time or the chronometer; false - * otherwise + * @return true if the notification will show the time; false otherwise * @hide */ - public boolean showsTimeOrChronometer() { + public boolean showsTime() { return when != 0 && extras.getBoolean(EXTRA_SHOW_WHEN); } /** + * @return true if the notification will show a chronometer; false otherwise + * @hide + */ + public boolean showsChronometer() { + return when != 0 && extras.getBoolean(EXTRA_SHOW_CHRONOMETER); + } + + /** * An object that can apply a rich notification style to a {@link Notification.Builder} * object. */ @@ -4459,8 +4467,8 @@ public class Notification implements Parcelable super.restoreFromExtras(extras); mMessages.clear(); - mUserDisplayName = extras.getString(EXTRA_SELF_DISPLAY_NAME); - mConversationTitle = extras.getString(EXTRA_CONVERSATION_TITLE); + mUserDisplayName = extras.getCharSequence(EXTRA_SELF_DISPLAY_NAME); + mConversationTitle = extras.getCharSequence(EXTRA_CONVERSATION_TITLE); Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES); if (parcelables != null && parcelables instanceof Parcelable[]) { mMessages = Message.getMessagesFromBundleArray(parcelables); @@ -4726,8 +4734,7 @@ public class Notification implements Parcelable static Message getMessageFromBundle(Bundle bundle) { try { - if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP) || - !bundle.containsKey(KEY_SENDER)) { + if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP)) { return null; } else { Message message = new Message(bundle.getCharSequence(KEY_TEXT), diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index 412b098a5872..cb15392b6a8a 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -803,7 +803,8 @@ public final class PendingIntent implements Parcelable { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) : null; - int res = mTarget.send(code, intent, resolvedType, + int res = ActivityManagerNative.getDefault().sendIntentSender( + mTarget, code, intent, resolvedType, onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index f41117858598..b4e9db86d18c 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -29,10 +29,10 @@ import android.content.res.ResourcesImpl; import android.content.res.ResourcesKey; import android.hardware.display.DisplayManagerGlobal; import android.os.IBinder; +import android.os.LocaleList; import android.os.Trace; import android.util.ArrayMap; import android.util.DisplayMetrics; -import android.util.LocaleList; import android.util.Log; import android.util.Pair; import android.util.Slog; diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index 5ec59b467510..0d4d007f46f9 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -322,7 +322,10 @@ public final class UiAutomation { /** * Destroy this UiAutomation. After calling this method, attempting to use the object will * result in errors. + * + * @hide */ + @TestApi public void destroy() { disconnect(); mIsDestroyed = true; diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 18a559368e66..18f93cd4688a 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; @@ -42,6 +43,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.DeadSystemException; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -75,7 +77,7 @@ import java.util.concurrent.TimeUnit; * * <p> An app can check whether wallpapers are supported for the current user, by calling * {@link #isWallpaperSupported()}, and whether setting of wallpapers is allowed, by calling - * {@link #isWallpaperSettingAllowed()}. + * {@link #isSetWallpaperAllowed()}. */ public class WallpaperManager { private static String TAG = "WallpaperManager"; @@ -86,6 +88,8 @@ public class WallpaperManager { /** {@hide} */ private static final String PROP_WALLPAPER = "ro.config.wallpaper"; /** {@hide} */ + private static final String PROP_LOCK_WALLPAPER = "ro.config.lock_wallpaper"; + /** {@hide} */ private static final String PROP_WALLPAPER_COMPONENT = "ro.config.wallpaper_component"; /** @@ -157,7 +161,7 @@ public class WallpaperManager { */ public static final String EXTRA_NEW_WALLPAPER_ID = "android.service.wallpaper.extra.ID"; - // flags for which kind of wallpaper to set + // flags for which kind of wallpaper to act on /** @hide */ @IntDef(flag = true, value = { @@ -168,12 +172,12 @@ public class WallpaperManager { public @interface SetWallpaperFlags {} /** - * Flag: use the supplied imagery as the general system wallpaper. + * Flag: set or retrieve the general system wallpaper. */ public static final int FLAG_SYSTEM = 1 << 0; /** - * Flag: use the supplied imagery as the lock-screen wallpaper. + * Flag: set or retrieve the lock-screen-specific wallpaper. */ public static final int FLAG_LOCK = 1 << 1; @@ -281,11 +285,13 @@ public class WallpaperManager { forgetLoadedWallpaper(); } - public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault) { - return peekWallpaperBitmap(context, returnDefault, context.getUserId()); + public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault, + @SetWallpaperFlags int which) { + return peekWallpaperBitmap(context, returnDefault, which, context.getUserId()); } - public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault, int userId) { + public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault, + @SetWallpaperFlags int which, int userId) { synchronized (this) { if (mService != null) { try { @@ -312,7 +318,7 @@ public class WallpaperManager { } if (returnDefault) { if (mDefaultWallpaper == null) { - mDefaultWallpaper = getDefaultWallpaperLocked(context); + mDefaultWallpaper = getDefaultWallpaperLocked(context, which); } return mDefaultWallpaper; } @@ -355,8 +361,8 @@ public class WallpaperManager { return null; } - private Bitmap getDefaultWallpaperLocked(Context context) { - InputStream is = openDefaultWallpaper(context); + private Bitmap getDefaultWallpaperLocked(Context context, @SetWallpaperFlags int which) { + InputStream is = openDefaultWallpaper(context, which); if (is != null) { try { BitmapFactory.Options options = new BitmapFactory.Options(); @@ -410,7 +416,7 @@ public class WallpaperManager { * @return Returns a Drawable object that will draw the wallpaper. */ public Drawable getDrawable() { - Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, true); + Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM); if (bm != null) { Drawable dr = new BitmapDrawable(mContext.getResources(), bm); dr.setDither(false); @@ -420,11 +426,22 @@ public class WallpaperManager { } /** - * Returns a drawable for the system built-in static wallpaper . - * + * Obtain a drawable for the built-in static system wallpaper. */ public Drawable getBuiltInDrawable() { - return getBuiltInDrawable(0, 0, false, 0, 0); + return getBuiltInDrawable(0, 0, false, 0, 0, FLAG_SYSTEM); + } + + /** + * Obtain a drawable for the specified built-in static system wallpaper. + * + * @param which The {@code FLAG_*} identifier of a valid wallpaper type. Throws + * IllegalArgumentException if an invalid wallpaper is requested. + * @return A Drawable presenting the specified wallpaper image, or {@code null} + * if no built-in default image for that wallpaper type exists. + */ + public Drawable getBuiltInDrawable(@SetWallpaperFlags int which) { + return getBuiltInDrawable(0, 0, false, 0, 0, which); } /** @@ -438,30 +455,61 @@ public class WallpaperManager { * 0 for left-aligned, 0.5 for horizontal center-aligned, and 1 for right-aligned * @param verticalAlignment A float value between 0 and 1 specifying where to crop the image; * 0 for top-aligned, 0.5 for vertical center-aligned, and 1 for bottom-aligned - * + * @return A Drawable presenting the built-in default system wallpaper image, + * or {@code null} if no such default image is defined on this device. */ public Drawable getBuiltInDrawable(int outWidth, int outHeight, boolean scaleToFit, float horizontalAlignment, float verticalAlignment) { + return getBuiltInDrawable(outWidth, outHeight, scaleToFit, + horizontalAlignment, verticalAlignment, FLAG_SYSTEM); + } + + /** + * Returns a drawable for the built-in static wallpaper of the specified type. Based on the + * parameters, the drawable can be cropped and scaled. + * + * @param outWidth The width of the returned drawable + * @param outWidth The height of the returned drawable + * @param scaleToFit If true, scale the wallpaper down rather than just cropping it + * @param horizontalAlignment A float value between 0 and 1 specifying where to crop the image; + * 0 for left-aligned, 0.5 for horizontal center-aligned, and 1 for right-aligned + * @param verticalAlignment A float value between 0 and 1 specifying where to crop the image; + * 0 for top-aligned, 0.5 for vertical center-aligned, and 1 for bottom-aligned + * @param which The {@code FLAG_*} identifier of a valid wallpaper type. Throws + * IllegalArgumentException if an invalid wallpaper is requested. + * @return A Drawable presenting the built-in default wallpaper image of the given type, + * or {@code null} if no default image of that type is defined on this device. + */ + public Drawable getBuiltInDrawable(int outWidth, int outHeight, boolean scaleToFit, + float horizontalAlignment, float verticalAlignment, @SetWallpaperFlags int which) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return null; + throw new RuntimeException(new DeadSystemException()); } + + if (which != FLAG_SYSTEM && which != FLAG_LOCK) { + throw new IllegalArgumentException("Must request exactly one kind of wallpaper"); + } + Resources resources = mContext.getResources(); horizontalAlignment = Math.max(0, Math.min(1, horizontalAlignment)); verticalAlignment = Math.max(0, Math.min(1, verticalAlignment)); - InputStream is = new BufferedInputStream(openDefaultWallpaper(mContext)); - - if (is == null) { - Log.e(TAG, "default wallpaper input stream is null"); + InputStream wpStream = openDefaultWallpaper(mContext, which); + if (wpStream == null) { + if (DEBUG) { + Log.w(TAG, "default wallpaper stream " + which + " is null"); + } return null; } else { + InputStream is = new BufferedInputStream(wpStream); if (outWidth <= 0 || outHeight <= 0) { Bitmap fullSize = BitmapFactory.decodeStream(is, null, null); return new BitmapDrawable(resources, fullSize); } else { int inWidth; int inHeight; + // Just measure this time through... { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; @@ -475,7 +523,9 @@ public class WallpaperManager { } } - is = new BufferedInputStream(openDefaultWallpaper(mContext)); + // Reopen the stream to do the full decode. We know at this point + // that openDefaultWallpaper() will return non-null. + is = new BufferedInputStream(openDefaultWallpaper(mContext, which)); RectF cropRectF; @@ -523,16 +573,15 @@ public class WallpaperManager { } if (crop == null) { - // BitmapRegionDecoder has failed, try to crop in-memory - is = new BufferedInputStream(openDefaultWallpaper(mContext)); + // BitmapRegionDecoder has failed, try to crop in-memory. We know at + // this point that openDefaultWallpaper() will return non-null. + is = new BufferedInputStream(openDefaultWallpaper(mContext, which)); Bitmap fullSize = null; - if (is != null) { - BitmapFactory.Options options = new BitmapFactory.Options(); - if (scaleDownSampleSize > 1) { - options.inSampleSize = scaleDownSampleSize; - } - fullSize = BitmapFactory.decodeStream(is, null, options); + BitmapFactory.Options options = new BitmapFactory.Options(); + if (scaleDownSampleSize > 1) { + options.inSampleSize = scaleDownSampleSize; } + fullSize = BitmapFactory.decodeStream(is, null, options); if (fullSize != null) { crop = Bitmap.createBitmap(fullSize, roundedTrueCrop.left, roundedTrueCrop.top, roundedTrueCrop.width(), @@ -598,7 +647,7 @@ public class WallpaperManager { * null pointer if these is none. */ public Drawable peekDrawable() { - Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, false); + Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, false, FLAG_SYSTEM); if (bm != null) { Drawable dr = new BitmapDrawable(mContext.getResources(), bm); dr.setDither(false); @@ -621,7 +670,7 @@ public class WallpaperManager { * @return Returns a Drawable object that will draw the wallpaper. */ public Drawable getFastDrawable() { - Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, true); + Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM); if (bm != null) { return new FastBitmapDrawable(bm); } @@ -636,7 +685,7 @@ public class WallpaperManager { * wallpaper or a null pointer if these is none. */ public Drawable peekFastDrawable() { - Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, false); + Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, false, FLAG_SYSTEM); if (bm != null) { return new FastBitmapDrawable(bm); } @@ -658,7 +707,7 @@ public class WallpaperManager { * @hide */ public Bitmap getBitmapAsUser(int userId) { - return sGlobals.peekWallpaperBitmap(mContext, true, userId); + return sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM, userId); } /** @@ -676,7 +725,7 @@ public class WallpaperManager { * @see #FLAG_LOCK * @see #FLAG_SYSTEM */ - public ParcelFileDescriptor getWallpaperFile(int which) { + public ParcelFileDescriptor getWallpaperFile(@SetWallpaperFlags int which) { return getWallpaperFile(which, mContext.getUserId()); } @@ -695,14 +744,14 @@ public class WallpaperManager { * * @hide */ - public ParcelFileDescriptor getWallpaperFile(int which, int userId) { + public ParcelFileDescriptor getWallpaperFile(@SetWallpaperFlags int which, int userId) { if (which != FLAG_SYSTEM && which != FLAG_LOCK) { throw new IllegalArgumentException("Must request exactly one kind of wallpaper"); } if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return null; + throw new RuntimeException(new DeadSystemException()); } else { try { Bundle outParams = new Bundle(); @@ -732,7 +781,7 @@ public class WallpaperManager { try { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return null; + throw new RuntimeException(new DeadSystemException()); } else { return sGlobals.mService.getWallpaperInfo(); } @@ -745,13 +794,17 @@ public class WallpaperManager { * Get the ID of the current wallpaper of the given kind. If there is no * such wallpaper configured, returns a negative number. * + * <p>Every time the wallpaper image is set, a new ID is assigned to it. + * This method allows the caller to determine whether the wallpaper imagery + * has changed, regardless of how that change happened. + * * @param which The wallpaper whose ID is to be returned. Must be a single * defined kind of wallpaper, either {@link #FLAG_SYSTEM} or * {@link #FLAG_LOCK}. * @return The positive numeric ID of the current wallpaper of the given kind, * or a negative value if no such wallpaper is configured. */ - public int getWallpaperId(int which) { + public int getWallpaperId(@SetWallpaperFlags int which) { return getWallpaperIdForUser(which, mContext.getUserId()); } @@ -760,11 +813,11 @@ public class WallpaperManager { * is no such wallpaper configured, returns a negative number. * @hide */ - public int getWallpaperIdForUser(int which, int userId) { + public int getWallpaperIdForUser(@SetWallpaperFlags int which, int userId) { try { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return -1; + throw new RuntimeException(new DeadSystemException()); } else { return sGlobals.mService.getWallpaperIdForUser(which, userId); } @@ -866,7 +919,7 @@ public class WallpaperManager { throws IOException { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return 0; + throw new RuntimeException(new DeadSystemException()); } final Bundle result = new Bundle(); final WallpaperSetCompletion completion = new WallpaperSetCompletion(); @@ -979,7 +1032,7 @@ public class WallpaperManager { validateRect(visibleCropHint); if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return 0; + throw new RuntimeException(new DeadSystemException()); } final Bundle result = new Bundle(); final WallpaperSetCompletion completion = new WallpaperSetCompletion(); @@ -1025,7 +1078,8 @@ public class WallpaperManager { * <p>This method requires the caller to hold the permission * {@link android.Manifest.permission#SET_WALLPAPER}. * - * @param bitmapData A stream containing the raw data to install as a wallpaper. + * @param bitmapData A stream containing the raw data to install as a wallpaper. This + * data can be in any format handled by {@link BitmapRegionDecoder}. * * @throws IOException If an error occurs when attempting to set the wallpaper * based on the provided image data. @@ -1055,13 +1109,17 @@ public class WallpaperManager { * <p>This method requires the caller to hold the permission * {@link android.Manifest.permission#SET_WALLPAPER}. * - * @param bitmapData A stream containing the raw data to install as a wallpaper. + * @param bitmapData A stream containing the raw data to install as a wallpaper. This + * data can be in any format handled by {@link BitmapRegionDecoder}. * @param visibleCropHint The rectangular subregion of the streamed image that should be * displayed as wallpaper. Passing {@code null} for this parameter means that * the full image should be displayed if possible given the image's and device's * aspect ratios, etc. * @param allowBackup {@code true} if the OS is permitted to back up this wallpaper * image for restore to a future device; {@code false} otherwise. + * @return An integer ID assigned to the newly active wallpaper; or zero on failure. + * + * @see #getWallpaperId(int) * * @throws IOException If an error occurs when attempting to set the wallpaper * based on the provided image data. @@ -1077,7 +1135,8 @@ public class WallpaperManager { * Version of {@link #setStream(InputStream, Rect, boolean)} that allows the caller * to specify which of the supported wallpaper categories to set. * - * @param bitmapData A stream containing the raw data to install as a wallpaper. + * @param bitmapData A stream containing the raw data to install as a wallpaper. This + * data can be in any format handled by {@link BitmapRegionDecoder}. * @param visibleCropHint The rectangular subregion of the streamed image that should be * displayed as wallpaper. Passing {@code null} for this parameter means that * the full image should be displayed if possible given the image's and device's @@ -1085,7 +1144,9 @@ public class WallpaperManager { * @param allowBackup {@code true} if the OS is permitted to back up this wallpaper * image for restore to a future device; {@code false} otherwise. * @param which Flags indicating which wallpaper(s) to configure with the new imagery. + * @return An integer ID assigned to the newly active wallpaper; or zero on failure. * + * @see #getWallpaperId(int) * @see #FLAG_LOCK * @see #FLAG_SYSTEM * @@ -1097,7 +1158,7 @@ public class WallpaperManager { validateRect(visibleCropHint); if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return 0; + throw new RuntimeException(new DeadSystemException()); } final Bundle result = new Bundle(); final WallpaperSetCompletion completion = new WallpaperSetCompletion(); @@ -1131,7 +1192,7 @@ public class WallpaperManager { public boolean hasResourceWallpaper(@RawRes int resid) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return false; + throw new RuntimeException(new DeadSystemException()); } try { Resources resources = mContext.getResources(); @@ -1159,7 +1220,7 @@ public class WallpaperManager { public int getDesiredMinimumWidth() { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return 0; + throw new RuntimeException(new DeadSystemException()); } try { return sGlobals.mService.getWidthHint(); @@ -1185,7 +1246,7 @@ public class WallpaperManager { public int getDesiredMinimumHeight() { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return 0; + throw new RuntimeException(new DeadSystemException()); } try { return sGlobals.mService.getHeightHint(); @@ -1246,6 +1307,7 @@ public class WallpaperManager { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); + throw new RuntimeException(new DeadSystemException()); } else { sGlobals.mService.setDimensionHints(minimumWidth, minimumHeight, mContext.getOpPackageName()); @@ -1268,6 +1330,7 @@ public class WallpaperManager { try { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); + throw new RuntimeException(new DeadSystemException()); } else { sGlobals.mService.setDisplayPadding(padding, mContext.getOpPackageName()); } @@ -1314,10 +1377,10 @@ public class WallpaperManager { * @hide */ @SystemApi - public void clearWallpaper(int which, int userId) { + public void clearWallpaper(@SetWallpaperFlags int which, int userId) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return; + throw new RuntimeException(new DeadSystemException()); } try { sGlobals.mService.clearWallpaper(mContext.getOpPackageName(), which, userId); @@ -1338,7 +1401,7 @@ public class WallpaperManager { public boolean setWallpaperComponent(ComponentName name) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return false; + throw new RuntimeException(new DeadSystemException()); } try { sGlobals.mService.setWallpaperComponentChecked(name, mContext.getOpPackageName()); @@ -1418,6 +1481,7 @@ public class WallpaperManager { public boolean isWallpaperSupported() { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); + throw new RuntimeException(new DeadSystemException()); } else { try { return sGlobals.mService.isWallpaperSupported(mContext.getOpPackageName()); @@ -1425,7 +1489,6 @@ public class WallpaperManager { throw e.rethrowFromSystemServer(); } } - return false; } /** @@ -1435,17 +1498,17 @@ public class WallpaperManager { * * @see android.os.UserManager#DISALLOW_SET_WALLPAPER */ - public boolean isWallpaperSettingAllowed() { + public boolean isSetWallpaperAllowed() { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); + throw new RuntimeException(new DeadSystemException()); } else { try { - return sGlobals.mService.isWallpaperSettingAllowed(mContext.getOpPackageName()); + return sGlobals.mService.isSetWallpaperAllowed(mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } - return false; } /** @@ -1479,7 +1542,7 @@ public class WallpaperManager { * wallpaper. */ public void clear() throws IOException { - setStream(openDefaultWallpaper(mContext)); + setStream(openDefaultWallpaper(mContext, FLAG_SYSTEM), null, false); } /** @@ -1492,7 +1555,7 @@ public class WallpaperManager { * {@link #FLAG_LOCK} * @throws IOException If an error occurs reverting to the built-in wallpaper. */ - public void clear(int which) throws IOException { + public void clear(@SetWallpaperFlags int which) throws IOException { if ((which & FLAG_SYSTEM) != 0) { clear(); } @@ -1504,10 +1567,22 @@ public class WallpaperManager { /** * Open stream representing the default static image wallpaper. * + * If the device defines no default wallpaper of the requested kind, + * {@code null} is returned. + * * @hide */ - public static InputStream openDefaultWallpaper(Context context) { - final String path = SystemProperties.get(PROP_WALLPAPER); + public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) { + final String whichProp; + final int defaultResId; + if (which == FLAG_LOCK) { + whichProp = PROP_LOCK_WALLPAPER; + defaultResId = com.android.internal.R.drawable.default_lock_wallpaper; + } else { + whichProp = PROP_WALLPAPER; + defaultResId = com.android.internal.R.drawable.default_wallpaper; + } + final String path = SystemProperties.get(whichProp); if (!TextUtils.isEmpty(path)) { final File file = new File(path); if (file.exists()) { @@ -1518,8 +1593,12 @@ public class WallpaperManager { } } } - return context.getResources().openRawResource( - com.android.internal.R.drawable.default_wallpaper); + try { + return context.getResources().openRawResource(defaultResId); + } catch (NotFoundException e) { + // no default defined for this device; this is not a failure + } + return null; } /** @@ -1557,7 +1636,7 @@ public class WallpaperManager { public boolean setLockWallpaperCallback(IWallpaperManagerCallback callback) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return false; + throw new RuntimeException(new DeadSystemException()); } try { @@ -1576,7 +1655,7 @@ public class WallpaperManager { public boolean isWallpaperBackupEligible() { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); - return false; + throw new RuntimeException(new DeadSystemException()); } try { return sGlobals.mService.isWallpaperBackupEligible(mContext.getUserId()); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index f78ed1e032b7..a672d8097d3b 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -5062,26 +5062,6 @@ public class DevicePolicyManager { } /** - * Called by the system to get the user restrictions for a user. - * - * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param userHandle user id the admin is running as. - * - * @hide - */ - public Bundle getUserRestrictionsForUser(@NonNull ComponentName admin, int userHandle) { - Bundle ret = null; - if (mService != null) { - try { - ret = mService.getUserRestrictionsForUser(admin, userHandle); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - return ret == null ? new Bundle() : ret; - } - - /** * Called by profile or device owners to hide or unhide packages. When a package is hidden it is * unavailable for use, but the data and actual package file remain. * diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 447ee29bd967..ddec412e53c1 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -174,7 +174,6 @@ interface IDevicePolicyManager { void setUserRestriction(in ComponentName who, in String key, boolean enable); Bundle getUserRestrictions(in ComponentName who); - Bundle getUserRestrictionsForUser(in ComponentName who, int userId); void addCrossProfileIntentFilter(in ComponentName admin, in IntentFilter filter, int flags); void clearCrossProfileIntentFilters(in ComponentName admin); diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java index c47557501b64..61790ea92ed9 100644 --- a/core/java/android/app/job/JobInfo.java +++ b/core/java/android/app/job/JobInfo.java @@ -88,7 +88,7 @@ public class JobInfo implements Parcelable { * * @return The minimum available interval for scheduling periodic jobs, in milliseconds. */ - public static final long getMinimumPeriod() { + public static final long getMinPeriodMillis() { return MIN_PERIOD_MILLIS; } @@ -99,7 +99,7 @@ public class JobInfo implements Parcelable { * * @return The minimum available flex time for scheduling periodic jobs, in milliseconds. */ - public static final long getMinimumFlex() { + public static final long getMinFlexMillis() { return MIN_FLEX_MILLIS; } @@ -306,7 +306,7 @@ public class JobInfo implements Parcelable { * job does not recur periodically. */ public long getIntervalMillis() { - return intervalMillis >= getMinimumPeriod() ? intervalMillis : getMinimumPeriod(); + return intervalMillis >= getMinPeriodMillis() ? intervalMillis : getMinPeriodMillis(); } /** @@ -316,7 +316,7 @@ public class JobInfo implements Parcelable { public long getFlexMillis() { long interval = getIntervalMillis(); long percentClamp = 5 * interval / 100; - long clampedFlex = Math.max(flexMillis, Math.max(percentClamp, getMinimumFlex())); + long clampedFlex = Math.max(flexMillis, Math.max(percentClamp, getMinFlexMillis())); return clampedFlex <= interval ? clampedFlex : interval; } @@ -682,9 +682,9 @@ public class JobInfo implements Parcelable { * Specify that this job should recur with the provided interval and flex. The job can * execute at any time in a window of flex length at the end of the period. * @param intervalMillis Millisecond interval for which this job will repeat. A minimum - * value of {@link #getMinimumPeriod()} is enforced. + * value of {@link #getMinPeriodMillis()} is enforced. * @param flexMillis Millisecond flex for this job. Flex is clamped to be at least - * {@link #getMinimumFlex()} or 5 percent of the period, whichever is + * {@link #getMinFlexMillis()} or 5 percent of the period, whichever is * higher. */ public Builder setPeriodic(long intervalMillis, long flexMillis) { diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index b8a40dc6895a..800dd434a969 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -645,6 +645,9 @@ public final class BluetoothGatt implements BluetoothProfile { } mConnState = CONN_STATE_CONNECTING; } + + mAutoConnect = autoConnect; + if (!registerApp(callback)) { synchronized(mStateLock) { mConnState = CONN_STATE_IDLE; @@ -653,8 +656,7 @@ public final class BluetoothGatt implements BluetoothProfile { return false; } - // the connection will continue after successful callback registration - mAutoConnect = autoConnect; + // The connection will continue in the onClientRegistered callback return true; } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 8f5ddf818bf4..a43d06ed5ae0 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -342,6 +342,14 @@ public abstract class Context { * {@link android.R.attr#isolatedProcess isolated}, * {@link android.R.attr#externalService external} service. This binds the service into the * calling application's package, rather than the package in which the service is declared. + * <p> + * When using this flag, the code for the service being bound will execute under the calling + * application's package name and user ID. Because the service must be an isolated process, + * it will not have direct access to the application's data, though. + * + * The purpose of this flag is to allow applications to provide services that are attributed + * to the app using the service, rather than the application providing the service. + * </p> */ public static final int BIND_EXTERNAL_SERVICE = 0x80000000; diff --git a/core/java/android/content/IIntentSender.aidl b/core/java/android/content/IIntentSender.aidl index f3affa7dc853..45c62d491625 100644 --- a/core/java/android/content/IIntentSender.aidl +++ b/core/java/android/content/IIntentSender.aidl @@ -21,7 +21,7 @@ import android.content.Intent; import android.os.Bundle; /** @hide */ -interface IIntentSender { - int send(int code, in Intent intent, String resolvedType, +oneway interface IIntentSender { + void send(int code, in Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, in Bundle options); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 47abd2bea87f..9118f01b498c 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1481,7 +1481,6 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ - @SystemApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_INSTALL_EPHEMERAL_PACKAGE = "android.intent.action.INSTALL_EPHEMERAL_PACKAGE"; @@ -1495,7 +1494,6 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ - @SystemApi @SdkConstant(SdkConstantType.SERVICE_ACTION) public static final String ACTION_RESOLVE_EPHEMERAL_PACKAGE = "android.intent.action.RESOLVE_EPHEMERAL_PACKAGE"; @@ -3764,14 +3762,12 @@ public class Intent implements Parcelable, Cloneable { * A {@link IntentSender} to start after ephemeral installation success. * @hide */ - @SystemApi public static final String EXTRA_EPHEMERAL_SUCCESS = "android.intent.extra.EPHEMERAL_SUCCESS"; /** * A {@link IntentSender} to start after ephemeral installation failure. * @hide */ - @SystemApi public static final String EXTRA_EPHEMERAL_FAILURE = "android.intent.extra.EPHEMERAL_FAILURE"; /** diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index 13a767e5dbac..32ca6c2d4bac 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -17,10 +17,6 @@ package android.content; import android.app.ActivityManagerNative; -import android.content.Context; -import android.content.Intent; -import android.content.IIntentSender; -import android.content.IIntentReceiver; import android.os.Bundle; import android.os.RemoteException; import android.os.Handler; @@ -191,7 +187,8 @@ public class IntentSender implements Parcelable { String resolvedType = intent != null ? intent.resolveTypeIfNeeded(context.getContentResolver()) : null; - int res = mTarget.send(code, intent, resolvedType, + int res = ActivityManagerNative.getDefault().sendIntentSender(mTarget, + code, intent, resolvedType, onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index bdea1e009eb0..5a09c0028cdc 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -944,8 +944,8 @@ public class ActivityInfo extends ComponentInfo dest.writeInt(windowLayout.height); dest.writeFloat(windowLayout.heightFraction); dest.writeInt(windowLayout.gravity); - dest.writeInt(windowLayout.minimalWidth); - dest.writeInt(windowLayout.minimalHeight); + dest.writeInt(windowLayout.minWidth); + dest.writeInt(windowLayout.minHeight); } else { dest.writeInt(0); } @@ -997,19 +997,19 @@ public class ActivityInfo extends ComponentInfo * @attr ref android.R.styleable#AndroidManifestLayout_defaultWidth * @attr ref android.R.styleable#AndroidManifestLayout_defaultHeight * @attr ref android.R.styleable#AndroidManifestLayout_gravity - * @attr ref android.R.styleable#AndroidManifestLayout_minimalWidth - * @attr ref android.R.styleable#AndroidManifestLayout_minimalHeight + * @attr ref android.R.styleable#AndroidManifestLayout_minWidth + * @attr ref android.R.styleable#AndroidManifestLayout_minHeight */ public static final class WindowLayout { public WindowLayout(int width, float widthFraction, int height, float heightFraction, int gravity, - int minimalWidth, int minimalHeight) { + int minWidth, int minHeight) { this.width = width; this.widthFraction = widthFraction; this.height = height; this.heightFraction = heightFraction; this.gravity = gravity; - this.minimalWidth = minimalWidth; - this.minimalHeight = minimalHeight; + this.minWidth = minWidth; + this.minHeight = minHeight; } WindowLayout(Parcel source) { @@ -1018,8 +1018,8 @@ public class ActivityInfo extends ComponentInfo height = source.readInt(); heightFraction = source.readFloat(); gravity = source.readInt(); - minimalWidth = source.readInt(); - minimalHeight = source.readInt(); + minWidth = source.readInt(); + minHeight = source.readInt(); } /** @@ -1069,9 +1069,9 @@ public class ActivityInfo extends ComponentInfo * width, then the system will set the same minimal width on all other activities in the * task. It will also ignore any other minimal width attributes of non-root activities. * - * @attr ref android.R.styleable#AndroidManifestLayout_minimalWidth + * @attr ref android.R.styleable#AndroidManifestLayout_minWidth */ - public final int minimalWidth; + public final int minWidth; /** * Minimal height of activity in pixels to be able to display its content. @@ -1081,8 +1081,8 @@ public class ActivityInfo extends ComponentInfo * height, then the system will set the same minimal height on all other activities in the * task. It will also ignore any other minimal height attributes of non-root activities. * - * @attr ref android.R.styleable#AndroidManifestLayout_minimalHeight + * @attr ref android.R.styleable#AndroidManifestLayout_minHeight */ - public final int minimalHeight; + public final int minHeight; } } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 7ee70440a15c..de1284ec248f 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3536,6 +3536,12 @@ public class PackageParser { a.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; final boolean appDefault = (owner.applicationInfo.privateFlags & PRIVATE_FLAG_RESIZEABLE_ACTIVITIES) != 0; + // This flag is used to workaround the issue with ignored resizeableActivity param when + // either targetSdkVersion is not set at all or <uses-sdk> tag is below <application> + // tag in AndroidManifest. If this param was explicitly set to 'false' we need to set + // corresponding resizeMode regardless of targetSdkVersion value at this point in time. + final boolean resizeableSetExplicitly + = sa.hasValue(R.styleable.AndroidManifestActivity_resizeableActivity); final boolean resizeable = sa.getBoolean( R.styleable.AndroidManifestActivity_resizeableActivity, appDefault); @@ -3546,7 +3552,8 @@ public class PackageParser { } else { a.info.resizeMode = RESIZE_MODE_RESIZEABLE; } - } else if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.N) { + } else if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.N + || resizeableSetExplicitly) { a.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; } else if (!a.info.isFixedOrientation() && (a.info.flags & FLAG_IMMERSIVE) == 0) { a.info.resizeMode = RESIZE_MODE_FORCE_RESIZEABLE; @@ -3712,15 +3719,15 @@ public class PackageParser { int gravity = sw.getInt( com.android.internal.R.styleable.AndroidManifestLayout_gravity, Gravity.CENTER); - int minimalWidth = sw.getDimensionPixelSize( - com.android.internal.R.styleable.AndroidManifestLayout_minimalWidth, + int minWidth = sw.getDimensionPixelSize( + com.android.internal.R.styleable.AndroidManifestLayout_minWidth, -1); - int minimalHeight = sw.getDimensionPixelSize( - com.android.internal.R.styleable.AndroidManifestLayout_minimalHeight, + int minHeight = sw.getDimensionPixelSize( + com.android.internal.R.styleable.AndroidManifestLayout_minHeight, -1); sw.recycle(); a.info.windowLayout = new ActivityInfo.WindowLayout(width, widthFraction, - height, heightFraction, gravity, minimalWidth, minimalHeight); + height, heightFraction, gravity, minWidth, minHeight); } private Activity parseActivityAlias(Package owner, Resources res, diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 2d0e74cf5e8c..29e5b5db5b69 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -28,10 +28,10 @@ import android.annotation.Nullable; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.Config; import android.os.Build; +import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; -import android.util.LocaleList; import android.view.View; import java.io.IOException; diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 110df5d76aac..dada61280c1e 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -35,10 +35,10 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.icu.text.PluralRules; import android.os.Build; +import android.os.LocaleList; import android.os.Trace; import android.util.AttributeSet; import android.util.DisplayMetrics; -import android.util.LocaleList; import android.util.Log; import android.util.LongSparseArray; import android.util.Slog; diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index c4ee3478fab4..49c106e69d9f 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -79,7 +79,7 @@ interface IInputManager { void vibrate(int deviceId, in long[] pattern, int repeat, IBinder token); void cancelVibrate(int deviceId, IBinder token); - void setPointerIconShape(int shapeId); + void setPointerIconType(int typeId); void setCustomPointerIcon(in PointerIcon icon); void setPointerIconDetached(boolean detached); diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 8a43acb59100..a5aeae331f84 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -872,13 +872,13 @@ public final class InputManager { * Changes the mouse pointer's icon shape into the specified id. * * @param iconId The id of the pointer graphic, as a value between - * {@link PointerIcon.STYLE_ARROW} and {@link PointerIcon.STYLE_GRABBING}. + * {@link PointerIcon.TYPE_ARROW} and {@link PointerIcon.TYPE_GRABBING}. * * @hide */ - public void setPointerIconShape(int iconId) { + public void setPointerIconType(int iconId) { try { - mIm.setPointerIconShape(iconId); + mIm.setPointerIconType(iconId); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/input/KeyboardLayout.java b/core/java/android/hardware/input/KeyboardLayout.java index 2cafa088665a..d395578a1270 100644 --- a/core/java/android/hardware/input/KeyboardLayout.java +++ b/core/java/android/hardware/input/KeyboardLayout.java @@ -17,9 +17,9 @@ package android.hardware.input; import android.annotation.NonNull; +import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; -import android.util.LocaleList; import java.util.Locale; diff --git a/core/java/android/net/INetworkPolicyListener.aidl b/core/java/android/net/INetworkPolicyListener.aidl index 812f1fe5e563..93463b472fa4 100644 --- a/core/java/android/net/INetworkPolicyListener.aidl +++ b/core/java/android/net/INetworkPolicyListener.aidl @@ -23,5 +23,6 @@ oneway interface INetworkPolicyListener { void onMeteredIfacesChanged(in String[] meteredIfaces); void onRestrictBackgroundChanged(boolean restrictBackground); void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted); + void onRestrictBackgroundBlacklistChanged(int uid, boolean blacklisted); } diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java index 7f1b1791b5d3..58b1b88d8976 100644 --- a/core/java/android/net/StaticIpConfiguration.java +++ b/core/java/android/net/StaticIpConfiguration.java @@ -131,7 +131,7 @@ public class StaticIpConfiguration implements Parcelable { str.append(" ").append(dnsServer.getHostAddress()); } - str.append(" ] Domains"); + str.append(" ] Domains "); if (domains != null) str.append(domains); return str.toString(); } diff --git a/core/java/android/net/UidRange.java b/core/java/android/net/UidRange.java index 2e586b39b5be..fd465d95a9ca 100644 --- a/core/java/android/net/UidRange.java +++ b/core/java/android/net/UidRange.java @@ -48,6 +48,17 @@ public final class UidRange implements Parcelable { return start / PER_USER_RANGE; } + public boolean contains(int uid) { + return start <= uid && uid <= stop; + } + + /** + * @return {@code true} if this range contains every UID contained by the {@param other} range. + */ + public boolean containsRange(UidRange other) { + return start <= other.start && other.stop <= stop; + } + @Override public int hashCode() { int result = 17; diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 8406bcfa8184..41ff9fdf8382 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -392,6 +392,7 @@ public final class NfcAdapter { /** * A callback that is invoked when a tag is removed from the field. + * @see NfcAdapter#ignore */ public interface OnTagRemovedListener { void onTagRemoved(); diff --git a/core/java/android/nfc/cardemulation/HostNfcFService.java b/core/java/android/nfc/cardemulation/HostNfcFService.java index 1d4baf4849cf..27c4976786f4 100644 --- a/core/java/android/nfc/cardemulation/HostNfcFService.java +++ b/core/java/android/nfc/cardemulation/HostNfcFService.java @@ -42,8 +42,13 @@ import android.util.Log; * exactly one System Code and one NFCID2. For details about the use of * System Code and NFCID2, see the NFC Forum Digital specification.</p> * <p>To statically register a System Code and NFCID2 with the service, a {@link #SERVICE_META_DATA} - * entry must be included in the declaration of the service. An example of a HostNfcFService - * manifest declaration is shown below: + * entry must be included in the declaration of the service. + * + * <p>All {@link HostNfcFService HostNfcFService} declarations in the manifest must require the + * {@link android.Manifest.permission#BIND_NFC_SERVICE} permission + * in their <service> tag, to ensure that only the platform can bind to your service.</p> + * + * <p>An example of a HostNfcFService manifest declaration is shown below: * * <pre> <service android:name=".MyHostNfcFService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> * <intent-filter> diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index b546da021e18..36ba6966effa 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -436,4 +436,6 @@ interface INetworkManagementService void addInterfaceToLocalNetwork(String iface, in List<RouteInfo> routes); void removeInterfaceFromLocalNetwork(String iface); + + void setAllowOnlyVpnForUids(boolean enable, in UidRange[] uidRanges); } diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index 55b0d2a15317..b27cb32bd4eb 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -58,6 +58,7 @@ interface IUserManager { boolean canHaveRestrictedProfile(int userHandle); int getUserSerialNumber(int userHandle); int getUserHandle(int userSerialNumber); + int getUserRestrictionSource(String restrictionKey, int userHandle); Bundle getUserRestrictions(int userHandle); boolean hasBaseUserRestriction(String restrictionKey, int userHandle); boolean hasUserRestriction(in String restrictionKey, int userHandle); diff --git a/core/java/android/util/LocaleList.aidl b/core/java/android/os/LocaleList.aidl index f5de35415999..acb364847b51 100644 --- a/core/java/android/util/LocaleList.aidl +++ b/core/java/android/os/LocaleList.aidl @@ -14,6 +14,6 @@ * limitations under the License. */ -package android.util; +package android.os; parcelable LocaleList; diff --git a/core/java/android/util/LocaleList.java b/core/java/android/os/LocaleList.java index 3c3db580bb28..8136796574e0 100644 --- a/core/java/android/util/LocaleList.java +++ b/core/java/android/os/LocaleList.java @@ -14,15 +14,13 @@ * limitations under the License. */ -package android.util; +package android.os; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; import android.icu.util.ULocale; -import android.os.Parcel; -import android.os.Parcelable; import com.android.internal.annotations.GuardedBy; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 1948df9b8fff..dcec98246ab6 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -18,6 +18,7 @@ package android.os; import android.Manifest; import android.accounts.AccountManager; +import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; @@ -43,6 +44,8 @@ import android.view.WindowManager.LayoutParams; import com.android.internal.R; import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; @@ -63,6 +66,41 @@ public class UserManager { private final Context mContext; /** + * @hide + * No user restriction. + */ + @SystemApi + public static final int RESTRICTION_NOT_SET = 0x0; + + /** + * @hide + * User restriction set by system/user. + */ + @SystemApi + public static final int RESTRICTION_SOURCE_SYSTEM = 0x1; + + /** + * @hide + * User restriction set by a device owner. + */ + @SystemApi + public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 0x2; + + /** + * @hide + * User restriction set by a profile owner. + */ + @SystemApi + public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 0x4; + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM, + RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER}) + @SystemApi + public @interface UserRestrictionSource {} + + /** * Specifies if a user is disallowed from adding and removing accounts, unless they are * {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by * Authenticator. @@ -1023,6 +1061,27 @@ public class UserManager { } /** + * @hide + * + * Returns who set a user restriction on a user. + * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. + * @param restrictionKey the string key representing the restriction + * @param userHandle the UserHandle of the user for whom to retrieve the restrictions. + * @return The source of user restriction. Any combination of {@link #RESTRICTION_NOT_SET}, + * {@link #RESTRICTION_SOURCE_SYSTEM}, {@link #RESTRICTION_SOURCE_DEVICE_OWNER} + * and {@link #RESTRICTION_SOURCE_PROFILE_OWNER} + */ + @SystemApi + @UserRestrictionSource + public int getUserRestrictionSource(String restrictionKey, UserHandle userHandle) { + try { + return mService.getUserRestrictionSource(restrictionKey, userHandle.getIdentifier()); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** * Returns the user-wide restrictions imposed on this user. * @return a Bundle containing all the restrictions. */ diff --git a/core/java/android/os/health/SystemHealthManager.java b/core/java/android/os/health/SystemHealthManager.java index 7c37fa40154f..32e8425cbe07 100644 --- a/core/java/android/os/health/SystemHealthManager.java +++ b/core/java/android/os/health/SystemHealthManager.java @@ -53,6 +53,8 @@ public class SystemHealthManager { /** * Obtain a SystemHealthManager object for the supplied context. + * + * @hide */ public static SystemHealthManager from(Context context) { return (SystemHealthManager)context.getSystemService(Context.SYSTEM_HEALTH_SERVICE); diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index 3915b0257493..b9bcd1c190a4 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -1233,8 +1233,8 @@ public interface IMountService extends IInterface { } @Override - public void changeUserKey(int userId, int serialNumber, - byte[] token, byte[] oldSecret, byte[] newSecret) throws RemoteException { + public void addUserKeyAuth(int userId, int serialNumber, + byte[] token, byte[] secret) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { @@ -1242,9 +1242,23 @@ public interface IMountService extends IInterface { _data.writeInt(userId); _data.writeInt(serialNumber); _data.writeByteArray(token); - _data.writeByteArray(oldSecret); - _data.writeByteArray(newSecret); - mRemote.transact(Stub.TRANSACTION_changeUserKey, _data, _reply, 0); + _data.writeByteArray(secret); + mRemote.transact(Stub.TRANSACTION_addUserKeyAuth, _data, _reply, 0); + _reply.readException(); + } finally { + _reply.recycle(); + _data.recycle(); + } + } + + @Override + public void fixateNewestUserKeyAuth(int userId) throws RemoteException { + Parcel _data = Parcel.obtain(); + Parcel _reply = Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(userId); + mRemote.transact(Stub.TRANSACTION_fixateNewestUserKeyAuth, _data, _reply, 0); _reply.readException(); } finally { _reply.recycle(); @@ -1489,7 +1503,9 @@ public interface IMountService extends IInterface { static final int TRANSACTION_mountAppFuse = IBinder.FIRST_CALL_TRANSACTION + 69; - static final int TRANSACTION_changeUserKey = IBinder.FIRST_CALL_TRANSACTION + 70; + static final int TRANSACTION_addUserKeyAuth = IBinder.FIRST_CALL_TRANSACTION + 70; + + static final int TRANSACTION_fixateNewestUserKeyAuth = IBinder.FIRST_CALL_TRANSACTION + 71; /** * Cast an IBinder object into an IMountService interface, generating a @@ -2069,14 +2085,20 @@ public interface IMountService extends IInterface { reply.writeNoException(); return true; } - case TRANSACTION_changeUserKey: { + case TRANSACTION_addUserKeyAuth: { data.enforceInterface(DESCRIPTOR); int userId = data.readInt(); int serialNumber = data.readInt(); byte[] token = data.createByteArray(); - byte[] oldSecret = data.createByteArray(); - byte[] newSecret = data.createByteArray(); - changeUserKey(userId, serialNumber, token, oldSecret, newSecret); + byte[] secret = data.createByteArray(); + addUserKeyAuth(userId, serialNumber, token, secret); + reply.writeNoException(); + return true; + } + case TRANSACTION_fixateNewestUserKeyAuth: { + data.enforceInterface(DESCRIPTOR); + int userId = data.readInt(); + fixateNewestUserKeyAuth(userId); reply.writeNoException(); return true; } @@ -2452,8 +2474,9 @@ public interface IMountService extends IInterface { public void createUserKey(int userId, int serialNumber, boolean ephemeral) throws RemoteException; public void destroyUserKey(int userId) throws RemoteException; - public void changeUserKey(int userId, int serialNumber, - byte[] token, byte[] oldSecret, byte[] newSecret) throws RemoteException; + public void addUserKeyAuth(int userId, int serialNumber, + byte[] token, byte[] secret) throws RemoteException; + public void fixateNewestUserKeyAuth(int userId) throws RemoteException; public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) throws RemoteException; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 76f5175c1b4f..66d487fd3105 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -48,6 +48,7 @@ import android.os.Binder; import android.os.Bundle; import android.os.DropBoxManager; import android.os.IBinder; +import android.os.LocaleList; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; @@ -58,7 +59,6 @@ import android.text.TextUtils; import android.util.AndroidException; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.LocaleList; import android.util.Log; import android.util.MemoryIntArray; @@ -2650,7 +2650,7 @@ public final class Settings { * The serialized system locale value. * * Do not use this value directory. - * To get system locale, use {@link android.util.LocaleList#getDefault} instead. + * To get system locale, use {@link LocaleList#getDefault} instead. * To update system locale, use {@link com.android.internal.app.LocalePicker#updateLocales} * instead. * @hide @@ -4702,6 +4702,14 @@ public final class Settings { public static final String ALWAYS_ON_VPN_APP = "always_on_vpn_app"; /** + * Whether to block networking outside of VPN connections while always-on is set. + * @see #ALWAYS_ON_VPN_APP + * + * @hide + */ + public static final String ALWAYS_ON_VPN_LOCKDOWN = "always_on_vpn_lockdown"; + + /** * Whether applications can be installed for this user via the system's * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism. * diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index 71b53f1f42ae..1c13962c7dfd 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -309,14 +309,13 @@ public class TextUtils { */ public static String join(CharSequence delimiter, Iterable tokens) { StringBuilder sb = new StringBuilder(); - boolean firstTime = true; - for (Object token: tokens) { - if (firstTime) { - firstTime = false; - } else { + Iterator<?> it = tokens.iterator(); + if (it.hasNext()) { + sb.append(it.next()); + while (it.hasNext()) { sb.append(delimiter); + sb.append(it.next()); } - sb.append(token); } return sb.toString(); } diff --git a/core/java/android/text/style/LocaleSpan.java b/core/java/android/text/style/LocaleSpan.java index 91990dfd1db2..b8428517748f 100644 --- a/core/java/android/text/style/LocaleSpan.java +++ b/core/java/android/text/style/LocaleSpan.java @@ -21,11 +21,11 @@ import com.android.internal.util.Preconditions; import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.Paint; +import android.os.LocaleList; import android.os.Parcel; import android.text.ParcelableSpan; import android.text.TextPaint; import android.text.TextUtils; -import android.util.LocaleList; import java.util.Locale; diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 48eee051796c..2f2fe57f68fa 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -1168,6 +1168,9 @@ public final class Display { public HdrCapabilities() { } + /** + * @hide + */ public HdrCapabilities(int[] supportedHdrTypes, float maxLuminance, float maxAverageLuminance, float minLuminance) { mSupportedHdrTypes = supportedHdrTypes; diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 4ba97d5f8bea..f8a6a17a0f57 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -163,7 +163,12 @@ interface IWindowManager IAppTransitionAnimationSpecsFuture specsFuture, IRemoteCallback startedCallback, boolean scaleUp); void executeAppTransition(); - void setAppStartingWindow(IBinder token, String pkg, int theme, + + /** + * Called to set the starting window for the input token and returns true if the starting + * window was set for the token. + */ + boolean setAppStartingWindow(IBinder token, String pkg, int theme, in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded); void setAppVisibility(IBinder token, boolean visible); diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java index 88cd7ca71a4e..e5748c1ffe52 100644 --- a/core/java/android/view/InputDevice.java +++ b/core/java/android/view/InputDevice.java @@ -775,12 +775,12 @@ public final class InputDevice implements Parcelable { } /** - * Sets the current pointer shape. - * @param pointerShape the id of the pointer icon. + * Sets the current pointer type. + * @param pointerType the type of the pointer icon. * @hide */ - public void setPointerShape(int pointerShape) { - InputManager.getInstance().setPointerIconShape(pointerShape); + public void setPointerType(int pointerType) { + InputManager.getInstance().setPointerIconType(pointerType); } /** diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java index 81bb638e62fb..fc79f53b744b 100644 --- a/core/java/android/view/PointerIcon.java +++ b/core/java/android/view/PointerIcon.java @@ -36,112 +36,112 @@ import android.util.Log; /** * Represents an icon that can be used as a mouse pointer. * <p> - * Pointer icons can be provided either by the system using system styles, + * Pointer icons can be provided either by the system using system types, * or by applications using bitmaps or application resources. * </p> */ public final class PointerIcon implements Parcelable { private static final String TAG = "PointerIcon"; - /** {@hide} Style constant: Custom icon with a user-supplied bitmap. */ - public static final int STYLE_CUSTOM = -1; + /** {@hide} Type constant: Custom icon with a user-supplied bitmap. */ + public static final int TYPE_CUSTOM = -1; - /** Style constant: Null icon. It has no bitmap. */ - public static final int STYLE_NULL = 0; + /** Type constant: Null icon. It has no bitmap. */ + public static final int TYPE_NULL = 0; - /** Style constant: no icons are specified. If all views uses this, then falls back - * to the default style, but this is helpful to distinguish a view explicitly want + /** Type constant: no icons are specified. If all views uses this, then falls back + * to the default type, but this is helpful to distinguish a view explicitly want * to have the default icon. * @hide */ - public static final int STYLE_NOT_SPECIFIED = 1; + public static final int TYPE_NOT_SPECIFIED = 1; - /** Style constant: Arrow icon. (Default mouse pointer) */ - public static final int STYLE_ARROW = 1000; + /** Type constant: Arrow icon. (Default mouse pointer) */ + public static final int TYPE_ARROW = 1000; - /** {@hide} Style constant: Spot hover icon for touchpads. */ - public static final int STYLE_SPOT_HOVER = 2000; + /** {@hide} Type constant: Spot hover icon for touchpads. */ + public static final int TYPE_SPOT_HOVER = 2000; - /** {@hide} Style constant: Spot touch icon for touchpads. */ - public static final int STYLE_SPOT_TOUCH = 2001; + /** {@hide} Type constant: Spot touch icon for touchpads. */ + public static final int TYPE_SPOT_TOUCH = 2001; - /** {@hide} Style constant: Spot anchor icon for touchpads. */ - public static final int STYLE_SPOT_ANCHOR = 2002; + /** {@hide} Type constant: Spot anchor icon for touchpads. */ + public static final int TYPE_SPOT_ANCHOR = 2002; - // Style constants for additional predefined icons for mice. - /** Style constant: context-menu. */ - public static final int STYLE_CONTEXT_MENU = 1001; + // Type constants for additional predefined icons for mice. + /** Type constant: context-menu. */ + public static final int TYPE_CONTEXT_MENU = 1001; - /** Style constant: hand. */ - public static final int STYLE_HAND = 1002; + /** Type constant: hand. */ + public static final int TYPE_HAND = 1002; - /** Style constant: help. */ - public static final int STYLE_HELP = 1003; + /** Type constant: help. */ + public static final int TYPE_HELP = 1003; - /** Style constant: wait. */ - public static final int STYLE_WAIT = 1004; + /** Type constant: wait. */ + public static final int TYPE_WAIT = 1004; - /** Style constant: cell. */ - public static final int STYLE_CELL = 1006; + /** Type constant: cell. */ + public static final int TYPE_CELL = 1006; - /** Style constant: crosshair. */ - public static final int STYLE_CROSSHAIR = 1007; + /** Type constant: crosshair. */ + public static final int TYPE_CROSSHAIR = 1007; - /** Style constant: text. */ - public static final int STYLE_TEXT = 1008; + /** Type constant: text. */ + public static final int TYPE_TEXT = 1008; - /** Style constant: vertical-text. */ - public static final int STYLE_VERTICAL_TEXT = 1009; + /** Type constant: vertical-text. */ + public static final int TYPE_VERTICAL_TEXT = 1009; - /** Style constant: alias (indicating an alias of/shortcut to something is + /** Type constant: alias (indicating an alias of/shortcut to something is * to be created. */ - public static final int STYLE_ALIAS = 1010; + public static final int TYPE_ALIAS = 1010; - /** Style constant: copy. */ - public static final int STYLE_COPY = 1011; + /** Type constant: copy. */ + public static final int TYPE_COPY = 1011; - /** Style constant: no-drop. */ - public static final int STYLE_NO_DROP = 1012; + /** Type constant: no-drop. */ + public static final int TYPE_NO_DROP = 1012; - /** Style constant: all-scroll. */ - public static final int STYLE_ALL_SCROLL = 1013; + /** Type constant: all-scroll. */ + public static final int TYPE_ALL_SCROLL = 1013; - /** Style constant: horizontal double arrow mainly for resizing. */ - public static final int STYLE_HORIZONTAL_DOUBLE_ARROW = 1014; + /** Type constant: horizontal double arrow mainly for resizing. */ + public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; - /** Style constant: vertical double arrow mainly for resizing. */ - public static final int STYLE_VERTICAL_DOUBLE_ARROW = 1015; + /** Type constant: vertical double arrow mainly for resizing. */ + public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; - /** Style constant: diagonal double arrow -- top-right to bottom-left. */ - public static final int STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; + /** Type constant: diagonal double arrow -- top-right to bottom-left. */ + public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; - /** Style constant: diagonal double arrow -- top-left to bottom-right. */ - public static final int STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; + /** Type constant: diagonal double arrow -- top-left to bottom-right. */ + public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; - /** Style constant: zoom-in. */ - public static final int STYLE_ZOOM_IN = 1018; + /** Type constant: zoom-in. */ + public static final int TYPE_ZOOM_IN = 1018; - /** Style constant: zoom-out. */ - public static final int STYLE_ZOOM_OUT = 1019; + /** Type constant: zoom-out. */ + public static final int TYPE_ZOOM_OUT = 1019; - /** Style constant: grab. */ - public static final int STYLE_GRAB = 1020; + /** Type constant: grab. */ + public static final int TYPE_GRAB = 1020; - /** Style constant: grabbing. */ - public static final int STYLE_GRABBING = 1021; + /** Type constant: grabbing. */ + public static final int TYPE_GRABBING = 1021; - // OEM private styles should be defined starting at this range to avoid - // conflicts with any system styles that may be defined in the future. - private static final int STYLE_OEM_FIRST = 10000; + // OEM private types should be defined starting at this range to avoid + // conflicts with any system types that may be defined in the future. + private static final int TYPE_OEM_FIRST = 10000; /** The default pointer icon. */ - public static final int STYLE_DEFAULT = STYLE_ARROW; + public static final int TYPE_DEFAULT = TYPE_ARROW; - private static final PointerIcon gNullIcon = new PointerIcon(STYLE_NULL); + private static final PointerIcon gNullIcon = new PointerIcon(TYPE_NULL); private static final SparseArray<PointerIcon> gSystemIcons = new SparseArray<PointerIcon>(); private static boolean sUseLargeIcons = false; - private final int mStyle; + private final int mType; private int mSystemIconResourceId; private Bitmap mBitmap; private float mHotSpotX; @@ -151,8 +151,8 @@ public final class PointerIcon implements Parcelable { private Bitmap mBitmapFrames[]; private int mDurationPerFrame; - private PointerIcon(int style) { - mStyle = style; + private PointerIcon(int type) { + mType = type; } /** @@ -160,7 +160,7 @@ public final class PointerIcon implements Parcelable { * * @return The null pointer icon. * - * @see #STYLE_NULL + * @see #TYPE_NULL * @hide */ public static PointerIcon getNullIcon() { @@ -177,36 +177,36 @@ public final class PointerIcon implements Parcelable { * @hide */ public static PointerIcon getDefaultIcon(@NonNull Context context) { - return getSystemIcon(context, STYLE_DEFAULT); + return getSystemIcon(context, TYPE_DEFAULT); } /** - * Gets a system pointer icon for the given style. - * If style is not recognized, returns the default pointer icon. + * Gets a system pointer icon for the given type. + * If typeis not recognized, returns the default pointer icon. * * @param context The context. - * @param style The pointer icon style. + * @param type The pointer icon type. * @return The pointer icon. * * @throws IllegalArgumentException if context is null. */ - public static PointerIcon getSystemIcon(@NonNull Context context, int style) { + public static PointerIcon getSystemIcon(@NonNull Context context, int type) { if (context == null) { throw new IllegalArgumentException("context must not be null"); } - if (style == STYLE_NULL) { + if (type == TYPE_NULL) { return gNullIcon; } - PointerIcon icon = gSystemIcons.get(style); + PointerIcon icon = gSystemIcons.get(type); if (icon != null) { return icon; } - int styleIndex = getSystemIconStyleIndex(style); - if (styleIndex == 0) { - styleIndex = getSystemIconStyleIndex(STYLE_DEFAULT); + int typeIndex = getSystemIconTypeIndex(type); + if (typeIndex == 0) { + typeIndex = getSystemIconTypeIndex(TYPE_DEFAULT); } int defStyle = sUseLargeIcons ? @@ -214,21 +214,21 @@ public final class PointerIcon implements Parcelable { TypedArray a = context.obtainStyledAttributes(null, com.android.internal.R.styleable.Pointer, 0, defStyle); - int resourceId = a.getResourceId(styleIndex, -1); + int resourceId = a.getResourceId(typeIndex, -1); a.recycle(); if (resourceId == -1) { - Log.w(TAG, "Missing theme resources for pointer icon style " + style); - return style == STYLE_DEFAULT ? gNullIcon : getSystemIcon(context, STYLE_DEFAULT); + Log.w(TAG, "Missing theme resources for pointer icon type " + type); + return type == TYPE_DEFAULT ? gNullIcon : getSystemIcon(context, TYPE_DEFAULT); } - icon = new PointerIcon(style); + icon = new PointerIcon(type); if ((resourceId & 0xff000000) == 0x01000000) { icon.mSystemIconResourceId = resourceId; } else { icon.loadResource(context, context.getResources(), resourceId); } - gSystemIcons.append(style, icon); + gSystemIcons.append(type, icon); return icon; } @@ -242,7 +242,7 @@ public final class PointerIcon implements Parcelable { } /** - * Creates a custom pointer from the given bitmap and hotspot information. + * Creates a custom pointer icon from the given bitmap and hotspot information. * * @param bitmap The bitmap for the icon. * @param hotSpotX The X offset of the pointer icon hotspot in the bitmap. @@ -254,14 +254,13 @@ public final class PointerIcon implements Parcelable { * @throws IllegalArgumentException if bitmap is null, or if the x/y hotspot * parameters are invalid. */ - public static PointerIcon createCustomIcon( - @NonNull Bitmap bitmap, float hotSpotX, float hotSpotY) { + public static PointerIcon create(@NonNull Bitmap bitmap, float hotSpotX, float hotSpotY) { if (bitmap == null) { throw new IllegalArgumentException("bitmap must not be null"); } validateHotSpot(bitmap, hotSpotX, hotSpotY); - PointerIcon icon = new PointerIcon(STYLE_CUSTOM); + PointerIcon icon = new PointerIcon(TYPE_CUSTOM); icon.mBitmap = bitmap; icon.mHotSpotX = hotSpotX; icon.mHotSpotY = hotSpotY; @@ -289,12 +288,12 @@ public final class PointerIcon implements Parcelable { * @throws Resources.NotFoundException if the resource was not found or the drawable * linked in the resource was not found. */ - public static PointerIcon loadCustomIcon(@NonNull Resources resources, @XmlRes int resourceId) { + public static PointerIcon load(@NonNull Resources resources, @XmlRes int resourceId) { if (resources == null) { throw new IllegalArgumentException("resources must not be null"); } - PointerIcon icon = new PointerIcon(STYLE_CUSTOM); + PointerIcon icon = new PointerIcon(TYPE_CUSTOM); icon.loadResource(null, resources, resourceId); return icon; } @@ -318,28 +317,28 @@ public final class PointerIcon implements Parcelable { return this; } - PointerIcon result = new PointerIcon(mStyle); + PointerIcon result = new PointerIcon(mType); result.mSystemIconResourceId = mSystemIconResourceId; result.loadResource(context, context.getResources(), mSystemIconResourceId); return result; } /** @hide */ - public int getStyle() { - return mStyle; + public int getType() { + return mType; } public static final Parcelable.Creator<PointerIcon> CREATOR = new Parcelable.Creator<PointerIcon>() { public PointerIcon createFromParcel(Parcel in) { - int style = in.readInt(); - if (style == STYLE_NULL) { + int type = in.readInt(); + if (type == TYPE_NULL) { return getNullIcon(); } int systemIconResourceId = in.readInt(); if (systemIconResourceId != 0) { - PointerIcon icon = new PointerIcon(style); + PointerIcon icon = new PointerIcon(type); icon.mSystemIconResourceId = systemIconResourceId; return icon; } @@ -347,7 +346,7 @@ public final class PointerIcon implements Parcelable { Bitmap bitmap = Bitmap.CREATOR.createFromParcel(in); float hotSpotX = in.readFloat(); float hotSpotY = in.readFloat(); - return PointerIcon.createCustomIcon(bitmap, hotSpotX, hotSpotY); + return PointerIcon.create(bitmap, hotSpotX, hotSpotY); } public PointerIcon[] newArray(int size) { @@ -360,9 +359,9 @@ public final class PointerIcon implements Parcelable { } public void writeToParcel(Parcel out, int flags) { - out.writeInt(mStyle); + out.writeInt(mType); - if (mStyle != STYLE_NULL) { + if (mType != TYPE_NULL) { out.writeInt(mSystemIconResourceId); if (mSystemIconResourceId == 0) { mBitmap.writeToParcel(out, flags); @@ -383,7 +382,7 @@ public final class PointerIcon implements Parcelable { } PointerIcon otherIcon = (PointerIcon) other; - if (mStyle != otherIcon.mStyle + if (mType != otherIcon.mType || mSystemIconResourceId != otherIcon.mSystemIconResourceId) { return false; } @@ -477,57 +476,57 @@ public final class PointerIcon implements Parcelable { } } - private static int getSystemIconStyleIndex(int style) { - switch (style) { - case STYLE_ARROW: + private static int getSystemIconTypeIndex(int type) { + switch (type) { + case TYPE_ARROW: return com.android.internal.R.styleable.Pointer_pointerIconArrow; - case STYLE_SPOT_HOVER: + case TYPE_SPOT_HOVER: return com.android.internal.R.styleable.Pointer_pointerIconSpotHover; - case STYLE_SPOT_TOUCH: + case TYPE_SPOT_TOUCH: return com.android.internal.R.styleable.Pointer_pointerIconSpotTouch; - case STYLE_SPOT_ANCHOR: + case TYPE_SPOT_ANCHOR: return com.android.internal.R.styleable.Pointer_pointerIconSpotAnchor; - case STYLE_HAND: + case TYPE_HAND: return com.android.internal.R.styleable.Pointer_pointerIconHand; - case STYLE_CONTEXT_MENU: + case TYPE_CONTEXT_MENU: return com.android.internal.R.styleable.Pointer_pointerIconContextMenu; - case STYLE_HELP: + case TYPE_HELP: return com.android.internal.R.styleable.Pointer_pointerIconHelp; - case STYLE_WAIT: + case TYPE_WAIT: return com.android.internal.R.styleable.Pointer_pointerIconWait; - case STYLE_CELL: + case TYPE_CELL: return com.android.internal.R.styleable.Pointer_pointerIconCell; - case STYLE_CROSSHAIR: + case TYPE_CROSSHAIR: return com.android.internal.R.styleable.Pointer_pointerIconCrosshair; - case STYLE_TEXT: + case TYPE_TEXT: return com.android.internal.R.styleable.Pointer_pointerIconText; - case STYLE_VERTICAL_TEXT: + case TYPE_VERTICAL_TEXT: return com.android.internal.R.styleable.Pointer_pointerIconVerticalText; - case STYLE_ALIAS: + case TYPE_ALIAS: return com.android.internal.R.styleable.Pointer_pointerIconAlias; - case STYLE_COPY: + case TYPE_COPY: return com.android.internal.R.styleable.Pointer_pointerIconCopy; - case STYLE_ALL_SCROLL: + case TYPE_ALL_SCROLL: return com.android.internal.R.styleable.Pointer_pointerIconAllScroll; - case STYLE_NO_DROP: + case TYPE_NO_DROP: return com.android.internal.R.styleable.Pointer_pointerIconNodrop; - case STYLE_HORIZONTAL_DOUBLE_ARROW: + case TYPE_HORIZONTAL_DOUBLE_ARROW: return com.android.internal.R.styleable.Pointer_pointerIconHorizontalDoubleArrow; - case STYLE_VERTICAL_DOUBLE_ARROW: + case TYPE_VERTICAL_DOUBLE_ARROW: return com.android.internal.R.styleable.Pointer_pointerIconVerticalDoubleArrow; - case STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW: + case TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW: return com.android.internal.R.styleable. Pointer_pointerIconTopRightDiagonalDoubleArrow; - case STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW: + case TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW: return com.android.internal.R.styleable. Pointer_pointerIconTopLeftDiagonalDoubleArrow; - case STYLE_ZOOM_IN: + case TYPE_ZOOM_IN: return com.android.internal.R.styleable.Pointer_pointerIconZoomIn; - case STYLE_ZOOM_OUT: + case TYPE_ZOOM_OUT: return com.android.internal.R.styleable.Pointer_pointerIconZoomOut; - case STYLE_GRAB: + case TYPE_GRAB: return com.android.internal.R.styleable.Pointer_pointerIconGrab; - case STYLE_GRABBING: + case TYPE_GRABBING: return com.android.internal.R.styleable.Pointer_pointerIconGrabbing; default: return 0; diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index ccb5ec467b1e..d59c8acb9107 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -82,6 +82,13 @@ import java.util.concurrent.locks.ReentrantLock; * and * {@link SurfaceHolder.Callback#surfaceDestroyed SurfaceHolder.Callback.surfaceDestroyed()}. * </ul> + * + * <p class="note"><strong>Note:</strong> Starting in platform version + * {@link android.os.Build.VERSION_CODES#N}, SurfaceView's window position is + * updated synchronously with other View rendering. This means that translating + * and scaling a SurfaceView on screen will not cause rendering artifacts. Such + * artifacts may occur on previous versions of the platform when its window is + * positioned asynchronously.</p> */ public class SurfaceView extends View { static private final String TAG = "SurfaceView"; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 77884f6e4d77..2269282a5771 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2644,7 +2644,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int PFLAG3_POINTER_ICON_NOT_SPECIFIED = 0 << PFLAG3_POINTER_ICON_LSHIFT; /** - * Value indicating {@link PointerIcon.STYLE_NULL}. + * Value indicating {@link PointerIcon.TYPE_NULL}. */ private static final int PFLAG3_POINTER_ICON_NULL = 1 << PFLAG3_POINTER_ICON_LSHIFT; @@ -4539,15 +4539,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, initializeScrollIndicators = true; } break; - case R.styleable.View_pointerShape: + case R.styleable.View_pointerIcon: final int resourceId = a.getResourceId(attr, 0); if (resourceId != 0) { - setPointerIcon(PointerIcon.loadCustomIcon( + setPointerIcon(PointerIcon.load( context.getResources(), resourceId)); } else { - final int pointerShape = a.getInt(attr, PointerIcon.STYLE_NOT_SPECIFIED); - if (pointerShape != PointerIcon.STYLE_NOT_SPECIFIED) { - setPointerIcon(PointerIcon.getSystemIcon(context, pointerShape)); + final int pointerType = a.getInt(attr, PointerIcon.TYPE_NOT_SPECIFIED); + if (pointerType != PointerIcon.TYPE_NOT_SPECIFIED) { + setPointerIcon(PointerIcon.getSystemIcon(context, pointerType)); } } break; @@ -21788,19 +21788,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * The default implementation does not care the location or event types, but some subclasses * may use it (such as WebViews). * @param event The MotionEvent from a mouse - * @param x The x position of the event, local to the view - * @param y The y position of the event, local to the view + * @param pointerIndex The index of the pointer for which to retrieve the {@link PointerIcon}. + * This will be between 0 and {@link MotionEvent#getPointerCount()}. * @see PointerIcon */ - public PointerIcon getPointerIcon(MotionEvent event, float x, float y) { + public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) { + final float x = event.getX(pointerIndex); + final float y = event.getY(pointerIndex); if (isDraggingScrollBar() || isOnScrollbarThumb(x, y)) { - return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_ARROW); + return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_ARROW); } return mPointerIcon; } /** * Set the pointer icon for the current view. + * Passing {@code null} will restore the pointer icon to its default value. * @param pointerIcon A PointerIcon instance which will be shown when the mouse hovers. */ public void setPointerIcon(PointerIcon pointerIcon) { @@ -21815,10 +21818,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Gets the pointer icon for the current view. + */ + public PointerIcon getPointerIcon() { + return mPointerIcon; + } + + + /** * Request capturing further mouse events. * - * When the view captures, the mouse pointer icon will disappear and will not change its - * position. Further mouse events will come to the capturing view, and the mouse movements + * When the view captures, the pointer icon will disappear and will not change its + * position. Further pointer events will come to the capturing view, and the pointer movements * will can be detected through {@link MotionEvent#AXIS_RELATIVE_X} and * {@link MotionEvent#AXIS_RELATIVE_Y}. Non-mouse events (touchscreens, or stylus) will not * be affected. @@ -21830,10 +21841,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @see #releasePointerCapture() * @see #hasPointerCapture() */ - public void setPointerCapture() { + public void requestPointerCapture() { final ViewRootImpl viewRootImpl = getViewRootImpl(); if (viewRootImpl != null) { - viewRootImpl.setPointerCapture(this); + viewRootImpl.requestPointerCapture(this); } } @@ -21842,7 +21853,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Release the current capture of mouse events. * * If the view does not have the capture, it will do nothing. - * @see #setPointerCapture() + * @see #requestPointerCapture() * @see #hasPointerCapture() */ public void releasePointerCapture() { @@ -21856,7 +21867,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Checks the capture status of mouse events. * * @return true if the view has the capture. - * @see #setPointerCapture() + * @see #requestPointerCapture() * @see #hasPointerCapture() */ public boolean hasPointerCapture() { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 2f23b61dd0de..3ff8d4f2e2b1 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1712,9 +1712,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } @Override - public PointerIcon getPointerIcon(MotionEvent event, float x, float y) { + public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) { + final float x = event.getX(pointerIndex); + final float y = event.getY(pointerIndex); if (isOnScrollbarThumb(x, y) || isDraggingScrollBar()) { - return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_ARROW); + return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_ARROW); } // Check what the child under the pointer says about the pointer. final int childrenCount = mChildrenCount; @@ -1728,7 +1730,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); final PointF point = getLocalPoint(); if (isTransformedTouchPointInView(x, y, child, point)) { - final PointerIcon pointerIcon = child.getPointerIcon(event, point.x, point.y); + final PointerIcon pointerIcon = + dispatchResolvePointerIcon(event, pointerIndex, child); if (pointerIcon != null) { if (preorderedList != null) preorderedList.clear(); return pointerIcon; @@ -1741,7 +1744,24 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // The pointer is not a child or the child has no preferences, returning the default // implementation. - return super.getPointerIcon(event, x, y); + return super.onResolvePointerIcon(event, pointerIndex); + } + + private PointerIcon dispatchResolvePointerIcon(MotionEvent event, int pointerIndex, + View child) { + final PointerIcon pointerIcon; + if (!child.hasIdentityMatrix()) { + MotionEvent transformedEvent = getTransformedMotionEvent(event, child); + pointerIcon = child.onResolvePointerIcon(transformedEvent, pointerIndex); + transformedEvent.recycle(); + } else { + final float offsetX = mScrollX - child.mLeft; + final float offsetY = mScrollY - child.mTop; + event.offsetLocation(offsetX, offsetY); + pointerIcon = child.onResolvePointerIcon(event, pointerIndex); + event.offsetLocation(-offsetX, -offsetY); + } + return pointerIcon; } private int getAndVerifyPreorderedIndex(int childrenCount, int i, boolean customOrder) { @@ -2122,17 +2142,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @return {@code true} if the child handled the event. */ private boolean dispatchTransformedGenericPointerEvent(MotionEvent event, View child) { - final float offsetX = mScrollX - child.mLeft; - final float offsetY = mScrollY - child.mTop; - boolean handled; if (!child.hasIdentityMatrix()) { - MotionEvent transformedEvent = MotionEvent.obtain(event); - transformedEvent.offsetLocation(offsetX, offsetY); - transformedEvent.transform(child.getInverseMatrix()); + MotionEvent transformedEvent = getTransformedMotionEvent(event, child); handled = child.dispatchGenericMotionEvent(transformedEvent); transformedEvent.recycle(); } else { + final float offsetX = mScrollX - child.mLeft; + final float offsetY = mScrollY - child.mTop; event.offsetLocation(offsetX, offsetY); handled = child.dispatchGenericMotionEvent(event); event.offsetLocation(-offsetX, -offsetY); @@ -2140,6 +2157,26 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return handled; } + /** + * Returns a MotionEvent that's been transformed into the child's local coordinates. + * + * It's the responsibility of the caller to recycle it once they're finished with it. + * @param event The event to transform. + * @param child The view whose coordinate space is to be used. + * @return A copy of the the given MotionEvent, transformed into the given View's coordinate + * space. + */ + private MotionEvent getTransformedMotionEvent(MotionEvent event, View child) { + final float offsetX = mScrollX - child.mLeft; + final float offsetY = mScrollY - child.mTop; + final MotionEvent transformedEvent = MotionEvent.obtain(event); + transformedEvent.offsetLocation(offsetX, offsetY); + if (!child.hasIdentityMatrix()) { + transformedEvent.transform(child.getInverseMatrix()); + } + return transformedEvent; + } + @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mInputEventConsistencyVerifier != null) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 130b440dfbbd..1c6600d0b3ac 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -359,7 +359,7 @@ public final class ViewRootImpl implements ViewParent, private long mFpsPrevTime = -1; private int mFpsNumFrames; - private int mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED; + private int mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; private PointerIcon mCustomPointerIcon = null; /** @@ -3168,7 +3168,7 @@ public final class ViewRootImpl implements ViewParent, } } - void setPointerCapture(View view) { + void requestPointerCapture(View view) { if (!mAttachInfo.mHasWindowFocus) { Log.w(mTag, "Can't set capture if it's not focused."); return; @@ -3178,6 +3178,7 @@ public final class ViewRootImpl implements ViewParent, } mCapturingView = view; InputManager.getInstance().setPointerIconDetached(true); + return; } void releasePointerCapture(View view) { @@ -4445,19 +4446,18 @@ public final class ViewRootImpl implements ViewParent, } private void maybeUpdatePointerIcon(MotionEvent event) { - if (event.getPointerCount() == 1 - && event.isFromSource(InputDevice.SOURCE_MOUSE)) { + if (event.getPointerCount() == 1 && event.isFromSource(InputDevice.SOURCE_MOUSE)) { if (event.getActionMasked() == MotionEvent.ACTION_HOVER_ENTER || event.getActionMasked() == MotionEvent.ACTION_HOVER_EXIT) { - // Other apps or the window manager may change the icon shape outside of - // this app, therefore the icon shape has to be reset on enter/exit event. - mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED; + // Other apps or the window manager may change the icon type outside of + // this app, therefore the icon type has to be reset on enter/exit event. + mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; } if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT) { if (!updatePointerIcon(event) && event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) { - mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED; + mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; } } } @@ -4484,13 +4484,14 @@ public final class ViewRootImpl implements ViewParent, } private void resetPointerIcon(MotionEvent event) { - mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED; + mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; updatePointerIcon(event); } private boolean updatePointerIcon(MotionEvent event) { - final float x = event.getX(); - final float y = event.getY(); + final int pointerIndex = 0; + final float x = event.getX(pointerIndex); + final float y = event.getY(pointerIndex); if (mView == null) { // E.g. click outside a popup to dismiss it Slog.d(mTag, "updatePointerIcon called after view was removed"); @@ -4501,19 +4502,19 @@ public final class ViewRootImpl implements ViewParent, Slog.d(mTag, "updatePointerIcon called with position out of bounds"); return false; } - final PointerIcon pointerIcon = mView.getPointerIcon(event, x, y); - final int pointerShape = (pointerIcon != null) ? - pointerIcon.getStyle() : PointerIcon.STYLE_DEFAULT; + final PointerIcon pointerIcon = mView.onResolvePointerIcon(event, pointerIndex); + final int pointerType = (pointerIcon != null) ? + pointerIcon.getType() : PointerIcon.TYPE_DEFAULT; - if (mPointerIconShape != pointerShape) { - mPointerIconShape = pointerShape; - if (mPointerIconShape != PointerIcon.STYLE_CUSTOM) { + if (mPointerIconType != pointerType) { + mPointerIconType = pointerType; + if (mPointerIconType != PointerIcon.TYPE_CUSTOM) { mCustomPointerIcon = null; - InputManager.getInstance().setPointerIconShape(pointerShape); + InputManager.getInstance().setPointerIconType(pointerType); return true; } } - if (mPointerIconShape == PointerIcon.STYLE_CUSTOM && + if (mPointerIconType == PointerIcon.TYPE_CUSTOM && !pointerIcon.equals(mCustomPointerIcon)) { mCustomPointerIcon = pointerIcon; InputManager.getInstance().setCustomPointerIcon(mCustomPointerIcon); diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 908a99ddd91e..e6f5b8386d49 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -938,7 +938,11 @@ public interface WindowManagerPolicy { * be correct. * * @param attrs The LayoutParams of the window. - * @param rotation Rotation of the display. + * @param taskBounds The bounds of the task this window is on or {@code null} if no task is + * associated with the window. + * @param displayRotation Rotation of the display. + * @param displayWidth The width of the display. + * @param displayHeight The height of the display. * @param outContentInsets The areas covered by system windows, expressed as positive insets. * @param outStableInsets The areas covered by stable system windows irrespective of their * current visibility. Expressed as positive insets. @@ -946,8 +950,9 @@ public interface WindowManagerPolicy { * @return Whether to always consume the navigation bar. * See {@link #isNavBarForcedShownLw(WindowState)}. */ - public boolean getInsetHintLw(WindowManager.LayoutParams attrs, int rotation, - Rect outContentInsets, Rect outStableInsets, Rect outOutsets); + public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds, + int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets, + Rect outStableInsets, Rect outOutsets); /** * Called when layout of the windows is finished. After this function has diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index 85893b0c0b08..7b7ccae62ded 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -18,11 +18,11 @@ package android.view.inputmethod; import android.annotation.Nullable; import android.os.Bundle; +import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; -import android.util.LocaleList; import android.util.Printer; /** diff --git a/core/java/android/widget/Chronometer.java b/core/java/android/widget/Chronometer.java index 3421790894ed..d74fa8cc3081 100644 --- a/core/java/android/widget/Chronometer.java +++ b/core/java/android/widget/Chronometer.java @@ -130,6 +130,7 @@ public class Chronometer extends TextView { @android.view.RemotableViewMethod public void setCountDown(boolean countDown) { mCountDown = countDown; + updateText(SystemClock.elapsedRealtime()); } /** diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 2813f0c889da..622567c83617 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -42,6 +42,7 @@ import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.os.ParcelableParcel; @@ -70,7 +71,6 @@ import android.text.style.SuggestionSpan; import android.text.style.TextAppearanceSpan; import android.text.style.URLSpan; import android.util.DisplayMetrics; -import android.util.LocaleList; import android.util.Log; import android.util.SparseArray; import android.view.ActionMode; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a0843c7a8be4..a3eed70c47b6 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -52,6 +52,7 @@ import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; +import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.os.ParcelableParcel; @@ -107,7 +108,6 @@ import android.text.style.URLSpan; import android.text.style.UpdateAppearance; import android.text.util.Linkify; import android.util.AttributeSet; -import android.util.LocaleList; import android.util.Log; import android.util.TypedValue; import android.view.AccessibilityIterators.TextSegmentIterator; @@ -6005,19 +6005,21 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } @Override - public PointerIcon getPointerIcon(MotionEvent event, float x, float y) { + public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) { if (mText instanceof Spannable && mLinksClickable) { + final float x = event.getX(pointerIndex); + final float y = event.getY(pointerIndex); final int offset = getOffsetForPosition(x, y); final ClickableSpan[] clickables = ((Spannable) mText).getSpans(offset, offset, ClickableSpan.class); if (clickables.length > 0) { - return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_HAND); + return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_HAND); } } if (isTextSelectable() || isTextEditable()) { - return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_TEXT); + return PointerIcon.getSystemIcon(mContext, PointerIcon.TYPE_TEXT); } - return super.getPointerIcon(event, x, y); + return super.onResolvePointerIcon(event, pointerIndex); } @Override diff --git a/core/java/com/android/internal/app/LocaleHelper.java b/core/java/com/android/internal/app/LocaleHelper.java index 7e9587adaf26..106999bd592c 100644 --- a/core/java/com/android/internal/app/LocaleHelper.java +++ b/core/java/com/android/internal/app/LocaleHelper.java @@ -18,7 +18,7 @@ package com.android.internal.app; import android.icu.text.ListFormatter; import android.icu.util.ULocale; -import android.util.LocaleList; +import android.os.LocaleList; import java.text.Collator; import java.util.Comparator; diff --git a/core/java/com/android/internal/app/LocalePicker.java b/core/java/com/android/internal/app/LocalePicker.java index b1b019cce869..472f583fa075 100644 --- a/core/java/com/android/internal/app/LocalePicker.java +++ b/core/java/com/android/internal/app/LocalePicker.java @@ -26,9 +26,9 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; +import android.os.LocaleList; import android.os.RemoteException; import android.provider.Settings; -import android.util.LocaleList; import android.util.Log; import android.view.LayoutInflater; import android.view.View; diff --git a/core/java/com/android/internal/app/LocalePickerWithRegion.java b/core/java/com/android/internal/app/LocalePickerWithRegion.java index ea628992b5ab..04929a76859e 100644 --- a/core/java/com/android/internal/app/LocalePickerWithRegion.java +++ b/core/java/com/android/internal/app/LocalePickerWithRegion.java @@ -21,8 +21,8 @@ import android.app.FragmentTransaction; import android.app.ListFragment; import android.content.Context; import android.os.Bundle; +import android.os.LocaleList; import android.text.TextUtils; -import android.util.LocaleList; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index 80d60706e0ea..8c5df08f5499 100644 --- a/core/java/com/android/internal/app/procstats/ProcessState.java +++ b/core/java/com/android/internal/app/procstats/ProcessState.java @@ -277,7 +277,7 @@ public final class ProcessState { if (!mDead) { return; } - Slog.wtfStack(TAG, "ProcessState dead: name=" + mName + Slog.w(TAG, "ProcessState dead: name=" + mName + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); } diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 6dc0c601b769..a028449e39d7 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -26,13 +26,13 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.os.LocaleList; import android.os.RemoteException; import android.provider.Settings; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.LocaleList; import android.util.Pair; import android.util.Printer; import android.util.Slog; diff --git a/core/java/com/android/internal/inputmethod/LocaleUtils.java b/core/java/com/android/internal/inputmethod/LocaleUtils.java index 2aa660ec5ebe..b18f83cdccef 100644 --- a/core/java/com/android/internal/inputmethod/LocaleUtils.java +++ b/core/java/com/android/internal/inputmethod/LocaleUtils.java @@ -22,7 +22,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.icu.util.ULocale; -import android.util.LocaleList; +import android.os.LocaleList; import java.util.ArrayList; import java.util.Arrays; diff --git a/core/java/com/android/internal/os/PathClassLoaderFactory.java b/core/java/com/android/internal/os/PathClassLoaderFactory.java index e5d36940a628..06a93b254bf5 100644 --- a/core/java/com/android/internal/os/PathClassLoaderFactory.java +++ b/core/java/com/android/internal/os/PathClassLoaderFactory.java @@ -16,6 +16,8 @@ package com.android.internal.os; +import android.os.Trace; + import dalvik.system.PathClassLoader; /** @@ -40,11 +42,13 @@ public class PathClassLoaderFactory { boolean isNamespaceShared) { PathClassLoader pathClassloader = new PathClassLoader(dexPath, librarySearchPath, parent); + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "createClassloaderNamespace"); String errorMessage = createClassloaderNamespace(pathClassloader, targetSdkVersion, librarySearchPath, libraryPermittedPath, isNamespaceShared); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); if (errorMessage != null) { throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " + diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 55541825de62..006d1ec1291a 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -28,6 +28,7 @@ import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; +import android.security.keystore.AndroidKeyStoreProvider; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -56,6 +57,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.security.Security; +import java.security.Provider; import java.util.ArrayList; /** @@ -198,6 +201,7 @@ public class ZygoteInit { // Ask the WebViewFactory to do any initialization that must run in the zygote process, // for memory sharing purposes. WebViewFactory.prepareWebViewInZygote(); + warmUpJcaProviders(); Log.d(TAG, "end preload"); } @@ -220,6 +224,35 @@ public class ZygoteInit { } /** + * Register AndroidKeyStoreProvider and warm up the providers that are already registered. + * + * By doing it here we avoid that each app does it when requesting a service from the + * provider for the first time. + */ + private static void warmUpJcaProviders() { + long startTime = SystemClock.uptimeMillis(); + Trace.traceBegin( + Trace.TRACE_TAG_DALVIK, "Starting installation of AndroidKeyStoreProvider"); + // AndroidKeyStoreProvider.install() manipulates the list of JCA providers to insert + // preferred providers. Note this is not done via security.properties as the JCA providers + // are not on the classpath in the case of, for example, raw dalvikvm runtimes. + AndroidKeyStoreProvider.install(); + Log.i(TAG, "Installed AndroidKeyStoreProvider in " + + (SystemClock.uptimeMillis() - startTime) + "ms."); + Trace.traceEnd(Trace.TRACE_TAG_DALVIK); + + startTime = SystemClock.uptimeMillis(); + Trace.traceBegin( + Trace.TRACE_TAG_DALVIK, "Starting warm up of JCA providers"); + for (Provider p : Security.getProviders()) { + p.warmUpServiceProvision(); + } + Log.i(TAG, "Warmed up JCA providers in " + + (SystemClock.uptimeMillis() - startTime) + "ms."); + Trace.traceEnd(Trace.TRACE_TAG_DALVIK); + } + + /** * Performs Zygote process initialization. Loads and initializes * commonly used classes. * diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index b781fd47b1bd..28281b3ce740 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -109,9 +109,15 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame Drawable captionBackgroundDrawableDrawable, Drawable userCaptionBackgroundDrawable, int statusBarColor, int navigationBarColor) { mDecorView = decorView; - mResizingBackgroundDrawable = resizingBackgroundDrawable; - mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable; - mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable; + mResizingBackgroundDrawable = resizingBackgroundDrawable != null + ? resizingBackgroundDrawable.getConstantState().newDrawable() + : null; + mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable != null + ? captionBackgroundDrawableDrawable.getConstantState().newDrawable() + : null; + mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable != null + ? userCaptionBackgroundDrawable.getConstantState().newDrawable() + : null; if (mCaptionBackgroundDrawable == null) { mCaptionBackgroundDrawable = mResizingBackgroundDrawable; } diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 8cc850970891..594581af8837 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -899,6 +899,8 @@ public final class FloatingToolbar { mOverflowPanel.setAlpha(1); mOverflowPanel.setVisibility(View.VISIBLE); mOverflowButton.setImageDrawable(mArrow); + mOverflowButton.setContentDescription(mContext.getString( + R.string.floating_toolbar_close_overflow_description)); // Update x-coordinates depending on RTL state. if (isRTL()) { @@ -940,6 +942,8 @@ public final class FloatingToolbar { mOverflowPanel.setAlpha(0); mOverflowPanel.setVisibility(View.INVISIBLE); mOverflowButton.setImageDrawable(mOverflow); + mOverflowButton.setContentDescription(mContext.getString( + R.string.floating_toolbar_open_overflow_description)); if (hasOverflow()) { // Update x-coordinates depending on RTL state. diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 07912cd43f07..886265ac6df1 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -119,6 +119,9 @@ public class SystemConfig { // These are the components that are enabled by default as VR mode listener services. final ArraySet<ComponentName> mDefaultVrComponents = new ArraySet<>(); + // These are the permitted backup transport service components + final ArraySet<ComponentName> mBackupTransportWhitelist = new ArraySet<>(); + public static SystemConfig getInstance() { synchronized (SystemConfig.class) { if (sInstance == null) { @@ -176,6 +179,10 @@ public class SystemConfig { return mDefaultVrComponents; } + public ArraySet<ComponentName> getBackupTransportWhitelist() { + return mBackupTransportWhitelist; + } + SystemConfig() { // Read configuration from system readPermissions(Environment.buildPath( @@ -452,6 +459,23 @@ public class SystemConfig { mDefaultVrComponents.add(new ComponentName(pkgname, clsname)); } XmlUtils.skipCurrentTag(parser); + } else if ("backup-transport-whitelisted-service".equals(name) && allowFeatures) { + String serviceName = parser.getAttributeValue(null, "service"); + if (serviceName == null) { + Slog.w(TAG, "<backup-transport-whitelisted-service> without service in " + + permFile + " at " + parser.getPositionDescription()); + } else { + ComponentName cn = ComponentName.unflattenFromString(serviceName); + if (cn == null) { + Slog.w(TAG, + "<backup-transport-whitelisted-service> with invalid service name " + + serviceName + " in "+ permFile + + " at " + parser.getPositionDescription()); + } else { + mBackupTransportWhitelist.add(cn); + } + } + XmlUtils.skipCurrentTag(parser); } else { XmlUtils.skipCurrentTag(parser); continue; diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index 71be52e52e57..6b634dfbef3e 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -32,7 +32,7 @@ namespace android { static struct { jclass clazz; - jfieldID mStyle; + jfieldID mType; jfieldID mBitmap; jfieldID mHotSpotX; jfieldID mHotSpotY; @@ -78,7 +78,7 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj status_t android_view_PointerIcon_getLoadedIcon(JNIEnv* env, jobject pointerIconObj, PointerIcon* outPointerIcon) { - outPointerIcon->style = env->GetIntField(pointerIconObj, gPointerIconClassInfo.mStyle); + outPointerIcon->style = env->GetIntField(pointerIconObj, gPointerIconClassInfo.mType); outPointerIcon->hotSpotX = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotX); outPointerIcon->hotSpotY = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotY); @@ -128,8 +128,8 @@ int register_android_view_PointerIcon(JNIEnv* env) { gPointerIconClassInfo.mBitmap = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mBitmap", "Landroid/graphics/Bitmap;"); - gPointerIconClassInfo.mStyle = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, - "mStyle", "I"); + gPointerIconClassInfo.mType = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, + "mType", "I"); gPointerIconClassInfo.mHotSpotX = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mHotSpotX", "F"); diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 6af9ef2271fa..d12e34c1cb10 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2796,7 +2796,7 @@ i <flag name="end" value="0x20" /> </attr> - <attr name="pointerShape"> + <attr name="pointerIcon"> <!-- Null icon, pointer becomes invisible. --> <enum name="none" value="0" /> <!-- The default icon of arrow pointer. --> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 8c5cb473295e..6c4340ad2349 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -2281,6 +2281,8 @@ activities launched in the task. That is if the root activity of a task set minimal width, then the system will set the same minimal width on all other activities in the task. It will also ignore any other minimal width attributes of non-root activities. --> + <attr name="minWidth" /> + <!-- @removed --> <attr name="minimalWidth" format="dimension" /> <!-- Minimal height of the activity. @@ -2288,6 +2290,8 @@ activities launched in the task. That is if the root activity of a task set minimal height, then the system will set the same minimal height on all other activities in the task. It will also ignore any other minimal height attributes of non-root activities. --> + <attr name="minHeight" /> + <!-- @removed --> <attr name="minimalHeight" format="dimension" /> </declare-styleable> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e64d9056d828..ad02d29dcbf3 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1127,6 +1127,9 @@ specified --> <string name="default_wallpaper_component" translatable="false">@null</string> + <!-- By default a product has no distinct default lock wallpaper --> + <item name="default_lock_wallpaper" type="drawable">@null</item> + <!-- Component name of the built in wallpaper used to display bitmap wallpapers. This must not be null. --> <string name="image_wallpaper_component" translatable="false">com.android.systemui/com.android.systemui.ImageWallpaper</string> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index c91e09fd39d0..ac4818457053 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2664,6 +2664,7 @@ <public type="attr" name="subMenuArrow" /> <public type="attr" name="defaultWidth" /> <public type="attr" name="defaultHeight" /> + <!-- @removed --> <public type="attr" name="minimalWidth" /> <public type="attr" name="resizeableActivity" /> <public type="attr" name="supportsPictureInPicture" /> @@ -2684,7 +2685,7 @@ <public type="attr" name="preferenceFragmentStyle" /> <public type="attr" name="canControlMagnification" /> <public type="attr" name="languageTag" /> - <public type="attr" name="pointerShape" /> + <public type="attr" name="pointerIcon" /> <public type="attr" name="tickMark" /> <public type="attr" name="tickMarkTint" /> <public type="attr" name="tickMarkTintMode" /> @@ -2709,6 +2710,7 @@ <public type="attr" name="fillType" /> <public type="attr" name="popupEnterTransition" /> <public type="attr" name="popupExitTransition" /> + <!-- @removed --> <public type="attr" name="minimalHeight" /> <public type="attr" name="forceHasOverlappingRendering" /> <public type="attr" name="contentInsetStartWithNavigation" /> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ac36a2f9f476..3f1de6d646f6 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1140,6 +1140,7 @@ <java-symbol type="array" name="config_colorTransforms" /> <java-symbol type="drawable" name="default_wallpaper" /> + <java-symbol type="drawable" name="default_lock_wallpaper" /> <java-symbol type="drawable" name="indicator_input_error" /> <java-symbol type="drawable" name="popup_bottom_dark" /> <java-symbol type="drawable" name="popup_bottom_bright" /> @@ -2322,6 +2323,8 @@ <java-symbol type="layout" name="floating_popup_overflow_list_item" /> <java-symbol type="layout" name="floating_popup_overflow_image_list_item" /> <java-symbol type="layout" name="floating_popup_overflow_button" /> + <java-symbol type="string" name="floating_toolbar_open_overflow_description" /> + <java-symbol type="string" name="floating_toolbar_close_overflow_description" /> <java-symbol type="dimen" name="floating_toolbar_height" /> <java-symbol type="dimen" name="floating_toolbar_menu_button_side_padding" /> <java-symbol type="dimen" name="floating_toolbar_overflow_side_padding" /> diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java index d4bb0f3e1125..39a29074acde 100644 --- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java +++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java @@ -18,9 +18,9 @@ package android.content.res; import android.annotation.NonNull; import android.app.ResourcesManager; import android.os.Binder; +import android.os.LocaleList; import android.support.test.filters.SmallTest; import android.util.DisplayMetrics; -import android.util.LocaleList; import android.util.TypedValue; import android.view.Display; import junit.framework.TestCase; diff --git a/core/tests/coretests/src/android/util/LocaleListTest.java b/core/tests/coretests/src/android/os/LocaleListTest.java index de1382d5d45e..17ef7730f452 100644 --- a/core/tests/coretests/src/android/util/LocaleListTest.java +++ b/core/tests/coretests/src/android/os/LocaleListTest.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package android.util; +package android.os; import android.test.suitebuilder.annotation.SmallTest; -import android.util.LocaleList; import java.util.Locale; diff --git a/core/tests/coretests/src/android/print/BasePrintTest.java b/core/tests/coretests/src/android/print/BasePrintTest.java index d56a405ba0bb..2c2ee8c2e52f 100644 --- a/core/tests/coretests/src/android/print/BasePrintTest.java +++ b/core/tests/coretests/src/android/print/BasePrintTest.java @@ -29,6 +29,7 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.os.CancellationSignal; +import android.os.LocaleList; import android.os.ParcelFileDescriptor; import android.os.SystemClock; import android.print.PrintAttributes; @@ -43,7 +44,6 @@ import android.printservice.PrintJob; import android.printservice.PrintService; import android.test.InstrumentationTestCase; import android.util.DisplayMetrics; -import android.util.LocaleList; import org.mockito.stubbing.Answer; diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java index 6b5e4adf9010..97ea88557cdc 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java @@ -22,12 +22,12 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Configuration; import android.content.res.Resources; +import android.os.LocaleList; import android.os.Parcel; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.LocaleList; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; import android.view.inputmethod.InputMethodSubtype; diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/LocaleUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/LocaleUtilsTest.java index deba40f62173..cd339fb95509 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/LocaleUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/LocaleUtilsTest.java @@ -16,9 +16,9 @@ package com.android.internal.inputmethod; +import android.os.LocaleList; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; -import android.util.LocaleList; import java.util.ArrayList; import java.util.Locale; diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml index 4a2f23284e8c..4211c6fbd5ea 100644 --- a/docs/html/_redirects.yaml +++ b/docs/html/_redirects.yaml @@ -834,11 +834,11 @@ redirects: - from: /r/studio-ui/avd-manager.html to: /studio/run/managing-avds.html - from: /r/studio-ui/rundebugconfig.html - to: /studio/run/emulator.html + to: /studio/run/index.html - from: /r/studio-ui/devicechooser.html to: /studio/run/emulator.html - from: /r/studio-ui/virtualdeviceconfig.html - to: /studio/run/emulator.html + to: /studio/run/managing-avds.html - from: /r/studio-ui/emulator.html to: /studio/run/emulator.html - from: /r/studio-ui/instant-run.html @@ -983,6 +983,8 @@ redirects: to: /studio/test/monkeyrunner/index.html - from: /tools/help/MonkeyRunner.html to: /studio/test/monkeyrunner/MonkeyRunner.html +- from: /tools/help/monitor.html + to: /studio/profile/monitor.html - from: /tools/help/proguard.html to: /studio/build/shrink-code.html - from: /tools/help/sdk-manager.html diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index c61837b63db2..31e37bf06895 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -247,86 +247,86 @@ var VERSION_NAMES = {"api":0},{"api":1},{"api":2},{"api":3}, { "api":4, - "link":"<a href='/about/versions/android-1.6.html'>1.6</a>", + "link":'<a href="/about/versions/android-1.6.html">1.6</a>', "codename":"Donut", }, { "api":5}, { "api":6}, { "api":7, - "link":"<a href='/about/versions/android-2.1.html'>2.1</a>", + "link":'<a href="/about/versions/android-2.1.html">2.1</a>', "codename":"Eclair", }, { "api":8, - "link":"<a href='/about/versions/android-2.2.html'>2.2</a>", + "link":'<a href="/about/versions/android-2.2.html">2.2</a>', "codename":"Froyo" }, { "api":9, - "link":"<a href='/about/versions/android-2.3.html'>2.3 -<br>2.3.2</a>", + "link":'<a href="/about/versions/android-2.3.html">2.3 -<br>2.3.2</a>', "codename":"Gingerbread" }, { "api":10, - "link":"<a href='/about/versions/android-2.3.3.html'>2.3.3 -<br>2.3.7</a>", + "link":'<a href="/about/versions/android-2.3.3.html">2.3.3 -<br>2.3.7</a>', "codename":"Gingerbread" }, { "api":11}, { "api":12, - "link":"<a href='/about/versions/android-3.1.html'>3.1</a>", + "link":'<a href="/about/versions/android-3.1.html">3.1</a>', "codename":"Honeycomb" }, { "api":13, - "link":"<a href='/about/versions/android-3.2.html'>3.2</a>", + "link":'<a href="/about/versions/android-3.2.html">3.2</a>', "codename":"Honeycomb" }, { "api":14}, { "api":15, - "link":"<a href='/about/versions/android-4.0.html'>4.0.3 -<br>4.0.4</a>", + "link":'<a href="/about/versions/android-4.0.html">4.0.3 -<br>4.0.4</a>', "codename":"Ice Cream Sandwich" }, { "api":16, - "link":"<a href='/about/versions/android-4.1.html'>4.1.x</a>", + "link":'<a href="/about/versions/android-4.1.html">4.1.x</a>', "codename":"Jelly Bean" }, { "api":17, - "link":"<a href='/about/versions/android-4.2.html'>4.2.x</a>", + "link":'<a href="/about/versions/android-4.2.html">4.2.x</a>', "codename":"Jelly Bean" }, { "api":18, - "link":"<a href='/about/versions/android-4.3.html'>4.3</a>", + "link":'<a href="/about/versions/android-4.3.html">4.3</a>', "codename":"Jelly Bean" }, { "api":19, - "link":"<a href='/about/versions/android-4.4.html'>4.4</a>", + "link":'<a href="/about/versions/android-4.4.html">4.4</a>', "codename":"KitKat" }, { "api":20, - "link":"<a href='/about/versions/android-4.4.html'>4.4W</a>", + "link":'<a href="/about/versions/android-4.4.html">4.4W</a>', "codename":"KitKat for Wear" }, { "api":21, - "link":"<a href='/about/versions/android-5.0.html'>5.0</a>", + "link":'<a href="/about/versions/android-5.0.html">5.0</a>', "codename":"Lollipop" }, { "api":22, - "link":"<a href='/about/versions/android-5.1.html'>5.1</a>", + "link":'<a href="/about/versions/android-5.1.html">5.1</a>', "codename":"Lollipop" }, { "api":23, - "link":"<a href='/about/versions/marshmallow/index.html'>6.0</a>", + "link":'<a href="/about/versions/marshmallow/index.html">6.0</a>', "codename":"Marshmallow" } ]; diff --git a/docs/html/google/play-services/id.jd b/docs/html/google/play-services/id.jd index f95ebef2c1d3..2f0664c4fed4 100644 --- a/docs/html/google/play-services/id.jd +++ b/docs/html/google/play-services/id.jd @@ -178,7 +178,7 @@ import java.io.IOException; public void getIdThread() { Info adInfo = null; try { - adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext); + adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext.getApplicationContext()); } catch (IOException e) { // Unrecoverable error connecting to Google Play services (e.g., // the old version of the service doesn't support getting AdvertisingId). diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd index 2203f71678f3..a1135bfbb919 100644 --- a/docs/html/google/play/billing/billing_admin.jd +++ b/docs/html/google/play/billing/billing_admin.jd @@ -26,193 +26,164 @@ parent.link=index.html </div> <p>In-app billing frees you from processing financial transactions, but you still need to perform a -few administrative tasks, including setting up and maintaining your product list on the Google Play -Developer Console, registering test accounts, and handling refunds when necessary.</p> +few administrative tasks. These tasks include the following:</p> +<ul> + <li>Setting up and maintaining your product list on the Google Play Developer Console.</li> + <li>Registering test accounts.</li> + <li>Handling refunds when necessary.</li> +</ul> +</p> -<p>You must have a Google Play publisher account to register test accounts. And you must have a -Google payments merchant account to create a product list and issue refunds to your users. If you +<p>To register a test account, you must have a Google Play publisher account. If you already have a publisher account on Google Play, you can use your existing account. You do not -need to register for a new account to support in-app billing.</p> +need to register for a new account to support in-app billing. If you don't have a publisher +account, you can register as a Google Play developer and set up a publisher account through the <a +href="http://play.google.com/apps/publish">Google Play Developer Console</a>.</p> -<p>If you do not have a publisher account, you can register as a Google Play -developer and set up a publisher account at the <a -href="http://play.google.com/apps/publish">Google Play Developer Console</a>. If you do not -have a Google payments merchant account, you can register for one through the -Developer Console.</p> +<p>If you want to create a product list and issue refunds to your users, you must have a +Google payments merchant account. If you don't have a merchant account, you can +register for one through the Developer Console.</p> <h2 id="billing-list-setup">Creating a Product List</h2> <p>The Google Play Developer Console provides a product list for each of your published -applications. You can sell an item using Google Play's in-app billing feature only if the item is -listed on an application's product list. Each application has its own product list; you cannot sell -items that appear on another application's product list.</p> - -<div class="figure-right"> - <figure id="fig-iap"> - <img src="{@docRoot}images/in-app-billing/in_app_products.png" width="700" - alt="The Mythical Journey app lists two in-app products, Invisibility Potion and Sleeping Potion."> - <figcaption> - <b>Figure 1. </b>You can access an application's product list by - selecting the <strong>In-app Products</strong> link in the main Apps - navigation. - </figcaption> - </figure> -</div> - -<p>You can access an application's product list by clicking the <strong>In-App Products</strong> -link in applications listed in your developer account (see -figure 1). The <strong>In-App Products</strong> link appears only if you have a Google payments -merchant account and the application's manifest includes the <code>com.android.vending.BILLING</code> -permission.</p> - -<p>A product list specifies items you are selling in an application — in-app products, -subscriptions, or a combination of both. For each item, the product list contains information such as a product id, -product description, and price. The product list stores only metadata about the items -you are selling in your application. It does not store any digital content. You are responsible for -storing and delivering the digital content that you sell in your applications.</p> - -<p>You can create a product list for any published application, or any -application in the alpha or beta channels, that's been -uploaded and saved to the Developer Console. However, you must have a Google payments merchant -account and the application's manifest must include the <code>com.android.vending.BILLING</code> -permission. If an application's manifest does not include this permission, you will be able to edit -existing items in the product list, but you won't be able to add new items to the list. For more -information about this permission, see -<a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission">Updating Your -Application's Manifest</a>.</p> +apps. You can sell an item using Google Play's in-app billing feature only if the item is +listed on an app's product list. Each app has its own product list; you cannot sell +items that appear on another app's product list.</p> + +<p>You can access an app's product list by opening the <strong>In-app Products</strong> +page for an app that is listed in your developer account. The link to the +<strong>In-app Products</strong> page appears only if you have a Google payments merchant +account and the app's manifest includes the +<code>com.android.vending.BILLING</code> permission. For more information about this +permission, see <a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission"> +Updating Your App's Manifest</a>.</p> + +<p>A product list specifies items you are selling in an app: in-app products, +subscriptions, or a combination of both. For each item, the product list contains information +such as product ID, product description, and price. You can create a product list for any +published app, including apps published to the alpha and beta channels.</p> + +<p>The product list stores only metadata about the items you are selling in your app. +It does not store any digital content. You are responsible for storing and delivering +the digital content that you sell in your apps.</p> <p class="note"><strong>Note:</strong> Previously, you could test an app by -uploading an unpublished "draft" version. This functionality is no longer +uploading an unpublished draft version. This functionality is no longer supported; instead, you must publish it to the alpha or beta distribution channel. For more information, see <a href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps are No Longer Supported</a>. -<p>In addition, an application package can have only one product list. If you create a product -list for an application, and you use the <a +<p>In addition, an app package can have only one product list. If you create a product +list for an app, and you use the <a href="{@docRoot}google/play/publishing/multiple-apks.html">multiple APK feature</a> to distribute -more than one APK for that application, the product list applies to all APK versions that are -associated with the application listing. You cannot create individual product lists for each APK if +more than one APK for that app, the product list applies to all APK versions that are +associated with the app listing. You cannot create individual product lists for each APK if you are using the multiple APK feature.</p> -<p>You can add items to a product list two ways: you can add items one at a time by using the In-app -Products UI (see figure 2), or you can add a batch of items by importing the items from a +<p>You can add items to a product list two ways: you can add items one at a time on the <strong>In-app +Products</strong> page, or you can add a batch of items by importing the items from a comma-separated values (CSV) file. Adding items one at a time is useful if your -application has only a few in-app items or you are adding only a few items to a -product list for testing purposes. The CSV file method is useful if your application has a large +app has only a few in-app items or you are adding only a few items to a +product list for testing purposes. The CSV file method is useful if your app has a large number of in-app items.</p> -<p class="note"><strong>Note:</strong> Batch upload of product lists containing subscriptions is not yet supported. -Also, you cannot perform a batch upload containing changes to in-app products that are linked to a +<p class="note"><strong>Note:</strong> Batch upload of product lists containing + subscriptions is not supported. Also, when updating existing items in a batch upload, + you cannot include changes to in-app products that are linked to a <a href="#pricing-template">pricing template</a>.</p> <h3 id="billing-form-add">Adding items one at a time to a product list</h3> -<p>To add an item to a product list using the In-app Products UI, follow these steps:</p> +<p>To add an item to a product list using the Developer Console UI, follow these steps:</p> <ol> <li><a href="http://play.google.com/apps/publish">Log in</a> to your publisher account.</li> - <li>In the <strong>All Applications</strong> panel, click on the - app name, then select <strong>In-app Products</strong>.</li> - <li>Click <strong>Add new product</strong> (see figure 2) and provide the product type and ID for the item you are - selling. Click <strong>Continue</strong>.</li> - <li>Enter additional information about the item, then click <strong>Save</strong> or <strong>Publish</strong>. + <li>In the <strong>All applications</strong> panel, click on the + app name, then open the <strong>In-app Products</strong> page.</li> + <li><p>Click <strong>Add new product</strong>. After you provide the product type and ID for the item you are + selling, click <strong>Continue</strong>.</p> + <dl> + <dt>Product Type</dt> + <dd> + <p>The product type can be <strong>Managed product</strong> or <strong>Subscription</strong>. You cannot + change an item's product type after you create the item. For more information, see + <a href="#billing-purchase-type">Choosing a Product Type</a>.</p> + <p class="note"><strong>Note: </strong>For subscription items, you cannot change the + item's price once you have published the item.</p> + </dd> + <dt>Product ID</dt> + <dd> + <p>Product IDs are unique across an app's namespace. A product ID must start with a + lowercase letter or a number and must be composed of only lowercase letters (a-z), numbers + (0-9), underscores (_), and periods (.). The product ID <code>android.test</code> is reserved, as are all + product IDs that start with <code>android.test</code>.</p> + <p class="note"><strong>Note: </strong>Be sure to plan your product ID namespace carefully. You + cannot modify an item's product ID after the item is created, and you cannot reuse + a product ID within an app.</p> + </dd> + </dl> + </li> + <li><p>Enter additional information about the item, then click <strong>Save</strong>.</p> + <dl> + <dt>Publishing State</dt> + <dd> + <p>An item's publishing state can be <strong>Active</strong> or + <strong>Inactive</strong>. To be visible to a user during checkout, an item's publishing state must be set to + <strong>Active</strong>, and the item's app must be published on Google Play.</p> + <p class="note"><strong>Note:</strong> If you're using a test account, users can see active items + within unpublished apps, as well. For more information, see <a + href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-real">Testing In-app + Billing</a>.</p> + </dd> + <dt>Languages and Translations</dt> + <dd> + <p>By default, in-app products inherit their default language from the parent app.</p> + <p>You can provide localized titles and descriptions for your in-app + products by selecting <strong>Add Translations</strong>. If you want Google + Play to translate your title and description for you, based on the title and + description in the default language, just choose the languages that you + want to offer. You can also provide custom translations in specific + languages.</p> + </dd> + <dt>Title</dt> + <dd> + The title is a short descriptor for the item. An example of a title is: "Sleeping potion." + Every item must have a title. The title is visible to users during checkout. For optimum appearance, + titles should be no longer than 25 characters; however, titles can be up to 55 characters in length. + </dd> + <dt>Description</dt> + <dd> + The description is a long descriptor for the item. An example of a description is: + "Instantly puts creatures to sleep. Does not work on angry elves." Every item must have a description. + Descriptions can be up to 80 characters in length. + </dd> + <dt>Price</dt> + <dd> + <p>Provide a price in your home currency, or link the price to an existing + pricing template. Based on the price you enter or the prices + from the pricing template, the system autofills country-specific prices for + different currencies. These generated prices use current exchange rates and + locally relevant pricing patterns (see figure 1).</p> + <p>You can also change prices for other currencies manually, but you can do + this only if a currency is used in one of the target countries for your + app. You can specify target countries for your app on the + <strong>Pricing & Distribution</strong> page in the Google Play + Developer Console.</p> + </dd> + </dl> + </li> </ol> -<div class="figure-right"> - <figure id="fig-anp"> - <img src="{@docRoot}images/in-app-billing/add_new_product.png" width="300" - alt="Adding a managed product with a Product ID of basic_sleeping_potion."> - <figcaption> - <b>Figure 2. </b>The <em>Add New Product</em> page lets you - provide basic information about a paid app or in-app product. - </figcaption> - </figure> -</div> - -<div class="figure-right"> - <figure id="fig-nmp"> - <img src="{@docRoot}images/in-app-billing/new_managed_product.png" width="700" - alt=""> - <figcaption> - <b>Figure 3. </b>The <em>New Managed Product</em> page lets you finish - adding items to an app’s product list. - </figcaption> - </figure> -</div> - -<div class="figure-right"> - <figure id="fig-elp"> - <img src="{@docRoot}images/in-app-billing/edit_local_prices.png" width="700" - alt="An item that costs 1.99 in USD usually costs a different amount in AUD, - EUR, or BOB. Some countries also add tax to the price."> - <figcaption> - <b>Figure 4. </b>Specifying additional currencies for an in-app product. - </figcaption> - </figure> -</div> - -<p>You must enter the following information for each item in a product list (see - figures 2 and 3):</p> -<ul> - <li><strong>In-app Product ID</strong> - <p>Product IDs are unique across an application's namespace. A product ID must start with a - lowercase letter or a number, and must be composed using only lowercase letters (a-z), numbers - (0-9), underscores (_), and dots (.). The product ID <code>"android.test"</code> is reserved, as are all - product IDs that start with <code>"android.test"</code>.</p> - <p class="note"><strong>Note: </strong>Be sure to plan your product ID namespace carefully. You - cannot modify an item's product ID after it is created, and you cannot reuse - a product ID.</p> - </li> - <li><strong>Product Type</strong> - <p>The product type can be <strong>Managed product</strong> or <strong>Subscription</strong>. You cannot - change an item's product type after you set it. For more information, see - <a href="#billing-purchase-type">Choosing a product type</a>.</p> - <p class="note"><strong>Note: </strong>For subscription items, note that you cannot change the - item's price once you have published it.</p> - </li> - <li><strong>Publishing State</strong> - <p>An item's publishing state can be <strong>Published</strong> or <strong>Unpublished - </strong>. To be visible to a user during checkout, an item's publishing state must be set to - <strong>Published</strong>, and the item's application must be published on Google Play.</p> - <p class="note"><strong>Note:</strong> This is not true for test accounts. An item is visible to - a test account if the application is not published and the item is published. See <a - href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-real">Testing In-app - Billing</a> for more information.</p> - </li> - <li><strong>Languages and Translations</strong> - <p>You can provide localized titles and descriptions for your in-app - products by selecting <strong>Add Translations</strong>. If you want Google - Play to translate your title and description for you, based on the title and - description in the default language, just choose the languages that you - want to offer. If you want to provide custom translations in specific - languages, you can also do that. By default, an in-app product inherits its - default language from the parent application.</p> - </li> - <li><strong>Title</strong> - <p>The title is a short descriptor for the item. For example, "Sleeping potion." - Every item must have a title. The title is visible to - users during checkout. For optimum appearance, titles should be no longer than 25 characters; - however, titles can be up to 55 characters in length.</p> - </li> - <li><strong>Description</strong> - <p>The description is a long descriptor for the item. For example, "Instantly puts creatures to - sleep. Does not work on angry elves." Every item must have a description. Descriptions can be - up to 80 characters in length.</p> - </li> - <li><strong>Price</strong> - <p>Provide a price in your home currency, or link the price to an existing - pricing template (see figure 4). Based on the price you enter or the prices - from the pricing template, the system autofills country-specific prices for - different currencies. These generated prices use today's exchange rates and - locally-relevant pricing patterns.</p> - <p>You can also change prices for other currencies manually, but you can do - this only if a currency is used in one of the target countries for your - application. You can specify target countries for your app on the - <strong>Pricing & Distribution</strong> page in the Google Play - Developer Console.</p> - </li> -</ul> +<figure id="fig-elp"> + <img class="border-img" src="{@docRoot}images/in-app-billing/edit_local_prices.png" + width="700" alt="An item that costs 1.99 in USD usually costs a different + amount in AUD, EUR, or BOB. Some countries also add tax to the price."> + <figcaption> + <b>Figure 1. </b>Specifying additional currencies for an in-app product. + </figcaption> +</figure> <h3 id="billing-bulk-add">Adding a batch of items to a product list</h3> @@ -227,18 +198,16 @@ tax-exclusive default price, and tax-inclusive prices will be auto-filled. If yo do not use auto-fill, prices you provide must include tax.</p> <p class="note"><strong>Note:</strong> Batch upload of product lists containing -subscriptions is not yet supported. Also, you cannot perform a batch upload -containing changes to in-app products that are linked to a +subscriptions is not supported. Also, when updating existing items in a batch +upload, you cannot include changes to in-app products that are linked to a <a href="#pricing-template">pricing template</a>.</p> - - <p>To import the items that are specified in your CSV file, do the following:</p> <ol> <li><a href="http://play.google.com/apps/publish">Log in</a> to your publisher account.</li> - <li>In the <strong>All Applications</strong> panel, click on the app - name, then select <strong>In-app Products</strong>.</li> + <li>In the <strong>All applications</strong> panel, select the app + name, then open the <strong>In-app Products</strong> page.</li> <li>On the In-app Products List page, click <strong>Import/Export</strong> > <strong>Import in-app products from CSV file</strong>, then select your CSV file. @@ -260,8 +229,8 @@ a product list and you want to start managing the product list through a CSV fil <h4 id="billing-bulk-format">Formatting batches of items</h4> -<p>The CSV file uses commas (,) and semi-colons (;) to separate data values. -Commas are used to separate primary data values, and semi-colons are used to +<p>The CSV file uses commas (,) and semicolons (;) to separate data values. +Commas are used to separate primary data values, and semicolons are used to separate subvalues. For example, the syntax for the CSV file is as follows:</p> <p>"<em>product_id</em>","<em>publish_state</em>","<em>purchase_type</em>","<em>autotranslate</em> @@ -271,86 +240,108 @@ separate subvalues. For example, the syntax for the CSV file is as follows:</p> <p>Descriptions and usage details are provided below.</p> -<ul> - <li><em>product_id</em> - <p>This is equivalent to the In-app Product ID setting in the In-app Products UI. If you specify +<dl> + <dt>product_id</dt> + <dd> + This is equivalent to the In-app Product ID setting in the In-app Products UI. If you specify a <em>product_id</em> that already exists in a product list, and you choose to overwrite the product list while importing the CSV file, the data for the existing item is overwritten with the values specified in the CSV file. The overwrite feature does not delete items that are on a - product list but not present in the CSV file.</p> - </li> - <li><em>publish_state</em> - <p>This is equivalent to the Publishing State setting in the In-app Products UI. Can be <code> - published</code> or <code>unpublished</code>.</p> - </li> - <li><em>purchase_type</em> - <p>This is equivalent to the Product Type setting in the In-app Products UI. Can be <code> + product list but not present in the CSV file. + </dd> + <dt>publish_state</dt> + <dd> + This is equivalent to the Publishing State setting in the In-app Products UI. Can be <code> + published</code> or <code>unpublished</code>. + </dd> + <dt>purchase_type</dt> + <dd> + This is equivalent to the Product Type setting in the In-app Products UI. Can be <code> managed_by_android</code>, which is equivalent to <strong>Managed per user account </strong> in the In-app Products UI, or <code>managed_by_publisher</code>, which is equivalent - to <strong>Unmanaged</strong> in the In-app Products UI.</p> - </li> - <li><em>autotranslate</em> - <p>This is equivalent to selecting the <strong>Fill fields with auto translation</strong> - checkbox in the In-app Products UI. Can be <code>true</code> or <code>false</code>.</p> - </li> - <li><em>locale</em> + to <strong>Unmanaged</strong> in the In-app Products UI. + </dd> + <dt>autotranslate</dt> + <dd> + This is equivalent to selecting the <strong>Fill fields with auto translation</strong> + checkbox in the In-app Products UI. Can be <code>true</code> or <code>false</code>. + </dd> + <dt>locale</dt> + <dd> <p>This is equivalent to the Language setting in the In-app Products UI. You must have an entry for the default locale. The default locale must be the first entry in the list of locales, and it must include a <em>title</em> and <em>description</em>. If you want to provide translated versions of the <em>title</em> and <em>description</em> in addition to the default, you must use the following syntax rules:</p> - <p>If <em>autotranslate</em> is <code>true</code>, you must specify the default locale, - default title, default description, and other locales using the following format:</p> - <p>"true,"<em>default_locale</em>; <em>default_locale_title</em>; - <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_3</em>, ..."</p> - <p>If <em>autotranslate</em> is <code>false</code>, you must specify the default locale, - default title, and default description as well as the translated titles and descriptions using - the following format:</p> - <p>"false,"<em>default_locale</em>; <em>default_locale_title</em>; - <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_2_title</em>; - <em>local_2_description</em>; <em>locale_3</em>; <em>locale_3_title</em>; - <em>locale_3_description</em>; ..."</p> + <ul> + <li> + <p>If <em>autotranslate</em> is <code>true</code>, you must specify the default locale, + default title, default description, and other locales using the following format:</p> + <p>"true,"<em>default_locale</em>; <em>default_locale_title</em>; + <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_3</em>, ..."</p> + </li> + <li> + <p>If <em>autotranslate</em> is <code>false</code>, you must specify the default locale, + default title, and default description as well as the translated titles and descriptions using + the following format:</p> + <p>"false,"<em>default_locale</em>; <em>default_locale_title</em>; + <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_2_title</em>; + <em>local_2_description</em>; <em>locale_3</em>; <em>locale_3_title</em>; + <em>locale_3_description</em>; ..."</p> + </li> + </ul> <p>See table 1 for a list of the language codes you can use with the <em>locale</em> field.</p> - </li> - <li><em>title</em> - <p>This is equivalent to the Title setting in the In-app Products UI. If the <em>title</em> - contains a semicolon, it must be escaped with a backslash (for example, "\;"). A backslash - should also be escaped with a backslash (for example, "\\").</p> - </li> - <li><em>description</em> - <p>This is equivalent to the Description in the In-app Products UI. If the <em>description</em> - contains a semicolon, it must be escaped with a backslash (for example, "\;"). A backslash - should also be escaped with a backslash (for example, "\\").</p> - </li> - <li><em>autofill</em> + </dd> + <dt>title</dt> + <dd> + This is equivalent to the Title setting in the In-app Products UI. If the <em>title</em> + contains a semicolon, it must be escaped with a backslash (for example, <code>\;</code>). Also, a backslash + must be escaped with a backslash (for example, <code>\\</code>). + </dd> + <dt>description</dt> + <dd> + This is equivalent to the Description in the In-app Products UI. If the <em>description</em> + contains a semicolon, it must be escaped with a backslash (for example, <code>\;</code>). Also, a backslash + must be escaped with a backslash (for example, <code>\\</code>). + </dd> + <dt>autofill</dt> + <dd> <p>This is equivalent to clicking <strong>Auto Fill</strong> in the In-app Products UI. Can be <code>true</code> or <code>false</code>. The syntax for specifying the <em>country</em> - and <em>price</em> varies depending on which <em>autofill</em> setting you use.</p> - <p>If <em>autofill</em> is set to <code>true</code>, you need to specify only the default - price in your home currency, and you must use this syntax:</p> - <p>"true","<em>default_price_in_home_currency</em>" - <p>If <em>autofill</em> is set to <code>false</code>, you need to specify a <em>country</em> - and a <em>price</em> for each currency, and you must use the following syntax:</p> - <p>"false", "<em>home_country</em>; <em>default_price_in_home_currency</em>; <em>country_2</em>; - <em>country_2_price</em>; <em>country_3</em>; <em>country_3_price</em>; ..."</p> + and <em>price</em> varies depending on which <em>autofill</em> setting you use:</p> + <ul> + <li> + <p>If <em>autofill</em> is set to <code>true</code>, you need to specify only the default + price in your home currency, and you must use this syntax:</p> + <p>"true","<em>default_price_in_home_currency</em>" + </li> + <li> + <p>If <em>autofill</em> is set to <code>false</code>, you need to specify a <em>country</em> + and a <em>price</em> for each currency, and you must use the following syntax:</p> + <p>"false", "<em>home_country</em>; <em>default_price_in_home_currency</em>; <em>country_2</em>; + <em>country_2_price</em>; <em>country_3</em>; <em>country_3_price</em>; ..."</p> + </li> + </ul> <p class="note"><strong>Note: </strong>If you use an <em>autofill</em> value of <code>false</code> and set country prices manually, you must incorporate country-specific pricing patterns, including tax rates, into the prices you provide.</p> - </li> - <li><em>country</em> - <p>The country for which you are specifying a price. You can only list countries that your - application is targeting. The country codes are two-letter uppercase + </dd> + <dt>country</dt> + <dd> + The country for which you are specifying a price. You can only list countries that your + app is targeting. The country codes are two-letter uppercase ISO country codes (such as "US"), as defined by - <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-2</a>.</p> - </li> - <li><em>price</em> - <p>This is equivalent to the Price in the In-app Products UI. The price must be specified in + <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-2</a>. + </dd> + <dt>price</dt> + <dd> + This is equivalent to the Price in the In-app Products UI. The price must be specified in micro-units. To convert a currency value to micro-units, you multiply the real value by 1,000,000. For example, if you want to sell an in-app item for $1.99, you specify <code>1990000</code> in the - <em>price</em> field.</p> - </li> -</ul> + <em>price</em> field. + </dd> +</dl> <p class="table-caption" id="language-table"><strong>Table 1.</strong> Language codes you can use with the <em>locale</em> field.</p> @@ -430,8 +421,8 @@ with the <em>locale</em> field.</p> </h2> <p> - If you sell multiple apps at the same price—or multiple in-app products at - the same price across one or more apps—you can add <em>pricing + If you sell multiple apps at the same price, or if you sell multiple in-app + products at the same price across one or more apps, you can add <em>pricing templates</em>. These templates make it easier to manage shared prices. </p> @@ -440,25 +431,9 @@ with the <em>locale</em> field.</p> </h3> <p> - When creating a template, you can provide new pricing information, or you can - apply pricing information from an existing paid app or in-app product. -</p> - -<div class="figure-right"> - <figure id="fig-npt"> - <img src="{@docRoot}images/in-app-billing/new_pricing_template.png" - srcset="{@docRoot}images/in-app-billing/new_pricing_template.png 1x, {@docRoot}images/in-app-billing/new_pricing_template_2x.png 2x" - width="400" alt="A template with the name Basic inventory uses a price of - USD 0.99."> - <figcaption> - <b>Figure 5. </b>The <em>Pricing template</em> page, where you add pricing - details for the new template you're creating. - </figcaption> - </figure> -</div> - -<p> - To add a pricing template, do the following: + When creating a pricing template, you provide new pricing information that you + can apply to paid apps and in-app products. To add a pricing template, do the + following: </p> <ol> @@ -467,21 +442,20 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the <strong>Settings</strong> panel, select <strong>Pricing - template</strong>. + <li>In the <strong>Settings</strong> panel, open the <strong>Pricing + template</strong> page. </li> <li> <p> If you are adding your first pricing template, the <strong>Add a Pricing Template</strong> banner appears. Select <strong>Add template</strong> to - create a new template. The <strong>Pricing Template</strong> page - appears. + create a new template. The new template's <em>Pricing</em> tab appears. </p> <p> Otherwise, you see a list of your pricing templates. Select <strong>New - pricing template</strong>. The <strong>Pricing Template</strong> page + pricing template</strong>. The new template's <em>Pricing</em> tab appears. </p> </li> @@ -494,7 +468,7 @@ with the <em>locale</em> field.</p> </p> <p> Based on the price and tax option you provide, the Developer Console - generates prices for international currencies using today's exchange + generates prices for international currencies using current exchange rates and country-specific pricing patterns. </p> </li> @@ -507,44 +481,26 @@ with the <em>locale</em> field.</p> </h3> <p> - You can link shared prices across paid apps or in-app products to a pricing - template. To complete the linking process, use either the template's - <em>Linked Items</em> tab or the Price section within a paid app or in-app - product's pricing page. + You can create links between pricing templates and sets of paid apps and + in-app products that share the same price. After completing this linking + process, any changes you make to the pricing template are applied to the + prices of items that you've linked to the template. To complete the linking + process, use either the pricing template's <em>Linked Items</em> tab or the + Price section within a paid app or in-app product's pricing page. </p> <p class="note"> <strong>Note:</strong> Since a subscription within your app has a constant price, you cannot link a subscription with a pricing template. You can, - however, import the prices from a template and apply them to a new + however, import the prices from a pricing template and apply them to a new subscription. </p> <h4> - Linking a pricing template or paid app to an in-app product + Linking a pricing template to in-app products and paid apps </h4> <p> - After you create a pricing template, you can link the prices of in-app - products and paid apps to that template. After completing this linking - process, any changes you make to the pricing template are applied to the - prices of items that you've linked to the template. -</p> - -<div class="figure-right"> - <figure id="fig-lpt"> - <img src="{@docRoot}images/in-app-billing/link_pricing_template.png" - width="700" alt="The Sleeping Potion in-app product is linked to the Basic - Inventory item, but the Invisibility Potion is not."> - <figcaption> - <b>Figure 6. </b>Use the Linked Items tab of the - <em>Pricing Template</em> page to change which in-app products and paid - apps are linked to a pricing template. - </figcaption> - </figure> -</div> - -<p> To link a pricing template to an in-app product, do the following: </p> @@ -554,23 +510,24 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the <strong>Settings</strong> panel, select <strong>Pricing - template</strong>. The <strong>Pricing Template</strong> page appears, - showing the list of pricing templates you have created for your account. + <li>In the <strong>Settings</strong> panel, open the <strong>Pricing + template</strong> page. This page shows the list of pricing templates you have + created for your account. </li> - <li>Choose the pricing template that you want to link to an in-app product, - then select the <em>Linked Items</em> tab. A page appears, showing options to - link your pricing template to in-app products and paid apps. + <li>Choose an existing pricing template that you want to link to an in-app + product, then select the template's <em>Linked Items</em> tab. This tab shows + options to link your pricing template to in-app products and paid apps + (see figure 2). </li> - <li>In the Link In-App Products section of the page, enter or choose the name + <li>In the Link In-App Products section of the tab, enter or choose the name of an app. This app should contain the in-app product that you want to link to your pricing template. </li> <li>Based on the app that you selected, you see a list of in-app products - that are active and are not yet linked to a pricing template. Select the + that are active and are not yet linked to a pricing template. Choose the in-app product that you want to link to the pricing template by selecting the <strong>Link</strong> button that appears in the same row as the in-app product. @@ -588,27 +545,23 @@ with the <em>locale</em> field.</p> app in the Link Paid Apps section. </p> +<figure id="fig-lpt"> + <img class="border-img" + src="{@docRoot}images/in-app-billing/link_pricing_template.png" width="700" + alt="The Sleeping Potion in-app product is linked to the Basic Inventory item, + but the Invisibility Potion is not."> + <figcaption> + <b>Figure 2. </b>On a pricing template's <em>Linked Items</em> tab, you can + change which in-app products and paid apps are linked to the pricing + template. + </figcaption> +</figure> + <h4> - Linking an in-app product or paid app with a pricing template + Linking an in-app product or paid app to a pricing template </h4> <p> - After you create a paid app or in-app product, you can link its pricing - information to a pricing template. -</p> - -<div class="figure-right"> - <figure id="fig-spt"> - <img src="{@docRoot}images/in-app-billing/select_pricing_template.png" - width="700" alt=""> - <figcaption> - <b>Figure 7. </b>Choosing a pricing template to link to a particular - in-app product or paid app. - </figcaption> - </figure> -</div> - -<p> To link an in-app product to a pricing template, do the following: </p> @@ -618,20 +571,16 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the <strong>All Applications</strong> panel, choose the app that - contains the in-app product that you want to link to a pricing template. - </li> - - <li>Within the app's panel, choose the <strong>In-app Products</strong> - sub-panel. + <li>In the <strong>All applications</strong> panel, select the app name, then + open the <strong>In-app Products</strong> page. </li> <li>Choose the in-app product that you want to link to a pricing template. - The <em>Managed Product Details</em> page appears. + The item's details page appears. </li> <li>In the Pricing section, choose the pricing template that you want to link - to the price of this in-app product (see figure 7). + to the price of this in-app product. </li> <li>The price of the in-app product is now linked to the pricing template you @@ -642,8 +591,7 @@ with the <em>locale</em> field.</p> <p> To link the price of a paid app to a pricing template, you follow a similar - process within the app's <strong>Pricing & Distribution</strong> - sub-panel. + process on the app's <strong>Pricing & Distribution</strong> page. </p> <h3 id="delete-linked-item"> @@ -652,27 +600,16 @@ with the <em>locale</em> field.</p> <p> As your app evolves, you may find it useful to remove older versions of - in-app products or apps, some of which may be linked to pricing templates. To - delete an in-app product or app that is linked to a pricing template, simply - remove it by completing the following steps. You don't need to unlink the - in-app product or app from the pricing template beforehand. + in-app products or unpublish paid apps, some of which may be linked to pricing + templates. To delete an in-app product or unpublish a paid app that is linked + to a pricing template, complete the following steps. You don't need to unlink + the in-app product or paid app from the pricing template beforehand. </p> <h4> Deleting an in-app product that is linked to a template </h4> -<div class="figure-right"> - <figure id="fig-diap"> - <img src="{@docRoot}images/in-app-billing/delete_iap.png" - width="700" alt=""> - <figcaption> - <b>Figure 8. </b>Deleting an in-app product that is linked to a pricing - template. - </figcaption> - </figure> -</div> - <p> To delete an in-app product that is linked to a template, do the following: </p> @@ -683,8 +620,7 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the Google Play Developer Console, navigate to the app that contains - the in-app product you want to delete. + <li>Select the app that contains the in-app product you want to delete. </li> <li>Open the app's <strong>In-app Products</strong> page. @@ -694,16 +630,25 @@ with the <em>locale</em> field.</p> </li> <li>Select the button that indicates whether the in-app product is active or - inactive (enclosed in a box within figure 8). The drop-down menu includes a + inactive (enclosed in a box within figure 3). The drop-down menu includes a <strong>Delete</strong> option. </li> - <li>Select <strong>Delete</strong>, then select <strong>Yes</strong> in the + <li>Select <strong>Delete</strong>, then choose <strong>Yes</strong> in the confirmation dialog that appears. </li> </ol> +<figure id="fig-diap"> + <img class="border-img" src="{@docRoot}images/in-app-billing/delete_iap.png" + width="500" alt=""> + <figcaption> + <b>Figure 3. </b>Deleting an in-app product that is linked to a pricing + template. + </figcaption> +</figure> + <h4> - Deleting a paid app that is linked to a template + Unpublishing a paid app that is linked to a template </h4> <div class="figure-right"> @@ -711,14 +656,15 @@ with the <em>locale</em> field.</p> <img src="{@docRoot}images/in-app-billing/unpublish_paid_app.png" width="700" alt=""> <figcaption> - <b>Figure 9. </b>Unpublishing an app that has already been published and is + <b>Figure 4. </b>Unpublishing an app that has already been published and is linked to a pricing template. </figcaption> </figure> </div> <p> - To delete a paid app that is linked to a template, do the following: + To unpublish a paid app that is already published and is linked to a template, + do the following: </p> <ol> @@ -727,15 +673,12 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the Google Play Developer Console, choose the app that you want to - delete. + <li>Select the app that you want to unpublish. </li> - <li>Choose either <strong>Unpublish app</strong> (enclosed in a box within - figure 9) if you have already published the app, or - <strong>Delete app</strong> if your app is still in the "draft" state. - </li> - <li>Confirm your choice in the dialog that appears. + <li>Select <strong>Unpublish app</strong> (enclosed in a box within figure 4), + then choose <strong>Unpublish</strong> in the confirmation dialog that + appears. </li> </ol> @@ -754,17 +697,16 @@ with the <em>locale</em> field.</p> account. </li> - <li>In the <strong>Settings</strong> panel, select <strong>Pricing - template</strong>. The <strong>Pricing Template</strong> page appears, - showing the list of pricing templates you have created for your account. + <li>In the <strong>Settings</strong> panel, open the <strong>Pricing + template</strong> page, which shows the list of pricing templates you have + created for your account. </li> <li>Select the pricing template that you wish to delete. </li> - <li>In the <em>Linked Items</em> tab on the pricing template details page, - unlink the pricing template from all in-app products and paid apps. - </li> + <li>On the pricing template's <em>Linked Items</em> tab, unlink all in-app + products that are linked to the template.</li> <li>Select <strong>Delete template</strong>. </li> @@ -772,23 +714,21 @@ with the <em>locale</em> field.</p> <h2 id="billing-purchase-type">Choosing a Product Type</h3> -<p>An item's product type controls how Google Play manages the purchase of the item. There are -several product types, including "managed per user account", "unmanaged," and "subscription." However, -note that the product types supported vary -across In-app Billing Version, so you should always choose a product type that's valid for the -version of In-app BIlling that your app uses. </p> +<p>An item's product type controls how Google Play manages the purchase of the item. The supported +product types include "managed product" and "subscription." Since support for different product +types can vary among versions of the In-app Billing API, make sure that you choose a product +type that's valid for the version of the In-app Billing API that your app uses. </p> -<p>For details, refer to the documentation for <a -href="{@docRoot}google/play/billing/api.html#producttype">In-app Billing Version -3</a>. +<p>For details, refer to the documentation for the <a +href="{@docRoot}google/play/billing/api.html#producttype">In-app Billing API</a>. <h2 id="billing-refunds">Handling Refunds</h2> <p>In-app billing does not allow users to send a refund request to Google Play. Refunds for -in-app purchases must be directed to you (the application developer). You can then process the +in-app purchases must be directed to you (the app developer). You can then process the refund through your Google payments merchant account. When you do this, Google Play receives a refund notification from Google payments, and Google Play sends a refund message to your -application. For more information, see <a +app. For more information, see <a href="{@docRoot}google/play/billing/v2/api.html#billing-action-notify">Handling IN_APP_NOTIFY messages</a> and <a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=1153485"> @@ -834,22 +774,22 @@ Google Order Number:</p> <p>The Google Play Developer Console lets you set up one or more test accounts. A test account is a regular Google account that you register on the Developer Console as a test account. Test accounts are authorized to make in-app purchases -from applications that you have uploaded to the Google Play Developer Console +from apps that you have uploaded to the Google Play Developer Console but have not yet published.</p> <p>You can use any Google account as a test account. Test accounts are useful if you want to let -multiple people test In-app Billing on applications without giving them access to your publisher +multiple people test In-app Billing on apps without giving them access to your publisher account's sign-in credentials. If you want to own and control the test accounts, you can create the accounts yourself and distribute the credentials to your developers or testers.</p> <p>Test accounts have three limitations:</p> <ul> - <li>Test account users can make purchase requests only within applications that are already - uploaded to your publisher account (although the application doesn't need to be published).</li> + <li>Test account users can make purchase requests only within apps that are already + uploaded to your publisher account (although the app doesn't need to be published).</li> <li>Test accounts can only be used to purchase items that are listed (and published) in an - application's product list.</li> - <li>Test account users do not have access to your publisher account and cannot upload applications + app's product list.</li> + <li>Test account users do not have access to your publisher account and cannot upload apps to your publisher account.</li> </ul> @@ -869,29 +809,28 @@ accounts yourself and distribute the credentials to your developers or testers.< <p>The Google Play Developer Console provides a public licensing key for each app.</p> -<div class="figure-right"> - <figure id="fig-bak"> - <img src="{@docRoot}images/in-app-billing/billing_app_key.png" - width="700" alt=""> - <figcaption> - <b>Figure 10. </b>You can find the license key for each app in the - <strong>Services & APIs</strong> panel. - </figcaption> - </figure> -</div> - -<p>To get the key for an app, follow these steps:</p> +<p>To locate the key for an app, follow these steps:</p> <ol> - <li>Open the <strong>All Applications</strong> panel.</li> - <li>Click on the app name, then select <strong>Services & APIs</strong>.</li> - <li>Scroll down to the <strong>Your License Key for this Application</strong> -field to locate the key for the app, as shown in figure 10.</li> + <li>Open the <strong>All applications</strong> panel.</li> + <li>Click on the app name, then open the <strong>Services & APIs</strong> + page.</li> + <li>Scroll down to the section of the page labeled Your License Key for This + Application, as shown in figure 5.</li> </ol> <p>Previously, the Developer Console provided a single public key per developer account. To transition apps to the new per-app public key, the Developer Console -set the app-specific key as the former developer key. This ensures compatibility +sets the app-specific key as the former developer key. This ensures compatibility for apps that depend on the (former) developer key. </p> +<figure id="fig-bak"> + <img class="border-img" src="{@docRoot}images/in-app-billing/billing_app_key.png" + width="700" alt=""> + <figcaption> + <b>Figure 5. </b>You can find the license key for each app on the + <strong>Services & APIs</strong> page. + </figcaption> +</figure> + <h2 id="billing-support">Where to Get Support</h2> <p>If you have questions or encounter problems while implementing In-app Billing, contact the diff --git a/docs/html/google/play/billing/billing_integrate.jd b/docs/html/google/play/billing/billing_integrate.jd index c658f702dce3..8ffb45cb92d7 100755 --- a/docs/html/google/play/billing/billing_integrate.jd +++ b/docs/html/google/play/billing/billing_integrate.jd @@ -111,13 +111,13 @@ method calls.</p> <li>Select <strong>File > New > Directory</strong> and enter {@code aidl} in the <em>New Directory</em> window, then select <strong>OK</strong>. - <li>Select <strong>File > New > Package</strong> and enter + <li>Select <strong>File > New > Package</strong> and enter {@code com.android.vending.billing} in the <em>New Package</em> window, then select <strong>OK</strong>.</li> - <li>Using your operating system file explorer, navigate to - {@code <sdk>/extras/google/play_billing/}, copy the - {@code IInAppBillingService.aidl} file, and paste it into the + <li>Using your operating system file explorer, navigate to + {@code <sdk>/extras/google/play_billing/}, copy the + {@code IInAppBillingService.aidl} file, and paste it into the {@code com.android.vending.billing} package in your project. </li> </ol> @@ -137,7 +137,7 @@ method calls.</p> </li> </ol> -<h2 id="billing-permission">Updating Your Application's Manifest</h2> +<h2 id="billing-permission">Updating Your App's Manifest</h2> <p> In-app billing relies on the Google Play application, which handles all diff --git a/docs/html/google/play/billing/billing_overview.jd b/docs/html/google/play/billing/billing_overview.jd index 2954a833f442..a05cc8d76992 100644 --- a/docs/html/google/play/billing/billing_overview.jd +++ b/docs/html/google/play/billing/billing_overview.jd @@ -132,11 +132,11 @@ type, pricing, description, and how Google Play should handle and track purchases for that product.</p> <p>If you sell several of your apps or in-app products at the same price, you can add <em>pricing templates</em> to manage these price points from a -centralized location. When using pricing templates, you can include the local -tax within the prices you provide, or you can provide prices and have the system +centralized location. When using pricing templates, you can include local taxes +within the prices you provide, or you can provide prices and have the system add local taxes to these prices. You can make changes to the prices in your -templates—such as refreshing the exchange rates for certain -countries—and your changes are applied to the apps and in-app products +pricing templates, such as refreshing the exchange rates for certain +countries, and your changes are applied to the apps and in-app products that you link to the template.</p> <p>You can also create test accounts to authorize access for testing applications that are unpublished.</p> diff --git a/docs/html/google/play/billing/index.jd b/docs/html/google/play/billing/index.jd index 795aceb502ec..80934aee96b6 100644 --- a/docs/html/google/play/billing/index.jd +++ b/docs/html/google/play/billing/index.jd @@ -18,7 +18,8 @@ and features, and more. You can use In-app Billing to sell products as</p> apps and in-app products that they distribute to multiple countries, the system automatically sets local prices for different currencies using today’s exchange rates and country-specific pricing patterns. To satisfy - specific pricing needs, developers can also adjust these prices manually.</li> + particular pricing needs, developers can also adjust these prices manually. + </li> <li><strong>Pricing Templates</strong>—Developers can add pricing templates and link these templates to app prices or in-app product prices. These templates include local prices across all markets. By using a diff --git a/docs/html/guide/topics/graphics/hardware-accel.jd b/docs/html/guide/topics/graphics/hardware-accel.jd index ca7255bdf6a8..b82c56b05721 100644 --- a/docs/html/guide/topics/graphics/hardware-accel.jd +++ b/docs/html/guide/topics/graphics/hardware-accel.jd @@ -327,30 +327,6 @@ changed.</li> <td class="value_pos">18</td> </tr> <tr> - <td class="label_pos">drawArc()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">drawRoundRect()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">saveLayer() with RectF dimensions</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">saveLayer() with float dimensions</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">saveLayerAlpha() with RectF dimensions</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">saveLayerAlpha() with float dimensions</td> - <td class="value_pos">21</td> - </tr> - <tr> <td colspan="5" class="s5">Paint</td> </tr> <tr> @@ -398,26 +374,6 @@ changed.</li> <td class="value_neg">✗</td> </tr> <tr> - <td class="label_pos">getFontFeatureSettings()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">isElegantTextHeight()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">isElegantTextHeight()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">setFontFeatureSettings()</td> - <td class="value_pos">21</td> - </tr> - <tr> - <td class="label_pos">setLetterSpacing()</td> - <td class="value_pos">21</td> - </tr> - <tr> <td colspan="5" class="s5">Xfermode</td> </tr> <tr> diff --git a/docs/html/images/in-app-billing/add_new_product.png b/docs/html/images/in-app-billing/add_new_product.png Binary files differdeleted file mode 100644 index 2281ec0a87af..000000000000 --- a/docs/html/images/in-app-billing/add_new_product.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/billing_app_key.png b/docs/html/images/in-app-billing/billing_app_key.png Binary files differindex 4c5300e7c282..5adca9c24028 100644 --- a/docs/html/images/in-app-billing/billing_app_key.png +++ b/docs/html/images/in-app-billing/billing_app_key.png diff --git a/docs/html/images/in-app-billing/delete_iap.png b/docs/html/images/in-app-billing/delete_iap.png Binary files differindex bbaea9ebebbf..46034521626c 100644 --- a/docs/html/images/in-app-billing/delete_iap.png +++ b/docs/html/images/in-app-billing/delete_iap.png diff --git a/docs/html/images/in-app-billing/in_app_products.png b/docs/html/images/in-app-billing/in_app_products.png Binary files differdeleted file mode 100644 index 04031cc3f420..000000000000 --- a/docs/html/images/in-app-billing/in_app_products.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/new_managed_product.png b/docs/html/images/in-app-billing/new_managed_product.png Binary files differdeleted file mode 100644 index bdccc9602270..000000000000 --- a/docs/html/images/in-app-billing/new_managed_product.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/new_pricing_template.png b/docs/html/images/in-app-billing/new_pricing_template.png Binary files differdeleted file mode 100644 index 852578767e8f..000000000000 --- a/docs/html/images/in-app-billing/new_pricing_template.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/new_pricing_template_2x.png b/docs/html/images/in-app-billing/new_pricing_template_2x.png Binary files differdeleted file mode 100644 index ce4094b99927..000000000000 --- a/docs/html/images/in-app-billing/new_pricing_template_2x.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/select_pricing_template.png b/docs/html/images/in-app-billing/select_pricing_template.png Binary files differdeleted file mode 100644 index fa8c7b6bc75d..000000000000 --- a/docs/html/images/in-app-billing/select_pricing_template.png +++ /dev/null diff --git a/docs/html/images/in-app-billing/unpublish_paid_app.png b/docs/html/images/in-app-billing/unpublish_paid_app.png Binary files differindex a36d8ce6b884..64bbd0d43c18 100644 --- a/docs/html/images/in-app-billing/unpublish_paid_app.png +++ b/docs/html/images/in-app-billing/unpublish_paid_app.png diff --git a/docs/html/images/topic/instant-apps/3D-Image-viewer.gif b/docs/html/images/topic/instant-apps/3D-Image-viewer.gif Binary files differnew file mode 100644 index 000000000000..b46f2d95bcb0 --- /dev/null +++ b/docs/html/images/topic/instant-apps/3D-Image-viewer.gif diff --git a/docs/html/images/topic/instant-apps/BandH-Photo.gif b/docs/html/images/topic/instant-apps/BandH-Photo.gif Binary files differnew file mode 100644 index 000000000000..fa2cdfc81386 --- /dev/null +++ b/docs/html/images/topic/instant-apps/BandH-Photo.gif diff --git a/docs/html/images/topic/instant-apps/Buzzfeed.gif b/docs/html/images/topic/instant-apps/Buzzfeed.gif Binary files differnew file mode 100644 index 000000000000..af7cc6641c11 --- /dev/null +++ b/docs/html/images/topic/instant-apps/Buzzfeed.gif diff --git a/docs/html/images/topic/instant-apps/Park-and-Pay.gif b/docs/html/images/topic/instant-apps/Park-and-Pay.gif Binary files differnew file mode 100644 index 000000000000..f5cbfb0d77ca --- /dev/null +++ b/docs/html/images/topic/instant-apps/Park-and-Pay.gif diff --git a/docs/html/images/topic/instant-apps/instant-apps-section-2.png b/docs/html/images/topic/instant-apps/instant-apps-section-2.png Binary files differnew file mode 100644 index 000000000000..8060c5764300 --- /dev/null +++ b/docs/html/images/topic/instant-apps/instant-apps-section-2.png diff --git a/docs/html/images/topic/instant-apps/instant-apps-section-4.png b/docs/html/images/topic/instant-apps/instant-apps-section-4.png Binary files differnew file mode 100644 index 000000000000..8e0fcf80055e --- /dev/null +++ b/docs/html/images/topic/instant-apps/instant-apps-section-4.png diff --git a/docs/html/images/topic/instant-apps/instant-apps-section-5.png b/docs/html/images/topic/instant-apps/instant-apps-section-5.png Binary files differnew file mode 100644 index 000000000000..e92ec8060177 --- /dev/null +++ b/docs/html/images/topic/instant-apps/instant-apps-section-5.png diff --git a/docs/html/images/topic/instant-apps/play-services-features-2x.png b/docs/html/images/topic/instant-apps/play-services-features-2x.png Binary files differnew file mode 100644 index 000000000000..098f91cd6722 --- /dev/null +++ b/docs/html/images/topic/instant-apps/play-services-features-2x.png diff --git a/docs/html/images/topic/instant-apps/s3-BandH-animated.gif b/docs/html/images/topic/instant-apps/s3-BandH-animated.gif Binary files differnew file mode 100644 index 000000000000..4e44f741f43c --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-BandH-animated.gif diff --git a/docs/html/images/topic/instant-apps/s3-BandH-static.png b/docs/html/images/topic/instant-apps/s3-BandH-static.png Binary files differnew file mode 100644 index 000000000000..004afb7b4a93 --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-BandH-static.png diff --git a/docs/html/images/topic/instant-apps/s3-BuzzFeed-animated.gif b/docs/html/images/topic/instant-apps/s3-BuzzFeed-animated.gif Binary files differnew file mode 100644 index 000000000000..7ed534eac88e --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-BuzzFeed-animated.gif diff --git a/docs/html/images/topic/instant-apps/s3-BuzzFeed-static.png b/docs/html/images/topic/instant-apps/s3-BuzzFeed-static.png Binary files differnew file mode 100644 index 000000000000..cdd0dc8844fb --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-BuzzFeed-static.png diff --git a/docs/html/images/topic/instant-apps/s3-ParkandPay-animated.gif b/docs/html/images/topic/instant-apps/s3-ParkandPay-animated.gif Binary files differnew file mode 100644 index 000000000000..4a14dc2e5fe1 --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-ParkandPay-animated.gif diff --git a/docs/html/images/topic/instant-apps/s3-ParkandPay-static.png b/docs/html/images/topic/instant-apps/s3-ParkandPay-static.png Binary files differnew file mode 100644 index 000000000000..fa9c2bfb6cfc --- /dev/null +++ b/docs/html/images/topic/instant-apps/s3-ParkandPay-static.png diff --git a/docs/html/images/topic/instant-apps/upgrade-your-app-2x.png b/docs/html/images/topic/instant-apps/upgrade-your-app-2x.png Binary files differnew file mode 100644 index 000000000000..60fe3736bd18 --- /dev/null +++ b/docs/html/images/topic/instant-apps/upgrade-your-app-2x.png diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js index 74bad7bb49ab..4909206d64d7 100644 --- a/docs/html/jd_collections.js +++ b/docs/html/jd_collections.js @@ -744,6 +744,14 @@ var RESOURCE_COLLECTIONS = { "https://developers.google.com/app-indexing/" ] }, + "distribute/users/knowyouruser": { + "title": "", + "resources": [ + "distribute/essentials/optimizing-your-app.html", + "http://www.youtube.com/watch?v=RRelFvc6Czo", + "distribute/stories/games/rvappstudios-zombie.html" + ] + }, "distribute/users/promotewithads": { "title": "", "resources": [ @@ -1872,7 +1880,7 @@ var RESOURCE_COLLECTIONS = { "resources": [ "work/overview.html", "work/guide.html", - "https://connect.googleforwork.com/community/applicants/android/isv", + "https://www.google.com/work/android/developers/applyDevHub/", "work/app-restrictions.html", "work/cosu.html", "work/managed-profiles.html" diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js index ed8b54fd7086..546fcfe479f6 100644 --- a/docs/html/jd_extras.js +++ b/docs/html/jd_extras.js @@ -2251,6 +2251,19 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "lang": "en", "group": "", "tags": [], + "url": "http://www.youtube.com/watch?v=RRelFvc6Czo", + "timestamp": null, + "image": "https://i1.ytimg.com/vi/RRelFvc6Czo/maxresdefault.jpg", + "title": "Android Developer Story: Smule", + "summary": "The creators of AutoRap, Magic Piano, and Songify talk about their experiences launching on Android and the explosive global growth they've seen on Google Play.", + "keywords": ["success", "users"], + "type": "video", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], "url": "https://developers.google.com/analytics/solutions/mobile-implementation-guide", "timestamp": null, "image": "images/cards/analytics-mobile_2x.jpg", @@ -3273,7 +3286,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title":"Join the Android for Work DevHub", "titleFriendly":"", "summary":"The Android for Work DevHub is a place to help developers keep up with Android in the workplace.", - "url":"https://connect.googleforwork.com/community/applicants/android/isv", + "url":"https://www.google.com/work/android/developers/applyDevHub/", "group":"", "keywords": ["work", "enterprise", "isv", "devhub"], "tags": [], diff --git a/docs/html/jd_extras_en.js b/docs/html/jd_extras_en.js index fca2b170d4cb..648518693ba6 100644 --- a/docs/html/jd_extras_en.js +++ b/docs/html/jd_extras_en.js @@ -2213,6 +2213,19 @@ METADATA['en'].extras = METADATA['en'].extras.concat([ "lang": "en", "group": "", "tags": [], + "url": "http://www.youtube.com/watch?v=RRelFvc6Czo", + "timestamp": null, + "image": "https://i1.ytimg.com/vi/RRelFvc6Czo/maxresdefault.jpg", + "title": "Android Developer Story: Smule", + "summary": "The creators of AutoRap, Magic Piano, and Songify talk about their experiences launching on Android and the explosive global growth they've seen on Google Play.", + "keywords": ["success", "users"], + "type": "video", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], "url": "https://developers.google.com/analytics/solutions/mobile-implementation-guide", "timestamp": null, "image": "images/cards/analytics-mobile_2x.jpg", @@ -3292,7 +3305,7 @@ METADATA['en'].extras = METADATA['en'].extras.concat([ "title":"Join the Android for Work DevHub", "titleFriendly":"", "summary":"The Android for Work DevHub is a place to help developers keep up with Android in the workplace.", - "url":"https://connect.googleforwork.com/community/applicants/android/isv", + "url":"https://www.google.com/work/android/developers/applyDevHub/", "group":"", "keywords": ["work", "enterprise", "isv", "devhub"], "tags": [], @@ -4405,6 +4418,14 @@ METADATA['en'].collections = { "https://developers.google.com/app-indexing/" ] }, + "distribute/users/knowyouruser": { + "title": "", + "resources": [ + "distribute/essentials/optimizing-your-app.html", + "http://www.youtube.com/watch?v=RRelFvc6Czo", + "distribute/stories/games/rvappstudios-zombie.html" + ] + }, "distribute/users/promotewithads": { "title": "", "resources": [ @@ -5388,7 +5409,7 @@ METADATA['en'].collections = { "resources": [ "work/overview.html", "work/guide.html", - "https://connect.googleforwork.com/community/applicants/android/isv", + "https://www.google.com/work/android/developers/applyDevHub/", "work/app-restrictions.html", "work/cosu.html", "work/managed-profiles.html" diff --git a/docs/html/preview/api-overview.jd b/docs/html/preview/api-overview.jd index 09227f251521..c643dc711386 100644 --- a/docs/html/preview/api-overview.jd +++ b/docs/html/preview/api-overview.jd @@ -9,36 +9,37 @@ page.image=images/cards/card-n-apis_2x.png <div id="qv-wrapper"> <div id="qv"> - <h2>Key developer features</h2> + <h2>Key Developer Features</h2> <ol> <ul style="list-style-type:none;"> - <li><a href="#multi-window_support">Multi-window support</a></li> + <li><a href="#multi-window_support">Multi-window Support</a></li> <li><a href="#notification_enhancements">Notifications</a></li> - <li><a href="#jit_aot">JIT/AOT compilation</a></li> - <li><a href="#quick_path_to_app_install">Quick path to app install</a></li> - <li><a href="#doze_on_the_go">Doze on the go</a></li> - <li><a href="#background_optimizations">Background optimizations</a></li> + <li><a href="#jit_aot">JIT/AOT Compilation</a></li> + <li><a href="#quick_path_to_app_install">Quick Path to App Install</a></li> + <li><a href="#doze_on_the_go">Doze on the Go</a></li> + <li><a href="#background_optimizations">Background Optimizations</a></li> <li><a href="#data_saver">Data Saver</a></li> <li><a href="#vulkan">Vulkan API</a></li> <li><a href="#tile_api">Quick Settings Tile API</a></li> - <li><a href="#number-blocking">Number-blocking</a></li> - <li><a href="#call_screening">Call screening</a></li> - <li><a href="#multi-locale_languages">Locales and languages</a></li> + <li><a href="#number-blocking">Number Blocking</a></li> + <li><a href="#call_screening">Call Screening</a></li> + <li><a href="#multi-locale_languages">Locales and Languages</a></li> <li><a href="#emoji">New Emojis</a></li> <li><a href="#icu4">ICU4J APIs in Android</a></li> <li><a href="#gles_32">OpenGL ES 3.2 API</a></li> - <li><a href="#android_tv_recording">Android TV recording</a></li> + <li><a href="#android_tv_recording">Android TV Recording</a></li> <li><a href="#android_for_work">Android for Work</a></li> <li><a href="#accessibility_enhancements">Accessibility</a></li> <li><a href="#direct_boot">Direct Boot</a></li> <li><a href="#key_attestation">Key Attestation</a></li> <li><a href="#network_security_config">Network Security Config</a></li> <li><a href="#default_trusted_ca">Default Trusted CA</a></li> - <li><a href="#apk_signature_v2">APK signature scheme v2</a></li> - <li><a href="#scoped_directory_access">Scoped directory access</a></li> + <li><a href="#apk_signature_v2">APK Signature Scheme v2</a></li> + <li><a href="#scoped_directory_access">Scoped Directory Access</a></li> <li><a href="#keyboard_shortcuts_helper">Keyboard Shortcuts Helper</a></li> <li><a href="#sustained_performance_api">Sustained Performance API</a></li> - <li><a href="#print_svc">Print service enhancements</a></li> + <li><a href="#vr">VR Support</a></li> + <li><a href="#print_svc">Print Service Enhancements</a></li> <li><a href="#virtual_files">Virtual Files</a></li> <li><a href="#framemetrics_api">FrameMetricsListener API</a></li> </ol> @@ -60,7 +61,7 @@ the new features for developers. </p> new APIs. </p> -<h2 id="multi-window_support">Multi-window support</h2> +<h2 id="multi-window_support">Multi-window Support</h2> <p>In Android N, we're introducing a new and much-requested multitasking feature @@ -85,6 +86,7 @@ interacts with other apps.</li> <p class="img-caption"> <strong>Figure 1.</strong> Apps running in split-screen mode. </p> + </div> <p>Especially on tablets and other larger-screen devices, multi-window support @@ -104,7 +106,7 @@ that size. You can also disable multi-window display for your app, which developer documentation. </p> -<h2 id="notification_enhancements">Notification enhancements</h2> +<h2 id="notification_enhancements">Notification Enhancements</h2> <p>In Android N we've redesigned notifications to make them easier and faster to use. Some of the changes include:</p> @@ -170,7 +172,7 @@ use. Some of the changes include:</p> -<h2 id="jit_aot">Profile-guided JIT/AOT compilation</h2> +<h2 id="jit_aot">Profile-guided JIT/AOT Compilation</h2> <p>In Android N, we've added a Just in Time (JIT) compiler with code profiling to ART, which lets it constantly improve the performance of Android apps as they @@ -192,14 +194,14 @@ binaries. This feature is especially important on low-memory devices.</p> device battery. It does precompilation only when then the device is idle and charging, saving time and battery by doing that work in advance.</p> -<h2 id="quick_path_to_app_install">Quick path to app install</h2> +<h2 id="quick_path_to_app_install">Quick Path to App Install</h2> <p>One of the most tangible benefits of ART's JIT compiler is the speed of app installs and system updates. Even large apps that required several minutes to optimize and install in Android 6.0 can now install in just a matter of seconds. System updates are also faster, since there's no more optimizing step. </p> -<h2 id="doze_on_the_go">Doze on the go...</h2> +<h2 id="doze_on_the_go">Doze on the Go...</h2> <p>Android 6.0 introduced Doze, a system mode that saves battery by deferring apps' CPU and network activities when the device is idle, such as when it's @@ -237,7 +239,7 @@ handle Doze, you're all set. If not, start <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">adapting your app to Doze</a> now.</p> -<h2 id="background_optimizations">Project Svelte: Background optimizations</h2> +<h2 id="background_optimizations">Project Svelte: Background Optimizations</h2> <p>Project Svelte is an ongoing effort to minimize RAM use by system and apps across the range of Android devices in the ecosystem. In Android N, Project @@ -401,22 +403,22 @@ displayed — users can add or move tiles just by dragging and dropping them </p> <p> - For information about creating an app tile, see the + For information about creating an app tile, see the documentation for <code>android.service.quicksettings.Tile</code> in the downloadable <a href= "{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>. </p> -<h2 id="number-blocking">Number-blocking</h2> +<h2 id="number-blocking">Number Blocking</h2> -<p>Android N now supports number-blocking in the platform and provides a +<p>Android N now supports number blocking in the platform and provides a framework API to let service providers maintain a blocked-number list. The default SMS app, the default phone app, and carrier apps can read from and write to the blocked-number list. The list is not accessible to other apps.</p> -<p>By making number-blocking a standard feature of the platform, Android provides -a consistent way for apps to support number-blocking across a wide range of +<p>By making number blocking a standard feature of the platform, Android provides +a consistent way for apps to support number blocking across a wide range of devices. Among the other benefits that apps can take advantage of are:</p> <ul> @@ -437,7 +439,7 @@ through any medium, such as a VOIP endpoint or forwarding phones.</p> Reference</a>. </p> -<h2 id="call_screening">Call screening</h2> +<h2 id="call_screening">Call Screening</h2> <p> Android N allows the default phone app to screen incoming calls. The phone @@ -459,7 +461,7 @@ through any medium, such as a VOIP endpoint or forwarding phones.</p> </p> -<h2 id="multi-locale_languages">Multi-locale support, more languages</h2> +<h2 id="multi-locale_languages">Multi-locale Support, More Languages</h2> <p>Android N now lets users select <strong>multiple locales</strong> in Settings, @@ -474,8 +476,9 @@ available to users. It offers more than 25 variants each for commonly used languages such as English, Spanish, French, and Arabic. It also adds partial support for more than 100 new languages.</p> -<p>Apps can get the list of locales set by the user by calling <code>LocaleList.GetDefault()</code>. To support the expanded number of locales, Android N is changing the way -that it resolves resources. Make sure that you test and verify that your apps +<p>Apps can get the list of locales set by the user by calling +<code>LocaleList.GetDefault()</code>. To support the expanded number of locales, Android N is +changing the way that it resolves resources. Make sure that you test and verify that your apps working as expected with the new resource resolution logic.</p> <p>To learn about the new resource-resolution behavior and the best practices you @@ -550,7 +553,8 @@ should follow, see <a href="{@docRoot}preview/features/multilingual-support.html <ul> <li> All extensions from the <a class="external-link" -href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Android Extension Pack</a></a> (AEP) except for <code>EXT_texture_sRGB_decode</code>. +href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt"> +Android Extension Pack</a></a> (AEP) except for <code>EXT_texture_sRGB_decode</code>. <li> Floating-point framebuffers for HDR and deferred shading. <li> BaseVertex draw calls to enable better batching and streaming. <li> Robust buffer access control to reduce WebGL overhead. @@ -566,7 +570,7 @@ supported OpenGL ES version at runtime, see the <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API guide</a>.</p> -<h2 id="android_tv_recording">Android TV recording</h2> +<h2 id="android_tv_recording">Android TV Recording</h2> <p>Android N adds the ability to record and playback content from Android TV input services via new recording APIs. Building on top of existing time-shifting @@ -649,7 +653,7 @@ action <code>android.net.VpnService</code>. </p> customizes the flow with a corporate logo. </p> -<h2 id="accessibility_enhancements">Accessibility enhancements</h2> +<h2 id="accessibility_enhancements">Accessibility Enhancements</h2> <p>Android N now offers Vision Settings directly on the Welcome screen for new device setup. This makes it much easier for users to discover and configure @@ -670,7 +674,7 @@ meet the needs of those users.</p> in the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.</p> -<h2 id="direct_boot">Direct boot</h2> +<h2 id="direct_boot">Direct Boot</h2> <p>Direct boot improves device startup times and lets registered apps have limited functionality even after an unexpected reboot. @@ -775,7 +779,7 @@ N that wish to trust user-added CAs should use the <a href="{@docRoot}preview/features/security-config.html">Network Security Config</a> to specify how user CAs should be trusted.</p> -<h2 id="apk_signature_v2">APK signature scheme v2</h2> +<h2 id="apk_signature_v2">APK Signature Scheme v2</h2> <p> Android N introduces APK Signature Scheme v2, a new app-signing scheme that @@ -826,7 +830,7 @@ specify how user CAs should be trusted.</p> the build file for signing apps</a> using the Android Plugin for Gradle. </p> -<h2 id="scoped_directory_access">Scoped directory access</h2> +<h2 id="scoped_directory_access">Scoped Directory Access</h2> <p>In Android N, apps can use new APIs to request access to specific <a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">external @@ -850,22 +854,18 @@ Directory Access</a> developer documentation.</p> <h2 id="keyboard_shortcuts_helper">Keyboard Shortcuts Helper</h2> <p> -In Android N, the user can press Meta+/ to trigger a Keyboard Shortcuts +In Android N, the user can press "Alt + /" to trigger a <em>Keyboard Shortcuts</em> screen that displays all shortcuts available both from the system and from the app in focus. These are retrieved automatically from the app’s menu if available, but developers can provide their own fine-tuned shortcuts lists -for the screen. This is done simply by overriding the following method -in {@code Activity.java}: +for the screen. You can do this by overriding the new +<code>Activity.onProvideKeyboardShortcuts()</code> method, described in the downloadable +<a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>. </p> -<pre> -public void onProvideKeyboardShortcuts( - List<KeyboardShortcutGroup> data, Menu menu, int deviceId) -</pre> - <p> To trigger the Keyboard Shortcuts Helper from anywhere in your app, -call {@code requestKeyboardShortcutsHelper} for the relevant activity. +call {@code Activity.requestKeyboardShortcutsHelper()} for the relevant activity. </p> <h2 id="sustained_performance_api">Sustained Performance API</h2> @@ -879,9 +879,9 @@ developers creating high-performance, long-running apps. <p> To address these limitations, Android N includes support for -<em>sustained performance mode</em>, enabling OEMs to provide hints on -device-performance capabilities for long-running applications. App developers -can use these hints to tune applications for a predictable, +<em>sustained performance mode</em>, enabling OEMs to provide hints about +device-performance capabilities for long-running apps. App developers +can use these hints to tune apps for a predictable, consistent level of device performance over long periods of time. </p> @@ -890,10 +890,23 @@ App developers can try out this new API in the N Developer Preview on Nexus 6P devices only. To use this feature, set the sustained performance window flag for the window you want to run in sustained performance mode. Set this flag using the -{@code setSustainedPerformanceMode(boolean)} method. The system automatically +{@code Window.setSustainedPerformanceMode()} method. The system automatically disables this mode when the window is no longer in focus. </p> +<h2 id="vr">VR Support</h2> + +<p> +Android N adds platform support and optimizations for a new VR Mode to let developers +build high-quality mobile VR experiences for users. There are a number of performance +enhancements, including access to an exclusive CPU core for VR apps. +Within your apps, you can take advantage of intelligent head-tracking, +and stereo notifications that work for VR. Most importantly, Android N provides for +very low latency graphics. For complete information about building VR apps for Android N, +see the <a href="https://developers.google.com/vr/android/">Google VR SDK for Android</a>. +</p> + + <h2 id="print_svc">Print Service Enhancements</h2> <p> @@ -939,10 +952,10 @@ disables this mode when the window is no longer in focus. <p> The FrameMetricsListener API allows an app to monitor its UI rendering -performance by exposing a streaming pubsub API to transfer frame +performance. The API provides this capability by exposing a streaming Pub/Sub API to transfer frame timing info for the app's current window. The data returned is -equivalent to that displayed by {@code adb shell dumpsys gfxinfo framestats}, -but is not limited to the past 120 frames. +equivalent to that which <code><a href="{@docRoot}tools/help/shell.html#shellcommands">adb shell</a> +dumpsys gfxinfo framestats</code> displays, but is not limited to the past 120 frames. </p> <p> @@ -958,25 +971,20 @@ for real use cases within an app. </p> <p> -The API provides a callback interface to be implemented and -registered on the window that you wish to monitor: +To monitor a window, implement the <code>FrameMetricsListener.onMetricsAvailable()</code> +callback method and register it on that window. For more information, refer to +the {@code FrameMetricsListener} class documentation in +the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>. </p> -<pre> - public interface FrameMetricsListener { - void onMetricsAvailable(Window window, FrameMetrics frameMetrics, - int dropCountSinceLastInvocation); - } -</pre> - <p> -The API returns a FrameMetrics object, which contains timing data that +The API provides a {@code FrameMetrics} object, which contains timing data that the rendering subsystem reports for various milestones in a frame lifecycle. The supported metrics are: {@code UNKNOWN_DELAY_DURATION}, {@code INPUT_HANDLING_DURATION}, {@code ANIMATION_DURATION}, {@code LAYOUT_MEASURE_DURATION}, {@code DRAW_DURATION}, {@code SYNC_DURATION}, {@code COMMAND_ISSUE_DURATION}, {@code SWAP_BUFFERS_DURATION}, -{@code TOTAL_DURATION}, and {@code FIRST_DRAW_FRAME} +{@code TOTAL_DURATION}, and {@code FIRST_DRAW_FRAME}. </p> diff --git a/docs/html/preview/behavior-changes.jd b/docs/html/preview/behavior-changes.jd index b6b2ee61970e..66dce7a5d0be 100644 --- a/docs/html/preview/behavior-changes.jd +++ b/docs/html/preview/behavior-changes.jd @@ -20,6 +20,7 @@ page.image=images/cards/card-n-changes_2x.png </li> <li><a href="#perm">Permissions Changes</a> </li> + <li><a href="#sharing-files">Sharing Files Between Apps</a></li> <li><a href="#accessibility">Accessibility Improvements</a> <ol> <li><a href="#screen-zoom">Screen Zoom</a></li> @@ -55,14 +56,13 @@ page.image=images/cards/card-n-changes_2x.png </p> -<h2 id="perf">Performance Improvements</h2> +<h2 id="perf">Battery and Memory</h2> <p> - Android N contains system behavior changes aimed at improving the battery - life of devices, RAM usage, and app performance. These changes can impact the - availability of system resources and system notifications to your app. You - should review these changes and evaluate how your app may need to adjust to - them. +Android N includes system behavior changes aimed at improving the battery life +of devices and reducing RAM usage. These changes can affect your app’s access to +system resources, along with the way your app interacts with other apps via +certain implicit intents. </p> <h3 id="doze">Doze</h3> @@ -138,7 +138,7 @@ page.image=images/cards/card-n-changes_2x.png </p> <p> - Similarly, apps can register to receive implicit {@link + Similarly, in previous versions of Android, apps could register to receive implicit {@link android.hardware.Camera#ACTION_NEW_PICTURE} and {@link android.hardware.Camera#ACTION_NEW_VIDEO} broadcasts from other apps, such as Camera. When a user takes a picture with the Camera app, these apps wake up @@ -244,6 +244,23 @@ page.image=images/cards/card-n-changes_2x.png </li> </ul> +<h2 id="sharing-files">Sharing Files Between Apps</h2> + +<p> +For apps targeting Android N, the Android framework enforces +the {@link android.os.StrictMode} API policy that prohibits exposing {@code file://} URIs +outside your app. If an intent containing a file URI leaves your app, the app fails +with a {@code FileUriExposedException} exception. +</p> + +<p> +To share files between applications, you should send a {@code content://} URI +and grant a temporary access permission on the URI. The easiest way to grant this permission is by +using the {@link android.support.v4.content.FileProvider} class. For more information +on permissions and sharing files, +see <a href="{@docRoot}training/secure-file-sharing/index.html">Sharing Files</a>. +</p> + <h2 id="accessibility">Accessibility Improvements</h2> <p> @@ -474,7 +491,7 @@ JavaVM::AttachCurrentThread from <jni.h>. running in device owner mode, the <code>DISALLOW_ADD_USER</code> restriction is automatically set. This prevents users from creating unmanaged secondary users. In addition, the <code>CreateUser()</code> and - <code>createAndInitial()</code> methods are deprecated; the new + <code>createAndInitializeUser()</code> methods are deprecated; the new <code>DevicePolicyManager.createAndManageUser()</code> method replaces them. </li> @@ -483,6 +500,10 @@ JavaVM::AttachCurrentThread from <jni.h>. <code>DevicePolicyManagewr.getWifiMacAddress()</code>. If Wi-Fi has never been enabled on the device, this method returns a value of {@code null}. </li> + + <li>The Work Mode setting controls access to work apps. When work mode is off the + system launcher indicates work apps are unavailable by greying them out. Enabling + work mode again restores normal behavior. </ul> <p> @@ -563,5 +584,33 @@ common example is storing too much data in which causes {@code ActivityThread.StopInfo} to throw a {@code RuntimeException} when your app targets Android N. </li> + +<li> +If an app posts {@link java.lang.Runnable} tasks to a {@link android.view.View}, and +the {@link android.view.View} +is not attached to a window, the system +queues the {@link java.lang.Runnable} task with the {@link android.view.View}; +the {@link java.lang.Runnable} task does not execute until the +{@link android.view.View} is attached +to a window. This behavior fixes the following bugs: +<ul> + <li>If an app posted to a {@link android.view.View} from a thread other than the intended + window’s UI thread, the {@link java.lang.Runnable} may run on the wrong thread as a result. + </li> + <li>If the {@link java.lang.Runnable} task was posted from a thread other than + a looper thread, the app could expose the {@link java.lang.Runnable} task.</li> +</ul> +</li> + +<li> +If an app on Android N with +{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES} +permission tries to delete a package, but a different app had installed that package, +the system requires user confirmation. In this scenario, apps should expect +{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION} +as the return status when they invoke +{@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}. +</li> + </ul> diff --git a/docs/html/preview/download-ota.jd b/docs/html/preview/download-ota.jd index 7e70f570a5ba..2058501dd9a9 100644 --- a/docs/html/preview/download-ota.jd +++ b/docs/html/preview/download-ota.jd @@ -203,72 +203,72 @@ This is the Android SDK Preview License Agreement (the “License Agreement”). <tr id="bullhead"> <td>Nexus 5X <br>"bullhead"</td> <td><a href="#top" onclick="onDownload(this)" - >bullhead-ota-npc91k-dfcbfda0.zip</a><br> - MD5: af537dc0c06e85f32a929c10aaf12e0a<br> - SHA-1: 12a32b09223eb8f98bc0f0f05d951789d5fbe12e + >bullhead-ota-npd35k-b8cfbd80.zip</a><br> + MD5: 15fe2eba9b01737374196bdf0a792fe9<br> + SHA-1: 5014b2bba77f9e1a680ac3f90729621c85a14283 </td> </tr> <tr id="shamu"> <td>Nexus 6 <br>"shamu"</td> <td><a href="#top" onclick="onDownload(this)" - >shamu-ota-npc91k-201dd8d1.zip</a><br> - MD5: 016d60b4734151ca70d977c04d737487<br> - SHA-1: 09ca7c0712366c53e61abb7a6142ce703e2ac62c + >shamu-ota-npd35k-078e6fa5.zip</a><br> + MD5: e8b12f7721c53af9a450f7058928a5fc<br> + SHA-1: b7a9b756f84a1d2e482ff9c16749d65f6e51425a </td> </tr> <tr id="angler"> <td>Nexus 6P <br>"angler"</td> <td><a href="#top" onclick="onDownload(this)" - >angler-ota-npc91k-7399f083.zip</a><br> - MD5: eacc5307ef4f00ba4b61ac9c1620def9<br> - SHA-1: 6a9f36cad4bd8fd63e7719c00e0b75bd991614ff + >angler-ota-npd35k-88457699.zip</a><br> + MD5: 3fac09fef759dde26e57cb80b20b6477<br> + SHA-1: 27d6caa786577d8a38b2da5bf94b33b4524a1a1c </td> </tr> <tr id="volantis"> <td>Nexus 9 <br>"volantis"</td> <td><a href="#top" onclick="onDownload(this)" - >volantis-ota-npc91k-42fc9c84.zip</a><br> - MD5: e1f3f5504aa3389ef4fbac7ac42a995f<br> - SHA-1: 1e49e2867479ad1a1c58f52584c62575bb9c2c3b + >volantis-ota-npd35k-51dbae76.zip</a><br> + MD5: 58312c4a5971818ef5c77a3f446003da<br> + SHA-1: aad9005be33d3e2bab480509a6ab74c3c3b9d921 </td> </tr> <tr id="volantisg"> <td>Nexus 9G <br>"volantisg"</td> <td><a href="#top" onclick="onDownload(this)" - >volantisg-ota-npc91k-4aa98b9f.zip</a><br> - MD5: ad2e60aa9b1a063f906eb8904388e5f8<br> - SHA-1: 4edfa8ab5d2d02ec46afffce62466aa715420558 + >volantisg-ota-npd35k-834f047f.zip</a><br> + MD5: 92b7d1fa252f7394e70f957c72d4aac8<br> + SHA-1: b6c057c84d90893630e303cbb60530e20ddb8361 </td> </tr> <tr id="fugu"> <td>Nexus Player <br>"fugu"</td> <td><a href="#top" onclick="onDownload(this)" - >fugu-ota-npc91o-b1d73dd5.zip</a><br> - MD5: d7fbccde75e0b6d860102320ea76d58f<br> - SHA-1: b1d73dd5a6498fb6c66e022bd0a6c8b6a6a2374b + >fugu-ota-npd35k-6ac91298.zip</a><br> + MD5: 1461622ad53ea842b2722fa7b49b8172<br> + SHA-1: 409c061668ab270774877d7f3eae44fa48d2b931 </td> </tr> <tr id="ryu"> <td>Pixel C <br>"ryu"</td> <td><a href="#top" onclick="onDownload(this)" - >ryu-ota-npc91k-80971fa8.zip</a><br> - MD5: 9d66ca3c5673586bb5ade9fdda6fb924<br> - SHA-1: 329209b6f1ee08a29e4be32139672a30901a19b7 + >ryu-ota-npd35k-a0b2347f.zip</a><br> + MD5: c60117f3640cc6db12386fd632289c7d<br> + SHA-1: 87349c767c69efb4172c90ce1d88cf578c3d28b3 </td> </tr> <tr id="seed"> <td>General Mobile 4G (Android One) <br>"seed"</td> <td><a href="#top" onclick="onDownload(this)" - >seed_l8150-ota-npc91k-8e8c8777.zip</a><br> - MD5: d21d417d7b5525633b5f7bcfa8b23245<br> - SHA-1: bfe42c7e291ca667d3f4d7c80825e5cf8830fc9a + >seed_l8150-ota-npd35k-09897a1d.zip</a><br> + MD5: a55cf94f7cce0393ec6c0b35041766b7<br> + SHA-1: 6f33742290eb46f2561891f38ca2e754b4e50c6a </td> </tr> diff --git a/docs/html/preview/download.jd b/docs/html/preview/download.jd index b0f53694ea90..b5405c7c934d 100644 --- a/docs/html/preview/download.jd +++ b/docs/html/preview/download.jd @@ -302,72 +302,81 @@ This is the Android SDK Preview License Agreement (the “License Agreement”). <tr id="bullhead"> <td>Nexus 5X <br>"bullhead"</td> <td><a href="#top" onclick="onDownload(this)" - >bullhead-npc91k-factory-d09b15b5.tgz</a><br> - MD5: f5aa4b0b10213435569ed4833dd973f8<br> - SHA-1: d09b15b5f8978e2fee3fbd799554de90b7012d64 + >bullhead-npd35k-factory-5ba40535.tgz</a><br> + MD5: b6c5d79a21815ee21db41822dcf61e9f<br> + SHA-1: 5ba4053577007d15c96472206e3a79bc80ab194c </td> </tr> <tr id="shamu"> <td>Nexus 6 <br>"shamu"</td> <td><a href="#top" onclick="onDownload(this)" - >shamu-npc91k-factory-7c9936dc.tgz</a><br> - MD5: 271b758d01f61cdef71a3e4c14e90e85<br> - SHA-1: 7c9936dca492dd9a5b279612962e3439031fcc06 + >shamu-npd35k-factory-a33bf20c.tgz</a><br> + MD5: e1cf9c57cfb11bebe7f1f5bfbf05d7ab<br> + SHA-1: a33bf20c719206bcf08d1edd8da6c0ff9d50f69c </td> </tr> <tr id="angler"> <td>Nexus 6P <br>"angler"</td> <td><a href="#top" onclick="onDownload(this)" - >angler-npc91k-factory-dcd13c44.tgz</a><br> - MD5: 3f304dc1d5044768af26c8503d3fbf18<br> - SHA-1: dcd13c44e7254916fcf7cb7fa31e0dc03737a3f5 + >angler-npd35k-factory-81c341d5.tgz</a><br> + MD5: e93de7949433339856124c3729c15ebb<br> + SHA-1: 81c341d57ef2cd139569b055d5d59e9e592a7abd </td> </tr> <tr id="volantis"> <td>Nexus 9 <br>"volantis"</td> <td><a href="#top" onclick="onDownload(this)" - >volantis-npc91k-factory-ed835af7.tgz</a><br> - MD5: 466a9873111a320e5a19891de61e5609<br> - SHA-1: ed835af7bebf26d4c12b5c30c8b1a337c06c9623 + >volantis-npd35k-factory-2b50e19d.tgz</a><br> + MD5: 565be87ebb2d5937e2abe1a42645864b<br> + SHA-1: 2b50e19dae2667b27f911e3c61ed64860caf43e1 </td> </tr> <tr id="volantisg"> <td>Nexus 9G <br>"volantisg"</td> <td><a href="#top" onclick="onDownload(this)" - >volantisg-npc91k-factory-6f20b9f6.tgz</a><br> - MD5: 419f76cdf886b18d2e7281915b9c77b0<br> - SHA-1: 6f20b9f6b0d77dc17793db32cd2da5a0b0aa63c9 + >volantisg-npd35k-factory-2e89ebe6.tgz</a><br> + MD5: a8464e15c6683fe2afa378a63e205fda<br> + SHA-1: 2e89ebe67a46b2f3beb050746c13341cd11fa678 </td> </tr> <tr id="fugu"> <td>Nexus Player <br>"fugu"</td> <td><a href="#top" onclick="onDownload(this)" - >fugu-npc91o-factory-3b8e3f56.tgz</a><br> - MD5: b88b70ecbfb80c983c90b97cb243628b<br> - SHA-1: 3b8e3f56a4c35b559783c2928e740df2aab8b377 + >fugu-npd35k-factory-1de74874.tgz</a><br> + MD5: c0dbb7db671f61b2785da5001cedefcb<br> + SHA-1: 1de74874f8d83e14d642f13b5a2130fc2aa55873 </td> </tr> <tr id="ryu"> <td>Pixel C <br>"ryu"</td> <td><a href="#top" onclick="onDownload(this)" - >ryu-npc91k-factory-463030f2.tgz</a><br> - MD5: 24e8981a3c95637867eb768c0f84c96c<br> - SHA-1: 463030f2ecdcfe9e92ddf9f3a224ac7aa5ed5866 + >ryu-npd35k-factory-b4eed85d.tgz</a><br> + MD5: bdcb6f770e753668b5fadff2a6678e0d<br> + SHA-1: b4eed85de0d42c200348a8629084f78e24f72ac2 </td> </tr> <tr id="seed"> <td>General Mobile 4G (Android One) <br>"seed"</td> <td><a href="#top" onclick="onDownload(this)" - >seed_l8150-npc91k-factory-7026d89d.tgz</a><br> - MD5: a614984799c887d9b5af2d366fefc8e3<br> - SHA-1: 7026d89d79decd8421da8df844a1fcd9e27df163 + >seed_l8150-npd35k-factory-5ab1212b.tgz</a><br> + MD5: 7d34a9774fdd6e025d485ce6cfc23c4c<br> + SHA-1: 5ab1212bc9417269d391aacf1e672fff24b4ecc5 + </td> + </tr> + + <tr id="xperia"> + <td>Sony Xperia Z3 <br> (D6603 and D6653)</td> + <td>Download: <a class="external-link" + href="http://support.sonymobile.com/xperiaz3/tools/xperia-companion/">Xperia Companion</a><br> + For more information, see <a class="external-link" + href="https://developer.sony.com/develop/smartphones-and-tablets/android-n-developer-preview/">Try Android N Developer Preview for Xperia Z3</a>. </td> </tr> diff --git a/docs/html/preview/features/background-optimization.jd b/docs/html/preview/features/background-optimization.jd index ec02328ad25e..3c33b9d3ff49 100644 --- a/docs/html/preview/features/background-optimization.jd +++ b/docs/html/preview/features/background-optimization.jd @@ -379,7 +379,7 @@ public boolean onStartJob(JobParameters params) { <li style="list-style: none; display: inline"> <pre class="no-pretty-print"> -{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore} +{@code $ adb shell cmd appops set <package> RUN_IN_BACKGROUND ignore} </pre> </li> @@ -389,7 +389,7 @@ public boolean onStartJob(JobParameters params) { <li style="list-style: none; display: inline"> <pre class="no-pretty-print"> -{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow} +{@code $ adb shell cmd appops set <package> RUN_IN_BACKGROUND allow} </pre> </li> -</ul>
\ No newline at end of file +</ul> diff --git a/docs/html/preview/features/multi-window.jd b/docs/html/preview/features/multi-window.jd index fec016861e80..a4f389a0948b 100644 --- a/docs/html/preview/features/multi-window.jd +++ b/docs/html/preview/features/multi-window.jd @@ -253,7 +253,7 @@ android:supportsPictureInPicture=["true" | "false"] </dd> <dt> - <code>android:minimalHeight</code>, <code>android:minimalWidth</code> + <code>android:minHeight</code>, <code>android:minWidth</code> </dt> <dd> @@ -275,8 +275,8 @@ android:supportsPictureInPicture=["true" | "false"] <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" - android:minimalHeight="450dp" - android:minimalWidth="300dp" /> + android:minHeight="450dp" + android:minWidth="300dp" /> </activity> </pre> diff --git a/docs/html/preview/features/notification-updates.jd b/docs/html/preview/features/notification-updates.jd index c40536053f76..016333734b57 100644 --- a/docs/html/preview/features/notification-updates.jd +++ b/docs/html/preview/features/notification-updates.jd @@ -209,9 +209,10 @@ notificationManager.notify(notificationId, repliedNotification); The notification must be either updated or cancelled after the app has received remote input. When the user replies to a remote update using Direct Reply, - do not cancel the notification. Instead, update the notification to display the user's reply. You can update the notification using a - <code>MessagingStyle</code>, or you can append the user's reply to the remote - input history. + do not cancel the notification. Instead, update the notification to display the user's reply. +For notifications using {@code MessagingStyle}, you should add +the reply as the latest message. When using other templates, you can +append the user's reply to the remote-input history. </p> <h2 id="bundle">Bundled Notifications</h2> @@ -395,4 +396,4 @@ Notification notification = new Notification.Builder() .addMessage("What's up?", timestamp2, "Coworker") .addMessage("Not much", timestamp3, null) .addMessage("How about lunch?", timestamp4, "Coworker")); -</pre>
\ No newline at end of file +</pre> diff --git a/docs/html/preview/overview.jd b/docs/html/preview/overview.jd index 0369490de884..1b45c1a66114 100644 --- a/docs/html/preview/overview.jd +++ b/docs/html/preview/overview.jd @@ -153,7 +153,7 @@ page.tags="preview", "developer", "android" <ul> <li><strong><a href="{@docRoot}preview/support.html#dp1">Preview 1</a></strong> (initial release, alpha)</li> <li><strong><a href="{@docRoot}preview/support.html#dp2">Preview 2</a></strong> (incremental update, alpha)</li> - <li><strong>Preview 3</strong> (incremental update, beta)</li> + <li><strong><a href="{@docRoot}preview/support.html#dp3">Preview 3</a></strong> (incremental update, beta)</li> <li><strong>Preview 4</strong> (final APIs and official SDK, Play publishing)</li> <li><strong>Preview 5</strong> (near-final system images for final testing)</li> <li><strong>Final release</strong> to AOSP and ecosystem</li> diff --git a/docs/html/preview/setup-sdk.jd b/docs/html/preview/setup-sdk.jd index 60568acf2cd1..28fc406f1d44 100644 --- a/docs/html/preview/setup-sdk.jd +++ b/docs/html/preview/setup-sdk.jd @@ -47,7 +47,7 @@ as described below.</p> Studio 2.1 or higher by clicking <strong>Help > Check for Update</strong> (on Mac, <strong>Android Studio > Check for Updates</strong>).</p> -<p>If you don't have it, <a href="{@docRoot}sdk/">download Android Studio +<p>If you don't have it, <a href="{@docRoot}studio/">download Android Studio 2.1 here</a>.</p> @@ -91,11 +91,11 @@ Android N Preview SDK in Android Studio as follows:</p> </tr> <tr> <td style="white-space: nowrap"> - <a href="{@docRoot}shareables/preview/n-preview-2-docs.zip" - >n-preview-2-docs.zip</a></td> + <a href="{@docRoot}shareables/preview/n-preview-3-docs.zip" + >n-preview-3-docs.zip</a></td> <td width="100%"> - MD5: c02732760f468bd97cd94c1b76361229<br> - SHA-1: 591eabe168c909799f6d8dcbe7b126c25ea8b04d + MD5: 19bcfd057a1f9dd01ffbb3d8ff7b8d81<br> + SHA-1: 9224bd4445cd7f653c4c294d362ccb195a2101e7 </td> </tr> <table> diff --git a/docs/html/preview/support.jd b/docs/html/preview/support.jd index 83ecde2372a5..7c56f970be94 100644 --- a/docs/html/preview/support.jd +++ b/docs/html/preview/support.jd @@ -5,6 +5,34 @@ page.image=images/cards/card-n-support_2x.png @jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>In this document</h2> + +<ul> + <li><a href="#dp3">Developer Preview 3</a> + <ul> + <li><a href="#general">General advisories</a></li> + <li><a href="#new">New in DP3</a></li> + <li><a href="#ki">Known issues</a></li> + </ul> + </li> + <li><a href="#dp2">Developer Preview 2</a></li> + <li><a href="#dp1">Developer Preview 1</a></li> +</ul> + +<!-- +<h2>See Also</h2> +<ol> + <li></li> +</ol> +--> + +</div> +</div> + <p> Two primary support channels are available to you when developing and testing with the Android N Developer Preview: Please file bugs at <a href= @@ -23,67 +51,453 @@ page.image=images/cards/card-n-support_2x.png <div class="cols"> <div class="col-6of12"> <p> - <em>Date: April 2016<br> - Builds: TODO<br> + <em>Date: May 2016<br> + Build: NPD35K<br> Emulator support: x86 & ARM (32/64-bit)<br> - Google Play services: TODO</em> + Google Play services: 8.4</em> </p> </div> </div> </div> +<h3 id="general">General advisories</h3> + +<p> + This Developer Preview release is for <strong>app developers and other early + adopters</strong> and is available for daily use, development, or + compatibility testing. Please be aware of these general notes about the + release: +</p> + +<ul> + <li>This release may have various <strong>stability issues</strong> on + supported devices. Users may encounter system instability, such as kernel + panics and crashes. + </li> + + <li>Some apps <strong>may not function as expected</strong> on the new + platform version. This includes Google’s apps as well as other apps. + </li> + + <li>Developer Preview 3 is <strong>Compatibility Test Suite (CTS) + approved</strong> on these devices: Nexus 5X, Nexus 6, Nexus 6P, and Pixel + C. Apps that depend on CTS approved builds should + work normally on these devices (Android Pay for example). + </li> + + <li>Developer Preview 3 is <strong>available on all supported + devices:</strong> Nexus 5X, Nexus 6, Nexus 6P, Nexus 9, Nexus Player, Pixel + C, General Mobile 4G (Android One), as well as Sony Xperia Z3 (D6603 and + D6653 models). + + </li> +</ul> + + <h3 id="new">New in DP3</h3> +<h4 id="">VR Mode for Android</h4> + +<p> + Android N adds platform support and optimizations for a new VR Mode to let + developers build high quality mobile VR experiences for users. There are a + number of performance enhancements, including access to an exclusive CPU core + for VR apps. Within your apps, you can take advantage of intelligent + head-tracking, and stereo notifications that work for VR. Most importantly, + Android N provides for very low latency graphics. +</p> + +<p> + For more information, see the <a href= + "https://developers.google.com/vr/android/">Google VR SDK for Android</a>. +</p> + +<h4 id="">Sustained performance mode</h4> + +<p> + Android N includes optional support for <a href= + "{@docRoot}preview/api-overview.html#sustained_performance_api">sustained + performance mode</a>, enabling OEMs to provide hints on device performance + capabilities for long running applications. App developers can then use these + hints to tune applications for a predictable, consistent level of device + performance over long periods of time. App developers can try out this new + API in the developer preview on Nexus 6P devices only. +</p> + +<h4>Multiprocess WebView</h4> + +<p> + Starting with version 51 in Android N, WebView will run web content in a + separate sandboxed process when the developer option "Multiprocess WebView" + is enabled. The WebView team is looking for feedback on compatibility and + runtime performance in N before enabling multiprocess WebView in a future + version of Android. In this version, regressions in startup time, total + memory usage and software rendering performance are expected. +</p> + +<p> + If you find unexpected issues in multiprocess mode we’d like to hear about + them. Please get in touch with the WebView team by <a href= + "https://bugs.chromium.org/p/chromium/issues/entry?template=Webview%20Bugs"> + filing a bug</a>. +</p> + +<h4 id="">Keyboard Shortcuts helper</h4> + +<p> + Android N lets users press <code>Meta+/</code> to trigger a <strong>Keyboard + Shortcuts</strong> screen that displays all shortcuts available both from the + system and from the app in focus. Developers can add their own shortcuts or + trigger the Shortcuts screen from their apps. See <a href= + "{@docRoot}preview/api-overview.html#keyboard_shortcuts_helper">Keyboard + Shortcuts helper</a> for details. +</p> -<h4 id="api-changes">API changes</h4> +<h4 id="">FrameMetrics API</h4> + +<p> + DP3 introduces a new <a href= + "{@docRoot}preview/api-overview.html#framemetrics_api">FrameMetrics API</a> + that allows an app to monitor its UI rendering performance by exposing a + streaming pubsub API to transfer frame timing info for the application’s + current window. <code>FrameMetricsListener</code> can be used to measure + interaction-level UI performance in production with higher granularity and + without the need for a USB connection. +</p> + +<h4 id="api-changes">Feature and API changes</h4> <dl> - <dt><a href="{@docRoot}preview/api-overview.html#number-blocking" - >Number-blocking</a></dt> - <dd>If an unauthorized user attempts to block or unblock a number, the operation - now fails with {@link java.lang.SecurityException}. (Previously, the - operation threw {@link java.lang.UnsupportedOperationException}.)</dd> - - <dt><a href="{@docRoot}preview/api-overview.html#tile_api">Quick - Settings Tile API</a></dt> - <dd>The system now uses the activity's metadata to decide on the tile mode. + <dt> + Launcher Shortcuts and the Launcher Shortcuts API + </dt> + + <dd> + We’ve decided to defer this feature to a future release of Android. We plan + to remove the Launcher Shortcuts APIs (ShortcutManager and others) from the + public Android N API starting in the next developer preview. + </dd> + + <dt> + WebView Javascript run before page load + </dt> + + <dd> + Starting with apps targeting Android N, the Javascript context is reset + when a new page is loaded. Currently, the context is carried over for the + first page loaded in a new {@link android.webkit.WebView} instance. + Developers looking to inject Javascript into the {@link + android.webkit.WebView} should execute the script after the page has + started to load. + </dd> + + <dt> + WebView Geolocation on insecure origins + </dt> + + <dd> + Starting with apps targeting Android N, the geolocation API will only be + allowed on secure origins (over HTTPS.) This policy is designed to protect + users' private information when they're using an insecure connection. + </dd> + + <dt> + Data Saver + </dt> + + <dd> + Starting in Developer Preview 3, apps can use use an intent to display a + system dialog that lets the user directly add the app to the Data Saver + exemption whitelist. See the <a href= + "{@docRoot}preview/api-overview.html#data_saver">Data Saver + documentation</a> for details. + </dd> + + <dt> + <a href= + "{@docRoot}preview/api-overview.html#number-blocking">Number-blocking</a> + </dt> + + <dd> + If an unauthorized user attempts to block or unblock a number, the + operation now fails with {@link java.lang.SecurityException}. (Previously, + the operation threw {@link java.lang.UnsupportedOperationException}.) + </dd> + + <dt> + <a href="{@docRoot}preview/api-overview.html#tile_api">Quick Settings Tile + API</a> + </dt> + + <dd> + The system now uses the activity's metadata to decide on the tile mode. (Previously, tile mode was determined by the return value of <code>TileService.onTileAdded()</code>.) For more information, see - <code>TileService.META_DATA_ACTIVE_TILE</code> in the downloadable - <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>. + <code>TileService.META_DATA_ACTIVE_TILE</code> in the downloadable <a href= + "{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>. </dd> </dl> -<h4 id="dp2-fixes">Fixes for issues reported by developers</h4> +<h4 id="dp3-fixes">Fixes for issues reported by developers</h4> <p> A number of issues reported by developers have been fixed, including: </p> <ul> - <li>TODO</li> + <li>Bluetooth Audio playback interrupted after 1 song (bug <a href= + "https://code.google.com/p/android/issues/detail?id=206889">206889</a>) + </li> + + <li>Pixel C Consistently Crashes (bug <a href= + "https://code.google.com/p/android/issues/detail?id=206962">206962</a>) + </li> + + <li>Clock and Toast notification issues (bug <a href= + "https://code.google.com/p/android/issues/detail?id=203094">203094</a>) + </li> + + <li>Pixel C reboots when connected to MacBook Pro via USB C Cable (bug + <a href= + "https://code.google.com/p/android/issues/detail?id=205432">205432</a>) + </li> + + <li>Calandar offset by one day (bug <a href= + "https://code.google.com/p/android/issues/detail?id=203002">203002</a>) + </li> + + <li>TelephonyManager.getAllCellInfo returning invalid data (bug <a href= + "https://code.google.com/p/android/issues/detail?id=203022">203022</a>) + </li> + + <li>Nexus 6p, Bluetooth keeps disconnecting (bug <a href= + "https://code.google.com/p/android/issues/detail?id=208062">208062</a>) + </li> </ul> -<h3 id="general">General advisories</h3> +<p>For the full list of fixed issues, see <a href="https://goo.gl/6uCKtf">the +issue tracker</a>.</p> -<p> - This Developer Preview release is for <strong>app developers only</strong> - and is designed for use in compatibility testing and early development only. - Please be aware of these general notes about the release: -</p> +<h3 id="ki">Known Issues</h3> + +<h4>Accessibility</h4> <ul> + <li>Unable to listen to TTS output when pitch is set near maximum level. + </li> - <li>TODO</li> + <li>Accessibility features and settings may be disrupted with the user adds a + Work profile, including magnification gesture and setting. Accessibility + state is restored when the user next touches the associated settings. + </li> </ul> -<h3 id="ki">Known Issues</h3> +<h4>Camera</h4> + +<ul> + <li>The Camera app has exhibited instability; it may crash in various + circumstances, such as when launched in multi-window mode. + </li> -<p>TODO</p> + <li>Pressing the shutter continuously in panorama mode may cause the Camera + app to crash. + </li> +</ul> -<h4>Device-specific issues</h4> +<h4>Audio</h4> +<ul> + <li>A platform audio player issue prevents some apps from functioning + normally. For example, Skype and other apps are affected by this issue. + </li> +</ul> + +<h4>Connectivity</h4> + + +<ul> + <li>When a Bluetooth Low Energy (BLE) peripheral role device advertises a + service and a BLE central role device connects, the peripheral role device + disconnects very quickly. + </li> + + <li>Wi-Fi connection may be dropped when the screen is off. + </li> + + <li>RFCOMM connections are unstable and may result in data corruption and + dangling connections. + </li> + + <li>The active network state ({@link android.net.NetworkInfo#getState + NetworkInfo.getState()} and {@link android.net.NetworkInfo#getDetailedState + NetworkInfo.getDetailedState()}) might return incorrect values during some + restricted background scenarios. + </li> +</ul> + + +<h4> + Launcher +</h4> + +<ul> + <li>The default launcher’s All Apps tray may become unresponsive after + cycling screen off / screen on. Returning to the homescreen and relaunching + the All Apps tray may resolve this issue. + </li> +</ul> + +<h4> + Keyboard +</h4> + +<ul> + <li>When updating a device running Android 6.0 or earlier to the N Developer + Preview, Google Keyboard does not preserve preferences data such as recent + emoji and sound settings. + </li> + + <li>Google Indic Managed Keyboard may be unstable. + </li> + + <li>When entering text in a password field, the user can select Russian as + the input language but the keyboard remains in English. This prevents the + user from entering Russian-language passwords. + </li> +</ul> + +<h4> + Locale and languages +</h4> + +<ul> + <li>When using a right-to-left (RTL) locale, the system may unexpectedly + switch to left-to-right (LTR) presentation after restarting the device. + </li> +</ul> + +<h4>Media</h4> + +<ul> + <li>Media playback be be unreliable on Nexus 9 and Nexus Player, including + issues playing HD video. + </li> +</ul> + +<h4> + Multi-window mode +</h4> + +<ul> + <li>Device may freeze when changing orientation in multi-window mode. + </li> + + <li>Several apps currently have issues with multi-window mode: + <ul> + <li>The system UI may crash when docking Settings > Display > + Screen brightness to multi-window. + </li> + + <li>The Camera app may crash when launched in multi-window mode. + </li> + + <li>YouTube may crash when launched into multi-window mode. To fix the + issue, you can clear the YouTube app’s data at Storage > Apps > + YouTube. + </li> + </ul> + </li> +</ul> + +<h4> + Google Play services +</h4> + +<ul> + <li>Apps using Google Cast through Google Play services may be unstable when + the user selects a system locale that uses letters and numbers outside of the + ASCII range. + </li> +</ul> + +<h4> + Android for Work and Google Apps Device Policy +</h4> + +<ul> + <li>The Device Policy app may crash when the user unlocks the device with the + "device policy status" screen pinned. + </li> + + <li>After setting up a work profile with file-based encryption enabled and + then turning off Work, users must unlock primary profile screen lock to once + again access Work apps. + </li> + + <li>Device reboots when removing the security pattern lock and opening work + app/personal app in the multi-window. + </li> + + <li>Setting DISALLOW_VPN_CONFIG is causing the consent dialog to appear in + always-on-vpn set by Device Policy Client. + </li> + + <li>Traffic is not locked down until VPN is connected in always-on-vpn mode. + </li> +</ul> + +<h4> + External storage +</h4> -<p>TODO</p> +<ul> + <li>Apps may become unstable when the user moves them from internal storage + to adoptable external storage (this can include SD card or devices attached + over USB). + </li> +</ul> + +<h4> + Screen zoom and multiple APKs in Google Play +</h4> + +<ul> + <li>On devices running Android N, Google Play services 9.0.83 incorrectly reports + the current screen density rather than the stable screen density. When screen + zoom is enabled on these devices, this can cause Google Play to select a + version of a multi-APK app that’s designed for smaller screens. This issue is + fixed in the next version of Google Play services and will be included in a + later Developer Preview release. + </li> + + <li>On devices running Android N, Google Play services 9.0.83 currently reports + Vulkan support but not Vulkan version. This can cause Google Play to select a + version of a multi-APK app that’s designed for lower Vulkan support on + devices with higher version support. Currently, the Google Play Store does + not accept uploads of Apps which use Vulkan version targeting. This support + will be added to the Google Play Store in the future and fixed in the next + version of Google Play services (to be included in a later Developer Preview + release) any N devices using the version of Google Play services 9.0.83 will + continue to receive versions of Apps targeting basic Vulkan support. + </li> +</ul> + +<h4 id="">Notifications</h4> + +<ul> + <li>MessagingStyle does not show notifications with "null" (self) sender. + </li> +</ul> + +<h4 id="">Developer Tools</h4> + +<ul> + <li> + <code>adb</code> may sometimes disconnect while using JDWP debugging. + </li> +</ul> + +<!-- TBA, if any +<h4>Device-specific issues</h4> <dl> <dt> @@ -99,6 +513,14 @@ page.image=images/cards/card-n-support_2x.png </dd> </dl> +--> + + + + + + + <!-- DP2 Release Notes Archive --> <h2 id="dp2">Developer Preview 2</h2> diff --git a/docs/html/topic/instant-apps/_book.yaml b/docs/html/topic/instant-apps/_book.yaml new file mode 100644 index 000000000000..1f918f2b2e7b --- /dev/null +++ b/docs/html/topic/instant-apps/_book.yaml @@ -0,0 +1,5 @@ +toc: +- title: Android Instant Apps + path: /topic/instant-apps/index.html +- title: Frequently Asked Questions (FAQs) + path: /topic/instant-apps/faqs.html
\ No newline at end of file diff --git a/docs/html/topic/instant-apps/faqs.jd b/docs/html/topic/instant-apps/faqs.jd new file mode 100644 index 000000000000..0a1f571d9030 --- /dev/null +++ b/docs/html/topic/instant-apps/faqs.jd @@ -0,0 +1,69 @@ +page.title=Android Instant Apps: Frequently Asked Questions +page.tags=Material,design +footer.hide=true +forcelocalnav=true +@jd:body + +<p> + <strong>What devices are compatible with Android Instant Apps?</strong> + <br/> + Android Instant Apps is compatible with devices that are running Android 4.1 + (API level 16) or higher and have Google Play services installed. +</p> + +<p> + <strong>Do developers need to build two different Android apps now?</strong> + <br/> + Developers only need to maintain one project with one source tree. + Developers simply configure the project to create two build artifacts: the + installable APK and the instant version. + Some developers can take less than a day to get up and running, + though the effort involved varies depending on how the + app is structured. +</p> + +<p> + <strong>What Android APIs and functionality can Instant Apps use?</strong> + <br/> + Android Instant Apps functionality complements an existing Android app, + but does not replace it. Android Instant Apps uses the same Android APIs, the + same project, the same source code. Android Instant Apps restricts some + features that might not match users' expectations of an app + that is not installed. + For example, an Instant App can't use background services, do background + notifications, or access unique device identifiers. +</p> + +<p> + <strong>Can users choose to install the app permanently?</strong> + <br/> + Developers can allow users to download the app from the Google Play + Store. After download, the app remains on the phone after the user has left + the experience. +</p> + +<p> + <strong>How do permissions work in Android Instant Apps?</strong> + <br/> + Android Instant Apps uses the runtime permissions model introduced in + Android 6.0. + If an app supports the permission model introduced in Android 6.0 + (API level 23), it does not require any additional work to become an Instant + App that runs on older devices. +</p> + +<p> + <strong>How do developers publish these apps?</strong> + <br/> + Developers publish their Instant Apps through the Google Play Developer + Console, similar to their existing Android apps. +</p> + +<p> + <strong>How can developers get involved?</strong> + <br/> + Developers interested in upgrading their Android apps can visit + <a class="external-link" href="g.co/InstantApps">g.co/InstantApps</a> to + sign up. We will be reaching out to interested + developers in the coming months. +</p>
\ No newline at end of file diff --git a/docs/html/topic/instant-apps/index.jd b/docs/html/topic/instant-apps/index.jd new file mode 100644 index 000000000000..d8de0b518b4a --- /dev/null +++ b/docs/html/topic/instant-apps/index.jd @@ -0,0 +1,314 @@ +fullpage=true +page.title=Android Instant Apps +page.viewport_width=970 +meta.tags="instant apps, getstarted, sdk, appquality, landing" +section.landing=true +header.hide=1 +carousel=1 +tabbedList=1 +excludeFromSuggestions=true +@jd:body + +<!-- Hero section --> +<section class="dac-expand dac-hero dac-section-light"> +<div class="wrap"> + <div class="cols dac-hero-content"> + + <div class="col-1of2 col-push-1of2 dac-hero-figure"> + <div class="dev-bytes-video"> + <iframe width="560" height="350" src= + "https://www.youtube.com/embed/cosqlfqrpFA" frameborder="0" + allowfullscreen=""></iframe> + </div> + </div> + + <div class="col-1of2 col-pull-1of2" style="margin-bottom:40px"> + <h1> + Android Instant Apps + </h1> + + <p class="sub-head"> + Native Android apps, without the installation + </p> + + <p class="dac-hero-description"> + An evolution in app sharing and discovery, Android Instant Apps enables + Android apps to run instantly, without requiring installation. Instant + Apps lets you experience what you love about apps—fast and beautiful + user interfaces, high performance, and great capabilities—with just a + tap. + </p> + + <p class="dac-hero-description"> + Request early access to the Instant Apps documentation today. + </p> + + <p style="margin-top:24px"> + <a class="landing-button green download-bundle-button" href= + "https://docs.google.com/a/google.com/forms/d/1S3MzsMVIlchLCqyNLaFbv64llxWaf90QSeYLeswco90/viewform" + target="_blank">I'M INTERESTED IN ANDROID INSTANT APPS<br></a> + </p> + </div> + + </div> <!-- end cols dac-hero-content --> +</div> <!-- end .wrap --> +</section> + +<!-- Second section --> + +<div class="wrap" style="margin-top:60px"> +<div class="cols dac-hero-content"> + <div class="col-1of2 dac-hero-figure"> + <img src="/images/topic/instant-apps/instant-apps-section-2.png"> + </div> +<div class="col-1of2"> +<div class="dac-hero-tag"></div> + + <h2 id="section-2">Run Android Apps Without Installation</h2> + <p class="dac-hero-description"> + Android Instant Apps lets you experience beautiful and immersive + apps, with material design and smooth animations, without installing them + on your device. + </p> + +</div> +</div> +</div> + +<!-- Third section --> + +<div class="wrap" style="margin-top:60px"> + + <h2 id="section-3">Access Apps From Anywhere</h2> + + <p> + Get people to your flagship Android experience from links that would + otherwise open your mobile web page — like + search, social media, messaging, and other deep links — without them + needing to stop and install your app first. + </p> + + <div class="cols" style="margin-top:1em;"> + <div class="col-4of12 gif-container"> + <img class="partner-gifs" + src="/images/topic/instant-apps/s3-BandH-static.png" + data-stat="/images/topic/instant-apps/s3-BandH-static.png" + data-anim="/images/topic/instant-apps/s3-BandH-animated.gif"> + <p class="figure-caption"> + <em>B&H Photo<br/> + (via Google Search)</em> + </p> + </div> + + <div class="col-4of12 gif-container"> + <img class="partner-gifs" + src="/images/topic/instant-apps/s3-BuzzFeed-static.png" + data-stat="/images/topic/instant-apps/s3-BuzzFeed-static.png" + data-anim="/images/topic/instant-apps/s3-BuzzFeed-animated.gif"> + <p class="figure-caption"> + <em>BuzzfeedVideo<br/> + (via a shared link)</em> + </p> + </div> + + <div class="col-4of12 gif-container"> + <img class="partner-gifs" + src="/images/topic/instant-apps/s3-ParkandPay-static.png" + data-stat="/images/topic/instant-apps/s3-ParkandPay-static.png" + data-anim="/images/topic/instant-apps/s3-ParkandPay-animated.gif"> + <p class="figure-caption"> + <em>Park and Pay<br/> + (via NFC)</em> + </p> + </div> + </div> +</div> + +<!-- Fourth section --> + +<div class="wrap" style="margin-top:60px"> +<div class="cols dac-hero-content"> + <div class="col-1of2 dac-hero-figure"> + <img src="/images/topic/instant-apps/instant-apps-section-4.png"> + </div> +<div class="col-1of2"> +<div class="dac-hero-tag"></div> + + <h2 id="section-4">Built On Google Play Services</h2> + <p class="dac-hero-description"> + Take advantage of Google Play services features — like location, identity, + payments, and Firebase — which are built right in for a seamless user + experience. + </p> + +</div> +</div> +</div> + +<!-- Fifth section --> + +<div class="wrap" style="margin-top:60px"> +<div class="cols dac-hero-content"> + <div class="col-1of2 col-push-1of2 dac-hero-figure"> + <img src="/images/topic/instant-apps/instant-apps-section-5.png"> + </div> +<div class="col-1of2 col-pull-1of2"> +<div class="dac-hero-tag"></div> + <h2 id="section-5">Works On Most Android Devices</h2> + + <p class="dac-hero-description"> + + Android Instant Apps can work on Android devices running Android 4.1+ + (API Level 16) or higher with Google Play services. + </p> + +</div> +</div> +</div> + +<!-- Sixth section --> + +<div class="wrap" style="margin-top:60px"> +<div class="cols dac-hero-content"> + <div class="col-1of2 dac-hero-figure"> + <img src="/images/topic/instant-apps/upgrade-your-app-2x.png"> + </div> +<div class="col-1of2"> +<div class="dac-hero-tag"></div> + + <h2 id="section-6">Upgrade Your Existing App</h2> + <p class="dac-hero-description"> + Android Instant Apps functionality is an upgrade to your existing Android + app, not a new, separate app. It's the same Android APIs, the same + project, the same source code. It can take less than a day to get + up and running for some developers, though the effort involved varies, + depending on how your app is structured. You modularize your app, + and Google Play downloads only the parts that are needed, on the fly. + </p> + +</div> +</div> +</div> + +<!-- Seventh section --> + +<div class="wrap" style="margin-top:60px" id="section-7"> + <h2 id="sign-up-docs" style="margin-bottom: 0px;"> + Sign up for access to Android Instant Apps documentation + </h2> + + <p> + We’ll let you know if you’re selected for early access + to Android Instant + Apps. + </p> + + <p> + <a class="landing-button green download-bundle-button" + href="https://docs.google.com/forms/d/1S3MzsMVIlchLCqyNLaFbv64llxWaf90QSeYLeswco90/viewform" + target="_blank"> + I'M INTERESTED IN ANDROID INSTANT APPS<br> + </a> + </p> + + <p style="margin-top:24px"> + Check out our <a href="faqs.html">frequently asked questions</a> to find out + more about Android Instant Apps. + </p> +</div> + +<style> + + /* Sub-heading styling */ + .sub-head { + font-size: 28px; + line-height: 125%; + } + + /* Background color for hero module. */ + .dac-section-light { + background: #B0BEC5; + } + + /* Styling and layout for video. */ + .dev-bytes-video { + margin-top: 30px; + position: relative; + padding-bottom: 56.25%; /* 16:9 */ + padding-top: 30px; + height: 0; + } + + .dev-bytes-video iframe, + .dev-bytes-video object, + .dev-bytes-video embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + /* Increase top margin for sections */ + .wrap { + margin-top: 1.5em; + } + + #section-3, #sign-up-docs { + margin-top: 0px; + border-top: 0px; + } + + /* Align the seventh section in the center. */ + #section-7 { + text-align: center; + } + + /* GIF section styling */ + .figure-caption { + text-align: center; + } + + .partner-gifs { + width: 80%; + height: auto; + } + + .gif-container { + text-align: center; + } + +</style> + +<script> + +(function () { + + function onMouseEnter(evt) { + if (evt.target.dataset && evt.target.dataset.anim) { + swap(evt.target, { + newStr: evt.target.dataset.anim + }); + } + } + + function onMouseOut(evt) { + if (evt.target.dataset && evt.target.dataset.stat) { + swap(evt.target, { + newStr: evt.target.dataset.stat + }); + } + } + + function swap(target, options) { + if (options && options.newStr) { + $(target).attr("src", options.newStr); + } + } + + $(".partner-gifs").mouseenter(onMouseEnter); + $(".partner-gifs").mouseout(onMouseOut); + +})(); + +</script>
\ No newline at end of file diff --git a/docs/html/topic/libraries/_book.yaml b/docs/html/topic/libraries/_book.yaml index ead95e7a09c7..34e5e47cafa0 100644 --- a/docs/html/topic/libraries/_book.yaml +++ b/docs/html/topic/libraries/_book.yaml @@ -6,6 +6,8 @@ toc: path: /topic/libraries/support-library/features.html - title: Setup path: /topic/libraries/support-library/setup.html + - title: Revision History + path: /topic/libraries/support-library/revisions.html - title: Data Binding Library path: /topic/libraries/data-binding/index.html diff --git a/docs/html/topic/libraries/support-library/index.jd b/docs/html/topic/libraries/support-library/index.jd index 70c9cffb7acd..92002dde3e90 100644 --- a/docs/html/topic/libraries/support-library/index.jd +++ b/docs/html/topic/libraries/support-library/index.jd @@ -13,15 +13,17 @@ page.metaDescription=The Android Support Library offers backward-compatible vers <li><a href="#layout-patterns">Support for General Layout Patterns</a></li> <li><a href="#form-factors">Support for Different Form Factors</a></li> <li><a href="#utils">General Utilities</a></li> - <li><a href="#revisions">Support Library Revision History</a></li> </ol> <h2>See also</h2> <ol> - <li><a href="{@docRoot}tools/support-library/features.html"> + <li><a href="{@docRoot}topic/libraries/support-library/features.html"> Support Library Features</a></li> - <li><a href="{@docRoot}tools/support-library/setup.html"> - Support Library Setup </a></li> + <li><a href="{@docRoot}topic/libraries/support-library/setup.html"> + Support Library Setup</a></li> + <li><a href="{@docRoot}topic/libraries/support-library/revisions.html"> + Support Library Revision History</a></li> + </ol> </div> @@ -180,2798 +182,3 @@ page.metaDescription=The Android Support Library offers backward-compatible vers permissions model, the methods check whether the appropriate permission was granted at install time. </p> - -<h2 id="revisions">Support Library Revision History</h2> - -<p>This section provides details about the Support Library package releases.</p> - -<div class="toggle-content opened"> - <p id="rev23-4-0"> - <a href="#" onclick="return toggleContent(this)"><img src= - "{@docRoot}assets/images/styles/disclosure_up.png" class= - "toggle-content-img" alt="">Android Support Library, revision 23.4.0</a> - <em>(May 2016)</em> - </p> - - <div class="toggle-content-toggleme"> - <dl> - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v4">v4 Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed issue where fragments were added in the wrong order. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=206901">Issue - 206901</a>) - </li> - - <li>Fixed issue where app bar wasn't drawn after being scrolled - offscreen. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=178037">Issue - 178037</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 - appcompat library</a>: - </dt> - - <dd> - <ul> - <li>Added <!-- TODO: Link to method --> - <code><a href= - "{@docRoot}reference/android/support/v7/app/AppCompatDelegate.html"> - AppCompatDelegate</a>.setCompatVectorFromResourcesEnabled()</code> - method to re-enable usage of vector drawables in {@link - android.graphics.drawable.DrawableContainer} objects on devices - running Android 4.4 (API level 19) and lower. See <a href= - "https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.44uulkfal" - class="external-link">AppCompat v23.2 — Age of the vectors</a> for - more information. - </li> - - <li>Fixed an issue in API 23 with <a href= - "{@docRoot}reference/android/support/v7/app/AppCompatDelegate.html#setDefaultNightMode(int)"> - <code>AppCompatDelegate.setDefaultNightMode()</code></a> not - loading correct resources in API level 23. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=206573">Issue - 206573</a>) - </li> - - <li>Fixed issue that could cause {@link - java.lang.NullPointerException}. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=207638">Issue - 207638</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#design">Design Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed an issue where {@link - android.support.design.widget.TextInputLayout} doesn't clear error - tint after {@link - android.support.design.widget.TextInputLayout#setErrorEnabled - setErrorEnabled(false)} on API level 21 - 22 (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=202829">Issue - 202829</a>) - </li> - - <li>Fixed an issue where {@link - android.support.design.widget.FloatingActionButton} does not return - when animations are disabled. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=206416">Issue - 206416</a>) - </li> - - <li>Fixed issue in {@link android.support.design.widget.AppBarLayout} - snap functionality when used with <code>{@link - android.support.design.R.id#scroll}|{@link - android.support.design.R.id#enterAlways}|{@link - android.support.design.R.id#enterAlwaysCollapsed}|{@link - android.support.design.R.id#snap}</code> scroll flags. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=207398">Issue - 207398</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <!-- TODO: Add link -->Vector Drawable library: - </dt> - - <dd> - <ul> - <li>Fixed a bug where <!-- TODO: Javadoc link --> - <code>VectorDrawableCompat</code> does not render correctly in - {@link android.widget.TextView} on API level 23. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=206227">Issue - 206227</a>) - </li> - </ul> - </dd> - </dl> - </div> -</div> - -<!-- end of collapsible section: 23.4.0 --> - - -<div class="toggle-content closed"> - <p id="rev23-3-0"> - <a href="#" onclick="return toggleContent(this)"><img src= - "{@docRoot}assets/images/styles/disclosure_up.png" class="toggle-content-img" - alt="">Android Support Library, revision 23.3.0</a> <em>(April - 2016)</em> - </p> - - <div class="toggle-content-toggleme"> - <dl> - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v4">v4 Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Added <code>AppLaunchChecker</code> to help track how your app - has been launched by the user in the past. - <code>hasStartedFromLauncher()</code> lets you know if the user has - launched your app from the home screen before, or if it has only - been started by other means (for example, to view specific web - URLs). - </li> - - <li>Fixed a memory leak in - <code>MediaBrowserServiceCompat.mConnections</code>. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=205220">Issue - 205220</a>) - </li> - - <li>Fixed issue where {@link android.support.v4.view.ViewPager} - does not account for page margins when flipping page. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=203816">Issue - 203816</a>) - </li> - <li>{@link android.support.v4.app.Fragment#onRequestPermissionsResult - Fragment.onRequestPermissionsResult()} is now delivered to child - fragments. - </li> - </ul> - </dd> - - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 - appcompat library</a>: - </dt> - - <dd> - <ul> - <li>Fixed an issue in {@link - android.support.v7.widget.AppCompatSpinner} that could cause - multiple popups to appear. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=205052">Issue - 205052</a>) - </li> - - <li>Fixed an issue with how borderless buttons were colored. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202967">Issue - 202967</a>) - </li> - - <li>Fixed a compatibility issue between {@link - android.support.v7.app.AppCompatDialogFragment } and {@link - android.support.v7.app.AlertDialog}. (<a class="external-link" - href="https://code.google.com/p/android/issues/detail?id=204805">Issue - 204805</a>) - </li> - - <li>Reverted changes to <code>TintResources</code> that were causing - memory and configuration issues. (<a class="external-link" - href="https://code.google.com/p/android/issues/detail?id=205236">Issue - 205236</a>)</li> - </ul> - </dd> - - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-mediarouter">v7 - mediarouter library</a>: - </dt> - - <dd> - <ul> - <li>Fixed {@link android.support.v7.app.MediaRouteControllerDialog} - volume slider’s behavior. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202299">Issue - 202299</a>) - </li> - </ul> - </dd> - - - <dt> - Changes for <a href="features.html#v7-preference">v7 Preference</a> - library: - </dt> - - <dd> - <ul> - <li>Fixed issue where {@link - android.support.v7.preference.PreferenceFragmentCompat} would crash - if <code>dividerHeight</code> is specified. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=204778">Issue - 204778</a>) - </li> - </ul> - </dd> - - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 - recyclerview library</a>: - </dt> - - <dd> - <ul> - <li>Fixed a bug where {@link - android.support.v7.widget.RecyclerView} would not invoke scroll - callbacks if the range of visible items shrank. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=200987">Issue - 200987</a>) - </li> - - <li>Fixed a bug where {@link - android.support.v7.widget.RecyclerView} would freeze if it was in - linear layout, was weighted, and contained images. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=203276">Issue - 203276</a>) - </li> - - <li>Fixed a crash in {@link - android.support.v7.widget.OrientationHelper#getStartAfterPadding - OrientationHelper.getStartAfterPadding()}. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=180521">Issue - 180521</a>) - </li> - - <li>Fixed a crash with usages of - <code>android:nestedScrollingEnabled</code>. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=197932">Issue - 197932</a>) - </li> - </ul> - </dd> - - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#design">Design Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed a bug where a hidden bottom sheet would handle touch - events. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=203654">Issue - 203654</a>) - </li> - - <li>Fixed a layout issue with <code>BottomSheetBehavior</code> when - <code>fitsSystemWindows</code> is true. (<a class="external-link" - href= - "https://code.google.com/p/android/issues/detail?id=203057">Issue - 203057</a>) - </li> - - <li>Fixed an accessibility issue with {@link - android.support.design.widget.Snackbar}. (<a class="external-link" - href= - "https://code.google.com/p/android/issues/detail?id=182145">Issue - 182145</a>) - </li> - - <li>Fixed a crash on {@link android.support.design.widget.Snackbar} - swipe. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=203924">Issue - 203924</a>) - </li> - - <li>Fixed a bug in {@link - android.support.design.widget.AppBarLayout} with - <code>enterAlways</code>. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=203661">Issue - 203661</a>) - </li> - - <li>Fixed a bug where {@link - android.support.design.widget.TextInputLayout} unnecessarily clears - {@link android.widget.EditText} object's background color filter. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=203357">Issue - 203357</a>) - </li> - </ul> - </dd> - - </dl> - </div> -</div> -<!-- end of collapsible section: 23.3.0 --> - -<div class="toggle-content closed"> - <p id="rev23-2-1"> - <a href="#" onclick="return toggleContent(this)"><img src= - "{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" - alt="">Android Support Library, revision 23.2.1</a> <em>(March - 2016)</em> - </p> - - <div class="toggle-content-toggleme"> - <dl> - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v4">v4 Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed an exception in {@link - android.support.v4.graphics.drawable.DrawableCompat#wrap - DrawableCompat.wrap()} and {@link android.graphics.drawable.LayerDrawable} on - API levels 17 to 19. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201817">Issue 201817</a>) - </li> - - <li>Fixed an {@code ArrayIndexOutOfBoundsException} in {@link - android.support.v4.widget.ViewDragHelper#shouldInterceptTouchEvent - ViewDragHelper.shouldInterceptTouchEvent()}. (<a class="external-link" - href="https://code.google.com/p/android/issues/detail?id=182262">Issue - 182262</a>) - </li> - - <li>Fixed a bug in {@link android.support.v4.view.ViewPager} related to - scroll calculation for size changes. - </li> - - <li>Fixed a {@code NullPointerException} when {@code - DrawerLayout.removeDrawerListener()} is called without a set {@link - android.support.v4.widget.DrawerLayout.DrawerListener - DrawerLayout.DrawerListener}. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202478">Issue 202478</a>) - </li> - - <li>Fixed a bug where {@link android.support.v4.view.ViewPager} does not set - {@link android.view.accessibility.AccessibilityEvent} parameters properly - when scrolling. - </li> - - <li>Fixed an issue that caused lag during device rotation when using - {@link android.support.v4.graphics.drawable.DrawableCompat#wrap - Drawable.wrap()}. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201924">Issue 201924</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 - appcompat library</a>: - </dt> - - <dd> - <ul> - <li>Reverted dependency on vector assets so that developers using the - <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">appcompat - library</a> are not forced to use {@link - android.graphics.drawable.VectorDrawable} and its associated build flags. - </li> - - <li>Fixed a compatibility issue with Night Mode and API level 23. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201910">Issue - 201910</a>) - </li> - - <li>Fixed a compatibility issue with {@link - android.support.v7.widget.SwitchCompat} and API level 7. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=201942">Issue 201942</a>) - </li> - - <li>Fixed an issue with propagating configuration values in Resources objects - <a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201928">Issue 201928</a> - </li> - - <li>Fixed a compatibility issue where the {@link - android.support.v7.app.NotificationCompat.MediaStyle - NotificationCompat.MediaStyle} cancel button becomes invisible on API level - 21 and below. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202156">Issue 202156</a>) - </li> - - <li>Fixed a compatibility crash with {@link - android.support.v7.widget.AppCompatSpinner} on API level 21 and below. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202246">Issue 202246</a>) - </li> - - <li>Fixed an issue where the {@code app:textAllCaps = "false"} style did not - work. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202117">Issue 202117</a>) - </li> - - <li>Fixed a crash when restoring {@link android.widget.SearchView}. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201836">Issue - 201836</a>) - </li> - - <li>Fixed a memory leak that occurs when tinting drawable resources using - AppCompat. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202379">Issue 202379</a>) - </li> - - <li>Fixed an issue with {@link android.view.KeyEvent} on API level 11 and - lower. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202939">Issue 202939</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-cardview">v7 cardview - library</a>: - </dt> - - <dd> - <ul> - <li>Added Night Mode support for {@link - android.support.v7.widget.CardView}. (<a class="external-link" - href="https://code.google.com/p/android/issues/detail?id=194497">Issue - 194497</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 - recyclerview library</a>: - </dt> - - <dd> - <ul> - <li>Fixed bugs related to various measure-spec methods. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=201856">Issue - 201856</a>) - </li> - - <li>Reduced the lockdown period in which {@link - android.support.v7.widget.RecyclerView} does not allow adapter - changes while calculating a layout or scroll. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=202046">Issue - 202046</a>) - </li> - - <li>Fixed a crash when calling {@link - android.support.v7.widget.RecyclerView.Adapter#notifyItemChanged - notifyItemChanged()} on an item that is out of view. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=202136">Issue - 202136</a>) - </li> - - <li>Fixed a crash that occurs when {@link - android.support.v7.widget.RecyclerView.LayoutManager - RecyclerView.LayoutManager} adds and removes a view in the same - measurement pass. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=193958">Issue - 193958</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v7-mediarouter">v7 - mediarouter library</a>: - </dt> - - <dd> - <ul> - <li>Fixed a crash that occurs when calling {@link - android.support.v7.media.MediaRouter#getInstance - MediaRouter.getInstance()} on API level 17. (<a class="external-link" - href= - "https://code.google.com/p/android/issues/detail?id=180654">Issue - 180654</a>) - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#v17-leanback">v17 - Leanback Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed an issue with {@code GridLayout.onAddFocusables()} that - caused the wrong item to be selected. - </li> - - <li>Fixed issue with {@link - android.support.v17.leanback.app.GuidedStepFragment} actions - disappearing after an action was collapsed. - </li> - </ul> - </dd> - - <dt> - Changes for <a href= - "{@docRoot}tools/support-library/features.html#design">Design Support - Library</a>: - </dt> - - <dd> - <ul> - <li>Fixed a {@link android.support.design.widget.TabLayout} crash - caused by tab-pooling. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201827">Issue - 201827</a>) - </li> - - <li>Fixed a bug in {@link - android.support.design.widget.NavigationView} that caused the wrong - color to be selected. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201951">Issue - 201951</a>) - </li> - - <li>Fixed a bug where {@link - android.support.design.widget.FloatingActionButton#setBackgroundTintList - setBackgroundTintList()} was no longer able to change the background - color. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201873">Issue - 201873</a>) - </li> - - <li>Fixed an issue where {@link - android.support.design.widget.AppBarLayout} did not completely scroll - out of view when used with {@code android:fitsSystemWindows = “true”}. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201822">Issue - 201822</a>) - </li> - - <li>Fixed an issue where {@code BottomSheetDialog} did not display - short content views correctly. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201793">Issue - 201793</a>) - </li> - - <li>Fixed an issue where {@code BottomSheetDialogFragment} moved - sporadically when content inside was changed. (<a class= - "external-link" href= - "https://code.google.com/p/android/issues/detail?id=202125">Issue - 202125</a>) - </li> - - <li>Fixed a crash in TextInputLayout counter <a class="external-link" - href= - "https://code.google.com/p/android/issues/detail?id=202051">link</a> - </li> - - <li>Fixed a crash that occured when {@link - android.support.design.widget.TextInputLayout#getCounterMaxLength - TextInputLayout.getCounterMaxLength()} restored a saved state. - (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=202375">Issue - 202375</a>) - </li> - - <li>Fixed a {@code ClassCastException} that occurred when restoring a - {@link android.support.design.widget.CoordinatorLayout} using the - saved state of a view that was not a {@link - android.support.design.widget.CoordinatorLayout}. - </li> - </ul> - </dd> - - <dt> - Changes for VectorDrawableCompat: - </dt> - - <dd> - <ul> - <li>Fixed a bug where the wrong variable was read for {@code - android:tintMode}. (<a class="external-link" href= - "https://code.google.com/p/android/issues/detail?id=201907">Issue - 201907</a>) - </li> - </ul> - </dd> - </dl> - </div> -</div> -<!-- end of collapsible section: 23.2.1 --> - -<div class="toggle-content closed"> - <p id="rev23-2-0"> - <a href="#" onclick="return toggleContent(this)"><img src= - "{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" - alt="">Android Support Library, revision 23.2.0</a> <em>(February - 2016)</em> - </p> - - <div class="toggle-content-toggleme"> - <dl> - <dt> - Changes for <a href="features.html#v4">v4 Support library</a>: - </dt> - - <dd> - <ul> - <li>Added {@code MediaBrowserCompat} for {@link - android.media.browse.MediaBrowser} support, and {@code - MediaBrowserServiceCompat} for {@link - android.service.media.MediaBrowserService} support. This is useful - when connecting a media app’s background service with UI components, - and integrating with Android Auto and Android Wear without requiring - API level 21 or higher. - </li> - - <li>The system now calls {@link - android.support.v4.app.FragmentActivity#onActivityResult onActivityResult()} for a - nested {@link android.support.v4.app.FragmentActivity}. - </li> - </ul> - </dd> - - <dt> - Changes for <a href="features.html#v7-appcompat">v7 AppCompat - library</a>: - </dt> - - <dd> - <ul> - <li>Added Night Mode functionality to API level 14 and higher. Switch - between <a href="{@docRoot}training/material/theme.html">Material - Light and Material Dark Themes</a> based on the time of day or - app-specific setting. - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>Day and night themes can be found here: {@code - <sdk>/extras/android/support/v7/appcompat/res/values/themes_daynight.xml} - </li> - - <li>{@code AppCompatDelegate.setDefaultNightMode()}: sets the - app’s default mode by passing one of the following constants: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>{@code MODE_NIGHT_AUTO} - </li> - - <li>{@code MODE_NIGHT_NO} - </li> - - <li>{@code MODE_NIGHT_YES} - </li> - - <li>{@code MODE_NIGHT_FOLLOW_SYSTEM} - </li> - </ul> - </li> - - <li>{@code AppCompatDelegate.setLocalNightMode()}: overrides - the night mode setting for the local app component. - </li> - - <li>{@code AppCompatDelegate.getDefaultNightMode()}: returns - the default night mode. - </li> - </ul> - </li> - </ul> - </dd> - - <dt> - Changes for <a href="features.html#v7-mediarouter">v7 mediarouter - library</a>: - </dt> - - <dd> - <ul> - <li>{@link android.support.v7.app.MediaRouteControllerDialog} now - correctly applies custom app theme colors. - </li> - </ul> - </dd> - - <dt> - Changes for <a href="features.html#design">Design support library</a>: - </dt> - - <dd> - <ul> - <li>Added support for <a href= - "https://www.google.com/design/spec/components/bottom-sheets.html">bottom - sheets</a>. An interaction plugin, {@code - BottomSheetBehavior}, allows a child view of a {@link - android.support.design.widget.CoordinatorLayout} to act as - a bottom sheet. The base class, {@code BottomSheetCallback}, provides - callbacks to monitor bottom sheet events. - </li> - </ul> - </dd> - - <dt> - Changes for the <a href="features.html#custom-tabs">CustomTabs support - library</a>: - </dt> - - <dd> - <ul> - <li> - <a href= - "https://developer.chrome.com/multidevice/android/customtabs">Chrome - Custom Tabs</a> now allows apps to include a bottom bar with action - buttons in addition to the existing top action button. - </li> - - <li>{@code CustomTabsIntent.Builder.addToolBarItem()}: adds an action - button to a custom tab. You can use this to add multiple buttons. - </li> - - <li>{@code CustomTabsSession.setToolBarItem()}: updates the visuals - for toolbar items. This method will only succeed if it is given a - valid id and the browser session is in the foreground. - </li> - </ul> - </dd> - - <dt> - Added VectorDrawable support library: - </dt> - - <dd> - <ul> - <li>Added Classes: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>{@code VectorDrawableCompat} - </li> - - <li>{@code AnimatedVectorDrawableCompat} - </li> - </ul> - </li> - - <li>Adds support for {@link - android.graphics.drawable.VectorDrawable} assets to apps - running on API level 7 or higher. {@link - android.graphics.drawable.AnimatedVectorDrawable} assets - are also supported on API level 11 or higher. Vector assets can be - considerably smaller than image assets and should help reduce app - size by reducing the amount of assets required to support multiple - device screens. - </li> - - <li>This library is now a dependency of the <a href= - "features.html#v7-appcompat">v7 AppCompat library</a>, allowing - developers and <a href="features.html#v7-appcompat">AppCompat </a> - to easily use vector drawables. To use {@code - VectorDrawableCompat} within an {@link android.widget.ImageButton} or - {@link android.widget.ImageView}, use the {@code app:srcCompat} XML - attribute or {@code setImageResource()} - method. - </li> - - <li>To keep referencing attribute IDs on API level 20 or - lower, add the following {@code appt} flag to your {@code - build,gradle} file: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>If you are building with Android Plugin for Gradle 1.5.0 or - lower, add the following to your {@code build.gradle} file: - </li> - - <li style="list-style: none; display: inline"> - <pre> -android { - defaultConfig { - // Stops the Gradle’s automatic rasterization of vectors - generatedDensities = [] - } - // Flag that tells aapt to keep the attribute ids - aaptOptions { - additionalParameters "--no-version-vectors" - } -} -</pre> - </li> - - <li>If you are building with Android Plugin for Gradle 2.0.0 or - higher, add the following to your {@code build.gradle} file: - </li> - - <li style="list-style: none; display: inline"> - <pre> -android { - defaultConfig { - vectorDrawables.useSupportLibrary = true - } -} -</pre> - </li> - </ul> - </li> - </ul> - </dd> - - <dt> - Changes for <a href="features.html#v17-leanback">v17 Leanback - Library</a>: - </dt> - - <dd> - <ul> - <li>Added new capabilities to {@link android.support.v17.leanback.app.GuidedStepFragment}, - which is a component that guides users through a decision or series of decisions: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>Added button actions to {@link - android.support.v17.leanback.widget.GuidedAction}: - </li> - - <ul> - <li>{@code GuidedStepFragment.setButtonActions()}: sets a list of - {@link android.support.v17.leanback.widget.GuidedAction} buttons that - the user may select from the Actions view. - </li> - </ul> - </li> - - <li>Description fields are now editable: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>{@code GuidedAction.Builder.descriptionEditable()}: when passing - {@code true}, sets the action’s description to be editable. - </li> - - <li>{@code GuidedAction.getEditDescription()}: returns the editable - description as a {@code CharSequence}. - </li> - </ul> - </li> - - <li>Added drop-down lists of sub-actions: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>{@code GuidedAction.setSubActions()}: sets a {@link - android.support.v17.leanback.widget.GuidedAction} list as a drop-down - menu of sub-actions. - </li> - </ul> - </li> - </ul> - - <li>Added the {@code GuidedDatePickerAction} widget for {@link - android.widget.DatePicker} functionality: - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>The date is selected using year, month, and day columns and has a - customizable range. - </li> - - <li>{@code GuidedDatePickerAction.Builder}: builder class for the {@code - GuidedDatePickerAction} object. - </li> - - <li>{@code GuidedDatePickerAction.Builder.datePickerFormat(String - datePickerFormat)}: set the desired date format by passing the - appropriate three-character {@code String}, e.g. {@code “YMD”} or {@code - “MDY”}. Alternatively, use the {@code datePickerFormat} XML attribute. - </li> - </ul> - </li> - </ul> - </dd> - </dl> - - <dl> - <dt> - Changes for <a href="features.html#v7-recyclerview">v7 RecyclerView - library</a>: - </dt> - - <dd> - <ul> - <li>{@link android.support.v7.widget.RecyclerView} now has an opt-in - feature called <em>AutoMeasure</em> which allows {@link - android.support.v7.widget.RecyclerView.LayoutManager} to easily wrap - content or handle various measurement specifications provided by the - parent of the {@link android.support.v7.widget.RecyclerView}. It - supports all existing animation capabilities of the {@link - android.support.v7.widget.RecyclerView}. - </li> - - <li style="list-style: none; display: inline"> - <ul> - <li>If you have a custom {@link - android.support.v7.widget.RecyclerView.LayoutManager}, - call {@code setAutoMeasureEnabled(true)} to start using the new - AutoMeasure API. All built-in {@link - android.support.v7.widget.RecyclerView.LayoutManager} objects - enable auto-measure by default. - </li> - - <li>{@link android.support.v7.widget.RecyclerView.LayoutManager} - no longer ignores some {@link - android.support.v7.widget.RecyclerView.LayoutParams} settings, - such as {@code MATCH_PARENT} in the scroll direction. - <p class="note"> - <strong>Note:</strong> These lifted restrictions may cause - unexpected behavior in your layouts. Make sure you specify - the correct layout parameters. - </p> - </li> - </ul> - </li> - - <li>When updating a {@link - android.support.v7.widget.RecyclerView.ViewHolder} with payload - information, {@link android.support.v7.widget.DefaultItemAnimator} - now disables change animations. - </li> - - <li>You can now modify the {@link - android.support.v7.widget.helper.ItemTouchHelper} escape velocity to - control swipe sensitivity. To make it easier or harder to swipe, - override {@code getSwipeEscapeVelocity(float defaultValue)} and modify {@code defaultValue}. - </li> - </ul> - </dd> - </dl> - </div> -</div> -<!-- end of collapsible section: 23.2.0 --> - -<div class="toggle-content closed"> - <p id="rev23-1-1"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 23.1.1</a> <em>(November 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library:</a></dt> - <dd> - <ul> - <li>Fixed a crash that occurs when you perform a swipe-to-dismiss action that the - {@code ItemTouchHelper} utility class provides, and then add an item. - (<a href="http://b.android.com/190500">Issue 190500</a>)</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v7-preference">v7 preference library:</a></dt> - <dd> - <ul> - <li>Fixed an issue with ProGuard usage. - (<a href="http://b.android.com/183261">Issue 183261</a>)</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v17-leanback">v17 Leanback Support library:</a></dt> - <dd> - <ul> - <li>Fixed a number of internal issues in this library.</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> - <dd> - <ul> - <li>Added the <code>getHeaderView</code> method to the <code>NavigationView</code> class.</li> - <li>Fixed a transparent background issue for a <code>FloatingActionButton</code> object on - devices running Android 4.0 (API level 15) and lower. - (<a href="http://b.android.com/183315">Issue 183315</a>)</li> - </ul> - </dd> - </dl> - - </div> -</div> <!-- end of collapsible section --> - - - -<div class="toggle-content closed"> - <p id="rev23-1-0"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 23.1.0</a> <em>(October 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v4">v4 Support library:</a></dt> - <dd> - <ul> - <li>Added <code>OnScrollChangedListener</code> interface support to the - <code>NestedScrollView</code> widget. It - allows you to receive callbacks when the scroll X or Y positions change.</li> - <li>Added a <code>MediaButtonReceiver</code> class to forward received playback controls - to a service that’s managing the <code>MediaSessionCompat</code> class. The - <code>MediaSessionCompat</code> class has a - constructor that can automatically find a media button receiver in the manifest. A - media button receiver is a key part to <a href= - "http://developer.android.com/training/managing-audio/volume-playback.html#PlaybackControls">handling - playback controls</a> from hardware or bluetooth controls.</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library:</a></dt> - <dd> - <ul> - <li>Added material design <code>Seekbar</code> and <code>ImageButton</code> widgets.</li> - <li>Updated the <code>ImageView</code> widget to support the tint feature.</li> - <li>Updated the look-and-feel of the <code>SwitchCompat</code> widget.</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v7-mediarouter">v7 mediarouter library:</a></dt> - <dd> - <ul> - <li>Added the following features to the <code>MediaRouteChooserDialog</code> class:</li> - <ul> - <li>Displays a loading page while discovering media route providers.</li> - <li>Includes a device type icon for easier device identification.</li> - <li>Sorts the routes according to frequency of use in the current app.</li> - <li>Supports landscape mode.</li> - </ul> - </ul> - <ul> - <li>Added the following features to the <code>MediaRouteControllerDialog</code> class:</li> - <ul> - <li>Recognizes screen casting and provides a proper description.</li> - <li>Supports various album art sizes and aspect ratios, and loads the art asynchronously.</li> - <li>Automatically selects the content color based on the primary color of the app.</li> - <li>Adjusts the dialog layout based on available screen space on the device.</li> - <li>Supports landscape mode.</li> - </ul> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v7-palette">v7 palette library:</a></dt> - <dd> - <ul> - <li>Added the <code>setRegion()</code> method to support extracting color from a specific - region of a <code>Bitmap</code> object.</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library:</a></dt> - <dd> - <ul> - <li>Added an improved animation API to the <code>ItemAnimator</code> class for better - customizations:</li> - <ul> - <li>Change animations no longer enforce two copies of the <code>ViewHolder</code> object, - which enables item content animations. Also, the <code>ItemAnimator</code> object - decides whether it wants to reuse the same <code>ViewHolder</code> object or create a - new one.</li> - <li>The new information record API gives the <code>ItemAnimator</code> class the flexibility - to collect data at the correct point in the layout lifecycle. This information is later - passed into the animate callbacks.</li> - </ul> - </ul> - <ul> - <li>Provided an easy transition plan for this backward-incompatible API change:</li> - <ul> - <li>If you’ve previously extended the <code>ItemAnimator</code> class, you can change - your base class to <code>SimpleItemAnimator</code> and your code should work as before. - The <code>SimpleItemAnimator</code> class provides the old API by wrapping the new API.</li> - <li>Some methods were removed from the <code>ItemAnimator</code> class. The following - code will no longer compile:</li> - <pre>recyclerView.getItemAnimator().setSupportsChangeAnimations(false)</pre> - <p>You can replace it with:</p> - <pre> -ItemAnimator animator = recyclerView.getItemAnimator(); -if (animator instanceof SimpleItemAnimator) { - ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false); -} - </pre> - </ul> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-preference">v7</a>, - <a href="features.html#v14-preference">v14</a>, and - <a href="features.html#v17-preference">v17</a> Preference Support library:</dt> - <dd> - <ul> - <li>Removed APIs for controlling <code>EditText</code> dialogs.</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v17-leanback">v17 Leanback Support library:</a></dt> - <dd> - <ul> - <li>Added a version of the <code>GuidedStepFragment</code> class for the Support library - (extends <code>android.support.v4.app.Fragment</code>), and improved animations and - transitions.</li> - <li>Updated the <code>GuidedStepFragment</code> class so it can be placed on top of - existing content.</li> - <li>Added the ability to annotate different types of search completions to the - <code>SearchFragment</code> class.</li> - <li>Added staggered slide transition support to the <code>VerticalGridFragment</code> - class.</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> - <dd> - <ul> - <li>Added <a href= - "https://www.google.com/design/spec/components/text-fields.html#text-fields-character-counter"> - character counting</a> support to the <code>TextInputLayout</code> widget.</li> - <li>Added edge snapping support to the <code>AppBarLayout</code> class by adding the - <code>SCROLL_FLAG_SNAP</code> constant. When scrolling ends, if the view is only - partially visible, the view is snapped and scrolled to its closest edge.</li> - <li>Added support for custom views to the <code>NavigationView</code> class by using the - <code>app:actionLayout</code> attribute or <code>MenuItemCompat.setActionView()</code> - method.</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#custom-tabs">Custom Tabs Support library:</a></dt> - <dd> - <ul> - <li>Added the <code>enableUrlBarHiding()</code> method to the <code>CustomTabsIntent</code> - class. It lets the client customize whether the URL bar should be hidden automatically - on scroll down.</li> - <li>Added the <code>setActionButton()</code> method to the <code>CustomTabsSession</code> - class. It lets the client - change the icon for a custom action button in an already launched custom tab.</li> - <li>Added the <code>TAB_SHOWN</code> and <code>TAB_HIDDEN</code> constants as new events - for the <code>onNavigationEvent</code> method of the <code>CustomTabsCallback</code> - class.</li> - </ul> - </dd> - - </dl> - - </div> -</div> <!-- end of collapsible section --> - - -<div class="toggle-content closed"> - <p id="rev23-0-1"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 23.0.1</a> <em>(September 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v7-preference">v7</a> and - <a href="features.html#v14-preference">v14</a> Preference Support library:</dt> - <dd> - <ul> - <li>Added the material design layout and style files. - (<a href="http://b.android.com/183376">Issue 183376</a>)</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library:</a></dt> - <dd> - <ul> - <li>Fixed crash issues for the {@link android.app.Fragment} class by limiting the use of - hardware layers to Android 4.1 (API level 16) and higher. - (<a href="http://b.android.com/183896">Issue 183896</a>)</li> - <li>Fixed an issue where hardware buttons did not work when an activity had set the - {@link android.widget.Toolbar} class to act as the - {@link android.app.ActionBar} by using the <code>setSupportActionBar()</code> method. - (<a href="http://b.android.com/183334">Issue 183334</a>)</li> - <li>Updated the {@link android.support.v7.app.AppCompatDialogFragment} class so it - no longer throws the {@code Windows feature must be requested before adding content} - error. - (<a href="http://b.android.com/183186">Issue 183186</a>)</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> - <dd> - <ul> - <li>Fixed the - {@link android.support.design.widget.AppBarLayout} class so it now draws correctly after - rotation. - (<a href="http://b.android.com/183109">Issue 183109</a>)</li> - <li>Fixed the - {@link android.support.design.widget.TabLayout} class so it now behaves correctly when a - user clicks after a swipe. - (<a href="http://b.android.com/183123">Issue 183123</a>)</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#custom-tabs">Custom Tabs Support library:</a></dt> - <dd> - <ul> - <li>Lowered the - <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>minSdkVersion</code></a> - value from 16 to 15 for version support.</li> - <li>Added a way to generate a - {@link android.support.customtabs.CustomTabsSessionToken} from an intent.</li> - </ul> - </dd> - - </dl> - - </div> -</div> <!-- end of collapsible section --> - - -<div class="toggle-content closed"> - <p id="rev23"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 23</a> <em>(August 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Added new support libraries:</a></dt> - <dd> - <ul> - <li><a href="features.html#custom-tabs">Custom Tabs Support library</a></li> - <li><a href="features.html#percent">Percent Support library</a></li> - <li><a href="features.html#recommendation">App Recommendation Support library for TV</a></li> - <li><a href="features.html#v7-preference">v7 Preference Support library</a></li> - <li><a href="features.html#v14-preference">v14 Preference Support library</a></li> - <li><a href="features.html#v17-preference">v17 Preference Support library for TV</a></li> - </ul> - </dd> - - </dl> - - <p>For a complete list of the Support Library changes, see the - <a href="{@docRoot}sdk/support_api_diff/23/changes.html">Support - Library API Differences Report</a>. </p> - - </div> -</div> <!-- end of collapsible section --> - - - -<div class="toggle-content closed"> - <p id="rev22-2-1"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 22.2.1</a> <em>(July 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> - <dd> - <ul> - <li>Added the {@code hide()} and {@code show()} methods to the - {@link android.support.design.widget.FloatingActionButton} class for programmatic - triggering of animations. </li> - <li>Added the {@code LENGTH_INDEFINITE} constant to the - {@link android.support.design.widget.Snackbar} class for showing a snackbar - until it is dismissed or another snackbar is shown. Also, added the - {@link android.support.design.widget.Snackbar#setActionTextColor(int)} and - {@link android.support.design.widget.Snackbar#setActionTextColor(ColorStateList)} - methods. </li> - <li>Added the {@code getSelectedTabPosition()} method to the - {@link android.support.design.widget.TabLayout} class for retrieving the currently - selected tab. </li> - <li>Provided a fully fluent API for the - {@link android.support.v7.app.NotificationCompat.MediaStyle} class for method - chaining. </li> - <li>Added convenience methods to the - {@link android.support.v7.widget.RecyclerView} for batch insertion of items. </li> - </ul> - </dd> - </dl> - - <p>For a complete list of the Support Library changes, see the - <a href="{@docRoot}sdk/support_api_diff/22.2.0/changes.html">Support - Library API Differences Report</a>. </p> - - </div> -</div> <!-- end of collapsible section --> - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 22.2.0</a> <em>(May 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Added <a href="features.html#design">Design Support library:</a></dt> - <dd> - <ul> - <li>Added {@link android.support.design.widget.TextInputLayout} for showing - {@link android.widget.EditText} hint and error text as floating labels. - </li> - <li>Added {@link android.support.design.widget.FloatingActionButton} for implementing a - primary action on your interface as a - floating action button, supporting either default or mini sizes. - </li> - <li>Added {@link android.support.design.widget.Snackbar} for providing lightweight - feedback with an optional action in an animated snackbar. - </li> - <li>Added {@link android.support.design.widget.TabLayout} for implementing fixed and - scrollable - <a href="{@docRoot}design/building-blocks/tabs.html">tabs</a> as well as easy - integration with - {@link android.support.v4.view.ViewPager}. - </li> - <li>Added {@link android.support.design.widget.NavigationView} for implementing - <a href="{@docRoot}design/patterns/navigation-drawer.html">navigation drawer</a> - contents, including the ability to inflate menu items via a - <a href="{@docRoot}guide/topics/resources/menu-resource.html">Menu Resource</a>. - </li> - <li>Added {@link android.support.design.widget.CoordinatorLayout}, a general purpose - layout, used for building dependencies between - sibling views and allowing easy scrolling reactions between components via - {@link android.support.design.widget.CoordinatorLayout.Behavior}. Many of the Design - Library components rely on being a child of a - {@link android.support.design.widget.CoordinatorLayout}. - </li> - <li>Added {@link android.support.design.widget.AppBarLayout}, a container for a - {@link android.widget.Toolbar} - and other views (such as {@link android.support.design.widget.TabLayout}) for - reacting to scrolling events by scrolling off the screen, becoming visible in reaction - to a downward scroll, or collapsing/uncollapsing before scrolling off/onto the screen. - </li> - <li>Added {@link android.support.design.widget.CollapsingToolbarLayout} for controlling - how a {@link android.widget.Toolbar} collapses. A toolbar may collapse by: - pinning components to the top of the screen while it collapses, introducing - parallax scrolling of components such as an {@link android.widget.ImageView}, - or adding a content scrim color when the view is partially collapsed. - </li> - </ul> - </dt> - - - - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - - <li>Added the -{@link android.support.v4.view.accessibility.AccessibilityEventCompat#getContentChangeTypes getContentChangeTypes()} - and -{@link android.support.v4.view.accessibility.AccessibilityEventCompat#setContentChangeTypes setContentChangeTypes()} - methods and related change type - fields to the - {@link android.support.v4.view.accessibility.AccessibilityEventCompat} - class for accessibility event handling. - </li> - <li>Added the -{@link android.support.v4.media.session.PlaybackStateCompat#getActiveQueueItemId getActiveQueueItemId()}, -{@link android.support.v4.media.session.PlaybackStateCompat#getCustomActions getCustomActions()}, - and - {@link android.support.v4.media.session.PlaybackStateCompat#getExtras getExtras()} - methods with related state fields to the - {@link android.support.v4.media.session.PlaybackStateCompat} class for - getting custom actions from the queue. - </li> - <li>Added the -{@link android.support.v4.media.session.PlaybackStateCompat.Builder#addCustomAction addCustomAction()}, -{@link android.support.v4.media.session.PlaybackStateCompat.Builder#setActiveQueueItemId setActiveQueueItemId()}, - and - {@link android.support.v4.media.session.PlaybackStateCompat.Builder#setExtras setExtras()} - methods to the - {@link android.support.v4.media.session.PlaybackStateCompat.Builder} class for adding - custom actions to a playback state. - </li> - <li>Added the -{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#fromCustomAction fromCustomAction()} and -{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#getCustomAction getCustomAction()} methods - to the - {@link android.support.v4.media.session.PlaybackStateCompat.CustomAction} class - for getting custom actions from the queue. - </li> - <li>Added the {@link android.support.v4.view.ViewCompat#isAttachedToWindow isAttachedToWindow()}, - {@link android.support.v4.view.ViewCompat#offsetLeftAndRight offsetLeftAndRight()}, and - {@link android.support.v4.view.ViewCompat#offsetTopAndBottom offsetTopAndBottom()} - methods to the {@link android.support.v4.view.ViewCompat} class for working with views. - </li> - <li>Added the {@link android.support.v4.view.ViewPager#addOnPageChangeListener addOnPageChangeListener()}, - {@link android.support.v4.view.ViewPager#clearOnPageChangeListeners clearOnPageChangeListeners()}, and - {@link android.support.v4.view.ViewPager#removeOnPageChangeListener removeOnPageChangeListener()} - methods to the {@link android.support.v4.view.ViewPager} class for responding to page - changes. - <p>Deprecated the - {@link android.support.v4.view.ViewPager#setOnPageChangeListener setOnPageChangeListener()} method.</p> - </li> - <li>Added the -{@link android.support.v4.view.ViewParentCompat#notifySubtreeAccessibilityStateChanged notifySubtreeAccessibilityStateChanged()} method to - the {@link android.support.v4.view.ViewParentCompat} class for notifying a view parent - that the accessibility state of one of its descendants has changed. - </li> - <li>Added the {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZ translationZ()}, - {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZBy translationZBy()}, - {@link android.support.v4.view.ViewPropertyAnimatorCompat#z z()}, and - {@link android.support.v4.view.ViewPropertyAnimatorCompat#zBy zBy()} - methods to the {@link android.support.v4.view.ViewPropertyAnimatorCompat} class for - adding animation. - </li> - </ul> - </dd> - - - -<dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> - <dd> -<ul> - <li>Added the - {@link android.support.v7.app.AppCompatActivity#onWindowStartingSupportActionMode onWindowStartingSupportActionMode()} - method to the - {@link android.support.v7.app.AppCompatActivity}, - {@link android.support.v7.app.AppCompatCallback}, and - {@link android.support.v7.app.AppCompatDialog} classes for handling action modes - started from the current window. - </li> - - <li>Added the -{@link android.support.v7.app.AppCompatDelegate#isHandleNativeActionModesEnabled isHandleNativeActionModesEnabled()} and -{@link android.support.v7.app.AppCompatDelegate#setHandleNativeActionModesEnabled setHandleNativeActionModesEnabled()} - methods to the - {@link android.support.v7.app.AppCompatDelegate} class for handling native action modes. - </li> - </ul> - </dd> - - <p>For a complete list of the Support Library changes, see the - <a href="{@docRoot}sdk/support_api_diff/22.2.0/changes.html">Support - Library API Differences Report</a>. </p> - - </dl> - - </div> -</div> <!-- end of collapsible section --> - - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 22.1.0</a> <em>(April 2015)</em> - </p> - - - - <div class="toggle-content-toggleme"> - <dl> - - - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#annotations">annotations library:</a></dt> - <dd> - <ul> - <li>Added the Annotations library to provide support for enhanced code inspections. - Annotations are added as metadata tags that you attach to variables, parameters, - and return values to inspect method return values, passed parameters, and local - variables and fields. - </li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - - <li>Added the {@link android.support.v4.graphics.ColorUtils ColorUtils} class - to provide a set of color-related utility methods. - </li> - <li>Added the {@link android.support.v4.graphics.drawable.DrawableCompat#unwrap unwrap()} and - {@link android.support.v4.graphics.drawable.DrawableCompat#wrap wrap()} methods to the - {@link android.support.v4.graphics.drawable.DrawableCompat} class , allowing you to use - {@link android.support.v4.graphics.drawable.DrawableCompat#setTint setTint()}, - {@link android.support.v4.graphics.drawable.DrawableCompat#setTintList setTintList()}, - and {@link android.support.v4.graphics.drawable.DrawableCompat#setTintMode setTintMode()} - on all API level 4 or higher devices. - </li> - <li>Added the {@link android.support.v4.os.TraceCompat} class to - write trace events to the system trace buffer, which can then be collected and - visualized using the <a href="{@docRoot}tools/help/systrace.html">Systrace</a> tool. - </li> - <li>Added the {@link android.support.v4.util.CircularIntArray} class - to create circular integer array data structures. - </li> - <li>Added the {@link android.support.v4.util.CircularArray#clear clear()}, - {@link android.support.v4.util.CircularArray#removeFromStart removeFromStart()}, - and {@link android.support.v4.util.CircularArray#removeFromEnd removeFromEnd()} - methods to the {@link android.support.v4.util.CircularArray} class. Also, changed the - existing methods in this class to be non-final. - </li> - <li>Added the {@link android.support.v4.view.InputDeviceCompat} - as a helper class to access data in the - {@link android.support.v4.view.InputDeviceCompat} class. - </li> - <li>Added the {@link android.support.v4.view.LayoutInflaterCompat} - class as a helper class to access data in the - {@link android.support.v4.view.LayoutInflaterCompat} class - and added the {@link android.support.v4.view.LayoutInflaterFactory} interface. - </li> - <li>Added classes, methods, and interfaces to support nested scrolling. - <ul> - <li>Added the {@link android.support.v4.view.NestedScrollingChildHelper} - and {@link android.support.v4.view.NestedScrollingParentHelper} - helper classes for implementing nested scrolling parent and child views.</li> - <li>Added the {@link android.support.v4.view.NestedScrollingChild} - interface to be implemented by {@link android.view.View} subclasses.</li> - <li>Added the {@link android.support.v4.view.NestedScrollingParent} - and {@link android.support.v4.view.ScrollingView} interfaces to support - scrolling operations and provide scroll related APIs.</li> - <li>Added the - {@link android.support.v4.view.ViewGroupCompat#getNestedScrollAxes - getNestedScrollAxes()} method to the {@link android.support.v4.view.ViewGroupCompat} - class.</li> - <li>Added methods to the {@link android.support.v4.view.ViewParentCompat} class to - support nested scrolling. - </li> - <li>Added the {@link android.support.v4.widget.NestedScrollView} - class to support nested scrolling parent and child on both new and old versions of - Android. - </li> - </ul> - </li> - <li>Added methods and constants to the {@link android.support.v4.view.MotionEventCompat} - class for getting axis values and event source. - </li> - <li>Updated the {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} - class to add methods for errors, content invalidation and labels. - </li> - <li>Added the following interpolation classes for animation: - {@link android.support.v4.view.animation.FastOutLinearInInterpolator}, - {@link android.support.v4.view.animation.FastOutSlowInInterpolator}, - {@link android.support.v4.view.animation.LinearOutSlowInInterpolator}, - {@link android.support.v4.view.animation.LinearOutSlowInInterpolator}, and - {@link android.support.v4.view.animation.PathInterpolatorCompat}. - </li> - <li>Added the {@link android.support.v4.widget.Space} class to create gaps between - components in general purpose layouts. This class is deprecated in the gridlayout library. - </li> - <li>Added the {@link android.support.v4.widget.TextViewCompat} class for accessing - features in a {@link android.widget.TextView}. - </li> - <li>Added a displacement parameter to the - {@link android.support.v4.widget.EdgeEffectCompat#onPull onPull()} method in the - {@link android.support.v4.widget.EdgeEffectCompat} class. - </li> - - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> - <dd> - <ul> - <li>Added tint support to appcompat widgets, including - {@link android.support.v7.widget.AppCompatAutoCompleteTextView}, - {@link android.support.v7.widget.AppCompatButton}, - {@link android.support.v7.widget.AppCompatCheckBox}, - {@link android.support.v7.widget.AppCompatCheckedTextView}, - {@link android.support.v7.widget.AppCompatEditText}, - {@link android.support.v7.widget.AppCompatMultiAutoCompleteTextView}, - {@link android.support.v7.widget.AppCompatRadioButton}, - {@link android.support.v7.widget.AppCompatRatingBar}, - {@link android.support.v7.widget.AppCompatSpinner}, and - {@link android.support.v7.widget.AppCompatTextView}. - </li> - <li>Updated the {@link android.support.v7.app.AppCompatActivity} as the base - class for activities that use the support library action bar features. This class - replaces the deprecated {@link android.support.v7.app.ActionBarActivity}. - </li> - <li>Added the - {@link android.support.v7.app.AppCompatCallback} interface - to be implemented for AppCompat to be able to perform callbacks. - </li> - <li>Added the - {@link android.support.v7.app.AppCompatDelegate} abstract class - as a delegate you can use to extend AppCompat's support to any activity. - </li> - <li>Added the - {@link android.support.v7.app.AppCompatDialog} class - as the base class for AppCompat themed dialogs. - </li> - <li>Added the spinner style - {@link android.support.v7.app.AlertDialog} and - {@link android.support.v7.app.AlertDialog.Builder} classes to provide an AppCompat - themed {@link android.app.AlertDialog}. - </li> - <li>Added the {@link android.support.v7.graphics.Palette.Builder} class - for generating {@link android.support.v7.graphics.Palette} instances. - <ul> - <li>Added the - {@link android.support.v7.graphics.Palette#from} - method to the {@link android.support.v7.graphics.Palette} class to - start generating a Palette with the returned - {@link android.support.v7.graphics.Palette.Builder} instance. - </li> - <li>Deprecated the {@link android.support.v7.graphics.Palette#generate generate()} and - {@link android.support.v7.graphics.Palette#generateAsync generateAsync()} methods. - </li> - </ul> - </li> - - <li>Added the - {@link android.support.v7.widget.GridLayout.Spec#getAbsoluteAlignment - getAbsoluteAlignment()} method to the {@link android.support.v7.widget.GridLayout.Spec} - class. - </li> - <li>Deprecated use of <code>app:theme</code> for styling - {@link android.support.v7.widget.Toolbar}. You can now use - <code>android:theme</code> for toolbars on all API level 7 and higher devices and - <code>android:theme</code> support for all widgets on API level 11 and higher devices. - </li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> - <dd> - <ul> - <li> Added {@link android.support.v17.leanback.app.GuidedStepFragment}, - {@link android.support.v17.leanback.widget.GuidanceStylist} and - {@link android.support.v17.leanback.widget.GuidedActionsStylist} to support - creating multi-step decision flows. - </li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library</a>:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.util.SortedList} classes to display items in - a list order and provide notification of changes to the list. - </li> - <li>Added the {@link android.support.v7.widget.util.SortedListAdapterCallback} class - that can bind a sorted list to a - {@link android.support.v7.widget.RecyclerView.Adapter} class. - </li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v8.renderscript.ScriptIntrinsicHistogram} class for - use as a histogram filter.</li> - <li>Added the {@link android.support.v8.renderscript.ScriptIntrinsicResize} class for - performing a resize of a 2D allocation. - </li> - </ul> - </dd> - - </dl> - - - </div> -</div> <!-- end of collapsible section --> - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 22</a> <em>(March 2015)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - <li>Updated the {@link android.support.v4.content.res.ResourcesCompat#getDrawable - getDrawable()} method to return a drawable object for a specified specific resource ID, - screen density, and theme. - </li> - <li>Added the {@link android.support.v4.view.ViewCompat#setImportantForAccessibility - setImportantForAccessibility()} method so you can indicate if a view should trigger - accessibility events. - </li> - <li>Added the {@link android.support.v4.widget.DrawerLayout#getStatusBarBackgroundDrawable - getStatusBarBackgroundDrawable()} method so you can get the status bar background - drawable. - </li> - <li>Added methods to the - {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation} - class so Android Auto messaging apps can retrieve additional notification data. - </li> - <li>Added the {@link android.support.v4.widget.SwipeRefreshLayout#getProgressCircleDiameter - getProgressCircleDiameter()} method to return the diameter of a circle layout. - </li> - <li>Changed the default {@link android.support.v4.widget.DrawerLayout DrawerLayout} - status bar color to {@link android.R.attr#colorPrimaryDark}. - </li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> - <dd> - <ul> - <li>Added the spinner style - {@link android.support.v7.appcompat.R.style#Base_Widget_AppCompat_Spinner_Underlined}.</li> - <li>Added tinted widgets styles with - {@link android.support.v7.appcompat.R.style#Widget_AppCompat_AutoCompleteTextView}, - {@link android.widget.MultiAutoCompleteTextView}, - {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Button}, and - {@link android.support.v7.appcompat.R.style#Base_Widget_AppCompat_RatingBar}.</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v17.leanback.widget.ListRowPresenter#getRecycledPoolSize - getRecycledPoolSize()} and - {@link android.support.v17.leanback.widget.ListRowPresenter#setRecycledPoolSize - setRecycledPoolSize()} methods to allow customized recycled pool sizes.</li> - <li>Added the {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} attribute to the - layout width setting to support wrapped content for title icons.</li> - <li>Defined {@link android.support.v17.leanback.R.transition} in XML to - improve transition updates. </li> - <li>Enabled support for right to left layouts.</li> - <li>Added the play and pause media key events support to the - {@link android.support.v17.leanback.app.PlaybackOverlayFragment} class.</li> - <li>Added enter and return transitions to the - {@link android.support.v17.leanback.app.BrowseFragment} class and the - {@link android.support.v17.leanback.app.DetailsFragment} class.</li> - <li>Added the {@link android.support.v17.leanback.widget.ArrayObjectAdapter#replace - replace()} method to replace items in an object’s adapter array. </li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-mediarouter">v7 mediarouter library</a>:</dt> - <dd> - <ul> - <li>Updated Google Cast icons to use the - <a href="{@docRoot}training/material/index.html">material design</a> style.</li> - <li>Updated all the icons used in the {@link android.media.MediaRouter} dialogs to use the - <a href="{@docRoot}training/material/index.html">material design</a> style.</li> - </ul> - </dd> - - - <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v7.widget.RecyclerView.ViewHolder#getLayoutPosition - getlayoutPosition()} - and {@link android.support.v7.widget.RecyclerView.ViewHolder#getAdapterPosition - getadapterPosition()} methods to the {@link android.support.v7.widget.RecyclerView} - class.</li> - <li>Deprecated the <code>classgetChildPosition()</code> and - <code>findViewHolderForPosition()</code> methods in the - {@link android.support.v7.widget.RecyclerView} class. </li> - <li>Deprecated the <code>getPosition()</code> method in the - {@link android.support.v7.widget.RecyclerView.ViewHolder} class. </li> - <li>Deprecated the <code>getViewPosition()</code> method in the - {@link android.support.v7.widget.RecyclerView.LayoutParams} class. </li> - </ul> - </dd> - - </div> -</div> - - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 21.0.3</a> <em>(December 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - <li>Added several {@link android.support.v4.app.NotificationCompat.WearableExtender} - methods to improve the display of barcodes in notifications on wearable devices. - <ul> - <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#getHintScreenTimeout getHintScreenTimeout()}</li> - <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#setHintScreenTimeout setHintScreenTimeout()}</li> - <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#getHintAvoidBackgroundClipping getHintAvoidBackgroundClipping()}</li> - <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#setHintAvoidBackgroundClipping setHintAvoidBackgroundClipping()}</li> - </ul> - </li> - </ul> - </dd> - - </div> -</div> - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 21.0.2</a> <em>(November 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - <li>Added {@link android.support.v4.app.NotificationCompat.CarExtender} - class to support Android Auto extensions to notifications.</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v7.widget.PopupMenu} constructor to support new popup - menus.</li> - <li>Added support for a Collapse icon description in the {@link android.support.v7.widget.Toolbar} - class.</li> - <li>Updated the {@link android.support.v7.widget.SearchView} widget to support displaying - the {@link android.support.v7.appcompat.R.attr#commitIcon}. </li> - <li>Removed the <code>buttonGravity</code> attribute from the - {@link android.support.v7.widget.Toolbar} class. </li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v7-cardview">v7 cardview library</a>:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.widget.CardView#setCardBackgroundColor} API to - support changing the background color of the {@link android.support.v7.widget.CardView}.</li> - <li>Changed the {@link android.support.v7.widget.CardView} to more accurately report its - opacity value as {@link android.graphics.PixelFormat#TRANSLUCENT}.</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview - library</a>:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.widget.RecyclerView#TOUCH_SLOP_DEFAULT} and - {@link android.support.v7.widget.RecyclerView#TOUCH_SLOP_PAGING} constants - to the {@link android.support.v7.widget.RecyclerView} class - to support touch slop configurations for paging.</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> - <dd> - <ul> - <li>Added support to generate v4 code fragments. </li> - <li>Changed the secondary text color on {@link android.support.v7.widget.CardView}. </li> - </ul> - </dd> - </dl> - </div> -</div> - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 21.0.1</a> <em>(November 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Added <a href="{@docRoot}tools/support-library/features.html#multidex"> - multidex support library</a> to support multiple - <a href="https://source.android.com/devices/tech/dalvik/">Dalvik</a> Executable (DEX) files - for multi-dex file support prior to Android 5.0. - </dt> - </dl> - </div> -</div> - - - - -<div class="toggle-content closed"> - <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 21</a> <em>(October 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> - <dd> - <ul> - <li>Added support for {@link android.support.v4.app.Fragment} - transitions for devices running Android 5.0 (API level 21). - Be aware that transitions have no effect on devices running - Android 4.4 and lower. - </li> - <li>Added {@link android.support.v4.provider.DocumentFile} to ease - the transition from {@link java.io.File} - while working with document trees. However, this class demands - more processing overhead compared to the platform's - {@link android.provider.DocumentsContract} API added in - Android 4.4 (API level 19). So you should switch to using {@link - android.provider.DocumentsContract} when running on Android 4.4 - and higher.</li> - </ul> - </dd> - <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat - library</a>:</dt> - <dd> - <ul> - <li>Added support for <a href="{@docRoot}design/material/">material - design</a> user interfaces.</li> - <li>Added {@link android.support.v7.widget.Toolbar}, which generalizes - the functionality of {@link android.support.v7.app.ActionBar} for - use within app layouts.</li> - <li>Updated {@link android.support.v7.app.ActionBarDrawerToggle}, - which contains the menu-to-arrow animation</li> - <li>Updated common user interface widgets to allow tinting via theme - attributes when running on pre-Android 5.0 devices</li> - <li>Added {@link android.support.v7.widget.SwitchCompat}, a backport - of the {@link android.widget.Switch} widget that was added in - Android 4.0 (API level 14).</li> - </ul> - </dd> - <dt>New <a href="features.html#v7-cardview">v7 cardview library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v7.widget.CardView} widget, which - provides a material design-compatible implementation for displaying - data items.</li> - </ul> - </dd> - <dt>New <a href="features.html#v7-recyclerview">v7 recyclerview - library</a>:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v7.widget.RecyclerView} widget, - which provides a flexible list view for providing a limited window - into a large data set.</li> - </ul> - </dd> - <dt>New <a href="features.html#v7-palette">v7 palette library</a>:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.graphics.Palette} class, - which lets you extract prominent colors from an image.</li> - </ul> - </dd> - <dt>New <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> - <dd> - <ul> - <li>Added support for building TV user interfaces, including - {@link android.support.v17.leanback.app.BrowseFragment}, - {@link android.support.v17.leanback.app.DetailsFragment}, and - {@link android.support.v17.leanback.app.PlaybackOverlayFragment}. - For more information about using these user interface widgets, - see <a href="{@docRoot}training/tv/playback/index.html">Building TV - Playback Apps</a>.</li> - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 20</a> <em>(July 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added extended notification support for Android Wear in - {@link android.support.v4.app.NotificationCompat.WearableExtender}, which allows you - to specify wearable-specific features in your notifications.</li> - <li>Added {@link android.support.v4.app.NotificationCompat.Action.WearableExtender}, - which allows actions to be added on wearable notifications.</li> - <li>Added {@link android.support.v4.app.NotificationManagerCompat}, which allows you - to issue notifications that properly support wearable features.</li> - <li>Added {@link android.support.v4.app.RemoteInput}, which allows a handheld device - to receive voice input from a notification that appears on a wearable device.</li> - <li>Improved the handling of touch feedback in - {@link android.support.v4.widget.SwipeRefreshLayout}.</li> - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 19.1.0</a> <em>(March 2014)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added the {@link android.support.v4.widget.SwipeRefreshLayout} class, - which enables users to refresh the contents of a view with a vertical - swipe gesture.</li> - <li>Fixed accessibility issues with navigation drawers.</li> - </ul> - </dd> - - <dt>Changes for v7 appcompat library:</dt> - <dd> - <ul> - <li>Fixed background issues with the action bar.</li> - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 19.0.1</a> <em>(December 2013)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Improved {@link android.support.v4.print.PrintHelper} by adding asynchronous - handling of printing.</li> - <li>Fixed the {@link android.support.v4.widget.DrawerLayout} class approximation of - the {@link android.view.View#addChildrenForAccessibility addChildrenForAccessibility()} - method.</li> - <li>Fixed slide drawable mirroring in {@link - android.support.v4.app.ActionBarDrawerToggle}.</li> - <li>Fixed off-by-one issue when removing an item from a collection iterator.</li> - </ul> - </dd> - - <dt>Changes for v7 mediarouter library:</dt> - <dd> - <ul> - <li>Improved route identification by using full component name in the {@link - android.support.v7.media.MediaRouteProvider.ProviderMetadata}.</li> - <li>Updated {@link android.support.v7.app.MediaRouteChooserDialog} to hide disabled - routes.</li> - </ul> - </dd> - - <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a></dt> - <dd> - <ul> - <li>Added error propagation for the RenderScript thunking layer.</li> - </ul> - </dd> - - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 19</a> <em>(October 2013)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added support for external Storage APIs with the - {@link android.support.v4.content.ContextCompat#getObbDirs getObbDirs()}, - {@link android.support.v4.content.ContextCompat#getExternalFilesDirs getExternalFilesDirs()}, - {@link android.support.v4.content.ContextCompat#getExternalCacheDirs getExternalCacheDirs()}, - and {@link android.support.v4.os.EnvironmentCompat#getStorageState getStorageState()}. - These helper methods always return a single file object on devices running Android - 4.3 (API level 18) and earlier. When running on Android 4.4 (API level 19) and higher, - these methods may return more than one file object.</li> - <li>Added {@link android.support.v4.print.PrintHelper} class that works with the - Print APIs to print images with a minimum of code.</li> - <li>Added drag-to-open user interface support for pop-up menus. For more information, see - {@link android.support.v4.widget.PopupMenuCompat} and - {@link android.support.v4.widget.ListPopupWindowCompat}.</li> - <li>Improved accessibility support with the addition of a - {@link android.support.v4.view.accessibility.AccessibilityNodeProviderCompat#findFocus - findFocus()} method in - {@link android.support.v4.view.accessibility.AccessibilityNodeProviderCompat} and the - {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat#getLiveRegion - getLiveRegion()} method in - {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat}.</li> - <li>Added helper class {@link android.support.v4.view.ScaleGestureDetectorCompat} for - accessing new scaling gesture methods.</li> - <li>Fixed problem with {@link android.support.v4.app.ActionBarDrawerToggle} in - right-to-left language displays.</li> - <li>Modified {@link android.support.v4.widget.AutoScrollHelper} option to consume - touch events or allow them to be passed through to other views.</li> - </ul> - </dd> - - <dt>Changes for v7 mediarouter library:</dt> - <dd> - <ul> - <li>Added support for media playback queuing, setting HTTP header values and media - playback duration.</li> - <li>Added explicit start, get, and end session actions for explicitly managing media - playback sessions with media router.</li> - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 18</a> <em>(July 2013)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>User interface - <ul> - <li>Added {@link android.support.v4.text.BidiFormatter} for handling - text strings that combine right to left and left to right-formatted text.</li> - <li>Modified {@link android.support.v4.view.ViewPager} to better handle cases where the - pager has a measured width of zero in the initial layout processing.</li> - <li>Modified {@link android.support.v4.widget.DrawerLayout} and - {@link android.support.v4.widget.SlidingPaneLayout} to not throw exceptions for - measurement while the project code is being edited.</li> - </ul> - </li> - - <li>Accessibility - <ul> - <li>Added {@link android.support.v4.widget.ExploreByTouchHelper} to simplify the - implementation of accessibility for custom views.</li> - <li>Fixed a problem with {@link android.support.v4.view.ViewPager} incorrectly - populating {@link - android.support.v4.view.accessibility.AccessibilityEventCompat#TYPE_VIEW_SCROLLED - TYPE_VIEW_SCROLLED} accessibility events.</li> - <li>Fixed a null pointer exception in {@link android.support.v4.view.ViewPager} when - populating an accessibility event.</li> - <li>Simplified {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} - by changing {@link java.lang.CharSequence} inputs to {@link java.lang.String} objects. - </li> - <li>Deprecated an {@link android.support.v4.view.accessibility.AccessibilityRecordCompat} - constructor that used an {@link java.lang.Object} as input.</li> - </ul> - </li> - - <li>Media - <ul> - <li>Added {@link android.support.v4.media.TransportMediator} helper class to manage - media transport control, such as play, pause, skip and other media actions.</li> - <li>Added {@link android.support.v4.hardware.display.DisplayManagerCompat} for managing - display output to one or more device displays.</li> - </ul> - </li> - - <li>Other changes - <ul> - <li>Added {@link android.support.v4.content.WakefulBroadcastReceiver} helper class for - implementing a common pattern of detecting a device wakeup event and passing work off - to a {@link android.app.Service} while ensuring that the device does not go back to - sleep before the handoff is complete.</li> - <li>Added two new APIs, - {@link android.support.v4.content.AsyncTaskLoader#commitContentChanged - commitContentChanged()} and - {@link android.support.v4.content.AsyncTaskLoader#rollbackContentChanged - rollbackContentChanged()}, to {@link android.support.v4.content.AsyncTaskLoader} to - help deal with background updates for data changes that are subsequently canceled. - </li> - </ul> - </li> - </ul> - </dd> - - <dt>New v7 appcompat library:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.app.ActionBar} to allow implementation of the - action bar user interface <a href="{@docRoot}design/patterns/actionbar.html">design - pattern</a> back to Android 2.1 (API level 7) and higher. Use of this class requires - that you implement your activity by extending the new - {@link android.support.v7.app.ActionBarActivity} class.</li> - </ul> - </dd> - - <dt>New v7 mediarouter library:</dt> - <dd> - <p>Added a new mediarouter library that provides support for the <a - href="https://developers.google.com/cast/">Google Cast developer preview</a>. - The v7 mediarouter library APIs provide a means of controlling the routing of - media channels and streams from the current device to external screens, - speakers, and other destination devices, with compatibility back to Android 2.1 - (API level 7). See <a - href="{@docRoot}tools/support-library/features.html#v7-mediarouter">V7 - mediarouter library</a> for more information. </p> - - <p class="caution">The v7 mediarouter library APIs introduced in Support - Library r18 are subject to change in later revisions of the Support - Library. At this time, we recommend using the library only in connection - with the <a href="https://developers.google.com/cast/">Google Cast - developer preview</a>.</p> - </dd> - - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 13</a> <em>(May 2013)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added {@link android.support.v4.widget.DrawerLayout} for creating a - <a href="{@docRoot}training/implementing-navigation/nav-drawer.html">Navigation - Drawer</a> that can be pulled in from the edge of a window.</li> - <li>Added {@link android.support.v4.widget.SlidingPaneLayout} widget for creating linked - summary and detail views that appropriately adapt to various screen sizes.</li> - <li>Added {@link android.support.v4.app.ActionBarDrawerToggle} as a way to tie - together the functions of {@link android.support.v4.widget.DrawerLayout} and {@link - android.app.ActionBar}.</li> - <li>Added {@link android.support.v4.widget.ViewDragHelper} as a new common component - for dragging views within a parent view.</li> - <li>Added {@link android.support.v4.widget.ScrollerCompat} to provide {@link - android.widget.Scroller} and {@link android.widget.OverScroller} compatibility support. - </li> - <li>Added {@link android.support.v4.content.FileProvider} to allow sharing of private - files between applications.</li> - <li>Updated {@link android.support.v4.view.ViewPager} to throw an exception if the - associated {@link android.support.v4.view.PagerAdapter} class is modified without a - call to {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged - notifyDataSetChanged()}. - </li> - <li>Fixed an issue with {@link android.support.v4.view.ViewPager} children drawing sort - order.</li> - <li>Fixed {@link android.support.v4.view.GestureDetectorCompat} to dispatch missing - {@link android.view.GestureDetector.SimpleOnGestureListener#onSingleTapConfirmed} calls - between tap timeout and long press events.</li> - </ul> - </dd> - - <dt>New v7 gridlayout library:</dt> - <dd> - <ul> - <li>Added {@link android.support.v7.widget.GridLayout} to provide support for the - {@link android.widget.GridLayout} layout object.</li> - <li>Added {@link android.support.v7.widget.Space} which can be used to create blank areas - within a {@link android.support.v7.widget.GridLayout} layout object.</li> - </ul> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 12</a> <em>(February 2013)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Improved interaction behavior for {@link android.support.v4.view.ViewPager}.</li> - <li>Fixed a bug that could cause {@link android.support.v4.view.ViewPager} to select the - wrong page.</li> - <li>Fixed use of {@link android.support.v4.view.ViewPager#removeView removeView()} method - during layout for {@link android.support.v4.view.ViewPager}.</li> - <li>Fixed issue with {@link android.support.v4.widget.SearchViewCompat} where using the - back button to dismiss does not clear the search text. This fix only applies to - host API levels 14 and higher.</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 11</a> <em>(November 2012)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>User Interface - <ul> - <li>Added support for nested {@link android.support.v4.app.Fragment} classes.</li> - <li>Added improvements to {@link android.support.v4.app.FragmentManager} debugging. - </li> - <li>Fixed problem in {@link android.support.v4.app.FragmentTabHost} where fragment - and tab interaction could result in a {@link android.widget.ListView} state loss. - </li> - <li>Fixed issue with user-visible hint in - {@link android.support.v4.app.FragmentStatePagerAdapter}.</li> - <li>Added {@link android.support.v4.view.ViewPager.PageTransformer PageTransformer} - interface to {@link android.support.v4.view.ViewPager} to allow applications to - supply a custom transition behavior for scrolling.</li> - <li>Added new features and fixes to {@link android.support.v4.app.TaskStackBuilder} - from current release.</li> - <li>Fixed {@link android.support.v4.view.PagerTitleStrip} to correctly track the - {@link android.support.v4.view.PagerAdapter} currently in use.</li> - <li>Fixed display flickering, positioning, and text clipping problems with - {@link android.support.v4.view.PagerTitleStrip}.</li> - <li>Fixed {@link android.support.v4.view.PagerTabStrip} to properly respect padding - when drawing an underline.</li> - </ul> - </li> - <li>Accessibility - <ul> - <li>Added support for new accessibility gesture and touch event types in - {@link android.support.v4.view.accessibility.AccessibilityEventCompat}.</li> - <li>Added support for new accessibility APIs in - {@link android.support.v4.view.ViewCompat}.</li> - <li>Added support for {@link android.support.v4.view.ViewCompat#performAccessibilityAction - performAccessibilityAction()} method to {@link android.support.v4.view.ViewCompat}. - </li> - </ul> - </li> - <li>Added support for gestures with {@link android.support.v4.view.GestureDetectorCompat}. - </li> - <li>Added support for performing atomic operations on files using a new - {@link android.support.v4.util.AtomicFile} class.</li> - <li>Added support for the full set of {@code make} methods in - {@link android.support.v4.content.IntentCompat}.</li> - <li>Added {@link android.support.v4.util.LruCache#trimToSize trimToSize()} method in - {@link android.support.v4.util.LruCache} utility class.</li> - <li>Updated {@link android.support.v4.net.ConnectivityManagerCompat} to get NetworkInfo - from a {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} - broadcast.</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 10</a> <em>(August 2012)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added support for notification features introduced in Android 4.1 (API level 16) with - additions to {@link android.support.v4.app.NotificationCompat}.</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 9</a> <em>(June 2012)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - - <li>User Interface Support - <ul> - <li>Added {@link android.support.v4.view.PagerTabStrip} support, providing enhanced -functionality beyond {@link android.support.v4.view.PagerTitleStrip}.</li> - <li>Fixed various bugs for {@link android.support.v4.view.PagerTitleStrip} and -{@link android.support.v4.view.PagerTabStrip}, including {@link -android.widget.TextView#setAllCaps setAllCaps} option, title alignment, -appearance improvements, minimum width constraints and touch navigation issues.</li> - <li>Added support for {@link android.support.v4.view.ViewPager} page gutters, which -helps the {@link android.support.v4.view.ViewPager} class provide paging support for content with -a large horizontal scroll range, such as a map.</li> - <li>Fixed numerous bugs for {@link android.support.v4.view.ViewPager}, including size -and data set change problems, page positioning, user interaction, scroll tracking and keyboard -navigation problems.</li> - <li>Fixed many bugs for {@link android.support.v4.app.Fragment}, including proper -handling of {@link android.support.v4.app.Fragment#onActivityResult onActivityResult()} when -the target fragment no longer exists, dispatching selection events to invisible fragments, improved -{@link android.support.v4.app.FragmentTransaction#replace FragmentTransaction.replace()} behavior -and added better state handling for fragments being moved out of view.</li> - <li>Added support for the {@link -android.support.v4.view.ViewCompat postOnAnimation()} method in {@link -android.support.v4.view.ViewCompat}.</li> - <li>Updated {@link android.support.v4.app.NavUtils} to use Android 4.1 (API level 16) -<em>Up</em> navigation functionality when available.</li> - </ul> - </li> - - <li>Accessibility - <ul> - <li>Updated accessibility support classes, including {@link -android.support.v4.view.accessibility.AccessibilityNodeInfoCompat}, to follow fixes made in Android -4.1 (API level 16).</li> - <li>Added support for accessibility scroll actions in {@link -android.support.v4.view.ViewPager}.</li> - </ul> - </li> - - <li>General improvements - <ul> - <li>Updated {@link android.support.v4.app.TaskStackBuilder} to reflect API changes in -Android 4.1 (API level 16).</li> - <li>Enhanced {@link android.support.v4.app.TaskStackBuilder} to allow it to be used -from a Service.</li> - <li>Added support for {@link android.support.v4.content.IntentCompat EXTRA_HTML_TEXT} -to {@link android.support.v4.app.ShareCompat}.</li> - <li>Updated {@link android.support.v4.app.NotificationCompat.Builder} to support the -{@link android.support.v4.app.NotificationCompat.Builder#setNumber setNumber()} method.</li> - <li>Added support in {@link android.support.v4.net.ConnectivityManagerCompat} for the -{@link android.support.v4.net.ConnectivityManagerCompat#isActiveNetworkMetered -isActiveNetworkMetered()} method.</li> - </ul> - </li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 8</a> <em>(April 2012)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Fixed intent flags for {@link android.app.PendingIntent} objects generated - by {@link android.support.v4.app.TaskStackBuilder}.</li> - <li>Removed unused attributes from the gridlayout library projects to make sure - the library can be built with API level 7 and higher.</li> - <li>Added {@code .classpath} and {@code .project} files for the gridlayout - library project.</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 7</a> <em>(March 2012)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added {@link android.support.v4.app.ShareCompat}, which provides helper classes -for sending and receiving content for social sharing applications, including new metadata for -attributing shared data to the source app. This class also provides compatible integration with the -new {@link android.widget.ShareActionProvider} in Android 4.0.</li> - <li>Added {@link android.support.v4.app.NavUtils} and {@link -android.support.v4.app.TaskStackBuilder} to provide support for implementing the -<a href="{@docRoot}design/index.html">Android Design</a> guidelines for navigation. These -additions include a way to implement the action bar's <em>Up</em> button across versions. -For an example implementation of this pattern, see the AppNavigation sample in -(<code><em><sdk></em>/samples/<em><platform></em>/AppNavigation</code>).</li> - <li>Added {@link android.support.v4.app.NotificationCompat.Builder} to provide a -compatibility implementation of Android 3.0's {@link android.app.Notification.Builder} helper class -for creating standardized system notifications.</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 6</a> <em>(December 2011)</em> - </p> - <div class="toggle-content-toggleme"> - - <p class="note"><strong>Note:</strong> Reference for support library APIs are now available with - the framework references, for example: {@link android.support.v4.app}.</p> -<dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Changes to ViewPager: - <ul> - <li>Added extra decorative view support for {@link android.support.v4.view.ViewPager}. - Decorative views may be supplied as child views of a pager in XML layout.</li> - <li>Added {@link android.support.v4.view.PagerAdapter#getPageTitle - PagerAdapter.getPageTitle()} to supply title strings for pages, which defaults to no - title for each page.</li> - <li>Added {@link android.support.v4.view.PagerTitleStrip}, a non-interactive title - strip, that can be added as a child of ViewPager. Developers can supply text - appearance and color, as well as layout sizing and gravity information.</li> - <li>Updated {@link android.support.v4.view.PagerAdapter} methods to take ViewGroup - objects, rather than View to avoid class casting in adapter implementations.</li> - <li>Updated {@link android.support.v4.view.ViewPager} to use Launcher-style - fling behavior.</li> - <li>Bug fixes for user interface interaction and test automation.</li> - </ul> - </li> - - <li>Support for Fragments: - <ul> - <li>Changed {@code setStartDeferred()} method to {@link - android.support.v4.app.Fragment#setUserVisibleHint}.</li> - <li>Added deferred start for off-screen pages to improve performance.</li> - </ul> - </li> - - <li>Support for Accessiblity APIs: - <ul> - <li>Updated {@link android.support.v4.view.AccessibilityDelegateCompat} methods - to return empty lists instead of null.</li> - <li>Added new APIs needed by the v4 samples.</li> - </ul> - </li> - - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 5</a> <em>(December 2011)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Support for Accessiblity APIs: - <ul> - <li>Added {@link android.support.v4.view.AccessibilityDelegateCompat} - to support {@link android.view.View.AccessibilityDelegate}.</li> - - <li>Added {@link android.support.v4.view.accessibility.AccessibilityEventCompat} - to support {@link android.view.accessibility.AccessibilityEvent}.</li> - - <li>Added {@link android.support.v4.view.accessibility.AccessibilityManagerCompat} - to support {@link android.view.accessibility.AccessibilityManager}.</li> - - <li>Added {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} - to support {@link android.view.accessibility.AccessibilityNodeInfo}.</li> - - <li>Added {@link android.support.v4.view.accessibility.AccessibilityRecordCompat} - to support {@link android.view.accessibility.AccessibilityRecord}.</li> - - <li>Added {@link - android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat} - to support {@link android.accessibilityservice.AccessibilityServiceInfo}.</li> - - <li>Added {@link android.support.v4.view.ViewGroupCompat} - to support accessibility features in {@link android.view.ViewGroup}. - </li> - - <li>Modified {@link android.support.v4.view.ViewCompat} - to support accessibility features in {@link android.view.View}.</li> - </ul> - </li> - - <li>Changes to ViewPager: - <ul> - <li>Added support for margins between pages. - An optional {@link android.graphics.drawable.Drawable} can be provided - to fill the margins.</li> - <li>Added support for {@link android.widget.EdgeEffect}.</li> - <li>Added support for keyboard navigation</li> - <li>Added support to control how many pages are kept to either side - of the current page.</li> - <li>Improved touch physics.</li> - <li>Bug fixes for user interface behavior.</li> - </ul> - </li> - </ul> - </dd> - </dl> - </div> -</div> - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 4</a> <em>(October 2011)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Added <code>EdgeEffectCompat</code> to - support {@link android.widget.EdgeEffect}.</li> - - <li>Added <code>LocalBroadcastManager</code> to allow applications to easily - register for and receive intents within a single application without - broadcasting them globally.</li> - - <li>Added support in <code>ViewCompat</code> to check for and set overscroll - modes for {@link android.view.View}s on Android 2.3 and later.</li> - <li>Changes to Fragment APIs: - <ul> - <li>Added new APIs to control the visibility of new menus.</li> - <li>Added custom animation APIs.</li> - <li>Added APIs in <code>FragmentActivity</code> to retain custom, - non-configuration instance data.</li> - <li>Various bug fixes.</li> - </ul> - </li> - - <li>Fixed a {@link android.content.Loader} bug that caused issues in - canceling {@link android.os.AsyncTask}s when running on Froyo and older - versions of the platform. The support - code now uses its own version of {@link android.os.AsyncTask} to keep the same - behavior on all platform versions.</li> - - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 3</a> <em>(July 2011)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 support library:</dt> - <dd> - <ul> - <li>Adds support for {@link android.app.Fragment.SavedState}</li> - <li>Adds {@code MotionEventCompat} to support newer {@link -android.view.MotionEvent} APIs</li> - <li>Adds {@code VelocityTrackerCompat} to support a newer {@link -android.view.VelocityTracker} APIs</li> - <li>Adds {@code ViewConfigurationCompat} to support a newer {@link -android.view.ViewConfiguration} APIs</li> - <li>All new APIs (available only in the support library) that allow you to create UIs -with horizontal paging, allowing users to swipe left and right between content views. Classes to -support this include: - <ul> - <li>{@code ViewPager}: A {@link android.view.ViewGroup} that manages the -layout for the child views, which the user can swipe between.</li> - <li>{@code PagerAdapter}: An adapter that populates the {@code ViewPager} with the -views that represent each page.</li> - <li>{@code FragmentPagerAdapter}: An extension of {@code PagerAdapter} for flipping -between fragments.</li> - <li>{@code FragmentStatePagerAdapter}: An extension of {@code PagerAdapter} for -flipping between fragments that uses the library's support for {@link -android.app.Fragment.SavedState}.</li> - </ul> - </li> - </ul> - </dd> - <dt>New v13 support library:</dt> - <dd> - <ul> - <li>Includes the {@code FragmentPagerAdapter} and {@code FragmentStatePagerAdapter} -to support the horizontal paging. - <p>These are exactly the same as the APIs added to the v4 support library, but rely on -other platform components in Android 3.2. Use this library instead of v4 if you're developing for -Android 3.2 and higher (all other APIs in the v4 library are already available with API level -13).</p> - </li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 2</a> <em>(May 2011)</em> - </p> - <div class="toggle-content-toggleme"> - <dl> - <dt>Changes for v4 library:</dt> - <dd> - <ul> - <li>Support for fragment animations</li> - <li>Fix {@link android.support.v4.app.Fragment#onActivityResult Fragment.onActivityResult()} - bug</li> - </ul> - </dd> - </dl> - </div> -</div> - - -<div class="toggle-content closed"> - <p><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" -/>Android Support Library, revision 1</a> <em>(March 2011)</em> - </p> - <div class="toggle-content-toggleme"> - <p>Initial release with the v4 library.</p> - </div> -</div> - diff --git a/docs/html/topic/libraries/support-library/revisions.jd b/docs/html/topic/libraries/support-library/revisions.jd new file mode 100644 index 000000000000..75257609cb30 --- /dev/null +++ b/docs/html/topic/libraries/support-library/revisions.jd @@ -0,0 +1,2797 @@ +page.title=Support Library Revision History +page.metaDescription=This page provides details about the Support Library package releases. + +@jd:body + +<p>This page provides details about the Support Library package releases.</p> + +<div class="toggle-content opened"> + <p id="rev23-4-0"> + <a href="#" onclick="return toggleContent(this)"><img src= + "{@docRoot}assets/images/styles/disclosure_up.png" class= + "toggle-content-img" alt="">Android Support Library, revision 23.4.0</a> + <em>(May 2016)</em> + </p> + + <div class="toggle-content-toggleme"> + <dl> + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v4">v4 Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed issue where fragments were added in the wrong order. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=206901">Issue + 206901</a>) + </li> + + <li>Fixed issue where app bar wasn't drawn after being scrolled + offscreen. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=178037">Issue + 178037</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 + appcompat library</a>: + </dt> + + <dd> + <ul> + <li>Added <!-- TODO: Link to method --> + <code><a href= + "{@docRoot}reference/android/support/v7/app/AppCompatDelegate.html"> + AppCompatDelegate</a>.setCompatVectorFromResourcesEnabled()</code> + method to re-enable usage of vector drawables in {@link + android.graphics.drawable.DrawableContainer} objects on devices + running Android 4.4 (API level 19) and lower. See <a href= + "https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.44uulkfal" + class="external-link">AppCompat v23.2 — Age of the vectors</a> for + more information. + </li> + + <li>Fixed an issue in API 23 with <a href= + "{@docRoot}reference/android/support/v7/app/AppCompatDelegate.html#setDefaultNightMode(int)"> + <code>AppCompatDelegate.setDefaultNightMode()</code></a> not + loading correct resources in API level 23. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=206573">Issue + 206573</a>) + </li> + + <li>Fixed issue that could cause {@link + java.lang.NullPointerException}. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=207638">Issue + 207638</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#design">Design Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed an issue where {@link + android.support.design.widget.TextInputLayout} doesn't clear error + tint after {@link + android.support.design.widget.TextInputLayout#setErrorEnabled + setErrorEnabled(false)} on API level 21 - 22 (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=202829">Issue + 202829</a>) + </li> + + <li>Fixed an issue where {@link + android.support.design.widget.FloatingActionButton} does not return + when animations are disabled. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=206416">Issue + 206416</a>) + </li> + + <li>Fixed issue in {@link android.support.design.widget.AppBarLayout} + snap functionality when used with <code>{@link + android.support.design.R.id#scroll}|{@link + android.support.design.R.id#enterAlways}|{@link + android.support.design.R.id#enterAlwaysCollapsed}|{@link + android.support.design.R.id#snap}</code> scroll flags. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=207398">Issue + 207398</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <!-- TODO: Add link -->Vector Drawable library: + </dt> + + <dd> + <ul> + <li>Fixed a bug where <!-- TODO: Javadoc link --> + <code>VectorDrawableCompat</code> does not render correctly in + {@link android.widget.TextView} on API level 23. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=206227">Issue + 206227</a>) + </li> + </ul> + </dd> + </dl> + </div> +</div> + +<!-- end of collapsible section: 23.4.0 --> + + +<div class="toggle-content closed"> + <p id="rev23-3-0"> + <a href="#" onclick="return toggleContent(this)"><img src= + "{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" + alt="">Android Support Library, revision 23.3.0</a> <em>(April + 2016)</em> + </p> + + <div class="toggle-content-toggleme"> + <dl> + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v4">v4 Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Added <code>AppLaunchChecker</code> to help track how your app + has been launched by the user in the past. + <code>hasStartedFromLauncher()</code> lets you know if the user has + launched your app from the home screen before, or if it has only + been started by other means (for example, to view specific web + URLs). + </li> + + <li>Fixed a memory leak in + <code>MediaBrowserServiceCompat.mConnections</code>. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=205220">Issue + 205220</a>) + </li> + + <li>Fixed issue where {@link android.support.v4.view.ViewPager} + does not account for page margins when flipping page. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=203816">Issue + 203816</a>) + </li> + <li>{@link android.support.v4.app.Fragment#onRequestPermissionsResult + Fragment.onRequestPermissionsResult()} is now delivered to child + fragments. + </li> + </ul> + </dd> + + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 + appcompat library</a>: + </dt> + + <dd> + <ul> + <li>Fixed an issue in {@link + android.support.v7.widget.AppCompatSpinner} that could cause + multiple popups to appear. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=205052">Issue + 205052</a>) + </li> + + <li>Fixed an issue with how borderless buttons were colored. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202967">Issue + 202967</a>) + </li> + + <li>Fixed a compatibility issue between {@link + android.support.v7.app.AppCompatDialogFragment } and {@link + android.support.v7.app.AlertDialog}. (<a class="external-link" + href="https://code.google.com/p/android/issues/detail?id=204805">Issue + 204805</a>) + </li> + + <li>Reverted changes to <code>TintResources</code> that were causing + memory and configuration issues. (<a class="external-link" + href="https://code.google.com/p/android/issues/detail?id=205236">Issue + 205236</a>)</li> + </ul> + </dd> + + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-mediarouter">v7 + mediarouter library</a>: + </dt> + + <dd> + <ul> + <li>Fixed {@link android.support.v7.app.MediaRouteControllerDialog} + volume slider’s behavior. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202299">Issue + 202299</a>) + </li> + </ul> + </dd> + + + <dt> + Changes for <a href="features.html#v7-preference">v7 Preference</a> + library: + </dt> + + <dd> + <ul> + <li>Fixed issue where {@link + android.support.v7.preference.PreferenceFragmentCompat} would crash + if <code>dividerHeight</code> is specified. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=204778">Issue + 204778</a>) + </li> + </ul> + </dd> + + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 + recyclerview library</a>: + </dt> + + <dd> + <ul> + <li>Fixed a bug where {@link + android.support.v7.widget.RecyclerView} would not invoke scroll + callbacks if the range of visible items shrank. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=200987">Issue + 200987</a>) + </li> + + <li>Fixed a bug where {@link + android.support.v7.widget.RecyclerView} would freeze if it was in + linear layout, was weighted, and contained images. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=203276">Issue + 203276</a>) + </li> + + <li>Fixed a crash in {@link + android.support.v7.widget.OrientationHelper#getStartAfterPadding + OrientationHelper.getStartAfterPadding()}. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=180521">Issue + 180521</a>) + </li> + + <li>Fixed a crash with usages of + <code>android:nestedScrollingEnabled</code>. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=197932">Issue + 197932</a>) + </li> + </ul> + </dd> + + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#design">Design Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed a bug where a hidden bottom sheet would handle touch + events. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=203654">Issue + 203654</a>) + </li> + + <li>Fixed a layout issue with <code>BottomSheetBehavior</code> when + <code>fitsSystemWindows</code> is true. (<a class="external-link" + href= + "https://code.google.com/p/android/issues/detail?id=203057">Issue + 203057</a>) + </li> + + <li>Fixed an accessibility issue with {@link + android.support.design.widget.Snackbar}. (<a class="external-link" + href= + "https://code.google.com/p/android/issues/detail?id=182145">Issue + 182145</a>) + </li> + + <li>Fixed a crash on {@link android.support.design.widget.Snackbar} + swipe. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=203924">Issue + 203924</a>) + </li> + + <li>Fixed a bug in {@link + android.support.design.widget.AppBarLayout} with + <code>enterAlways</code>. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=203661">Issue + 203661</a>) + </li> + + <li>Fixed a bug where {@link + android.support.design.widget.TextInputLayout} unnecessarily clears + {@link android.widget.EditText} object's background color filter. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=203357">Issue + 203357</a>) + </li> + </ul> + </dd> + + </dl> + </div> +</div> +<!-- end of collapsible section: 23.3.0 --> + +<div class="toggle-content closed"> + <p id="rev23-2-1"> + <a href="#" onclick="return toggleContent(this)"><img src= + "{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" + alt="">Android Support Library, revision 23.2.1</a> <em>(March + 2016)</em> + </p> + + <div class="toggle-content-toggleme"> + <dl> + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v4">v4 Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed an exception in {@link + android.support.v4.graphics.drawable.DrawableCompat#wrap + DrawableCompat.wrap()} and {@link android.graphics.drawable.LayerDrawable} on + API levels 17 to 19. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201817">Issue 201817</a>) + </li> + + <li>Fixed an {@code ArrayIndexOutOfBoundsException} in {@link + android.support.v4.widget.ViewDragHelper#shouldInterceptTouchEvent + ViewDragHelper.shouldInterceptTouchEvent()}. (<a class="external-link" + href="https://code.google.com/p/android/issues/detail?id=182262">Issue + 182262</a>) + </li> + + <li>Fixed a bug in {@link android.support.v4.view.ViewPager} related to + scroll calculation for size changes. + </li> + + <li>Fixed a {@code NullPointerException} when {@code + DrawerLayout.removeDrawerListener()} is called without a set {@link + android.support.v4.widget.DrawerLayout.DrawerListener + DrawerLayout.DrawerListener}. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202478">Issue 202478</a>) + </li> + + <li>Fixed a bug where {@link android.support.v4.view.ViewPager} does not set + {@link android.view.accessibility.AccessibilityEvent} parameters properly + when scrolling. + </li> + + <li>Fixed an issue that caused lag during device rotation when using + {@link android.support.v4.graphics.drawable.DrawableCompat#wrap + Drawable.wrap()}. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201924">Issue 201924</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-appcompat">v7 + appcompat library</a>: + </dt> + + <dd> + <ul> + <li>Reverted dependency on vector assets so that developers using the + <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">appcompat + library</a> are not forced to use {@link + android.graphics.drawable.VectorDrawable} and its associated build flags. + </li> + + <li>Fixed a compatibility issue with Night Mode and API level 23. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201910">Issue + 201910</a>) + </li> + + <li>Fixed a compatibility issue with {@link + android.support.v7.widget.SwitchCompat} and API level 7. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=201942">Issue 201942</a>) + </li> + + <li>Fixed an issue with propagating configuration values in Resources objects + <a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201928">Issue 201928</a> + </li> + + <li>Fixed a compatibility issue where the {@link + android.support.v7.app.NotificationCompat.MediaStyle + NotificationCompat.MediaStyle} cancel button becomes invisible on API level + 21 and below. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202156">Issue 202156</a>) + </li> + + <li>Fixed a compatibility crash with {@link + android.support.v7.widget.AppCompatSpinner} on API level 21 and below. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202246">Issue 202246</a>) + </li> + + <li>Fixed an issue where the {@code app:textAllCaps = "false"} style did not + work. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202117">Issue 202117</a>) + </li> + + <li>Fixed a crash when restoring {@link android.widget.SearchView}. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201836">Issue + 201836</a>) + </li> + + <li>Fixed a memory leak that occurs when tinting drawable resources using + AppCompat. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202379">Issue 202379</a>) + </li> + + <li>Fixed an issue with {@link android.view.KeyEvent} on API level 11 and + lower. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202939">Issue 202939</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-cardview">v7 cardview + library</a>: + </dt> + + <dd> + <ul> + <li>Added Night Mode support for {@link + android.support.v7.widget.CardView}. (<a class="external-link" + href="https://code.google.com/p/android/issues/detail?id=194497">Issue + 194497</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 + recyclerview library</a>: + </dt> + + <dd> + <ul> + <li>Fixed bugs related to various measure-spec methods. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=201856">Issue + 201856</a>) + </li> + + <li>Reduced the lockdown period in which {@link + android.support.v7.widget.RecyclerView} does not allow adapter + changes while calculating a layout or scroll. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=202046">Issue + 202046</a>) + </li> + + <li>Fixed a crash when calling {@link + android.support.v7.widget.RecyclerView.Adapter#notifyItemChanged + notifyItemChanged()} on an item that is out of view. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=202136">Issue + 202136</a>) + </li> + + <li>Fixed a crash that occurs when {@link + android.support.v7.widget.RecyclerView.LayoutManager + RecyclerView.LayoutManager} adds and removes a view in the same + measurement pass. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=193958">Issue + 193958</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v7-mediarouter">v7 + mediarouter library</a>: + </dt> + + <dd> + <ul> + <li>Fixed a crash that occurs when calling {@link + android.support.v7.media.MediaRouter#getInstance + MediaRouter.getInstance()} on API level 17. (<a class="external-link" + href= + "https://code.google.com/p/android/issues/detail?id=180654">Issue + 180654</a>) + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#v17-leanback">v17 + Leanback Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed an issue with {@code GridLayout.onAddFocusables()} that + caused the wrong item to be selected. + </li> + + <li>Fixed issue with {@link + android.support.v17.leanback.app.GuidedStepFragment} actions + disappearing after an action was collapsed. + </li> + </ul> + </dd> + + <dt> + Changes for <a href= + "{@docRoot}tools/support-library/features.html#design">Design Support + Library</a>: + </dt> + + <dd> + <ul> + <li>Fixed a {@link android.support.design.widget.TabLayout} crash + caused by tab-pooling. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201827">Issue + 201827</a>) + </li> + + <li>Fixed a bug in {@link + android.support.design.widget.NavigationView} that caused the wrong + color to be selected. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201951">Issue + 201951</a>) + </li> + + <li>Fixed a bug where {@link + android.support.design.widget.FloatingActionButton#setBackgroundTintList + setBackgroundTintList()} was no longer able to change the background + color. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201873">Issue + 201873</a>) + </li> + + <li>Fixed an issue where {@link + android.support.design.widget.AppBarLayout} did not completely scroll + out of view when used with {@code android:fitsSystemWindows = “true”}. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201822">Issue + 201822</a>) + </li> + + <li>Fixed an issue where {@code BottomSheetDialog} did not display + short content views correctly. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201793">Issue + 201793</a>) + </li> + + <li>Fixed an issue where {@code BottomSheetDialogFragment} moved + sporadically when content inside was changed. (<a class= + "external-link" href= + "https://code.google.com/p/android/issues/detail?id=202125">Issue + 202125</a>) + </li> + + <li>Fixed a crash in TextInputLayout counter <a class="external-link" + href= + "https://code.google.com/p/android/issues/detail?id=202051">link</a> + </li> + + <li>Fixed a crash that occured when {@link + android.support.design.widget.TextInputLayout#getCounterMaxLength + TextInputLayout.getCounterMaxLength()} restored a saved state. + (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=202375">Issue + 202375</a>) + </li> + + <li>Fixed a {@code ClassCastException} that occurred when restoring a + {@link android.support.design.widget.CoordinatorLayout} using the + saved state of a view that was not a {@link + android.support.design.widget.CoordinatorLayout}. + </li> + </ul> + </dd> + + <dt> + Changes for VectorDrawableCompat: + </dt> + + <dd> + <ul> + <li>Fixed a bug where the wrong variable was read for {@code + android:tintMode}. (<a class="external-link" href= + "https://code.google.com/p/android/issues/detail?id=201907">Issue + 201907</a>) + </li> + </ul> + </dd> + </dl> + </div> +</div> +<!-- end of collapsible section: 23.2.1 --> + +<div class="toggle-content closed"> + <p id="rev23-2-0"> + <a href="#" onclick="return toggleContent(this)"><img src= + "{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" + alt="">Android Support Library, revision 23.2.0</a> <em>(February + 2016)</em> + </p> + + <div class="toggle-content-toggleme"> + <dl> + <dt> + Changes for <a href="features.html#v4">v4 Support library</a>: + </dt> + + <dd> + <ul> + <li>Added {@code MediaBrowserCompat} for {@link + android.media.browse.MediaBrowser} support, and {@code + MediaBrowserServiceCompat} for {@link + android.service.media.MediaBrowserService} support. This is useful + when connecting a media app’s background service with UI components, + and integrating with Android Auto and Android Wear without requiring + API level 21 or higher. + </li> + + <li>The system now calls {@link + android.support.v4.app.FragmentActivity#onActivityResult onActivityResult()} for a + nested {@link android.support.v4.app.FragmentActivity}. + </li> + </ul> + </dd> + + <dt> + Changes for <a href="features.html#v7-appcompat">v7 AppCompat + library</a>: + </dt> + + <dd> + <ul> + <li>Added Night Mode functionality to API level 14 and higher. Switch + between <a href="{@docRoot}training/material/theme.html">Material + Light and Material Dark Themes</a> based on the time of day or + app-specific setting. + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>Day and night themes can be found here: {@code + <sdk>/extras/android/support/v7/appcompat/res/values/themes_daynight.xml} + </li> + + <li>{@code AppCompatDelegate.setDefaultNightMode()}: sets the + app’s default mode by passing one of the following constants: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>{@code MODE_NIGHT_AUTO} + </li> + + <li>{@code MODE_NIGHT_NO} + </li> + + <li>{@code MODE_NIGHT_YES} + </li> + + <li>{@code MODE_NIGHT_FOLLOW_SYSTEM} + </li> + </ul> + </li> + + <li>{@code AppCompatDelegate.setLocalNightMode()}: overrides + the night mode setting for the local app component. + </li> + + <li>{@code AppCompatDelegate.getDefaultNightMode()}: returns + the default night mode. + </li> + </ul> + </li> + </ul> + </dd> + + <dt> + Changes for <a href="features.html#v7-mediarouter">v7 mediarouter + library</a>: + </dt> + + <dd> + <ul> + <li>{@link android.support.v7.app.MediaRouteControllerDialog} now + correctly applies custom app theme colors. + </li> + </ul> + </dd> + + <dt> + Changes for <a href="features.html#design">Design support library</a>: + </dt> + + <dd> + <ul> + <li>Added support for <a href= + "https://www.google.com/design/spec/components/bottom-sheets.html">bottom + sheets</a>. An interaction plugin, {@code + BottomSheetBehavior}, allows a child view of a {@link + android.support.design.widget.CoordinatorLayout} to act as + a bottom sheet. The base class, {@code BottomSheetCallback}, provides + callbacks to monitor bottom sheet events. + </li> + </ul> + </dd> + + <dt> + Changes for the <a href="features.html#custom-tabs">CustomTabs support + library</a>: + </dt> + + <dd> + <ul> + <li> + <a href= + "https://developer.chrome.com/multidevice/android/customtabs">Chrome + Custom Tabs</a> now allows apps to include a bottom bar with action + buttons in addition to the existing top action button. + </li> + + <li>{@code CustomTabsIntent.Builder.addToolBarItem()}: adds an action + button to a custom tab. You can use this to add multiple buttons. + </li> + + <li>{@code CustomTabsSession.setToolBarItem()}: updates the visuals + for toolbar items. This method will only succeed if it is given a + valid id and the browser session is in the foreground. + </li> + </ul> + </dd> + + <dt> + Added VectorDrawable support library: + </dt> + + <dd> + <ul> + <li>Added Classes: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>{@code VectorDrawableCompat} + </li> + + <li>{@code AnimatedVectorDrawableCompat} + </li> + </ul> + </li> + + <li>Adds support for {@link + android.graphics.drawable.VectorDrawable} assets to apps + running on API level 7 or higher. {@link + android.graphics.drawable.AnimatedVectorDrawable} assets + are also supported on API level 11 or higher. Vector assets can be + considerably smaller than image assets and should help reduce app + size by reducing the amount of assets required to support multiple + device screens. + </li> + + <li>This library is now a dependency of the <a href= + "features.html#v7-appcompat">v7 AppCompat library</a>, allowing + developers and <a href="features.html#v7-appcompat">AppCompat </a> + to easily use vector drawables. To use {@code + VectorDrawableCompat} within an {@link android.widget.ImageButton} or + {@link android.widget.ImageView}, use the {@code app:srcCompat} XML + attribute or {@code setImageResource()} + method. + </li> + + <li>To keep referencing attribute IDs on API level 20 or + lower, add the following {@code appt} flag to your {@code + build,gradle} file: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>If you are building with Android Plugin for Gradle 1.5.0 or + lower, add the following to your {@code build.gradle} file: + </li> + + <li style="list-style: none; display: inline"> + <pre> +android { + defaultConfig { + // Stops the Gradle’s automatic rasterization of vectors + generatedDensities = [] + } + // Flag that tells aapt to keep the attribute ids + aaptOptions { + additionalParameters "--no-version-vectors" + } +} +</pre> + </li> + + <li>If you are building with Android Plugin for Gradle 2.0.0 or + higher, add the following to your {@code build.gradle} file: + </li> + + <li style="list-style: none; display: inline"> + <pre> +android { + defaultConfig { + vectorDrawables.useSupportLibrary = true + } +} +</pre> + </li> + </ul> + </li> + </ul> + </dd> + + <dt> + Changes for <a href="features.html#v17-leanback">v17 Leanback + Library</a>: + </dt> + + <dd> + <ul> + <li>Added new capabilities to {@link android.support.v17.leanback.app.GuidedStepFragment}, + which is a component that guides users through a decision or series of decisions: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>Added button actions to {@link + android.support.v17.leanback.widget.GuidedAction}: + </li> + + <ul> + <li>{@code GuidedStepFragment.setButtonActions()}: sets a list of + {@link android.support.v17.leanback.widget.GuidedAction} buttons that + the user may select from the Actions view. + </li> + </ul> + </li> + + <li>Description fields are now editable: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>{@code GuidedAction.Builder.descriptionEditable()}: when passing + {@code true}, sets the action’s description to be editable. + </li> + + <li>{@code GuidedAction.getEditDescription()}: returns the editable + description as a {@code CharSequence}. + </li> + </ul> + </li> + + <li>Added drop-down lists of sub-actions: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>{@code GuidedAction.setSubActions()}: sets a {@link + android.support.v17.leanback.widget.GuidedAction} list as a drop-down + menu of sub-actions. + </li> + </ul> + </li> + </ul> + + <li>Added the {@code GuidedDatePickerAction} widget for {@link + android.widget.DatePicker} functionality: + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>The date is selected using year, month, and day columns and has a + customizable range. + </li> + + <li>{@code GuidedDatePickerAction.Builder}: builder class for the {@code + GuidedDatePickerAction} object. + </li> + + <li>{@code GuidedDatePickerAction.Builder.datePickerFormat(String + datePickerFormat)}: set the desired date format by passing the + appropriate three-character {@code String}, e.g. {@code “YMD”} or {@code + “MDY”}. Alternatively, use the {@code datePickerFormat} XML attribute. + </li> + </ul> + </li> + </ul> + </dd> + </dl> + + <dl> + <dt> + Changes for <a href="features.html#v7-recyclerview">v7 RecyclerView + library</a>: + </dt> + + <dd> + <ul> + <li>{@link android.support.v7.widget.RecyclerView} now has an opt-in + feature called <em>AutoMeasure</em> which allows {@link + android.support.v7.widget.RecyclerView.LayoutManager} to easily wrap + content or handle various measurement specifications provided by the + parent of the {@link android.support.v7.widget.RecyclerView}. It + supports all existing animation capabilities of the {@link + android.support.v7.widget.RecyclerView}. + </li> + + <li style="list-style: none; display: inline"> + <ul> + <li>If you have a custom {@link + android.support.v7.widget.RecyclerView.LayoutManager}, + call {@code setAutoMeasureEnabled(true)} to start using the new + AutoMeasure API. All built-in {@link + android.support.v7.widget.RecyclerView.LayoutManager} objects + enable auto-measure by default. + </li> + + <li>{@link android.support.v7.widget.RecyclerView.LayoutManager} + no longer ignores some {@link + android.support.v7.widget.RecyclerView.LayoutParams} settings, + such as {@code MATCH_PARENT} in the scroll direction. + <p class="note"> + <strong>Note:</strong> These lifted restrictions may cause + unexpected behavior in your layouts. Make sure you specify + the correct layout parameters. + </p> + </li> + </ul> + </li> + + <li>When updating a {@link + android.support.v7.widget.RecyclerView.ViewHolder} with payload + information, {@link android.support.v7.widget.DefaultItemAnimator} + now disables change animations. + </li> + + <li>You can now modify the {@link + android.support.v7.widget.helper.ItemTouchHelper} escape velocity to + control swipe sensitivity. To make it easier or harder to swipe, + override {@code getSwipeEscapeVelocity(float defaultValue)} and modify {@code defaultValue}. + </li> + </ul> + </dd> + </dl> + </div> +</div> +<!-- end of collapsible section: 23.2.0 --> + +<div class="toggle-content closed"> + <p id="rev23-1-1"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 23.1.1</a> <em>(November 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library:</a></dt> + <dd> + <ul> + <li>Fixed a crash that occurs when you perform a swipe-to-dismiss action that the + {@code ItemTouchHelper} utility class provides, and then add an item. + (<a href="http://b.android.com/190500">Issue 190500</a>)</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v7-preference">v7 preference library:</a></dt> + <dd> + <ul> + <li>Fixed an issue with ProGuard usage. + (<a href="http://b.android.com/183261">Issue 183261</a>)</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v17-leanback">v17 Leanback Support library:</a></dt> + <dd> + <ul> + <li>Fixed a number of internal issues in this library.</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Added the <code>getHeaderView</code> method to the <code>NavigationView</code> class.</li> + <li>Fixed a transparent background issue for a <code>FloatingActionButton</code> object on + devices running Android 4.0 (API level 15) and lower. + (<a href="http://b.android.com/183315">Issue 183315</a>)</li> + </ul> + </dd> + </dl> + + </div> +</div> <!-- end of collapsible section --> + + + +<div class="toggle-content closed"> + <p id="rev23-1-0"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 23.1.0</a> <em>(October 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v4">v4 Support library:</a></dt> + <dd> + <ul> + <li>Added <code>OnScrollChangedListener</code> interface support to the + <code>NestedScrollView</code> widget. It + allows you to receive callbacks when the scroll X or Y positions change.</li> + <li>Added a <code>MediaButtonReceiver</code> class to forward received playback controls + to a service that’s managing the <code>MediaSessionCompat</code> class. The + <code>MediaSessionCompat</code> class has a + constructor that can automatically find a media button receiver in the manifest. A + media button receiver is a key part to <a href= + "http://developer.android.com/training/managing-audio/volume-playback.html#PlaybackControls">handling + playback controls</a> from hardware or bluetooth controls.</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library:</a></dt> + <dd> + <ul> + <li>Added material design <code>Seekbar</code> and <code>ImageButton</code> widgets.</li> + <li>Updated the <code>ImageView</code> widget to support the tint feature.</li> + <li>Updated the look-and-feel of the <code>SwitchCompat</code> widget.</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v7-mediarouter">v7 mediarouter library:</a></dt> + <dd> + <ul> + <li>Added the following features to the <code>MediaRouteChooserDialog</code> class:</li> + <ul> + <li>Displays a loading page while discovering media route providers.</li> + <li>Includes a device type icon for easier device identification.</li> + <li>Sorts the routes according to frequency of use in the current app.</li> + <li>Supports landscape mode.</li> + </ul> + </ul> + <ul> + <li>Added the following features to the <code>MediaRouteControllerDialog</code> class:</li> + <ul> + <li>Recognizes screen casting and provides a proper description.</li> + <li>Supports various album art sizes and aspect ratios, and loads the art asynchronously.</li> + <li>Automatically selects the content color based on the primary color of the app.</li> + <li>Adjusts the dialog layout based on available screen space on the device.</li> + <li>Supports landscape mode.</li> + </ul> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v7-palette">v7 palette library:</a></dt> + <dd> + <ul> + <li>Added the <code>setRegion()</code> method to support extracting color from a specific + region of a <code>Bitmap</code> object.</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library:</a></dt> + <dd> + <ul> + <li>Added an improved animation API to the <code>ItemAnimator</code> class for better + customizations:</li> + <ul> + <li>Change animations no longer enforce two copies of the <code>ViewHolder</code> object, + which enables item content animations. Also, the <code>ItemAnimator</code> object + decides whether it wants to reuse the same <code>ViewHolder</code> object or create a + new one.</li> + <li>The new information record API gives the <code>ItemAnimator</code> class the flexibility + to collect data at the correct point in the layout lifecycle. This information is later + passed into the animate callbacks.</li> + </ul> + </ul> + <ul> + <li>Provided an easy transition plan for this backward-incompatible API change:</li> + <ul> + <li>If you’ve previously extended the <code>ItemAnimator</code> class, you can change + your base class to <code>SimpleItemAnimator</code> and your code should work as before. + The <code>SimpleItemAnimator</code> class provides the old API by wrapping the new API.</li> + <li>Some methods were removed from the <code>ItemAnimator</code> class. The following + code will no longer compile:</li> + <pre>recyclerView.getItemAnimator().setSupportsChangeAnimations(false)</pre> + <p>You can replace it with:</p> + <pre> +ItemAnimator animator = recyclerView.getItemAnimator(); +if (animator instanceof SimpleItemAnimator) { + ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false); +} + </pre> + </ul> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-preference">v7</a>, + <a href="features.html#v14-preference">v14</a>, and + <a href="features.html#v17-preference">v17</a> Preference Support library:</dt> + <dd> + <ul> + <li>Removed APIs for controlling <code>EditText</code> dialogs.</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v17-leanback">v17 Leanback Support library:</a></dt> + <dd> + <ul> + <li>Added a version of the <code>GuidedStepFragment</code> class for the Support library + (extends <code>android.support.v4.app.Fragment</code>), and improved animations and + transitions.</li> + <li>Updated the <code>GuidedStepFragment</code> class so it can be placed on top of + existing content.</li> + <li>Added the ability to annotate different types of search completions to the + <code>SearchFragment</code> class.</li> + <li>Added staggered slide transition support to the <code>VerticalGridFragment</code> + class.</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Added <a href= + "https://www.google.com/design/spec/components/text-fields.html#text-fields-character-counter"> + character counting</a> support to the <code>TextInputLayout</code> widget.</li> + <li>Added edge snapping support to the <code>AppBarLayout</code> class by adding the + <code>SCROLL_FLAG_SNAP</code> constant. When scrolling ends, if the view is only + partially visible, the view is snapped and scrolled to its closest edge.</li> + <li>Added support for custom views to the <code>NavigationView</code> class by using the + <code>app:actionLayout</code> attribute or <code>MenuItemCompat.setActionView()</code> + method.</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#custom-tabs">Custom Tabs Support library:</a></dt> + <dd> + <ul> + <li>Added the <code>enableUrlBarHiding()</code> method to the <code>CustomTabsIntent</code> + class. It lets the client customize whether the URL bar should be hidden automatically + on scroll down.</li> + <li>Added the <code>setActionButton()</code> method to the <code>CustomTabsSession</code> + class. It lets the client + change the icon for a custom action button in an already launched custom tab.</li> + <li>Added the <code>TAB_SHOWN</code> and <code>TAB_HIDDEN</code> constants as new events + for the <code>onNavigationEvent</code> method of the <code>CustomTabsCallback</code> + class.</li> + </ul> + </dd> + + </dl> + + </div> +</div> <!-- end of collapsible section --> + + +<div class="toggle-content closed"> + <p id="rev23-0-1"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 23.0.1</a> <em>(September 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v7-preference">v7</a> and + <a href="features.html#v14-preference">v14</a> Preference Support library:</dt> + <dd> + <ul> + <li>Added the material design layout and style files. + (<a href="http://b.android.com/183376">Issue 183376</a>)</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library:</a></dt> + <dd> + <ul> + <li>Fixed crash issues for the {@link android.app.Fragment} class by limiting the use of + hardware layers to Android 4.1 (API level 16) and higher. + (<a href="http://b.android.com/183896">Issue 183896</a>)</li> + <li>Fixed an issue where hardware buttons did not work when an activity had set the + {@link android.widget.Toolbar} class to act as the + {@link android.app.ActionBar} by using the <code>setSupportActionBar()</code> method. + (<a href="http://b.android.com/183334">Issue 183334</a>)</li> + <li>Updated the {@link android.support.v7.app.AppCompatDialogFragment} class so it + no longer throws the {@code Windows feature must be requested before adding content} + error. + (<a href="http://b.android.com/183186">Issue 183186</a>)</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Fixed the + {@link android.support.design.widget.AppBarLayout} class so it now draws correctly after + rotation. + (<a href="http://b.android.com/183109">Issue 183109</a>)</li> + <li>Fixed the + {@link android.support.design.widget.TabLayout} class so it now behaves correctly when a + user clicks after a swipe. + (<a href="http://b.android.com/183123">Issue 183123</a>)</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#custom-tabs">Custom Tabs Support library:</a></dt> + <dd> + <ul> + <li>Lowered the + <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>minSdkVersion</code></a> + value from 16 to 15 for version support.</li> + <li>Added a way to generate a + {@link android.support.customtabs.CustomTabsSessionToken} from an intent.</li> + </ul> + </dd> + + </dl> + + </div> +</div> <!-- end of collapsible section --> + + +<div class="toggle-content closed"> + <p id="rev23"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 23</a> <em>(August 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Added new support libraries:</a></dt> + <dd> + <ul> + <li><a href="features.html#custom-tabs">Custom Tabs Support library</a></li> + <li><a href="features.html#percent">Percent Support library</a></li> + <li><a href="features.html#recommendation">App Recommendation Support library for TV</a></li> + <li><a href="features.html#v7-preference">v7 Preference Support library</a></li> + <li><a href="features.html#v14-preference">v14 Preference Support library</a></li> + <li><a href="features.html#v17-preference">v17 Preference Support library for TV</a></li> + </ul> + </dd> + + </dl> + + <p>For a complete list of the Support Library changes, see the + <a href="{@docRoot}sdk/support_api_diff/23/changes.html">Support + Library API Differences Report</a>. </p> + + </div> +</div> <!-- end of collapsible section --> + + + +<div class="toggle-content closed"> + <p id="rev22-2-1"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 22.2.1</a> <em>(July 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Added the {@code hide()} and {@code show()} methods to the + {@link android.support.design.widget.FloatingActionButton} class for programmatic + triggering of animations. </li> + <li>Added the {@code LENGTH_INDEFINITE} constant to the + {@link android.support.design.widget.Snackbar} class for showing a snackbar + until it is dismissed or another snackbar is shown. Also, added the + {@link android.support.design.widget.Snackbar#setActionTextColor(int)} and + {@link android.support.design.widget.Snackbar#setActionTextColor(ColorStateList)} + methods. </li> + <li>Added the {@code getSelectedTabPosition()} method to the + {@link android.support.design.widget.TabLayout} class for retrieving the currently + selected tab. </li> + <li>Provided a fully fluent API for the + {@link android.support.v7.app.NotificationCompat.MediaStyle} class for method + chaining. </li> + <li>Added convenience methods to the + {@link android.support.v7.widget.RecyclerView} for batch insertion of items. </li> + </ul> + </dd> + </dl> + + <p>For a complete list of the Support Library changes, see the + <a href="{@docRoot}sdk/support_api_diff/22.2.0/changes.html">Support + Library API Differences Report</a>. </p> + + </div> +</div> <!-- end of collapsible section --> + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 22.2.0</a> <em>(May 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Added <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Added {@link android.support.design.widget.TextInputLayout} for showing + {@link android.widget.EditText} hint and error text as floating labels. + </li> + <li>Added {@link android.support.design.widget.FloatingActionButton} for implementing a + primary action on your interface as a + floating action button, supporting either default or mini sizes. + </li> + <li>Added {@link android.support.design.widget.Snackbar} for providing lightweight + feedback with an optional action in an animated snackbar. + </li> + <li>Added {@link android.support.design.widget.TabLayout} for implementing fixed and + scrollable + <a href="{@docRoot}design/building-blocks/tabs.html">tabs</a> as well as easy + integration with + {@link android.support.v4.view.ViewPager}. + </li> + <li>Added {@link android.support.design.widget.NavigationView} for implementing + <a href="{@docRoot}design/patterns/navigation-drawer.html">navigation drawer</a> + contents, including the ability to inflate menu items via a + <a href="{@docRoot}guide/topics/resources/menu-resource.html">Menu Resource</a>. + </li> + <li>Added {@link android.support.design.widget.CoordinatorLayout}, a general purpose + layout, used for building dependencies between + sibling views and allowing easy scrolling reactions between components via + {@link android.support.design.widget.CoordinatorLayout.Behavior}. Many of the Design + Library components rely on being a child of a + {@link android.support.design.widget.CoordinatorLayout}. + </li> + <li>Added {@link android.support.design.widget.AppBarLayout}, a container for a + {@link android.widget.Toolbar} + and other views (such as {@link android.support.design.widget.TabLayout}) for + reacting to scrolling events by scrolling off the screen, becoming visible in reaction + to a downward scroll, or collapsing/uncollapsing before scrolling off/onto the screen. + </li> + <li>Added {@link android.support.design.widget.CollapsingToolbarLayout} for controlling + how a {@link android.widget.Toolbar} collapses. A toolbar may collapse by: + pinning components to the top of the screen while it collapses, introducing + parallax scrolling of components such as an {@link android.widget.ImageView}, + or adding a content scrim color when the view is partially collapsed. + </li> + </ul> + </dt> + + + + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + + <li>Added the +{@link android.support.v4.view.accessibility.AccessibilityEventCompat#getContentChangeTypes getContentChangeTypes()} + and +{@link android.support.v4.view.accessibility.AccessibilityEventCompat#setContentChangeTypes setContentChangeTypes()} + methods and related change type + fields to the + {@link android.support.v4.view.accessibility.AccessibilityEventCompat} + class for accessibility event handling. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat#getActiveQueueItemId getActiveQueueItemId()}, +{@link android.support.v4.media.session.PlaybackStateCompat#getCustomActions getCustomActions()}, + and + {@link android.support.v4.media.session.PlaybackStateCompat#getExtras getExtras()} + methods with related state fields to the + {@link android.support.v4.media.session.PlaybackStateCompat} class for + getting custom actions from the queue. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat.Builder#addCustomAction addCustomAction()}, +{@link android.support.v4.media.session.PlaybackStateCompat.Builder#setActiveQueueItemId setActiveQueueItemId()}, + and + {@link android.support.v4.media.session.PlaybackStateCompat.Builder#setExtras setExtras()} + methods to the + {@link android.support.v4.media.session.PlaybackStateCompat.Builder} class for adding + custom actions to a playback state. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#fromCustomAction fromCustomAction()} and +{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#getCustomAction getCustomAction()} methods + to the + {@link android.support.v4.media.session.PlaybackStateCompat.CustomAction} class + for getting custom actions from the queue. + </li> + <li>Added the {@link android.support.v4.view.ViewCompat#isAttachedToWindow isAttachedToWindow()}, + {@link android.support.v4.view.ViewCompat#offsetLeftAndRight offsetLeftAndRight()}, and + {@link android.support.v4.view.ViewCompat#offsetTopAndBottom offsetTopAndBottom()} + methods to the {@link android.support.v4.view.ViewCompat} class for working with views. + </li> + <li>Added the {@link android.support.v4.view.ViewPager#addOnPageChangeListener addOnPageChangeListener()}, + {@link android.support.v4.view.ViewPager#clearOnPageChangeListeners clearOnPageChangeListeners()}, and + {@link android.support.v4.view.ViewPager#removeOnPageChangeListener removeOnPageChangeListener()} + methods to the {@link android.support.v4.view.ViewPager} class for responding to page + changes. + <p>Deprecated the + {@link android.support.v4.view.ViewPager#setOnPageChangeListener setOnPageChangeListener()} method.</p> + </li> + <li>Added the +{@link android.support.v4.view.ViewParentCompat#notifySubtreeAccessibilityStateChanged notifySubtreeAccessibilityStateChanged()} method to + the {@link android.support.v4.view.ViewParentCompat} class for notifying a view parent + that the accessibility state of one of its descendants has changed. + </li> + <li>Added the {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZ translationZ()}, + {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZBy translationZBy()}, + {@link android.support.v4.view.ViewPropertyAnimatorCompat#z z()}, and + {@link android.support.v4.view.ViewPropertyAnimatorCompat#zBy zBy()} + methods to the {@link android.support.v4.view.ViewPropertyAnimatorCompat} class for + adding animation. + </li> + </ul> + </dd> + + + +<dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> + <dd> +<ul> + <li>Added the + {@link android.support.v7.app.AppCompatActivity#onWindowStartingSupportActionMode onWindowStartingSupportActionMode()} + method to the + {@link android.support.v7.app.AppCompatActivity}, + {@link android.support.v7.app.AppCompatCallback}, and + {@link android.support.v7.app.AppCompatDialog} classes for handling action modes + started from the current window. + </li> + + <li>Added the +{@link android.support.v7.app.AppCompatDelegate#isHandleNativeActionModesEnabled isHandleNativeActionModesEnabled()} and +{@link android.support.v7.app.AppCompatDelegate#setHandleNativeActionModesEnabled setHandleNativeActionModesEnabled()} + methods to the + {@link android.support.v7.app.AppCompatDelegate} class for handling native action modes. + </li> + </ul> + </dd> + + <p>For a complete list of the Support Library changes, see the + <a href="{@docRoot}sdk/support_api_diff/22.2.0/changes.html">Support + Library API Differences Report</a>. </p> + + </dl> + + </div> +</div> <!-- end of collapsible section --> + + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 22.1.0</a> <em>(April 2015)</em> + </p> + + + + <div class="toggle-content-toggleme"> + <dl> + + + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#annotations">annotations library:</a></dt> + <dd> + <ul> + <li>Added the Annotations library to provide support for enhanced code inspections. + Annotations are added as metadata tags that you attach to variables, parameters, + and return values to inspect method return values, passed parameters, and local + variables and fields. + </li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + + <li>Added the {@link android.support.v4.graphics.ColorUtils ColorUtils} class + to provide a set of color-related utility methods. + </li> + <li>Added the {@link android.support.v4.graphics.drawable.DrawableCompat#unwrap unwrap()} and + {@link android.support.v4.graphics.drawable.DrawableCompat#wrap wrap()} methods to the + {@link android.support.v4.graphics.drawable.DrawableCompat} class , allowing you to use + {@link android.support.v4.graphics.drawable.DrawableCompat#setTint setTint()}, + {@link android.support.v4.graphics.drawable.DrawableCompat#setTintList setTintList()}, + and {@link android.support.v4.graphics.drawable.DrawableCompat#setTintMode setTintMode()} + on all API level 4 or higher devices. + </li> + <li>Added the {@link android.support.v4.os.TraceCompat} class to + write trace events to the system trace buffer, which can then be collected and + visualized using the <a href="{@docRoot}tools/help/systrace.html">Systrace</a> tool. + </li> + <li>Added the {@link android.support.v4.util.CircularIntArray} class + to create circular integer array data structures. + </li> + <li>Added the {@link android.support.v4.util.CircularArray#clear clear()}, + {@link android.support.v4.util.CircularArray#removeFromStart removeFromStart()}, + and {@link android.support.v4.util.CircularArray#removeFromEnd removeFromEnd()} + methods to the {@link android.support.v4.util.CircularArray} class. Also, changed the + existing methods in this class to be non-final. + </li> + <li>Added the {@link android.support.v4.view.InputDeviceCompat} + as a helper class to access data in the + {@link android.support.v4.view.InputDeviceCompat} class. + </li> + <li>Added the {@link android.support.v4.view.LayoutInflaterCompat} + class as a helper class to access data in the + {@link android.support.v4.view.LayoutInflaterCompat} class + and added the {@link android.support.v4.view.LayoutInflaterFactory} interface. + </li> + <li>Added classes, methods, and interfaces to support nested scrolling. + <ul> + <li>Added the {@link android.support.v4.view.NestedScrollingChildHelper} + and {@link android.support.v4.view.NestedScrollingParentHelper} + helper classes for implementing nested scrolling parent and child views.</li> + <li>Added the {@link android.support.v4.view.NestedScrollingChild} + interface to be implemented by {@link android.view.View} subclasses.</li> + <li>Added the {@link android.support.v4.view.NestedScrollingParent} + and {@link android.support.v4.view.ScrollingView} interfaces to support + scrolling operations and provide scroll related APIs.</li> + <li>Added the + {@link android.support.v4.view.ViewGroupCompat#getNestedScrollAxes + getNestedScrollAxes()} method to the {@link android.support.v4.view.ViewGroupCompat} + class.</li> + <li>Added methods to the {@link android.support.v4.view.ViewParentCompat} class to + support nested scrolling. + </li> + <li>Added the {@link android.support.v4.widget.NestedScrollView} + class to support nested scrolling parent and child on both new and old versions of + Android. + </li> + </ul> + </li> + <li>Added methods and constants to the {@link android.support.v4.view.MotionEventCompat} + class for getting axis values and event source. + </li> + <li>Updated the {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} + class to add methods for errors, content invalidation and labels. + </li> + <li>Added the following interpolation classes for animation: + {@link android.support.v4.view.animation.FastOutLinearInInterpolator}, + {@link android.support.v4.view.animation.FastOutSlowInInterpolator}, + {@link android.support.v4.view.animation.LinearOutSlowInInterpolator}, + {@link android.support.v4.view.animation.LinearOutSlowInInterpolator}, and + {@link android.support.v4.view.animation.PathInterpolatorCompat}. + </li> + <li>Added the {@link android.support.v4.widget.Space} class to create gaps between + components in general purpose layouts. This class is deprecated in the gridlayout library. + </li> + <li>Added the {@link android.support.v4.widget.TextViewCompat} class for accessing + features in a {@link android.widget.TextView}. + </li> + <li>Added a displacement parameter to the + {@link android.support.v4.widget.EdgeEffectCompat#onPull onPull()} method in the + {@link android.support.v4.widget.EdgeEffectCompat} class. + </li> + + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> + <dd> + <ul> + <li>Added tint support to appcompat widgets, including + {@link android.support.v7.widget.AppCompatAutoCompleteTextView}, + {@link android.support.v7.widget.AppCompatButton}, + {@link android.support.v7.widget.AppCompatCheckBox}, + {@link android.support.v7.widget.AppCompatCheckedTextView}, + {@link android.support.v7.widget.AppCompatEditText}, + {@link android.support.v7.widget.AppCompatMultiAutoCompleteTextView}, + {@link android.support.v7.widget.AppCompatRadioButton}, + {@link android.support.v7.widget.AppCompatRatingBar}, + {@link android.support.v7.widget.AppCompatSpinner}, and + {@link android.support.v7.widget.AppCompatTextView}. + </li> + <li>Updated the {@link android.support.v7.app.AppCompatActivity} as the base + class for activities that use the support library action bar features. This class + replaces the deprecated {@link android.support.v7.app.ActionBarActivity}. + </li> + <li>Added the + {@link android.support.v7.app.AppCompatCallback} interface + to be implemented for AppCompat to be able to perform callbacks. + </li> + <li>Added the + {@link android.support.v7.app.AppCompatDelegate} abstract class + as a delegate you can use to extend AppCompat's support to any activity. + </li> + <li>Added the + {@link android.support.v7.app.AppCompatDialog} class + as the base class for AppCompat themed dialogs. + </li> + <li>Added the spinner style + {@link android.support.v7.app.AlertDialog} and + {@link android.support.v7.app.AlertDialog.Builder} classes to provide an AppCompat + themed {@link android.app.AlertDialog}. + </li> + <li>Added the {@link android.support.v7.graphics.Palette.Builder} class + for generating {@link android.support.v7.graphics.Palette} instances. + <ul> + <li>Added the + {@link android.support.v7.graphics.Palette#from} + method to the {@link android.support.v7.graphics.Palette} class to + start generating a Palette with the returned + {@link android.support.v7.graphics.Palette.Builder} instance. + </li> + <li>Deprecated the {@link android.support.v7.graphics.Palette#generate generate()} and + {@link android.support.v7.graphics.Palette#generateAsync generateAsync()} methods. + </li> + </ul> + </li> + + <li>Added the + {@link android.support.v7.widget.GridLayout.Spec#getAbsoluteAlignment + getAbsoluteAlignment()} method to the {@link android.support.v7.widget.GridLayout.Spec} + class. + </li> + <li>Deprecated use of <code>app:theme</code> for styling + {@link android.support.v7.widget.Toolbar}. You can now use + <code>android:theme</code> for toolbars on all API level 7 and higher devices and + <code>android:theme</code> support for all widgets on API level 11 and higher devices. + </li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> + <dd> + <ul> + <li> Added {@link android.support.v17.leanback.app.GuidedStepFragment}, + {@link android.support.v17.leanback.widget.GuidanceStylist} and + {@link android.support.v17.leanback.widget.GuidedActionsStylist} to support + creating multi-step decision flows. + </li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library</a>:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.util.SortedList} classes to display items in + a list order and provide notification of changes to the list. + </li> + <li>Added the {@link android.support.v7.widget.util.SortedListAdapterCallback} class + that can bind a sorted list to a + {@link android.support.v7.widget.RecyclerView.Adapter} class. + </li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v8.renderscript.ScriptIntrinsicHistogram} class for + use as a histogram filter.</li> + <li>Added the {@link android.support.v8.renderscript.ScriptIntrinsicResize} class for + performing a resize of a 2D allocation. + </li> + </ul> + </dd> + + </dl> + + + </div> +</div> <!-- end of collapsible section --> + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 22</a> <em>(March 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + <li>Updated the {@link android.support.v4.content.res.ResourcesCompat#getDrawable + getDrawable()} method to return a drawable object for a specified specific resource ID, + screen density, and theme. + </li> + <li>Added the {@link android.support.v4.view.ViewCompat#setImportantForAccessibility + setImportantForAccessibility()} method so you can indicate if a view should trigger + accessibility events. + </li> + <li>Added the {@link android.support.v4.widget.DrawerLayout#getStatusBarBackgroundDrawable + getStatusBarBackgroundDrawable()} method so you can get the status bar background + drawable. + </li> + <li>Added methods to the + {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation} + class so Android Auto messaging apps can retrieve additional notification data. + </li> + <li>Added the {@link android.support.v4.widget.SwipeRefreshLayout#getProgressCircleDiameter + getProgressCircleDiameter()} method to return the diameter of a circle layout. + </li> + <li>Changed the default {@link android.support.v4.widget.DrawerLayout DrawerLayout} + status bar color to {@link android.R.attr#colorPrimaryDark}. + </li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> + <dd> + <ul> + <li>Added the spinner style + {@link android.support.v7.appcompat.R.style#Base_Widget_AppCompat_Spinner_Underlined}.</li> + <li>Added tinted widgets styles with + {@link android.support.v7.appcompat.R.style#Widget_AppCompat_AutoCompleteTextView}, + {@link android.widget.MultiAutoCompleteTextView}, + {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Button}, and + {@link android.support.v7.appcompat.R.style#Base_Widget_AppCompat_RatingBar}.</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v17.leanback.widget.ListRowPresenter#getRecycledPoolSize + getRecycledPoolSize()} and + {@link android.support.v17.leanback.widget.ListRowPresenter#setRecycledPoolSize + setRecycledPoolSize()} methods to allow customized recycled pool sizes.</li> + <li>Added the {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} attribute to the + layout width setting to support wrapped content for title icons.</li> + <li>Defined {@link android.support.v17.leanback.R.transition} in XML to + improve transition updates. </li> + <li>Enabled support for right to left layouts.</li> + <li>Added the play and pause media key events support to the + {@link android.support.v17.leanback.app.PlaybackOverlayFragment} class.</li> + <li>Added enter and return transitions to the + {@link android.support.v17.leanback.app.BrowseFragment} class and the + {@link android.support.v17.leanback.app.DetailsFragment} class.</li> + <li>Added the {@link android.support.v17.leanback.widget.ArrayObjectAdapter#replace + replace()} method to replace items in an object’s adapter array. </li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-mediarouter">v7 mediarouter library</a>:</dt> + <dd> + <ul> + <li>Updated Google Cast icons to use the + <a href="{@docRoot}training/material/index.html">material design</a> style.</li> + <li>Updated all the icons used in the {@link android.media.MediaRouter} dialogs to use the + <a href="{@docRoot}training/material/index.html">material design</a> style.</li> + </ul> + </dd> + + + <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v7.widget.RecyclerView.ViewHolder#getLayoutPosition + getlayoutPosition()} + and {@link android.support.v7.widget.RecyclerView.ViewHolder#getAdapterPosition + getadapterPosition()} methods to the {@link android.support.v7.widget.RecyclerView} + class.</li> + <li>Deprecated the <code>classgetChildPosition()</code> and + <code>findViewHolderForPosition()</code> methods in the + {@link android.support.v7.widget.RecyclerView} class. </li> + <li>Deprecated the <code>getPosition()</code> method in the + {@link android.support.v7.widget.RecyclerView.ViewHolder} class. </li> + <li>Deprecated the <code>getViewPosition()</code> method in the + {@link android.support.v7.widget.RecyclerView.LayoutParams} class. </li> + </ul> + </dd> + + </div> +</div> + + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 21.0.3</a> <em>(December 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + <li>Added several {@link android.support.v4.app.NotificationCompat.WearableExtender} + methods to improve the display of barcodes in notifications on wearable devices. + <ul> + <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#getHintScreenTimeout getHintScreenTimeout()}</li> + <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#setHintScreenTimeout setHintScreenTimeout()}</li> + <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#getHintAvoidBackgroundClipping getHintAvoidBackgroundClipping()}</li> + <li>{@link android.support.v4.app.NotificationCompat.WearableExtender#setHintAvoidBackgroundClipping setHintAvoidBackgroundClipping()}</li> + </ul> + </li> + </ul> + </dd> + + </div> +</div> + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 21.0.2</a> <em>(November 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + <li>Added {@link android.support.v4.app.NotificationCompat.CarExtender} + class to support Android Auto extensions to notifications.</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v7.widget.PopupMenu} constructor to support new popup + menus.</li> + <li>Added support for a Collapse icon description in the {@link android.support.v7.widget.Toolbar} + class.</li> + <li>Updated the {@link android.support.v7.widget.SearchView} widget to support displaying + the {@link android.support.v7.appcompat.R.attr#commitIcon}. </li> + <li>Removed the <code>buttonGravity</code> attribute from the + {@link android.support.v7.widget.Toolbar} class. </li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v7-cardview">v7 cardview library</a>:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.widget.CardView#setCardBackgroundColor} API to + support changing the background color of the {@link android.support.v7.widget.CardView}.</li> + <li>Changed the {@link android.support.v7.widget.CardView} to more accurately report its + opacity value as {@link android.graphics.PixelFormat#TRANSLUCENT}.</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v7-recyclerview">v7 recyclerview + library</a>:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.widget.RecyclerView#TOUCH_SLOP_DEFAULT} and + {@link android.support.v7.widget.RecyclerView#TOUCH_SLOP_PAGING} constants + to the {@link android.support.v7.widget.RecyclerView} class + to support touch slop configurations for paging.</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> + <dd> + <ul> + <li>Added support to generate v4 code fragments. </li> + <li>Changed the secondary text color on {@link android.support.v7.widget.CardView}. </li> + </ul> + </dd> + </dl> + </div> +</div> + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 21.0.1</a> <em>(November 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Added <a href="{@docRoot}tools/support-library/features.html#multidex"> + multidex support library</a> to support multiple + <a href="https://source.android.com/devices/tech/dalvik/">Dalvik</a> Executable (DEX) files + for multi-dex file support prior to Android 5.0. + </dt> + </dl> + </div> +</div> + + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 21</a> <em>(October 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + <li>Added support for {@link android.support.v4.app.Fragment} + transitions for devices running Android 5.0 (API level 21). + Be aware that transitions have no effect on devices running + Android 4.4 and lower. + </li> + <li>Added {@link android.support.v4.provider.DocumentFile} to ease + the transition from {@link java.io.File} + while working with document trees. However, this class demands + more processing overhead compared to the platform's + {@link android.provider.DocumentsContract} API added in + Android 4.4 (API level 19). So you should switch to using {@link + android.provider.DocumentsContract} when running on Android 4.4 + and higher.</li> + </ul> + </dd> + <dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat + library</a>:</dt> + <dd> + <ul> + <li>Added support for <a href="{@docRoot}design/material/">material + design</a> user interfaces.</li> + <li>Added {@link android.support.v7.widget.Toolbar}, which generalizes + the functionality of {@link android.support.v7.app.ActionBar} for + use within app layouts.</li> + <li>Updated {@link android.support.v7.app.ActionBarDrawerToggle}, + which contains the menu-to-arrow animation</li> + <li>Updated common user interface widgets to allow tinting via theme + attributes when running on pre-Android 5.0 devices</li> + <li>Added {@link android.support.v7.widget.SwitchCompat}, a backport + of the {@link android.widget.Switch} widget that was added in + Android 4.0 (API level 14).</li> + </ul> + </dd> + <dt>New <a href="features.html#v7-cardview">v7 cardview library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v7.widget.CardView} widget, which + provides a material design-compatible implementation for displaying + data items.</li> + </ul> + </dd> + <dt>New <a href="features.html#v7-recyclerview">v7 recyclerview + library</a>:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v7.widget.RecyclerView} widget, + which provides a flexible list view for providing a limited window + into a large data set.</li> + </ul> + </dd> + <dt>New <a href="features.html#v7-palette">v7 palette library</a>:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.graphics.Palette} class, + which lets you extract prominent colors from an image.</li> + </ul> + </dd> + <dt>New <a href="features.html#v17-leanback">v17 leanback library</a>:</dt> + <dd> + <ul> + <li>Added support for building TV user interfaces, including + {@link android.support.v17.leanback.app.BrowseFragment}, + {@link android.support.v17.leanback.app.DetailsFragment}, and + {@link android.support.v17.leanback.app.PlaybackOverlayFragment}. + For more information about using these user interface widgets, + see <a href="{@docRoot}training/tv/playback/index.html">Building TV + Playback Apps</a>.</li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 20</a> <em>(July 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added extended notification support for Android Wear in + {@link android.support.v4.app.NotificationCompat.WearableExtender}, which allows you + to specify wearable-specific features in your notifications.</li> + <li>Added {@link android.support.v4.app.NotificationCompat.Action.WearableExtender}, + which allows actions to be added on wearable notifications.</li> + <li>Added {@link android.support.v4.app.NotificationManagerCompat}, which allows you + to issue notifications that properly support wearable features.</li> + <li>Added {@link android.support.v4.app.RemoteInput}, which allows a handheld device + to receive voice input from a notification that appears on a wearable device.</li> + <li>Improved the handling of touch feedback in + {@link android.support.v4.widget.SwipeRefreshLayout}.</li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 19.1.0</a> <em>(March 2014)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added the {@link android.support.v4.widget.SwipeRefreshLayout} class, + which enables users to refresh the contents of a view with a vertical + swipe gesture.</li> + <li>Fixed accessibility issues with navigation drawers.</li> + </ul> + </dd> + + <dt>Changes for v7 appcompat library:</dt> + <dd> + <ul> + <li>Fixed background issues with the action bar.</li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 19.0.1</a> <em>(December 2013)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Improved {@link android.support.v4.print.PrintHelper} by adding asynchronous + handling of printing.</li> + <li>Fixed the {@link android.support.v4.widget.DrawerLayout} class approximation of + the {@link android.view.View#addChildrenForAccessibility addChildrenForAccessibility()} + method.</li> + <li>Fixed slide drawable mirroring in {@link + android.support.v4.app.ActionBarDrawerToggle}.</li> + <li>Fixed off-by-one issue when removing an item from a collection iterator.</li> + </ul> + </dd> + + <dt>Changes for v7 mediarouter library:</dt> + <dd> + <ul> + <li>Improved route identification by using full component name in the {@link + android.support.v7.media.MediaRouteProvider.ProviderMetadata}.</li> + <li>Updated {@link android.support.v7.app.MediaRouteChooserDialog} to hide disabled + routes.</li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a></dt> + <dd> + <ul> + <li>Added error propagation for the RenderScript thunking layer.</li> + </ul> + </dd> + + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 19</a> <em>(October 2013)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added support for external Storage APIs with the + {@link android.support.v4.content.ContextCompat#getObbDirs getObbDirs()}, + {@link android.support.v4.content.ContextCompat#getExternalFilesDirs getExternalFilesDirs()}, + {@link android.support.v4.content.ContextCompat#getExternalCacheDirs getExternalCacheDirs()}, + and {@link android.support.v4.os.EnvironmentCompat#getStorageState getStorageState()}. + These helper methods always return a single file object on devices running Android + 4.3 (API level 18) and earlier. When running on Android 4.4 (API level 19) and higher, + these methods may return more than one file object.</li> + <li>Added {@link android.support.v4.print.PrintHelper} class that works with the + Print APIs to print images with a minimum of code.</li> + <li>Added drag-to-open user interface support for pop-up menus. For more information, see + {@link android.support.v4.widget.PopupMenuCompat} and + {@link android.support.v4.widget.ListPopupWindowCompat}.</li> + <li>Improved accessibility support with the addition of a + {@link android.support.v4.view.accessibility.AccessibilityNodeProviderCompat#findFocus + findFocus()} method in + {@link android.support.v4.view.accessibility.AccessibilityNodeProviderCompat} and the + {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat#getLiveRegion + getLiveRegion()} method in + {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat}.</li> + <li>Added helper class {@link android.support.v4.view.ScaleGestureDetectorCompat} for + accessing new scaling gesture methods.</li> + <li>Fixed problem with {@link android.support.v4.app.ActionBarDrawerToggle} in + right-to-left language displays.</li> + <li>Modified {@link android.support.v4.widget.AutoScrollHelper} option to consume + touch events or allow them to be passed through to other views.</li> + </ul> + </dd> + + <dt>Changes for v7 mediarouter library:</dt> + <dd> + <ul> + <li>Added support for media playback queuing, setting HTTP header values and media + playback duration.</li> + <li>Added explicit start, get, and end session actions for explicitly managing media + playback sessions with media router.</li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 18</a> <em>(July 2013)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>User interface + <ul> + <li>Added {@link android.support.v4.text.BidiFormatter} for handling + text strings that combine right to left and left to right-formatted text.</li> + <li>Modified {@link android.support.v4.view.ViewPager} to better handle cases where the + pager has a measured width of zero in the initial layout processing.</li> + <li>Modified {@link android.support.v4.widget.DrawerLayout} and + {@link android.support.v4.widget.SlidingPaneLayout} to not throw exceptions for + measurement while the project code is being edited.</li> + </ul> + </li> + + <li>Accessibility + <ul> + <li>Added {@link android.support.v4.widget.ExploreByTouchHelper} to simplify the + implementation of accessibility for custom views.</li> + <li>Fixed a problem with {@link android.support.v4.view.ViewPager} incorrectly + populating {@link + android.support.v4.view.accessibility.AccessibilityEventCompat#TYPE_VIEW_SCROLLED + TYPE_VIEW_SCROLLED} accessibility events.</li> + <li>Fixed a null pointer exception in {@link android.support.v4.view.ViewPager} when + populating an accessibility event.</li> + <li>Simplified {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} + by changing {@link java.lang.CharSequence} inputs to {@link java.lang.String} objects. + </li> + <li>Deprecated an {@link android.support.v4.view.accessibility.AccessibilityRecordCompat} + constructor that used an {@link java.lang.Object} as input.</li> + </ul> + </li> + + <li>Media + <ul> + <li>Added {@link android.support.v4.media.TransportMediator} helper class to manage + media transport control, such as play, pause, skip and other media actions.</li> + <li>Added {@link android.support.v4.hardware.display.DisplayManagerCompat} for managing + display output to one or more device displays.</li> + </ul> + </li> + + <li>Other changes + <ul> + <li>Added {@link android.support.v4.content.WakefulBroadcastReceiver} helper class for + implementing a common pattern of detecting a device wakeup event and passing work off + to a {@link android.app.Service} while ensuring that the device does not go back to + sleep before the handoff is complete.</li> + <li>Added two new APIs, + {@link android.support.v4.content.AsyncTaskLoader#commitContentChanged + commitContentChanged()} and + {@link android.support.v4.content.AsyncTaskLoader#rollbackContentChanged + rollbackContentChanged()}, to {@link android.support.v4.content.AsyncTaskLoader} to + help deal with background updates for data changes that are subsequently canceled. + </li> + </ul> + </li> + </ul> + </dd> + + <dt>New v7 appcompat library:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.app.ActionBar} to allow implementation of the + action bar user interface <a href="{@docRoot}design/patterns/actionbar.html">design + pattern</a> back to Android 2.1 (API level 7) and higher. Use of this class requires + that you implement your activity by extending the new + {@link android.support.v7.app.ActionBarActivity} class.</li> + </ul> + </dd> + + <dt>New v7 mediarouter library:</dt> + <dd> + <p>Added a new mediarouter library that provides support for the <a + href="https://developers.google.com/cast/">Google Cast developer preview</a>. + The v7 mediarouter library APIs provide a means of controlling the routing of + media channels and streams from the current device to external screens, + speakers, and other destination devices, with compatibility back to Android 2.1 + (API level 7). See <a + href="{@docRoot}tools/support-library/features.html#v7-mediarouter">V7 + mediarouter library</a> for more information. </p> + + <p class="caution">The v7 mediarouter library APIs introduced in Support + Library r18 are subject to change in later revisions of the Support + Library. At this time, we recommend using the library only in connection + with the <a href="https://developers.google.com/cast/">Google Cast + developer preview</a>.</p> + </dd> + + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 13</a> <em>(May 2013)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added {@link android.support.v4.widget.DrawerLayout} for creating a + <a href="{@docRoot}training/implementing-navigation/nav-drawer.html">Navigation + Drawer</a> that can be pulled in from the edge of a window.</li> + <li>Added {@link android.support.v4.widget.SlidingPaneLayout} widget for creating linked + summary and detail views that appropriately adapt to various screen sizes.</li> + <li>Added {@link android.support.v4.app.ActionBarDrawerToggle} as a way to tie + together the functions of {@link android.support.v4.widget.DrawerLayout} and {@link + android.app.ActionBar}.</li> + <li>Added {@link android.support.v4.widget.ViewDragHelper} as a new common component + for dragging views within a parent view.</li> + <li>Added {@link android.support.v4.widget.ScrollerCompat} to provide {@link + android.widget.Scroller} and {@link android.widget.OverScroller} compatibility support. + </li> + <li>Added {@link android.support.v4.content.FileProvider} to allow sharing of private + files between applications.</li> + <li>Updated {@link android.support.v4.view.ViewPager} to throw an exception if the + associated {@link android.support.v4.view.PagerAdapter} class is modified without a + call to {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged + notifyDataSetChanged()}. + </li> + <li>Fixed an issue with {@link android.support.v4.view.ViewPager} children drawing sort + order.</li> + <li>Fixed {@link android.support.v4.view.GestureDetectorCompat} to dispatch missing + {@link android.view.GestureDetector.SimpleOnGestureListener#onSingleTapConfirmed} calls + between tap timeout and long press events.</li> + </ul> + </dd> + + <dt>New v7 gridlayout library:</dt> + <dd> + <ul> + <li>Added {@link android.support.v7.widget.GridLayout} to provide support for the + {@link android.widget.GridLayout} layout object.</li> + <li>Added {@link android.support.v7.widget.Space} which can be used to create blank areas + within a {@link android.support.v7.widget.GridLayout} layout object.</li> + </ul> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 12</a> <em>(February 2013)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Improved interaction behavior for {@link android.support.v4.view.ViewPager}.</li> + <li>Fixed a bug that could cause {@link android.support.v4.view.ViewPager} to select the + wrong page.</li> + <li>Fixed use of {@link android.support.v4.view.ViewPager#removeView removeView()} method + during layout for {@link android.support.v4.view.ViewPager}.</li> + <li>Fixed issue with {@link android.support.v4.widget.SearchViewCompat} where using the + back button to dismiss does not clear the search text. This fix only applies to + host API levels 14 and higher.</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 11</a> <em>(November 2012)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>User Interface + <ul> + <li>Added support for nested {@link android.support.v4.app.Fragment} classes.</li> + <li>Added improvements to {@link android.support.v4.app.FragmentManager} debugging. + </li> + <li>Fixed problem in {@link android.support.v4.app.FragmentTabHost} where fragment + and tab interaction could result in a {@link android.widget.ListView} state loss. + </li> + <li>Fixed issue with user-visible hint in + {@link android.support.v4.app.FragmentStatePagerAdapter}.</li> + <li>Added {@link android.support.v4.view.ViewPager.PageTransformer PageTransformer} + interface to {@link android.support.v4.view.ViewPager} to allow applications to + supply a custom transition behavior for scrolling.</li> + <li>Added new features and fixes to {@link android.support.v4.app.TaskStackBuilder} + from current release.</li> + <li>Fixed {@link android.support.v4.view.PagerTitleStrip} to correctly track the + {@link android.support.v4.view.PagerAdapter} currently in use.</li> + <li>Fixed display flickering, positioning, and text clipping problems with + {@link android.support.v4.view.PagerTitleStrip}.</li> + <li>Fixed {@link android.support.v4.view.PagerTabStrip} to properly respect padding + when drawing an underline.</li> + </ul> + </li> + <li>Accessibility + <ul> + <li>Added support for new accessibility gesture and touch event types in + {@link android.support.v4.view.accessibility.AccessibilityEventCompat}.</li> + <li>Added support for new accessibility APIs in + {@link android.support.v4.view.ViewCompat}.</li> + <li>Added support for {@link android.support.v4.view.ViewCompat#performAccessibilityAction + performAccessibilityAction()} method to {@link android.support.v4.view.ViewCompat}. + </li> + </ul> + </li> + <li>Added support for gestures with {@link android.support.v4.view.GestureDetectorCompat}. + </li> + <li>Added support for performing atomic operations on files using a new + {@link android.support.v4.util.AtomicFile} class.</li> + <li>Added support for the full set of {@code make} methods in + {@link android.support.v4.content.IntentCompat}.</li> + <li>Added {@link android.support.v4.util.LruCache#trimToSize trimToSize()} method in + {@link android.support.v4.util.LruCache} utility class.</li> + <li>Updated {@link android.support.v4.net.ConnectivityManagerCompat} to get NetworkInfo + from a {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} + broadcast.</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 10</a> <em>(August 2012)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added support for notification features introduced in Android 4.1 (API level 16) with + additions to {@link android.support.v4.app.NotificationCompat}.</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 9</a> <em>(June 2012)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + + <li>User Interface Support + <ul> + <li>Added {@link android.support.v4.view.PagerTabStrip} support, providing enhanced +functionality beyond {@link android.support.v4.view.PagerTitleStrip}.</li> + <li>Fixed various bugs for {@link android.support.v4.view.PagerTitleStrip} and +{@link android.support.v4.view.PagerTabStrip}, including {@link +android.widget.TextView#setAllCaps setAllCaps} option, title alignment, +appearance improvements, minimum width constraints and touch navigation issues.</li> + <li>Added support for {@link android.support.v4.view.ViewPager} page gutters, which +helps the {@link android.support.v4.view.ViewPager} class provide paging support for content with +a large horizontal scroll range, such as a map.</li> + <li>Fixed numerous bugs for {@link android.support.v4.view.ViewPager}, including size +and data set change problems, page positioning, user interaction, scroll tracking and keyboard +navigation problems.</li> + <li>Fixed many bugs for {@link android.support.v4.app.Fragment}, including proper +handling of {@link android.support.v4.app.Fragment#onActivityResult onActivityResult()} when +the target fragment no longer exists, dispatching selection events to invisible fragments, improved +{@link android.support.v4.app.FragmentTransaction#replace FragmentTransaction.replace()} behavior +and added better state handling for fragments being moved out of view.</li> + <li>Added support for the {@link +android.support.v4.view.ViewCompat postOnAnimation()} method in {@link +android.support.v4.view.ViewCompat}.</li> + <li>Updated {@link android.support.v4.app.NavUtils} to use Android 4.1 (API level 16) +<em>Up</em> navigation functionality when available.</li> + </ul> + </li> + + <li>Accessibility + <ul> + <li>Updated accessibility support classes, including {@link +android.support.v4.view.accessibility.AccessibilityNodeInfoCompat}, to follow fixes made in Android +4.1 (API level 16).</li> + <li>Added support for accessibility scroll actions in {@link +android.support.v4.view.ViewPager}.</li> + </ul> + </li> + + <li>General improvements + <ul> + <li>Updated {@link android.support.v4.app.TaskStackBuilder} to reflect API changes in +Android 4.1 (API level 16).</li> + <li>Enhanced {@link android.support.v4.app.TaskStackBuilder} to allow it to be used +from a Service.</li> + <li>Added support for {@link android.support.v4.content.IntentCompat EXTRA_HTML_TEXT} +to {@link android.support.v4.app.ShareCompat}.</li> + <li>Updated {@link android.support.v4.app.NotificationCompat.Builder} to support the +{@link android.support.v4.app.NotificationCompat.Builder#setNumber setNumber()} method.</li> + <li>Added support in {@link android.support.v4.net.ConnectivityManagerCompat} for the +{@link android.support.v4.net.ConnectivityManagerCompat#isActiveNetworkMetered +isActiveNetworkMetered()} method.</li> + </ul> + </li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 8</a> <em>(April 2012)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Fixed intent flags for {@link android.app.PendingIntent} objects generated + by {@link android.support.v4.app.TaskStackBuilder}.</li> + <li>Removed unused attributes from the gridlayout library projects to make sure + the library can be built with API level 7 and higher.</li> + <li>Added {@code .classpath} and {@code .project} files for the gridlayout + library project.</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 7</a> <em>(March 2012)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added {@link android.support.v4.app.ShareCompat}, which provides helper classes +for sending and receiving content for social sharing applications, including new metadata for +attributing shared data to the source app. This class also provides compatible integration with the +new {@link android.widget.ShareActionProvider} in Android 4.0.</li> + <li>Added {@link android.support.v4.app.NavUtils} and {@link +android.support.v4.app.TaskStackBuilder} to provide support for implementing the +<a href="{@docRoot}design/index.html">Android Design</a> guidelines for navigation. These +additions include a way to implement the action bar's <em>Up</em> button across versions. +For an example implementation of this pattern, see the AppNavigation sample in +({@code <em><sdk></em>/samples/<em><platform></em>/AppNavigation}).</li> + <li>Added {@link android.support.v4.app.NotificationCompat.Builder} to provide a +compatibility implementation of Android 3.0's {@link android.app.Notification.Builder} helper class +for creating standardized system notifications.</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 6</a> <em>(December 2011)</em> + </p> + <div class="toggle-content-toggleme"> + + <p class="note"><strong>Note:</strong> Reference for support library APIs are now available with + the framework references, for example: {@link android.support.v4.app}.</p> +<dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Changes to ViewPager: + <ul> + <li>Added extra decorative view support for {@link android.support.v4.view.ViewPager}. + Decorative views may be supplied as child views of a pager in XML layout.</li> + <li>Added {@link android.support.v4.view.PagerAdapter#getPageTitle + PagerAdapter.getPageTitle()} to supply title strings for pages, which defaults to no + title for each page.</li> + <li>Added {@link android.support.v4.view.PagerTitleStrip}, a non-interactive title + strip, that can be added as a child of ViewPager. Developers can supply text + appearance and color, as well as layout sizing and gravity information.</li> + <li>Updated {@link android.support.v4.view.PagerAdapter} methods to take ViewGroup + objects, rather than View to avoid class casting in adapter implementations.</li> + <li>Updated {@link android.support.v4.view.ViewPager} to use Launcher-style + fling behavior.</li> + <li>Bug fixes for user interface interaction and test automation.</li> + </ul> + </li> + + <li>Support for Fragments: + <ul> + <li>Changed {@code setStartDeferred()} method to {@link + android.support.v4.app.Fragment#setUserVisibleHint}.</li> + <li>Added deferred start for off-screen pages to improve performance.</li> + </ul> + </li> + + <li>Support for Accessiblity APIs: + <ul> + <li>Updated {@link android.support.v4.view.AccessibilityDelegateCompat} methods + to return empty lists instead of null.</li> + <li>Added new APIs needed by the v4 samples.</li> + </ul> + </li> + + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 5</a> <em>(December 2011)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Support for Accessiblity APIs: + <ul> + <li>Added {@link android.support.v4.view.AccessibilityDelegateCompat} + to support {@link android.view.View.AccessibilityDelegate}.</li> + + <li>Added {@link android.support.v4.view.accessibility.AccessibilityEventCompat} + to support {@link android.view.accessibility.AccessibilityEvent}.</li> + + <li>Added {@link android.support.v4.view.accessibility.AccessibilityManagerCompat} + to support {@link android.view.accessibility.AccessibilityManager}.</li> + + <li>Added {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} + to support {@link android.view.accessibility.AccessibilityNodeInfo}.</li> + + <li>Added {@link android.support.v4.view.accessibility.AccessibilityRecordCompat} + to support {@link android.view.accessibility.AccessibilityRecord}.</li> + + <li>Added {@link + android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat} + to support {@link android.accessibilityservice.AccessibilityServiceInfo}.</li> + + <li>Added {@link android.support.v4.view.ViewGroupCompat} + to support accessibility features in {@link android.view.ViewGroup}. + </li> + + <li>Modified {@link android.support.v4.view.ViewCompat} + to support accessibility features in {@link android.view.View}.</li> + </ul> + </li> + + <li>Changes to ViewPager: + <ul> + <li>Added support for margins between pages. + An optional {@link android.graphics.drawable.Drawable} can be provided + to fill the margins.</li> + <li>Added support for {@link android.widget.EdgeEffect}.</li> + <li>Added support for keyboard navigation</li> + <li>Added support to control how many pages are kept to either side + of the current page.</li> + <li>Improved touch physics.</li> + <li>Bug fixes for user interface behavior.</li> + </ul> + </li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 4</a> <em>(October 2011)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added <code>EdgeEffectCompat</code> to + support {@link android.widget.EdgeEffect}.</li> + + <li>Added <code>LocalBroadcastManager</code> to allow applications to easily + register for and receive intents within a single application without + broadcasting them globally.</li> + + <li>Added support in <code>ViewCompat</code> to check for and set overscroll + modes for {@link android.view.View}s on Android 2.3 and later.</li> + <li>Changes to Fragment APIs: + <ul> + <li>Added new APIs to control the visibility of new menus.</li> + <li>Added custom animation APIs.</li> + <li>Added APIs in <code>FragmentActivity</code> to retain custom, + non-configuration instance data.</li> + <li>Various bug fixes.</li> + </ul> + </li> + + <li>Fixed a {@link android.content.Loader} bug that caused issues in + canceling {@link android.os.AsyncTask}s when running on Froyo and older + versions of the platform. The support + code now uses its own version of {@link android.os.AsyncTask} to keep the same + behavior on all platform versions.</li> + + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 3</a> <em>(July 2011)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Adds support for {@link android.app.Fragment.SavedState}</li> + <li>Adds {@code MotionEventCompat} to support newer {@link +android.view.MotionEvent} APIs</li> + <li>Adds {@code VelocityTrackerCompat} to support a newer {@link +android.view.VelocityTracker} APIs</li> + <li>Adds {@code ViewConfigurationCompat} to support a newer {@link +android.view.ViewConfiguration} APIs</li> + <li>All new APIs (available only in the support library) that allow you to create UIs +with horizontal paging, allowing users to swipe left and right between content views. Classes to +support this include: + <ul> + <li>{@code ViewPager}: A {@link android.view.ViewGroup} that manages the +layout for the child views, which the user can swipe between.</li> + <li>{@code PagerAdapter}: An adapter that populates the {@code ViewPager} with the +views that represent each page.</li> + <li>{@code FragmentPagerAdapter}: An extension of {@code PagerAdapter} for flipping +between fragments.</li> + <li>{@code FragmentStatePagerAdapter}: An extension of {@code PagerAdapter} for +flipping between fragments that uses the library's support for {@link +android.app.Fragment.SavedState}.</li> + </ul> + </li> + </ul> + </dd> + <dt>New v13 support library:</dt> + <dd> + <ul> + <li>Includes the {@code FragmentPagerAdapter} and {@code FragmentStatePagerAdapter} +to support the horizontal paging. + <p>These are exactly the same as the APIs added to the v4 support library, but rely on +other platform components in Android 3.2. Use this library instead of v4 if you're developing for +Android 3.2 and higher (all other APIs in the v4 library are already available with API level +13).</p> + </li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 2</a> <em>(May 2011)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Changes for v4 library:</dt> + <dd> + <ul> + <li>Support for fragment animations</li> + <li>Fix {@link android.support.v4.app.Fragment#onActivityResult Fragment.onActivityResult()} + bug</li> + </ul> + </dd> + </dl> + </div> +</div> + + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/styles/disclosure_down.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 1</a> <em>(March 2011)</em> + </p> + <div class="toggle-content-toggleme"> + <p>Initial release with the v4 library.</p> + </div> +</div> + diff --git a/docs/html/wear/index.jd b/docs/html/wear/index.jd index 62c0253508af..f5e9e87748b9 100644 --- a/docs/html/wear/index.jd +++ b/docs/html/wear/index.jd @@ -68,14 +68,43 @@ nonavpage=true </div> </div> <!-- end .wrap --> <div class="landing-scroll-down-affordance"> - <a class="landing-down-arrow" href="#extending-android-to-wearables"> + <a class="landing-down-arrow" href="#next-section"> <img src="{@docRoot}wear/images/carrot.png" alt="Scroll down to read more"> </a> </div> </div> <!-- end .landing-section .landing-hero --> - <div class="landing-rest-of-page"> + <div class="landing-rest-of-page" id="next-section"> + + + <section class="dac-expand dac-hero dac-light" style="background-color:#FFFFFF"> + <div class="wrap" style="max-width:1100px;margin-top:0"> + <div class="cols dac-hero-content" style="padding-bottom:1em;"> + + <div class="col-7of16 col-push-9of16" style="padding-left:2em"> + <h1 class="dac-hero-title">Android Wear 2.0 Developer Preview</h1> + <p class="dac-hero-description"> + Get ready for the next version of Android Wear! + Support stand-alone Wear devices and apps. + Create enhanced user interaction and glanceable experiences. + Test your apps on Wear devices. + </p> + + <a class="dac-hero-cta" href="{@docRoot}wear/preview/index.html"> + <span class="dac-sprite dac-auto-chevron"></span> + Get started + </a> + </div> + <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;"> + <img class="dac-hero-image" src="{@docRoot}wear/preview/images/hero-1x.png" + srcset="{@docRoot}wear/preview/images/hero-1x.png 1x, + {@docRoot}wear/preview/images/hero-2x.png 2x"> + </div> + </div> + </div> + </section> + <div class="landing-section" id="extending-android-to-wearables"> <div class="wrap"> <div class="landing-section-header"> diff --git a/docs/html/wear/preview/_book.yaml b/docs/html/wear/preview/_book.yaml index a68729427e48..a4acad04afcc 100644 --- a/docs/html/wear/preview/_book.yaml +++ b/docs/html/wear/preview/_book.yaml @@ -10,21 +10,21 @@ toc: section: - title: Notification Improvements path: /wear/preview/features/notifications.html - - title: Input Method Framework + - title: Input Method Framework path: /wear/preview/features/ime.html - title: Complications path: /wear/preview/features/complications.html - - title: Wear Navigation and Actions + - title: Navigation and Actions path: /wear/preview/features/ui-nav-actions.html - title: Bridging for Notifications path: /wear/preview/features/bridger.html -- title: Downloads - path: /wear/preview/downloads.html - - title: Get Started path: /wear/preview/start.html +- title: Download and Test + path: /wear/preview/downloads.html + - title: License Agreement path: /wear/preview/license.html diff --git a/docs/html/wear/preview/api-overview.jd b/docs/html/wear/preview/api-overview.jd index bf18c16c6780..384cb0a416ce 100644 --- a/docs/html/wear/preview/api-overview.jd +++ b/docs/html/wear/preview/api-overview.jd @@ -12,26 +12,30 @@ page.image=images/cards/card-n-apis_2x.png <h2>Key developer features</h2> <ol> <ul style="list-style-type:none;"> - <li><a href="#stand-alone">Stand Alone Devices</a> + <li><a href="#ui">User Interface Improvements</a> <ol> - <li><a href="#wear-apk">Wear-Specific APKs</a></li> - <li><a href="#network">Network Access</a></li> - <li><a href="#auth">Authentication</a></li> + <li><a href="#complications">Complications</a></li> + <li><a href="#drawers">Navigation and Action Drawers</a></li> </ol> </li> - <li><a href="#notify">Notifications and Interactions</a> + + <li><a href="#notify">Notifications and Input</a> <ol> - <li><a href="#appoid">Appoids with Chat Templates</a></li> - <li><a href="#smart-replies">Smart Replies</a></li> + <li><a href="#expanded">Expanded Notification</a></li> + <li><a href="#messaging">Messaging Style Notification</a></li> + <li><a href="#smart-replies">Smart Reply</a></li> + <li><a href="#content-action">Notification Content Action</a> <li><a href="#remote-input">Remote Input</a></li> + <li><a href="#bridging">Bridging Mode</a></li> <li><a href="#imf">Input Method Framework</a></li> </ol> </li> - <li><a href="#ui">User Interface Improvements</a> + + <li><a href="#stand-alone">Standalone Devices</a> <ol> - <li><a href="#complicatiosn">Complications</a></li> - <li><a href="#drawers">Navigation and Action Drawers</a></li> - <li><a href="#button-loc">Button Locations</a></li> + <li><a href="#wear-apk">Wear-Specific APKs</a></li> + <li><a href="#network">Network Access</a></li> + <li><a href="#auth">Authentication</a></li> </ol> </li> </ol> @@ -47,78 +51,283 @@ page.image=images/cards/card-n-apis_2x.png </p> -<h2 id="stand-alone">Stand Alone Devices</h2> +<h2 id="ui">User Interface Improvements</h2> -<p>Description of developer theme</p> +<p>The preview introduces powerful additions to the user interface, opening up +exciting possibilities to developers. +A complication is any feature in a watch face that displays more than hours and +minutes. With the Complications API, + watch faces can display extra information and separate apps can expose complication + data. +The navigation and action drawers provide users with new ways to interact with apps. +</p> -<h3 id="wear-apk">Wear-Specific APKs</h3> -<p>Description of feature</p> +<h3 id="complications">Complications</h3> +<img src="{@docRoot}wear/preview/images/complications-main-image.png" + height="320" style="float:right;margin:10px 0 0 40px" /> -<p>Sample implementation of feature</p> +<p> + A <a href= + "https://en.wikipedia.org/wiki/Complication_(horology)">complication</a> is a + feature of a watch face that displays more than hours and minutes, such as a + battery indicator or a step counter. The Complications API helps watch face + developers create these features visual features and data connections they + require. +</p> -<h3 id="network">Network Access</h3> +<p> + Watch faces that use this API can display extra information without needing + code for getting the underlying data. Data providers can supply data to any + watch face using the API. +</p> -<p>Description of feature</p> +<p>For examples of how to use this feature, +see <a href="{@docRoot}wear/preview/features/complications.html"> + Watch Face Complications</a>. +</p> -<p>Sample implementation of feature</p> -<h3 id="auth">Authentication</h3> +<h3 id="drawers">Navigation and Action drawers</h3> + +<p>Wear 2.0 introduces two new widgets, navigation drawer and action drawer. These + widgets give your users new ways to interact with your app. The navigation drawer + appears at the top of the screen and allows users to navigate between app views. + The action drawer appears at the bottom of the screen and allows users to choose + from a list of actions associated with the current usage context. These drawers + are accessible to users when they edge swipe from the top or bottom of the + screen; they peek when users scroll in an opposite direction. +</p> + +<div class="cols"> + <div class="col-2of6"> + <img src="{@docRoot}wear/preview/images/nav_drawer.gif" + height="240" alt="" style="padding:.5em"> + </div> + <div class="col-2of6"> + <img src="{@docRoot}wear/preview/images/action_drawer.gif" + height="240" alt="" style="padding:.5em;"> + </div> +</div> + +<p> + To learn how to add these widgets to your app, see + <a href="{@docRoot}wear/preview/features/ui-nav-actions.html"> + Wear Navigation and Actions</a>. +</p> -<p>Description of feature</p> -<p>Sample implementation of feature</p> +<h2 id="notify">Notifications and Input</h2> +<p>In Wear 2.0, we’ve redesigned the key experiences on the watch to be even more + intuitive and provide users new ways to respond to messages. Some of the highlights + are below; for a complete list of changes, see + <a href="{@docRoot}wear/preview/features/notifications.html">Notification Changes in Wear 2.0</a>. -<h2 id="notify">Notifications and Interactions</h2> +<img src="{@docRoot}wear/preview/images/expanded_diagram.png" height="340" + style="float:left;margin:10px 20px 0 0" /> +<h3 id="expanded">Expanded notifications</h3> -<p>Description of developer theme</p> +<p> + When a user taps on a notification that is bridged from the phone to the + watch or that lacks a + <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.Builder.html#setContentIntent(android.app.PendingIntent)"> + {@code contentIntent}</a>, the user will be taken to the expanded view of + that notification. When you <a href= + "{@docRoot}training/wearables/notifications/pages.html">specify additional + content pages</a> and actions for a notification, those are available to the + user within the expanded notification. Each expanded notification follows + <a href="https://google.com/design/spec-wear">Material Design for Android + Wear</a>, so the user gets an app-like experience. +</p> + + +<h3 id="messaging">Messaging Style notification</h3> +<p> If you have a chat messaging app, your notifications should use +{@code Notification.MessagingStyle}, which is new in Android 6.0. Wear 2.0 uses +the chat messages included in a +<a href="{docRoot}preview/features/notification-updates.html#style">{@code MessagingStyle}</a> + notification +(see {@code addMessage()}) to provide a rich chat app-like experience in the +expanded notification. +</p> -<h3 id="appoid">Appoids with Chat Templates</h3> -<p>Description of feature</p> +<h3 id="smart-replies">Smart Reply</h3> -<p>Sample implementation of feature</p> +<p>Android Wear 2.0 introduces support for Smart Reply in +<a href="{@docRoot}wear/preview/features/notifications.html#messaging">{@code MessagingStyle}</a> + notifications. Smart Reply provides the user with contextually relevant, + touchable choices in the expanded notification and in + <a href="{@docRoot}reference/android/app/RemoteInput.html">{@code RemoteInput}</a>. +</p> -<h3 id="smart-replies">Smart Replies</h3> +<p>By enabling Smart Reply for your {@code MessagingStyle} notifications, you provide +users a fast (single tap), discreet (no speaking aloud), and reliable way to respond + to chat messages they receive. + </p> -<p>Description of feature</p> -<p>Sample implementation of feature</p> +<img src="{@docRoot}wear/preview/images/remoteinput.png" height="350" + style="float:right;margin:10px 0 0 40px" /> <h3 id="remote-input">Remote Input</h3> -<p>Description of feature</p> +<p>Wear 2.0 users can choose between various input options from +<a href="{@docRoot}reference/android/app/RemoteInput.html">Remote Input</a>. + These options include: +</p> +<ul> +<li>Dictation</li> +<li>Emoji</li> +<li>Canned responses</li> +<li>Smart Reply</i> +<li>Default IME </i> +</ul> -<p>Sample implementation of feature</p> +<p> +For messaging notifications with Smart Reply, the system-generated Smart Reply + appears within <a href="{@docRoot}reference/android/app/RemoteInput.html">{@code RemoteInput}</a> + above the developer-provided list of canned responses. + You can also use the + <a href="{@docRoot}reference/android/app/RemoteInput.Builder.html#setChoices(java.lang.CharSequence[])">setChoices()</a> + method in the {@code RemoteInput} API to enable users to select from a list + of canned responses. +</p> + +<h3 id="bridging"> Bridging Mode </h3> +<p>By default, notifications are +<a href="{@docRoot}training/wearables/notifications/index.html"> +bridged</a> (shared) from an app on a companion phone +to the watch. Since a phone app and a standalone watch app may be sources of the + same notifications, the Android Wear 2.0 Preview includes a Bridging mode feature. + Developers can begin planning to change the behavior of notifications with the + following: +</p> + +<ul> +<li>Specifying in the standalone app's Android manifest file that notifications from + the corresponding phone app should not be bridged to the watch. </li> +<li>Setting a dismissal ID so notification dismissals (by users) are synced across +devices.</li> +</ul> + +<p>For an example of how to use this feature, see <a href="{@docRoot}wear/preview/features/bridger.html"> +Bridging Mode for Notifications</a>.</p> <h3 id="imf">Input Method Framework</h3> -<p>Description of feature</p> +<p>Wear 2.0 extends the Android input method framework (IMF) to Android Wear. +This allows users to enter text on Wear using the system default IME or third party + IMEs. The Wear IME lets the user enter text via gesture typing as well as tapping + individual keys. The IMF APIs used for Wear devices are the same as other form + factors, though usage is slightly different due to limited screen real estate. +</p> -<p>Sample implementation of feature</p> +<p>Wear provides user settings on the watch that let the user:</p> +<ul> +<li>Enable multiple IMEs from the list of installed IMEs.</li> +<li>Set a single default IME from the list of enabled IMEs.</li> +<li>Change languages for various IMEs.</li> +</ul> +<p>To learn how to create an IME for Wear, see <a href="{@docRoot}wear/preview/features/ime.html"> +Input Method Framework</a>. +</p> -<h2 id="ui">User Interface Improvements</h2> +<h2 id="stand-alone">Standalone Devices</h2> + +<p>Standalone watches will enable Android Wear apps to work independently of phone + apps. This means your app can continue to offer full functionality even if the + paired phone is far away or turned off. </p> + +<h3 id="wear-apk">Wear-Specific APKs</h3> + +<p>For delivery to a watch, an Android Wear app is currently embedded in its corresponding +phone app. This delivery method can result in an increased download size for users, + regardless of whether they have an Android Wear device. +</p> + +<p>With standalone devices, the +<a href ="{@docRoot}google/play/publishing/multiple-apks.html">Multi-APK</a> + delivery method will be used. Developers will have the ability to release Android + Wear apps independently of the corresponding phone apps. Please stay tuned for + more information about this change. +</p> -<p>Description of developer theme</p> +<h3 id="network">Network Access</h3> -<h3 id="complicatiosn">Complications</h3> +<p>Since Android Wear apps will work independently of phone apps, Android Wear's + network access will no longer require the + <a href="{@docRoot}training/wearables/data-layer/index.html"> + Wearable Data Layer API</a>. Android Wear apps will have the ability to make + their own network requests. Additionally, they will be able to directly use + Google Cloud Messaging. +</p> -<p>Description of feature</p> +<p>No APIs for network access or GCM are specific to Android Wear; refer to the +existing documentation about +<a href="{@docRoot}training/basics/network-ops/connecting.html"> +Connecting to the Network</a> and +<a href="https://developers.google.com/cloud-messaging/">Cloud Messaging</a>. +</p> -<p>Sample implementation of feature</p> +<p>We recommend using the following libraries:</p> +<ul> +<li><a href="{@docRoot}reference/android/app/job/JobScheduler.html"> +JobScheduler</a> for asynchronous jobs, including polling at regular intervals +</li> +<li>Multi-networking APIs if you need to connect to specific network types; see +the <a href="{@docRoot}about/versions/android-5.0.html#Wireless"> +Multiple Network Connections</a> +</li> +</ul> -<h3 id="drawers">Navigation and Action Drawers</h3> +<p>You will still be able to use the +<a href="{@docRoot}training/wearables/data-layer/index.html"> + Wearable Data Layer API</a> to communicate with a phone app. + However, use of this API to connect to a network will be discouraged. + </p> -<p>Description of feature</p> -<p>Sample implementation of feature</p> +<h3 id="auth">Authentication</h3> + +<p>Since Android Wear apps will work independently of phone apps, Android Wear's + authentication capabilities will be more powerful; apps will have new ways to + authenticate.</p> + + <h4> Authentication tokens can be passed over the Wearable Data Layer </h4> + +<p>For Android-paired watches (only), the phone will securely transfer authentication + data to a watch app via the + <a href="{@docRoot}training/wearables/data-layer/index.html"> + Wearable Data Layer API</a>. The data can be transferred as + Messages or Data Items. </p> + +<p>If your watch app needs to determine if your phone app is installed, you can +advertise a capability on the phone app and retrieve the capability on the watch. + For more information, see following sections of + <a href="{@docRoot}training/wearables/data-layer/messages.html"> + Sending and Receiving Messages</a>: + <ul> + <li>Advertise Capabilities</li> + <li>Retrieve the Nodes with the Required Capabilities</li> + </ul> +<h4>Users can enter a username and password on a watch</h4> + +<p>Google Keyboard will be standard on Android Wear, allowing for direct text entry. + This feature will work as expected with standard + <a href="{@docRoot}reference/android/widget/EditText.html"> + EditText widgets</a>. For passwords, the {@code textPassword} attribute will be + used. + +<h4>Utilizing Account Manager</h4> +Android Wear will include the <a href="{@docRoot}reference/android/accounts/AccountManager.html"> +AccountManager</a>, which will be accessible for syncing and storing account + data, as it is on an Android phone. +</p> -<h3 id="button-loc">Button Locations</h3> -<p>Description of feature</p> -<p>Sample implementation of feature</p> diff --git a/docs/html/wear/preview/downloads.jd b/docs/html/wear/preview/downloads.jd index eea4f111918c..b119d57b0e72 100644 --- a/docs/html/wear/preview/downloads.jd +++ b/docs/html/wear/preview/downloads.jd @@ -1,9 +1,10 @@ page.title=Download and Test with a Device meta.keywords="wear-preview" page.tags="wear-preview" -page.image=images/cards/card-n-sdk_2x.png +page.image=images/cards/card-n-downloads_2x.png @jd:body + <div style="position:relative; min-height:600px"> <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;"> @@ -192,17 +193,17 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </ul> <p> - If you want an environment for basic <strong>compatibility - testing</strong> of your app, you can use your current APK and a + If you want an environment for basic compatibility + testing of your app, you can use your current APK and a supported watch or an emulator. As described below, you don't necessarily need to update your full development environment to do basic testing. </p> <p> - However, if you want to <strong>modify</strong> your app to target + However, if you want to modify your app to target Android Wear 2.0 or use new APIs, you need to update your development environment. See <a href="{@docRoot}wear/preview/start.html">Get Started - with the Android Wear 2.0 Preview</a>. + with the Preview</a>. </p> <h2 id="set_up_a_watch"> @@ -211,7 +212,7 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <p> You can download a system image and manually flash it to a matching - watch. See the table below to download the system image for your test + watch. See the table below to download the image for your test watch. </p> @@ -221,9 +222,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement testing. </p> - <p> - Installing a system image on a watch <strong>removes all data from the - watch</strong>, so you should back up your data first. + <p class="warning"> + <strong>Warning:</strong> Installing a system image on a watch removes all data from the + watch, so you should back up your data first. </p> <h3 id="preview_system_images"> @@ -240,78 +241,79 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement Preview image for LGE Watch Urbane 2nd Edition </h4> - <p> - <strong>Please note the following:</strong> - Flashing your device will + <p class="caution"> + <strong>Caution:</strong> Flashing your device will require unlocking the bootloader which may void the device's warranty--proceed at your own risk. </p> <table> <tr> - <th scope="col"> + <th style="width:300px"> Type of LGE Watch Urbane 2nd Edition image </th> - <th scope="col"> + <th> Download/Checksums </th> </tr> - <tr id="download-3-placeholder"> + + <tr id="nemo-preview"> <td> Preview image for testing </td> - <td><a href="#top" onclick="onDownload(this)">download-3-placeholder.tgz</a><br> - MD5: [string]<br> - SHA-1: [string] + <td><a href="#top" onclick="onDownload(this)">nemo-nvd36i-factory-9cdd2ac0.tgz</a><br> + MD5: b33ba8e59780fbe5c83d8936b108640f<br> + SHA-1: 9cdd2ac01f2976cafe5a21958298dac159b7a325 </td> </tr> - <tr id="download-4-placeholder"> + + <tr id="nemo-non-preview"> <td> Non-preview image (for after testing) </td> - <td><a href="#top" onclick="onDownload(this)">download-4-placeholder.tgz</a><br> - MD5: [string]<br> - SHA-1: [string] + <td><a href="#top" onclick="onDownload(this)">nemo-mnc40x-factory-fa528bec.tgz</a><br> + MD5: 0b8ba3653d5a93cb854f4d7409d7b6c9<br> + SHA-1: fa528bec8aba3bf6c7d901ba63cd6ea0a08dbeb0 </td> </tr> + </table> <h4 id="preview_image_for_huawei_watch"> Preview image for Huawei Watch </h4> - <p> - <strong>Please note the following:</strong> - Flashing your device will require unlocking + <p class="caution"> + <strong>Caution:</strong> Flashing your device will require unlocking the bootloader which shall void the device's warranty--proceed at your own risk. </p> <table> <tr> - <th scope="col"> + <th style="width:300px"> Type of Huawei Watch image </th> - <th scope="col"> + <th> Download/Checksums </th> </tr> - <tr id="download-1-placeholder"> + <tr id="sturgeon-preview"> <td> Preview image for testing </td> - <td><a href="#top" onclick="onDownload(this)">download-1-placeholder.tgz</a><br> - MD5: [string]<br> - SHA-1: [string] + <td><a href="#top" onclick="onDownload(this)">sturgeon-nvd36i-factory-2cbe5080.tgz</a><br> + MD5: ccc972cdc33cba778a2f624066ef5713<br> + SHA-1: 2cbe5080ded060ce43ba65ff27e2290b28981634 </td> </tr> - <tr id="download-2-placeholder"> + <tr id="sturgeon-non-preview"> <td> Non-preview image (for after testing) </td> - <td><a href="#top" onclick="onDownload(this)">download-2-placeholder.tgz</a><br> - MD5: [string]<br> - SHA-1: [string] + <td><a href="#top" onclick="onDownload(this)">sturgeon-mec23l-factory-48003078.tgz</a><br> + MD5: 417b5cbddb29a2262bce133e283d2732<br> + SHA-1: 4800307843580f818557dd7c43d8ba2161e289b2 </td> </tr> </table> @@ -323,18 +325,24 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <p> The steps for flashing an image to a watch are similar to the <a href= "https://developers.google.com/android/nexus/images">steps provided for - flashing to a phone</a>. After you <strong>back up your watch - data</strong>, use steps in this section to flash the image to the - <strong>specific watch</strong> that matches the image (e.g., you must + flashing to a phone</a>. After you back up your watch + data, use steps in this section to flash the image to the + specific watch that matches the image (e.g., you must use an LGE Watch Urbane 2nd Edition for the corresponding image). </p> + <p class="warning"> + <strong>Warning:</strong> Installing a system image on a watch removes all data from the + watch, so you should back up your data first. + </p> + <h4 id="set_up_the_watch_to_be_flashed"> Set up the watch to be flashed </h4> <p> - On the watch, enable the Developer Options menu and ADB debugging as + From the phone, unpair ("Forget") the watch. + Then on the watch, enable the Developer Options menu and ADB debugging as follows: </p> @@ -386,8 +394,8 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </p> <ol> - <li>Download and unzip the appropriate system image from the "Preview - system image" column in the <a href="#preview_system_images">table + <li>Download and unzip the appropriate system image from a "Preview + image for testing" row in a <a href="#preview_system_images">table above</a>. </li> @@ -404,9 +412,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <code>adb reboot bootloader</code> </li> - <li>If necessary, use <strong>one</strong> of following two commands to - unlock the device's bootloader. This step <strong>erases all data on the - device</strong>: <code>fastboot flashing unlock</code> or, for some + <li>If necessary, use one of following two commands to + unlock the device's bootloader. This step erases all data on the + device: <code>fastboot flashing unlock</code> or, for some devices, <code>fastboot oem unlock</code> </li> @@ -420,8 +428,43 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </li> </ol> + + <h4 id="set_up_watch"> + Set up the watch and begin testing + </h4> + + <p> + After the <code>flash-all</code> script finishes, your watch reboots + and soon will be ready for testing with the preview image. + </p> + + <ol> + <li>Attach the watch charger to the watch and plug the USB cord + into your computer, if it is not already plugged in. + </li> + + <li>Use the following <a href="{@docRoot}tools/help/adb.html">adb + command</a> to confirm that the watch is available: + <code>adb devices</code> + </li> + + <li>Use the following adb command to start the device in fastboot mode: + <code>adb reboot bootloader</code> + </li> + + <li>Use the following command to + lock the device's bootloader: <code>fastboot flashing lock</code> or, for some + devices, <code>fastboot oem lock</code> + </li> + + <li>On the watch, continue the boot by touching <strong>'0'</strong>. + </li> + + </ol> + + <p> - After the script finishes, your watch reboots. Pair the watch with a + Pair the watch with a phone or tablet. The preview now is available for testing on the watch. Before installing an app, enable the Developer Options menu, and ADB debugging, on the watch as follows: @@ -477,20 +520,21 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <p> When testing is completed, follow the steps for <a href= - "#uninstall_the_preview_from_a_watch">uninstalling the preview</a>. + "#remove_the_preview_from_a_watch">removing the preview</a>. </p> - <h3 id="uninstall_the_preview_from_a_watch"> - Uninstall the preview from a watch + <h3 id="remove_the_preview_from_a_watch"> + Remove the preview from a watch </h3> <p> - When testing with the preview is done, restore the watch as follows: + When testing with the preview is done, unpair ("Forget") the watch from the phone and + restore the watch as follows: </p> <ol> - <li>Download and unzip the appropriate system image from the "Non-preview - system image" column in the <a href="#preview_system_images">table + <li>Download and unzip the appropriate system image from a "Non-preview + image" row in a <a href="#preview_system_images">table above</a>. </li> @@ -523,8 +567,10 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <li>Click <strong>Create Virtual Device</strong>. </li> - <li>In the <strong>Category</strong> pane, select Wear, choose a name - (such as Android Wear Round), and click <strong>Next</strong>. + <li>In the <strong>Category</strong> pane, select Wear, choose a hardware profile, + and click <strong>Next</strong>. The Android Wear 2.0 Developer Preview + is only optimized for round devices currently, so we recommend not + using the square or chin profiles for now. </li> <li>Select an <strong>N</strong> image to download. The images may be on @@ -554,7 +600,7 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <script> - var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/wear/preview/"; + var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/wear-preview/"; function onDownload(link) { $("#downloadForRealz").html("Download " + $(link).text()); diff --git a/docs/html/wear/preview/features/bridger.jd b/docs/html/wear/preview/features/bridger.jd index 4f0d76b70c96..b7be093ed298 100644 --- a/docs/html/wear/preview/features/bridger.jd +++ b/docs/html/wear/preview/features/bridger.jd @@ -1,7 +1,7 @@ page.title=Bridging Mode for Notifications meta.keywords="wear-preview" page.tags="wear-preview" -page.image=images/cards/card-n-sdk_2x.png + @jd:body <div id="qv-wrapper"> @@ -25,22 +25,21 @@ page.image=images/cards/card-n-sdk_2x.png <p> By default, notifications <a href= "{@docRoot}training/wearables/notifications/index.html">are bridged - (shared)</a> from an app on a companion phone to the watch. Standalone - Android Wear apps are planned for Android Wear 2.0. Therefore, a phone - app and a standalone watch app may be sources of the same notifications. - The Android Wear 2.0 Preview includes a Bridging mode feature to handle - this problem of duplicate notifications. + (shared)</a> from an app on a companion phone to the watch. If you build + a standalone watch app and have a companion phone app, they may duplicate + notifications. The Android Wear 2.0 Preview includes a Bridging mode + feature to handle this problem of repeated notifications. </p> <p> - With the Android Wear 2.0 Preview, developers can plan to change the + With the Android Wear 2.0 Preview, developers can change the behavior of notifications with the following: </p> <ul> <li>Specifying in the standalone app's Android manifest file that - notifications from the corresponding phone app should <strong>not be - bridged</strong> to the watch + notifications from the corresponding phone app should not be + bridged to the watch </li> <li>Setting a dismissal ID so notification dismissals are synced across @@ -53,14 +52,15 @@ page.image=images/cards/card-n-sdk_2x.png </h2> <p> - To prevent bridging of notifications from a phone app, you can use a + To prevent bridging of notifications from a phone app, you can use an entry in the manifest file of the watch app (e.g. the standalone watch app), as follows: </p> <pre> com.google.android.wearable.notificationBridgeMode -</pre> + </pre> + <p> Setting that entry to <code>NO_BRIDGING</code> will prevent bridging: </p> @@ -96,7 +96,7 @@ com.google.android.wearable.notificationBridgeMode </p> <p> - Thus, if bridging should be prevented <strong>when</strong> the watch app + Thus, if bridging should be prevented when the watch app is installed, use the <a href= "#preventing_bridging_with_the_bridging_mode_feature">Bridging mode feature</a>. @@ -118,7 +118,7 @@ com.google.android.wearable.notificationBridgeMode <pre> public WearableExtender setDismissalId(String dismissalId) public String getDismissalId() -</pre> + </pre> <p> To enable a dismissal to be synced, use the <code>setDismissalId()</code> method. For each notification, pass a globally unique ID, as a string, @@ -140,7 +140,7 @@ Notification notification = new NotificationCompat.Builder(context) <set other fields> .extend(wearableExtender) .build(); -</pre> + </pre> <p> Dismissal IDs work if a watch is paired to an Android phone, but not if a watch is paired to an iPhone. diff --git a/docs/html/wear/preview/features/complications.jd b/docs/html/wear/preview/features/complications.jd index 155f7335e8ef..a0157de10ffe 100644 --- a/docs/html/wear/preview/features/complications.jd +++ b/docs/html/wear/preview/features/complications.jd @@ -1,46 +1,52 @@ page.title=Watch Face Complications meta.keywords="wear-preview" page.tags="wear-preview" -page.image=images/cards/card-n-sdk_2x.png - +page.image=/wear/preview/images/complications-main-image.png @jd:body <div id="qv-wrapper"> <div id="qv"> - <ol> + <h2>In this document</h2> + <ol> <li> - <a href= - "#adding_complications_to_a_watch_face">Adding Complications to a Watch Face</a> + <a href="#adding_complications_to_a_watch_face">Adding + Complications to a Watch Face</a> </li> <li> - <a href= - "#exposing_data_to_complications">Exposing Data to Complications</a> + <a href="#exposing_data_to_complications">Exposing Data to + Complications</a> </li> <li> - <a href= - "#using_complication_types">Using Complication Types</a> + <a href="#using_complication_types">Using Complication Types</a> </li> <li> - <a href= - "#using_fields_for_complication_data">Using Fields for Complication Data</a> + <a href="#using_fields_for_complication_data">Using Fields for + Complication Data</a> </li> <li> - <a href= - "#api_additions">API Additions</a> + <a href="#api_additions">API Additions</a> </li> - </ol> + </ol> + <h2>See Also</h2> + <ol> + <li><a class="external-link" + href="https://github.com/googlesamples/android-WatchFace">Watch + Face sample app with complications</a></li> + </ol> </div> </div> <p> - A complication is a feature of a watch face <a href= - "https://en.wikipedia.org/wiki/Complication_(horology)">beyond hours and - minutes</a>. For example, a battery indicator is a complication. + A complication is any feature in a watch face that displays <a href= + "https://en.wikipedia.org/wiki/Complication_(horology)">more than hours and + minutes</a>. For example, a battery indicator is a complication. The + Complications API is for both watch faces and data provider apps. </p> - <p> - The Complications API is for both watch faces and data provider apps. - </p> + <div class="col-4of10"> + <img src="../images/complications-main-image.png" alt="Complications" + id="img-split-screen"> + </div> <p> Watch faces can display extra information without needing code for @@ -50,41 +56,44 @@ page.image=images/cards/card-n-sdk_2x.png </p> <p> - For creating or modifying watch faces, see <a href= - "#adding_complications_to_a_watch_face">Adding complications to a watch - face</a>. - </p> - - <p> - For writing apps that provide data to watch faces, see <a href= - "#exposing_data_to_complications">Exposing data to complications</a>. - </p> - - <p> Along with reviewing this page, download the Android Wear 2.0 Preview - Reference and review the <a href="#api_additions">API additions</a> in - the Javadoc for complications. + Reference (see the Complications API <a href= + "#api_additions">additions</a>) and review the Javadoc for complications. </p> <p> Apps that provide data to watch faces for complications are called - "complication data providers." These apps lack control over how their - data is rendered. The consuming watch faces are responsible for drawing + "complication data providers." These apps are not responsible for controlling + how their data is rendered on the watch face. + This allows a watch face to integrate the data naturally with the + watch face design. + The consuming watch faces are responsible for drawing the complications. </p> <p> + Watch faces can receive complication data of + <a href="#using_complication_types">various types</a> (e.g. small text + data or icon data) and then display it. + </p> + + <p> As indicated in the diagram below, Android Wear mediates the flow of data from providers to watch faces. </p> - <img src="../images/complications-data-flow.png" width="" alt="Complications data flow" title= - "Complications data flow"> + <img src="../images/complications-data-flow.png" width="" alt= + "Complications data flow" title="Complications data flow"> <p> - Through this process, watch faces can receive complication data of - <a href="#using_complication_types">various types</a> (e.g. small text - data or icon data) and then display it. + For creating or modifying watch faces, see <a href= + "#adding_complications_to_a_watch_face">Adding complications to a watch + face</a>. + </p> + + <p> + For writing apps that provide data to watch faces, see <a href= + "#exposing_data_to_complications">Exposing data to complications</a>. </p> <h2 id="adding_complications_to_a_watch_face"> @@ -205,15 +214,17 @@ android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST <p> The service's manifest entry should also include an <code>android:icon</code> attribute. The provided icon should be a - single-color white icon. This icon should represent the provider and will - be shown in the provider chooser. + single-color white icon. Vector drawables are recommended for the icons. + An icon should represent the provider and will be shown in the provider + chooser. </p> <p> Include metadata to specify the supported types, update period, and configuration action, if required; for details, download the Android Wear 2.0 Preview Reference and see the keys listed for the - <code>ComplicationProviderService</code> class (in the Javadoc). + <code>ComplicationProviderService</code> class (in the Javadoc; see + <a href="#api_additions">API Additions</a>). </p> <h3 id="update_period"> @@ -266,11 +277,7 @@ android.support.wearable.complications.UPDATE_PERIOD_SECONDS <p> Then create the configuration activity with an intent filter for that action. The configuration activity must reside in the same package as the - provider. - </p> - - <p> - The configuration activity must return <code>RESULT_OK</code> or + provider. The configuration activity must return <code>RESULT_OK</code> or <code>RESULT_CANCELED</code>, to tell the system whether the provider should be set. </p> @@ -281,14 +288,15 @@ android.support.wearable.complications.UPDATE_PERIOD_SECONDS </p> <p> - For details, download the Android Wear 2.0 Preview Reference, containing - the Javadoc, and see the following in the - <code>ComplicationProviderService</code> class: + For details, download the Android Wear 2.0 Preview Reference (see + <a href="#api_additions">API Additions</a>), containing the Javadoc, and + see the following in the <code>ComplicationProviderService</code> class: </p> <pre> METADATA_KEY_PROVIDER_CONFIG_ACTION -</pre> + </pre> + <h2 id="using_complication_types"> Using Complication Types </h2> @@ -340,6 +348,16 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION gauges can be shown without including text. </p> + <h3 id="examples_of_complication_types"> + Examples of Complication Types + </h3> + + <p> + The following shows examples of complication types: + </p> + <img src="../images/complication-type-exs.png" width="" alt= + "Complication types" title="Complications types - examples"> + <h3 id="types_and_fields"> Types and fields @@ -352,16 +370,16 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION <table> <tr> - <th scope="col"> + <th> Type </th> - <th scope="col"> + <th> Required fields </th> - <th scope="col"> + <th> Optional fields </th> - <th scope="col"> + <th> Notes </th> </tr> @@ -374,7 +392,8 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION Short text </td> <td> - IconShort title + Icon<br> + Short title </td> <td> Exactly one of Icon/Short title is expected to be shown if either or @@ -384,16 +403,16 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION <tr> <td> - LONG_TEXT + ICON </td> <td> - Long text + Icon </td> <td> - Long titleIcon*Small image </td> <td> - Title is expected to be shown if provided. + Used when text is not needed.The icon is expected to be single-color, + and may be tinted by the watch face. </td> </tr> @@ -402,29 +421,34 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION RANGED_VALUE </td> <td> - ValueMin valueMax value + Value<br> + Min value<br> + Max value </td> <td> - IconShort textShort title + Icon<br> + Short text<br> + Short title </td> <td> - Optional fields are not guaranteed to be displayed. Uses include for - numerical data within bounds, such as for a percentage. + Optional fields are not guaranteed to be displayed. </td> </tr> <tr> <td> - ICON + LONG_TEXT </td> <td> - Icon + Long text </td> <td> + Long title<br> + Icon<br> + Small image </td> <td> - Used when text is not needed.The icon is expected to be single-color, - and may be tinted by the watch face. + Title is expected to be shown if provided. </td> </tr> @@ -467,16 +491,16 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION <table> <tr> - <th scope="col"> + <th> Type </th> - <th scope="col"> + <th> Required fields </th> - <th scope="col"> + <th> Optional fields </th> - <th scope="col"> + <th> Notes </th> </tr> @@ -514,16 +538,6 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION </tr> </table> - <h3 id="examples_of_complication_types"> - Examples of Complication Types - </h3> - <p> - The following shows examples of complication types: - </p> - - <img src="../images/complication-type-exs.png" width="" - alt="Complication types" title="Complications types - examples"> - <h2 id="using_fields_for_complication_data"> Using Fields for Complication Data </h2> @@ -543,10 +557,10 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION <table> <tr> - <th scope="col"> + <th> Field </th> - <th scope="col"> + <th> Description </th> </tr> @@ -563,11 +577,21 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION <tr> <td> + Icon + </td> + <td> + A single-color image representing the data or the source of the data. + Must be tintable. Vector drawables are recommended for this field. + </td> + </tr> + + <tr> + <td> Short title </td> <td> - Descriptive field for small complications.Should not exceed 7 - characters.May only be meaningful in combination with <em>Short + Descriptive field for small complications. Should not exceed 7 + characters. May only be meaningful in combination with <em>Short text</em>. </td> </tr> @@ -586,7 +610,7 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION Long title </td> <td> - Descriptive field for large, text-based complications.May only be + Descriptive field for large, text-based complications. May only be meaningful in combination with <em>Long text</em>. </td> </tr> @@ -596,7 +620,7 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION Value </td> <td> - A numerical (float) representation of the data.Expected to be + A numerical (float) representation of the data. Expected to be depicted relative to the bounds the <em>Min value</em> and <em>Max value</em> fields (but not required to be between those bounds). </td> @@ -608,7 +632,7 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION </td> <td> The lower bound for the range within which <em>Value</em> should be - depicted.Only meaningful in combination with <em>Value</em> and + depicted. Only meaningful in combination with <em>Value</em> and <em>Max value</em>. </td> </tr> @@ -619,28 +643,18 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION </td> <td> The upper bound for the range within which <em>value</em> should be - depicted.Only meaningful in combination with <em>Value</em> and + depicted. Only meaningful in combination with <em>Value</em> and <em>Min value</em>. </td> </tr> <tr> <td> - Icon - </td> - <td> - A single-color image representing the data or the source of the - data.Must be tintable. - </td> - </tr> - - <tr> - <td> Small image </td> <td> - A small image to represent the data or the source of the data.May be - full color.Not expected to fill the entire watch face. + A small image to represent the data or the source of the data. May be + full color. Not expected to fill the entire watch face. </td> </tr> @@ -649,7 +663,7 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION Large image </td> <td> - An image with sufficient resolution to fill the watch face.May be + An image with sufficient resolution to fill the watch face. May be full color. </td> </tr> @@ -681,8 +695,10 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION </h2> <p> - The Complications API includes the following new classes in the Wearable - Support Library: + The Complications API includes new classes in the Wearable Support + Library. For more information, download the <a href= + "{@docRoot}wear/preview/start.html#get_the_preview_reference_documentation"> + Android Wear 2.0 Preview Reference</a>. </p> <ul> diff --git a/docs/html/wear/preview/features/ime.jd b/docs/html/wear/preview/features/ime.jd index 4ee507c3c8fd..1301be9afb2a 100644 --- a/docs/html/wear/preview/features/ime.jd +++ b/docs/html/wear/preview/features/ime.jd @@ -13,7 +13,6 @@ page.tags="wear" <li><a href="#creating">Creating an Input Method for Wear</a></li> <li><a href="#invoking">Invoking IME</a></li> <li><a href="#considerations">General IME Considerations</a></li> - <li><a href="#test">Testing your IME</a></li> </ol> </div> @@ -28,32 +27,40 @@ Input Method Framework (IMF) to Android Wear. IMF allows for virtual, on-screen <p>Wear 2.0 comes with the system default Input Method Editor (IME) and opens up the IMF APIs for third-party developers to create custom input -methods for Wear. -</p> +methods for Wear.</p> +<p><img src="{@docRoot}wear/preview/images/new_input_methods.png"></p> +<p><b>Figure 1</b>. Sample input methods </p> <h2 id="creating">Creating an Input Method for Wear</h2> - -<p>To create an input method for Wear, -see <a href="http://developer.android.com/guide/topics/text/creating-input-method.html">Creating an Input Method</a>. +<p>The Android platform provides a standard framework for creating IMEs. To create + a Wear-specific IME, you need to optimize your IME for limited screen size. + </p> + +<p>This document provides guidance that can help you create a Wear-specific IME. +Before you continue with this guide, it's important that you read the +documentation for +<a href="{@docRoot}guide/topics/text/creating-input-method.html">Creating an Input Method</a> + on handsets. </p> -<h2 id="invoking">Invoking IME</h2> + +<h2 id="invoking">Invoking an Input Method</h2> If you are developing an IME for Wear, remember that the feature is supported only on Android 6.0 (API level 23) and higher versions of the platform. To ensure that your IME can only be installed on Wearables that support input -methods beyond voice, add the following to your application's manifest: +methods beyond voice, add the following to your app's manifest: <pre> <uses-sdk android:minSdkVersion="23" /> </pre> -This indicates that your application requires Android 6.0 or higher. -For more information, see <a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Levels</a> - and the documentation for the <a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a> +This indicates that your app requires Android 6.0 or higher. +For more information, see <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Levels</a> + and the documentation for the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a> element. <p> -To control how your application is filtered from devices that do not support Wear -IMEs (for example, on Phone), add the following to your application's manifest: +To control how your app is filtered from devices that do not support Wear +IMEs (for example, on Phone), add the following to your app's manifest: </p> <pre> <uses-feature android:required="true" android:name="android.hardware.type.watch" /> @@ -64,9 +71,9 @@ IMEs (for example, on Phone), add the following to your application's manifest: can invoke your IME from:</p> <ul> <li>A notification or an app using the -<a href="http://developer.android.com/reference/android/support/v4/app/RemoteInput.html">RemoteInput</a></code> API.</li> +<a href="{@docRoot}reference/android/support/v4/app/RemoteInput.html">RemoteInput</a></code> API.</li> <li>Wear apps with an -<a href="http://developer.android.com/reference/android/widget/EditText.html">EditText</a> +<a href="{@docRoot}reference/android/widget/EditText.html">EditText</a> field. Touching a text field places the cursor in the field and automatically displays the IME on focus.</li> </ul> @@ -74,41 +81,39 @@ IMEs (for example, on Phone), add the following to your application's manifest: <h2 id="considerations">General IME Considerations</h2> -<p>Here are some things to consider when implementing IME for wear:</p> +<p>Here are some things to consider when implementing IME for Wear:</p> <ul> <li><strong>Set Default Action</strong> <p> <a href="http://developer.android.com/reference/android/support/v4/app/RemoteInput.html">{@code RemoteInput}</a> and Wear apps expect only single-line text entry. The ENTER key should always trigger - a call to <a href="http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html#sendDefaultEditorAction(boolean)">sendDefaultEditorAction</a>, + a call to <a href="{@docRoot}reference/android/inputmethodservice/InputMethodService.html#sendDefaultEditorAction(boolean)">sendDefaultEditorAction</a>, which causes the app to dismiss the keyboard and continue on to the next step or action.</p> </li> -<li><Strong>Use full screen mode IME</strong> +<li><Strong>Use full-screen-mode IME</strong> <p> -Most on-screen input methods will consume most of the screen, leaving very little - of the app visible; hence, we discourage Android Wear apps from presenting a - visible {@code EditTextView}. Instead, a full-screen IME uses - <a href="http://developer.android.com/reference/android/inputmethodservice/ExtractEditText.html">ExtractEditText</a> - to render its own view of the attached editor, also providing control over the - styling of this view. You can ignore all editor-related events that the IME - doesn't generate. -For more details on full-screen mode, see -<a href="http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html">InputMethodService</a>. +Input methods on Wear consume most of the screen, leaving very little of the + app visible; using full-screen mode ensures an optimal user experience regardless + of the app UI. In full-screen mode, an + <a href="{@docRoot}reference/android/view/inputmethod/ExtractedText.html">{@code ExtractEditText}</a> provides a mirrored + view of the text field being edited and can be styled to blend with the rest of + the input method UI. For more details on full-screen mode, see + <a href="{@docRoot}reference/android/inputmethodservice/InputMethodService.html">InputMethodService</a>. </p> </li> -<li><strong>Handle inputType flags</strong> +<li><strong>Handle InputType flags</strong> <p> -For privacy reasons, at a minimum you should handle the {@code inputType} +For privacy reasons, at a minimum you should handle the {@code InputType} flag {@code TYPE_TEXT_VARIATION_PASSWORD} in your IME. When your IME is in password mode, make sure that your keyboard is optimized for single key press (auto spelling correction, auto completion and gesture input are disabled). Most importantly, keyboard in password mode should support ASCII symbols regardless of the input language. For more details, see -<a href="http://developer.android.com/training/keyboard-input/style.html">Specifying The Input Method Type</a>. +<a href="{@docRoot}training/keyboard-input/style.html">Specifying The Input Method Type</a>. </p> </li> @@ -116,21 +121,13 @@ regardless of the input language. For more details, see <p> Android allows users to easily switch between all IMEs supported by the platform. In your IME implementation, set the boolean - <a href="http://developer.android.com/guide/topics/text/creating-input-method.html#Switching">supportsSwitchingToNextInputMethod = true</a> - to enable your IME to support switching mechanism + <a href="{@docRoot}guide/topics/text/creating-input-method.html#Switching">supportsSwitchingToNextInputMethod = true</a> + to enable your IME to support the switching mechanism (so that apps can switch to the next platform-supported IME). </p> </li> </ul> -<h2 id="test">Test your IME</h2> - -<p>To test your IME, install the -<a href="https://drive.google.com/a/google.com/file/d/0ByOeMdiY1arvWUk5QXU1V0E3cFU/view?usp=sharing">Input Box</a> - app which has a simple <i><code>EditText</i></code> field. - When responding to messages from chat apps, you can also use the IME on the - watch.</p> - diff --git a/docs/html/wear/preview/features/notifications.jd b/docs/html/wear/preview/features/notifications.jd index 21a77c2907eb..0962eb4b5f82 100644 --- a/docs/html/wear/preview/features/notifications.jd +++ b/docs/html/wear/preview/features/notifications.jd @@ -1,7 +1,231 @@ -page.title=Expanded Notifications +page.title=Notification Changes in Android Wear 2.0 meta.tags="wear", "wear-preview", "notifications" page.tags="wear" +page.image=/wear/preview/images/expanded_diagram.png + @jd:body -<p>stub</p>
\ No newline at end of file +<div id="qv-wrapper"> + <div id="qv"> + <!-- table of contents --> + <h2>This document includes</h2> + <ol> + <li><a href="#visual">Visual Updates</a></li> + <li><a href="#expanded">Expanded Notifications</a></li> + <li><a href="#messaging">MessagingStyle</a></li> + </ol> + </div> +</div> + +<p>Android Wear 2.0 updates the visual style and interaction paradigm of notifications + as well as introduces expanded notifications, which provide substantial additional + content and actions in an app-like experience. +</p> + +<p>The visual and interaction changes make it much easier for users to read and + interact with notifications from your app. Expanded notifications enable + you to deliver Wear users an app-like experience even if you haven't built an + Android Wear app. +</p> + +<p class="note"> + <strong>Note:</strong> When developing for Wear 2.0, ensure that + you have the latest version of the Android Wear app on your phone. +</p> + +<h2 id="visual">Visual Updates</h2> +<p>Notifications receive important visual updates in Wear 2.0, with +<a href="http://www.google.com/design/spec-wear"> +material design</a> visual changes. +</p> + +<p><img src="{@docRoot}wear/preview/images/comparison_diagram.png" /> </p> +<p><b>Figure 1.</b> Comparison of the same notification in Android Wear 1.x and 2.0.</p> + +<p>Some of the visual updates include:</p> +<ul> +<li><strong>Updated touch targets of a notification</strong>: + If no <a href="{@docRoot}reference/android/app/Notification.html#contentIntent">{@code contentIntent}</a> + is set or if the notification is + <a href="{@docRoot}design/wear/structure.html#Bridged">bridged</a> + from a paired phone, then tapping the notification opens an <a href="{@docRoot}wear/preview/features/notifications.html#expanded">expanded notification</a>. + If the notification is generated locally by a Wear app and if a + <a href="{@docRoot}reference/android/app/Notification.html#contentIntent">{@code contentIntent}</a> + is set, tapping the notification fires the + <a href="{@docRoot}reference/android/app/Notification.html#contentIntent">{@code contentIntent}</a>. + </li> + +<li><strong>Dark background color</strong>: + If you have notifications that are bridged to wearables, you need to be careful + with regards to using color for the notifications. Since a bridged + notification needs to support both light (Wear 1.x) and dark (Wear 2.0) + backgrounds, it is unlikely that any colors will work well on both. + <a href="{@docRoot}reference/android/app/Notification.WearableExtender.html#setDisplayIntent(android.app.PendingIntent)">{@code DisplayIntent}</a> + notifications render with both light and dark backgrounds + as well, and need to be checked for the same reason. + We recommended that you don't set color for bridged notifications. + + When Wear apps post local notifications, you can work around this by checking + <a href="{@docRoot}training/basics/supporting-devices/platforms.html#version-codes">the API level of the device</a> they're running on and using an appropriate color + for Wear 1.x and a different color for Wear 2.0. +</li> + +<li><strong>Updated horizontal swipe gesture on a notification</strong>: + To dismiss a notification in Wear 2.0, the user swipes horizontally in either + direction. So if your notification instructs the user to swipe left or right, + you must update the text of your notification. +</li> +</ul> +<h2 id="expanded">Expanded Notifications</h2> +<p>Android Wear 2.0 introduces <i>expanded notifications</i>, which provide + substantial additional content and actions for each notification. +</p> +<p>When you <a href="{@docRoot}training/wearables/notifications/pages.html">specify additional content pages</a> + and actions for a notification, those are available to the user within the + expanded notification. Each expanded notification follows + <a href="http://www.google.com/design/spec-wear">Material Design for Android Wear</a>, + so the user gets an app-like experience. +</p> +<p><img src="{@docRoot}wear/preview/images/expanded_diagram.png" /> </p> +<p><b>Figure 2</b>. An expanded notification with content and actions.</p> +<p>If the first action in the expanded notification has a +<a href=" {@docRoot}reference/android/support/v4/app/RemoteInput.html">{@code RemoteInput}</a> + (e.g., a Reply action), then the choices you set with <a href="http://developer.android.com/reference/android/support/v4/app/RemoteInput.Builder.html#setChoices(java.lang.CharSequence[])">{@code setChoices()}</a> + appear within the expanded notification below the first action. +</p> + +<p>The user can view the expanded notification by tapping on a notification when + either of the following is true: +</p> +<ul> + <li>The notification is generated by an app on the paired phone and + bridged to Wear. + </li> + <li>The notification does not have a + <a href="http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setContentIntent(android.app.PendingIntent)">{@code contentIntent}</a>. + </li> +</ul> +<h3>Best practices for expanded notifications</h3> +<p>To decide when to use expanded notifications, follow these guidelines:</p> +<ul> + <li>All notifications bridged from the paired phone to the Wear device will + use expanded notifications. + </li> + <li>If a notification is generated by an app running locally on Wear 2.0, + you should <a href="{@docRoot}training/notify-user/build-notification.html#action"> + make the touch target of your notification </a> launch + <a href="{@docRoot}training/notify-user/build-notification.html#action"> an Activity</a> + within your app by calling <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.Builder.html#setContentIntent(android.app.PendingIntent)">{@code setContentIntent()}</a>. + We recommend that you do not use expanded notifications for notifications generated + by an app running locally on Wear 2.0. + </li> +</ul> + +<h3>Adding expanded notifications</h3> +<p> + Expanded Notifications allow you to include additional content and actions + for a notification. You choose the level of detail that your app's notifications + will provide; however be judicious with the amount of detail you include in a + notification. +</p> +<h4>Adding additional content</h4> +To show additional content in your expanded notification, see <a href="{@docRoot}training/wearables/notifications/pages.html">Adding Pages to a Notification</a>.</p> +<p>Additional content pages are stacked vertically in the expanded notification + and appear in the order they were added. + These additional content pages can optionally use a style such as <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.BigTextStyle.html">{@code BigTextStyle}</a> or <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.BigPictureStyle.html">{@code BigPictureStyle}</a>. +</p> +<h4>Primary action</h4> +The expanded notification will contain one primary action, which is the first +action in the notification unless a different action is specified using +<a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.WearableExtender.html#setContentAction(int)">{@code setContentAction()}</a>. +</p> +<h4>Additional actions</h4> +<p> + To specify additional actions, use + <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.WearableExtender.html#addAction(android.support.v4.app.NotificationCompat.Action)">{@code addAction()}</a> + or <a href="{@docRoot}reference/android/support/v4/app/NotificationCompat.WearableExtender.html#addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>)">{@code addActions()}</a>. + The action drawer of the expanded notification contains all available actions. +</p> +<h2 id="messaging">MessagingStyle</h2> + +<p>If you have a chat messaging app, your notifications should use +<a href="{@docRoot}preview/features/notification-updates.html#style">{@code Notification.MessagingStyle}</a>, + which is new in Android 6.0. Wear 2.0 uses the chat messages included + in a <a href="{@docRoot}preview/features/notification-updates.html#style">{@code MessagingStyle}</a> notification + (see <a href="{@docRoot}preview/features/notification-updates.html#style">{@code addMessage()}</a>) to provide + a rich chat app-like experience in the expanded notification. +</p> +<p class="note">Note: <a href="{@docRoot}preview/features/notification-updates.html#style">{@code MessagingStyle}</a> +expanded notifications require that you have at least version 1.5.0.2861804 of the + <a href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app">Android Wear app</a> + on your paired Android phone. That version will be available within the next + few weeks in the Play Store. +</p> +<h3 id="smart-reply">Smart Reply</h3> +<p>Wear 2.0 also introduces <i>Smart Reply</i> for <a href="{@docRoot}preview/features/notification-updates.html#style">{@code MessagingStyle}</a> notifications. + Smart Reply provides the user with contextually relevant, touchable choices in + the expanded notification and in {@code RemoteInput}. These augment the fixed + list of choices that the developer provides in + <a href="http://developer.android.com/reference/android/support/v4/app/RemoteInput.html">{@code RemoteInput}</a> + using the + <a href="{@docRoot}reference/android/support/v4/app/RemoteInput.Builder.html#setChoices(java.lang.CharSequence[])">{@code setChoices()}</a> method. +</p> +<p>By enabling Smart Reply for your MessagingStyle notifications, + you provide users with a fast (single tap), discreet (no speaking aloud), and + reliable way to respond to chat messages. +</p> +<p><img src="{@docRoot}wear/preview/images/messaging_style.png" /></p> +<p><b>Figure 3</b>. The expanded notification includes contextually relevant + Smart Reply responses below the primary action. +</p> + +<p>Responses generated by Smart Reply are shown in addition to those set using the + <a href="{@docRoot}reference/android/support/v4/app/RemoteInput.Builder.html#setChoices(java.lang.CharSequence[])">{@code setChoices()}</a> method. +</p> +<p>To enable Smart Reply for your notification action, you need to do the +following: +</p> +<ol> + <li>Use <a href="{@docRoot}preview/features/notification-updates.html#style">{@code Notification.MessagingStyle}</a>. + </li> + <li>Call the method + <a href="{@docRoot}wear/preview/start.html#get_the_preview_reference_documentation">{@code setAllowGeneratedReplies()}</a> + for the notification action.</li> + <li>Ensure that the notification action has a + <a href="{@docRoot}reference/android/app/RemoteInput.html">{@code RemoteInput}</a> + (where the responses will reside). + </li> +</ol> +<p>The following example shows how to create a MessagingStyle notification with +Smart Reply responses.</p> +<pre> +// Create an intent for the reply action +Intent replyIntent = new Intent(this, ReplyActivity.class); +PendingIntent replyPendingIntent = + PendingIntent.getActivity(this, 0, replyIntent, + PendingIntent.FLAG_UPDATE_CURRENT); + +// Create the reply action and add the remote input +NotificationCompat.Action action = + new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, + getString(R.string.label), replyPendingIntent) + .addRemoteInput(remoteInput) + +// 1) allow generated replies +.setAllowGeneratedReplies(true) + .build(); + +Notification noti = new NotificationCompat.Builder() + .setContentTitle(messages.length + " new messages with " + sender.toString()) + .setContentText(subject) + .setSmallIcon(R.drawable.new_message) + .setLargeIcon(aBitmap) + // 2) set the style to MessagingStyle + .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name)).addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender()) + .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender())) + + +// 3) add an action with RemoteInput +.extend(new WearableExtender().addAction(action)).build(); +</pre> diff --git a/docs/html/wear/preview/features/ui-nav-actions.jd b/docs/html/wear/preview/features/ui-nav-actions.jd index 587f88f23a7b..800fc8e74e83 100644 --- a/docs/html/wear/preview/features/ui-nav-actions.jd +++ b/docs/html/wear/preview/features/ui-nav-actions.jd @@ -1,6 +1,7 @@ page.title=Wear Navigation and Actions meta.tags="wear", "wear-preview", "navigation", "action" page.tags="wear" +page.image=/wear/preview/images/card_drawer.png @jd:body @@ -18,23 +19,27 @@ page.tags="wear" <h2>You should also read</h2> <ul> - <li><a href="https://spec.googleplex.com/wear/components/navigation-drawer.html"> + <li><a href="http://www.google.com/design/wear-spec/components/navigation-drawer.html"> Navigation Drawer Design</a> </li> <li> - <a href="https://spec.googleplex.com/wear/components/action-drawer.html"> + <a href="http://www.google.com/design/wear-spec/components/action-drawer.html"> Action Drawer Design</a> </ul> - <h2>Samples</h2> + <h2>See Also</h2> <ol> - + <li> + <a href="https://github.com/googlesamples/android-WearDrawers">Sample app with + navigation and action drawers</a> + </li> </ol> </div> </div> -<p>Wear 2.0 adds interactive navigation and action drawers that users can pull -from the top or bottom edge of the window, respectively. The navigation drawer -appears at the top of the screen and lets users jump to different views within +<p>As part of the <a href="http://www.google.com/design/spec-wear">Material Design</a> + for Android Wear, Wear 2.0 adds interactive navigation and action drawers. + The navigation drawer appears at the top of the screen and lets users jump to + different views within the app, similar to the navigation drawer on a phone. The action drawer appears at the bottom of the screen and provides context-specific actions for the user, similar to the action bar on a phone. These drawers are accessible when the user diff --git a/docs/html/wear/preview/images/card_drawer.png b/docs/html/wear/preview/images/card_drawer.png Binary files differnew file mode 100644 index 000000000000..3614f9519356 --- /dev/null +++ b/docs/html/wear/preview/images/card_drawer.png diff --git a/docs/html/wear/preview/images/comparison_diagram.png b/docs/html/wear/preview/images/comparison_diagram.png Binary files differnew file mode 100644 index 000000000000..7dbf65f2a216 --- /dev/null +++ b/docs/html/wear/preview/images/comparison_diagram.png diff --git a/docs/html/wear/preview/images/complication-type-exs.png b/docs/html/wear/preview/images/complication-type-exs.png Binary files differindex d6fe8908d025..6e2287c11a0f 100644 --- a/docs/html/wear/preview/images/complication-type-exs.png +++ b/docs/html/wear/preview/images/complication-type-exs.png diff --git a/docs/html/wear/preview/images/complications-data-flow.png b/docs/html/wear/preview/images/complications-data-flow.png Binary files differindex 7fa43f2704ff..2415535b6f17 100644 --- a/docs/html/wear/preview/images/complications-data-flow.png +++ b/docs/html/wear/preview/images/complications-data-flow.png diff --git a/docs/html/wear/preview/images/complications-main-image.png b/docs/html/wear/preview/images/complications-main-image.png Binary files differnew file mode 100644 index 000000000000..dd37b25a289a --- /dev/null +++ b/docs/html/wear/preview/images/complications-main-image.png diff --git a/docs/html/wear/preview/images/expanded_diagram.png b/docs/html/wear/preview/images/expanded_diagram.png Binary files differnew file mode 100644 index 000000000000..03bca9a28191 --- /dev/null +++ b/docs/html/wear/preview/images/expanded_diagram.png diff --git a/docs/html/wear/preview/images/hero-1x.png b/docs/html/wear/preview/images/hero-1x.png Binary files differindex 5dcc84735d05..1d0cb6f4376a 100644 --- a/docs/html/wear/preview/images/hero-1x.png +++ b/docs/html/wear/preview/images/hero-1x.png diff --git a/docs/html/wear/preview/images/hero-2x.png b/docs/html/wear/preview/images/hero-2x.png Binary files differindex 19a60cdbe033..9f4eb66d0d23 100644 --- a/docs/html/wear/preview/images/hero-2x.png +++ b/docs/html/wear/preview/images/hero-2x.png diff --git a/docs/html/wear/preview/images/messaging_style.png b/docs/html/wear/preview/images/messaging_style.png Binary files differnew file mode 100644 index 000000000000..966e524c6db5 --- /dev/null +++ b/docs/html/wear/preview/images/messaging_style.png diff --git a/docs/html/wear/preview/images/messaging_style_diagram.png b/docs/html/wear/preview/images/messaging_style_diagram.png Binary files differnew file mode 100644 index 000000000000..3b21c79730bc --- /dev/null +++ b/docs/html/wear/preview/images/messaging_style_diagram.png diff --git a/docs/html/wear/preview/images/new_input_methods.png b/docs/html/wear/preview/images/new_input_methods.png Binary files differnew file mode 100644 index 000000000000..c0359965cdab --- /dev/null +++ b/docs/html/wear/preview/images/new_input_methods.png diff --git a/docs/html/wear/preview/images/remoteinput.png b/docs/html/wear/preview/images/remoteinput.png Binary files differnew file mode 100644 index 000000000000..9d8049800d63 --- /dev/null +++ b/docs/html/wear/preview/images/remoteinput.png diff --git a/docs/html/wear/preview/index.jd b/docs/html/wear/preview/index.jd index 302465468db8..4b3c1f2ed86a 100644 --- a/docs/html/wear/preview/index.jd +++ b/docs/html/wear/preview/index.jd @@ -25,14 +25,19 @@ footer.hide=1 <h1 class="dac-hero-title">Android Wear 2.0 Developer Preview</h1> <p class="dac-hero-description"> Get ready for the next version of Android Wear! - Support stand-alone Wear devices and apps. - Create enhanced user interaction and glanceable experiences. - Test your apps on Wear devices. + Support <strong>stand-alone</strong> Wear devices and apps. + Create <strong>enhanced user interaction</strong> and + <strong>glanceable experiences</strong>. + Test your apps on <strong>Wear devices</strong>. </p> <a class="dac-hero-cta" href="{@docRoot}wear/preview/program.html"> <span class="dac-sprite dac-auto-chevron"></span> - Learn more + Learn about the Preview + </a> + <a class="dac-hero-cta" href="https://www.google.com/design/spec-wear"> + <span class="dac-sprite dac-auto-chevron"></span> + Material Design for Wear </a> </div> <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;"> @@ -57,7 +62,7 @@ footer.hide=1 </a> <ul class="dac-actions"> <li class="dac-action"> - <a class="dac-action-link" href="{@docRoot}wear/preview/bug"> + <a class="dac-action-link" href="http://g.co/wearpreviewbug"> <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i> Report an issue </a> diff --git a/docs/html/wear/preview/program.jd b/docs/html/wear/preview/program.jd index 802e8a84f9ec..a130663f6f91 100644 --- a/docs/html/wear/preview/program.jd +++ b/docs/html/wear/preview/program.jd @@ -25,7 +25,7 @@ page.image=images/cards/card-n-sdk_2x.png </h5> <p> - Run and test your apps on a range of devices or on an emulator. + Run and test your apps on supported Wear devices or the emulator. </p> </div> @@ -35,7 +35,7 @@ page.image=images/cards/card-n-sdk_2x.png </h5> <p> - We’ll provide monthly updates during the preview, so you'll be + We'll provide frequent updates during the preview, so you'll be testing against the latest platform changes. </p> </div> @@ -71,8 +71,10 @@ page.image=images/cards/card-n-sdk_2x.png </h5> <p> - Report issues and give us feedback using our issue tracker. - Connect with other developers in the Wear Developer Community. + Report issues and give us feedback using our + <a href="https://g.co/wearpreviewbug">issue tracker</a>. + Connect with other developers in + the <a href="https://g.co/androidweardev">Wear Developer Community</a>. </p> </div> @@ -124,11 +126,12 @@ page.image=images/cards/card-n-sdk_2x.png <p> The first three milestones provide an early test and development - environment to helps you identify compatibility issues in your current + environment to help you identify compatibility issues in your current apps and plan migration or feature work needed to target the new platform. This is the priority period in which to give us your feedback on features and APIs and file compatibility issues — for all of these, - please use the issue tracker. You can expect some API changes across + please use the <a href="https://g.co/wearpreviewbug">issue tracker</a>. + You can expect some API changes across these updates. </p> @@ -144,8 +147,6 @@ page.image=images/cards/card-n-sdk_2x.png <p> As you test and develop on Android Wear 2.0, we strongly recommend keeping your development environment up-to-date as updates are released. - Updated preview images will be available that you can download and flash - manually. </p> <p> @@ -195,18 +196,25 @@ page.image=images/cards/card-n-sdk_2x.png </h3> <p> - You can download these hardware system images for Nexus devices from the - Downloads page: + You can download these hardware system images at <a href= + "{@docRoot}wear/preview/downloads.html">Download and Test with a + Device</a>: </p> <ul> - <li>LG Watch Urbane 2nd Edition “nemo” + <li>LGE Watch Urbane 2nd Edition </li> - <li>Huawei Watch “sturgeon” + <li>Huawei Watch </li> </ul> + <p> + Please keep in mind that the Developer Preview system images + are for app developers only, and for compatibility testing and + early development only, and are not ready for day-to-day use. + </p> + <h3 id="documentation_and_sample_code"> Documentation and sample code </h3> @@ -216,17 +224,22 @@ page.image=images/cards/card-n-sdk_2x.png </p> <ul> - <li>[comment placeholder] Get Started has step-by-step instructions for + <li><a href= + "{@docRoot}wear/preview/start.html">Get Started</a> + has step-by-step instructions for setting up the SDK. </li> - <li>Documentation of new APIs, including an API Overview, downloadable - API Reference, and developer guides on key features such as - complications, design patterns for Wear, and building standalone Android - Wear apps. + <li>Documentation of new APIs, including an + <a href="{@docRoot}wear/preview/api-overview.html">API Overview</a>, + downloadable + <a href="{@docRoot}wear/preview/start.html#get_the_preview_reference_documentation">API Reference</a>, + and developer guides on key features such as + <a href="{@docRoot}wear/preview/features/complications.html">complications</a> + and design patterns for Wear. </li> - <li>Sample code that demonstrates how to implement [comment placeholder] + <li>Sample code that demonstrates how to implement complications and other new features. </li> </ul> @@ -241,7 +254,8 @@ page.image=images/cards/card-n-sdk_2x.png </p> <ul> - <li>Wear Developer Preview Issue Tracker is your primary feedback + <li>Wear Developer Preview + <a href="https://g.co/wearpreviewbug">Issue Tracker</a> is your primary feedback channel. You can report bugs, performance issues, and general feedback through the issue tracker. You can also check for known issues and find workaround steps. diff --git a/docs/html/wear/preview/start.jd b/docs/html/wear/preview/start.jd index 04b9fe6ed8ed..65d4b56e164d 100644 --- a/docs/html/wear/preview/start.jd +++ b/docs/html/wear/preview/start.jd @@ -1,4 +1,4 @@ -page.title=Get Started with the Android Wear 2.0 Developer Preview +page.title=Get Started with the Preview meta.keywords="wear-preview" page.tags="wear-preview" page.image=images/cards/card-n-sdk_2x.png @@ -28,8 +28,8 @@ page.image=images/cards/card-n-sdk_2x.png </div> <p> - If you want an environment for basic <strong>compatibility - testing</strong> of your app, you can use your current APK and a + If you want an environment for basic compatibility + testing of your app, you can use your current APK and a supported watch or an emulator. You don't necessarily need to update your full development environment to do basic testing. To simply test your app's compatibility with a preview system image, see <a href= @@ -97,19 +97,20 @@ page.image=images/cards/card-n-sdk_2x.png <table> <tr> - <th scope="col"> + <th style="width:300px"> Reference documentation </th> - <th scope="col"> - Notes + <th> + Checksums </th> </tr> <tr> <td> - [zip file name] + <a href="http://storage.googleapis.com/androiddevelopers/shareables/wear-preview/wearable-support-preview-1-docs.zip">wearable-support-preview-1-docs.zip</a> </td> - <td> + <td>MD5: 02f9dc7714c00076b323c9081655c3b2<br> + SHA-1: 075f3821ee9b66a919a0e8086f79c12bc9576fb2 </td> </tr> </table> @@ -137,8 +138,8 @@ page.image=images/cards/card-n-sdk_2x.png </li> <li>If prompted by the Android SDK Manager for the SDK version to use for - the project, select <strong>Use</strong> <strong>Android Studio's - SDK</strong>. <//li> + the project, select <strong>Use Android Studio's + SDK</strong>. </li> <li>If prompted to update the Gradle plugin, update the version of the @@ -151,12 +152,10 @@ page.image=images/cards/card-n-sdk_2x.png 'com.google.android.support:wearable:1.4.0'</code>) by changing it to the following, which requires that your the Google Repository <a href= "#install_android_studio_and_the_latest_packages">is the latest - version</a>:: - - <pre> - compile 'com.google.android.support:wearable:2.0.0-alpha1' - -</pre> + version</a>: + <pre> +compile 'com.google.android.support:wearable:2.0.0-alpha1' + </pre> </li> <li>See the following page for setting up a watch or emulator with a @@ -195,11 +194,9 @@ page.image=images/cards/card-n-sdk_2x.png <code>dependencies</code> section, update the existing reference to the Wearable Support Library (perhaps <code>compile 'com.google.android.support:wearable:1.4.0'</code>) to: - - <pre> - compile 'com.google.android.support:wearable:2.0.0-alpha1' - -</pre> + <pre> +compile 'com.google.android.support:wearable:2.0.0-alpha1' + </pre> </li> <li>See the following page for setting up a watch or emulator with a diff --git a/docs/html/wear/preview/support.jd b/docs/html/wear/preview/support.jd new file mode 100644 index 000000000000..d03edf31aacd --- /dev/null +++ b/docs/html/wear/preview/support.jd @@ -0,0 +1,139 @@ +page.title=Support and Release Notes +meta.keywords="preview", "wear" +page.tags="preview", "developer preview" + +@jd:body + +<p> + If you experience problems when developing and testing with the + Wear 2.0 Developer Preview, please file bugs at + <a href="https://g.co/wearpreviewbug">https://g.co/wearpreviewbug</a>. +</p> + +<p> + To discuss issues or ideas with other developers working with Android Wear, + join the <a href="https://plus.google.com/communities/113381227473021565406"> + Wear Developer Google+ community</a>. +</p> + +<h2 id="dp">Developer Preview 1</h2> + +<div class="wrap"> + <div class="cols"> + <div class="col-6of12"> + <p><em>Date: May 2016<br /> + Builds: Wearable Support 2.0.0-alpha1, NVD36I <br /> + Emulator support: x86 & ARM (32-bit)<br/> + </em></p> + </div> + </div> +</div> + + +<h3 id="general_advisories">General advisories</h3> + +<p> + This Developer Preview release is for app developers only and is designed for + use in compatibility testing and early development only. +</p> + +<h4 id="deprecations">Deprecations</h4> + + +<p>The following fields are deprecated in the Preview:</p> + +<ul> + <li>The <code>Notification.WearableExtender#setCustomSizePreset(int)</code> + method no longer accepts <code>SIZE_FULL_SCREEN</code> and this value is now + undefined. + </li> + + <li>The <code>Notification.WearableExtender#setContentIcon(int)</code> method + is deprecated. + </li> +</ul> + +<h3 id="known_issues">Known Issues</h3> + + +<h4 id="notifications">Notifications</h4> + + +<ul> + <li>This preview release does not include support for notification groups, + but will be supported in a future release. + </li> + <li>Tapping on next and previous controls in a notification while playing + music does not work. + </li> + <li>Bottom drawer actions user interface overlaps with media card + notifications. + </li> + <li>The system does not generate Smart Reply responses even if + <code>setAllowGeneratedReplies(true)</code> is set. + </li> +</ul> + + +<h4 id="complications">Complications</h4> + +<ul> + <li>Battery information is not synchronized between watch face and drop down + quick menu. + </li> + <li>Play music crashes when tapping on music complication in watch face. + </li> +</ul> + + +<h4 id="system_user_interface">System User Interface</h4> + +<ul> + <li>Pressing the hardware button in ambient mode triggers active mode with + the app launcher instead of active mode only. + </li> + <li>Double pressing the power hardware button while on the launcher causes + the watch screen to turn black. + </li> + <li>Dismissing multiple notifications can cause app to force close. + </li> + <li>Turning screen lock to off (Enable and disable) functionality is not + reliable. + </li> + <li>Airplane mode does not work from quick settings. + </li> + <li>Tapping Google keyboard English (United States) displays a <em>Settings + under construction</em> message. + </li> + <li>First calendar event notification must be dismissed in order to show the + rest of the event card. + </li> + <li>Unable to turn off the Wifi on wearable. + </li> + <li>Voice transcription may not work reliably at this time. + </li> +</ul> + + +<h4 id="companion_app">Companion App</h4> + +<ul> + <li>'More actions' via Companion app shows a blank screen on phone running + nyc-release and watch running feldspar-release. + </li> + <li>Select watch face on companion wear app will not change watch face on + wearable. + </li> +</ul> + + +<h4 id="devices">Devices</h4> + +<ul> + <li>On the Huawei Watch, selecting the language, followed by multiple + acknowledgement dialogues results in a black screen. + </li> + <li>On the LG Watch Urbane LTE, when answering call from the watch, the watch + does not provide audio from the caller. + </li> +</ul> diff --git a/docs/html/work/guide.jd b/docs/html/work/guide.jd index 66ffb99b876e..a93bfa53ab06 100644 --- a/docs/html/work/guide.jd +++ b/docs/html/work/guide.jd @@ -523,7 +523,7 @@ android.app.extra.PROVISIONING_TIME_ZONE=America/New_York</pre> </p> <p> - <a href="https://connect.googleforwork.com/community/applicants/android/isv"> + <a href="https://www.google.com/work/android/developers/applyDevHub/"> <span class="dac-sprite dac-auto-chevron"></span> Learn about the Android for Work DevHub. </a> diff --git a/docs/html/work/overview.jd b/docs/html/work/overview.jd index 2b1f08b4d0b2..56d8c20179be 100644 --- a/docs/html/work/overview.jd +++ b/docs/html/work/overview.jd @@ -40,7 +40,7 @@ page.image=images/work/cards/briefcase_600px.png <p> Additionally, Android for Work offers a partner program for developers through the - <a href="https://connect.googleforwork.com/community/applicants/android/isv" + <a href="https://www.google.com/work/android/developers/applyDevHub/" >Android for Work DevHub</a>, which provides exclusive access to beta features and developer events, along with access to a community of Android developers making enterprise apps. @@ -72,7 +72,7 @@ page.image=images/work/cards/briefcase_600px.png <h2 id="community-overview">What Does the Android for Work DevHub Offer?</h2> <p> - The <a href="https://connect.googleforwork.com/community/applicants/android/isv" + The <a href="https://www.google.com/work/android/developers/applyDevHub/" >Android for Work DevHub</a> offers these incentives: </p> @@ -103,7 +103,7 @@ page.image=images/work/cards/briefcase_600px.png <p> Apply to join the - <a href="https://connect.googleforwork.com/community/applicants/android/isv" + <a href="https://www.google.com/work/android/developers/applyDevHub/" >Android for Work DevHub</a>. </p> diff --git a/docs/image_sources/topic/instant-apps/Play-Services.png b/docs/image_sources/topic/instant-apps/Play-Services.png Binary files differnew file mode 100644 index 000000000000..4b65c9919fb6 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/Play-Services.png diff --git a/docs/image_sources/topic/instant-apps/image03.png b/docs/image_sources/topic/instant-apps/image03.png Binary files differnew file mode 100644 index 000000000000..becc7ff842ce --- /dev/null +++ b/docs/image_sources/topic/instant-apps/image03.png diff --git a/docs/image_sources/topic/instant-apps/instant-apps-section-2 b/docs/image_sources/topic/instant-apps/instant-apps-section-2 Binary files differnew file mode 100644 index 000000000000..6857e1fa3220 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/instant-apps-section-2 diff --git a/docs/image_sources/topic/instant-apps/instant-apps-section-4 b/docs/image_sources/topic/instant-apps/instant-apps-section-4 Binary files differnew file mode 100644 index 000000000000..c9436f184979 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/instant-apps-section-4 diff --git a/docs/image_sources/topic/instant-apps/instant-apps-section-5 b/docs/image_sources/topic/instant-apps/instant-apps-section-5 Binary files differnew file mode 100644 index 000000000000..b33544c8afbf --- /dev/null +++ b/docs/image_sources/topic/instant-apps/instant-apps-section-5 diff --git a/docs/image_sources/topic/instant-apps/play-services-features-2x.png b/docs/image_sources/topic/instant-apps/play-services-features-2x.png Binary files differnew file mode 100644 index 000000000000..098f91cd6722 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/play-services-features-2x.png diff --git a/docs/image_sources/topic/instant-apps/s3-BandH-animated.gif b/docs/image_sources/topic/instant-apps/s3-BandH-animated.gif Binary files differnew file mode 100644 index 000000000000..4e44f741f43c --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-BandH-animated.gif diff --git a/docs/image_sources/topic/instant-apps/s3-BandH-static.png b/docs/image_sources/topic/instant-apps/s3-BandH-static.png Binary files differnew file mode 100644 index 000000000000..004afb7b4a93 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-BandH-static.png diff --git a/docs/image_sources/topic/instant-apps/s3-BuzzFeed-animated.gif b/docs/image_sources/topic/instant-apps/s3-BuzzFeed-animated.gif Binary files differnew file mode 100644 index 000000000000..7ed534eac88e --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-BuzzFeed-animated.gif diff --git a/docs/image_sources/topic/instant-apps/s3-BuzzFeed-static.png b/docs/image_sources/topic/instant-apps/s3-BuzzFeed-static.png Binary files differnew file mode 100644 index 000000000000..cdd0dc8844fb --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-BuzzFeed-static.png diff --git a/docs/image_sources/topic/instant-apps/s3-ParkandPay-animated.gif b/docs/image_sources/topic/instant-apps/s3-ParkandPay-animated.gif Binary files differnew file mode 100644 index 000000000000..4a14dc2e5fe1 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-ParkandPay-animated.gif diff --git a/docs/image_sources/topic/instant-apps/s3-ParkandPay-static.png b/docs/image_sources/topic/instant-apps/s3-ParkandPay-static.png Binary files differnew file mode 100644 index 000000000000..fa9c2bfb6cfc --- /dev/null +++ b/docs/image_sources/topic/instant-apps/s3-ParkandPay-static.png diff --git a/docs/image_sources/topic/instant-apps/upgrade-your-app-2x.png b/docs/image_sources/topic/instant-apps/upgrade-your-app-2x.png Binary files differnew file mode 100644 index 000000000000..fbf6a013c4ca --- /dev/null +++ b/docs/image_sources/topic/instant-apps/upgrade-your-app-2x.png diff --git a/docs/image_sources/topic/instant-apps/works-on-all-2x (1).png b/docs/image_sources/topic/instant-apps/works-on-all-2x (1).png Binary files differnew file mode 100644 index 000000000000..5a440328c9c5 --- /dev/null +++ b/docs/image_sources/topic/instant-apps/works-on-all-2x (1).png diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index daa1d7c6648f..054e29fd9ff4 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -19,11 +19,11 @@ package android.graphics; import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.Size; +import android.os.LocaleList; import android.text.GraphicsOperations; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; -import android.util.LocaleList; import com.android.internal.annotations.GuardedBy; diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 8857c41dc33d..faf6a52bca85 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -259,6 +259,7 @@ LOCAL_SRC_FILES += \ tests/unit/SkiaBehaviorTests.cpp \ tests/unit/SnapshotTests.cpp \ tests/unit/StringUtilsTests.cpp \ + tests/unit/TestUtilsTests.cpp \ tests/unit/TextDropShadowCacheTests.cpp \ tests/unit/VectorDrawableTests.cpp diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp index 2ec7b75cb91d..59c106578cf3 100644 --- a/libs/hwui/BakedOpDispatcher.cpp +++ b/libs/hwui/BakedOpDispatcher.cpp @@ -791,6 +791,16 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur renderer.renderGlop(state, glop); } +void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state, + int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) { + SkPaint paint; + paint.setColor(color); + paint.setXfermodeMode(mode); + paint.setColorFilter(colorFilter); + RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); + BakedOpDispatcher::onRectOp(renderer, rectOp, state); +} + void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) { // Note that we don't use op->paint in this function - it's never set on a LayerOp OffscreenBuffer* buffer = *op.layerHandle; @@ -798,12 +808,9 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, if (CC_UNLIKELY(!buffer)) { // Layer was not allocated, which can occur if there were no draw ops inside. We draw the // equivalent by drawing a rect with the same layer properties (alpha/xfer/filter). - SkPaint paint; - paint.setAlpha(op.alpha * 255); - paint.setXfermodeMode(op.mode); - paint.setColorFilter(op.colorFilter); - RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); - BakedOpDispatcher::onRectOp(renderer, rectOp, state); + int color = SkColorSetA(SK_ColorTRANSPARENT, op.alpha * 255); + renderRectForLayer(renderer, op, state, + color, op.mode, op.colorFilter); } else { float layerAlpha = op.alpha * state.alpha; Glop glop; @@ -817,6 +824,19 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, .build(); renderer.renderGlop(state, glop); } + + if (buffer && !buffer->hasRenderedSinceRepaint) { + buffer->hasRenderedSinceRepaint = true; + if (CC_UNLIKELY(Properties::debugLayersUpdates)) { + // render debug layer highlight + renderRectForLayer(renderer, op, state, + 0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr); + } else if (CC_UNLIKELY(Properties::debugOverdraw)) { + // render transparent to increment overdraw for repaint area + renderRectForLayer(renderer, op, state, + SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr); + } + } } void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) { diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp index 3c302b3f6c9f..eed012636bb4 100644 --- a/libs/hwui/BakedOpRenderer.cpp +++ b/libs/hwui/BakedOpRenderer.cpp @@ -55,6 +55,7 @@ void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const } mRenderTarget.offscreenBuffer = offscreenBuffer; + mRenderTarget.offscreenBuffer->hasRenderedSinceRepaint = false; // create and bind framebuffer mRenderTarget.frameBufferId = mRenderState.createFramebuffer(); diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 84c8a745ad1e..746e99a96123 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -81,7 +81,8 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // only schedule repaint if node still on layer - possible it may have been // removed during a dropped frame, but layers may still remain scheduled so // as not to lose info on what portion is damaged - if (CC_LIKELY(layerNode->getLayer() != nullptr)) { + OffscreenBuffer* layer = layerNode->getLayer(); + if (CC_LIKELY(layer)) { ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u", layerNode->getName(), layerNode->getWidth(), layerNode->getHeight()); @@ -90,7 +91,7 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // map current light center into RenderNode's coordinate space Vector3 lightCenter = mCanvasState.currentSnapshot()->getRelativeLightCenter(); - layerNode->getLayer()->inverseTransformInWindow.mapPoint3d(lightCenter); + layer->inverseTransformInWindow.mapPoint3d(lightCenter); saveForLayer(layerNode->getWidth(), layerNode->getHeight(), 0, 0, layerDamage, lightCenter, nullptr, layerNode); diff --git a/libs/hwui/renderstate/OffscreenBufferPool.h b/libs/hwui/renderstate/OffscreenBufferPool.h index 089f131668a0..73a3392a7811 100644 --- a/libs/hwui/renderstate/OffscreenBufferPool.h +++ b/libs/hwui/renderstate/OffscreenBufferPool.h @@ -77,6 +77,8 @@ public: // vbo / size of mesh GLsizei elementCount = 0; GLuint vbo = 0; + + bool hasRenderedSinceRepaint; }; /** diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h index dbaefa470b50..4536bef6d391 100644 --- a/libs/hwui/tests/common/TestUtils.h +++ b/libs/hwui/tests/common/TestUtils.h @@ -74,6 +74,28 @@ typedef DisplayListCanvas TestCanvas; }; \ void test_case_name##_##test_name##_RenderThreadTest::doTheThing(renderthread::RenderThread& renderThread) +/** + * Sets a property value temporarily, generally for the duration of a test, restoring the previous + * value when going out of scope. + * + * Can be used e.g. to test behavior only active while Properties::debugOverdraw is enabled. + */ +template <typename T> +class ScopedProperty { +public: + ScopedProperty(T& property, T newValue) + : mPropertyPtr(&property) + , mOldValue(property) { + property = newValue; + } + ~ScopedProperty() { + *mPropertyPtr = mOldValue; + } +private: + T* mPropertyPtr; + T mOldValue; +}; + class TestUtils { public: class SignalingDtor { diff --git a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp index 5613f9fd729c..01d3d7066ae3 100644 --- a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp +++ b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp @@ -16,21 +16,22 @@ #include <gtest/gtest.h> -#include <RecordedOp.h> #include <BakedOpDispatcher.h> #include <BakedOpRenderer.h> #include <FrameBuilder.h> -#include <SkBlurDrawLooper.h> +#include <LayerUpdateQueue.h> #include <hwui/Paint.h> +#include <RecordedOp.h> #include <tests/common/TestUtils.h> +#include <utils/Color.h> +#include <SkBlurDrawLooper.h> #include <SkDashPathEffect.h> using namespace android::uirenderer; static BakedOpRenderer::LightInfo sLightInfo; const FrameBuilder::LightGeometry sLightGeometry = { {100, 100, 100}, 50}; -static Rect sBaseClip(100, 100); class ValidatingBakedOpRenderer : public BakedOpRenderer { public: @@ -55,7 +56,7 @@ static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, R std::function<void(const Glop& glop)> glopVerifier) { // Create op, and wrap with basic state. LinearAllocator allocator; - auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), sBaseClip); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 100)); auto state = BakedOpState::tryConstruct(allocator, *snapshot, *op); ASSERT_NE(nullptr, state); @@ -194,4 +195,84 @@ RENDERTHREAD_TEST(BakedOpDispatcher, renderTextWithShadow) { frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); ASSERT_EQ(3, glopCount) << "Exactly three glops expected"; -}
\ No newline at end of file +} + +static void validateLayerDraw(renderthread::RenderThread& renderThread, + std::function<void(const Glop& glop)> validator) { + auto node = TestUtils::createNode(0, 0, 100, 100, + [](RenderProperties& props, TestCanvas& canvas) { + props.mutateLayerProperties().setType(LayerType::RenderLayer); + + // provide different blend mode, so decoration draws contrast + props.mutateLayerProperties().setXferMode(SkXfermode::Mode::kSrc_Mode); + canvas.drawColor(Color::Black, SkXfermode::Mode::kSrcOver_Mode); + }); + OffscreenBuffer** layerHandle = node->getLayerHandle(); + + auto syncedNode = TestUtils::getSyncedNode(node); + + // create RenderNode's layer here in same way prepareTree would + OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100); + *layerHandle = &layer; + { + LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid + layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(0, 0, 100, 100)); + + ValidatingBakedOpRenderer renderer(renderThread.renderState(), validator); + FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, + sLightGeometry, Caches::getInstance()); + frameBuilder.deferLayers(layerUpdateQueue); + frameBuilder.deferRenderNode(*syncedNode); + frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); + } + + // clean up layer pointer, so we can safely destruct RenderNode + *layerHandle = nullptr; +} + +static FloatColor makeFloatColor(uint32_t color) { + FloatColor c; + c.set(color); + return c; +} + +RENDERTHREAD_TEST(BakedOpDispatcher, layerUpdateProperties) { + for (bool debugOverdraw : { false, true }) { + for (bool debugLayersUpdates : { false, true }) { + ScopedProperty<bool> ovdProp(Properties::debugOverdraw, debugOverdraw); + ScopedProperty<bool> lupProp(Properties::debugLayersUpdates, debugLayersUpdates); + + int glopCount = 0; + validateLayerDraw(renderThread, [&glopCount, &debugLayersUpdates](const Glop& glop) { + if (glopCount == 0) { + // 0 - Black layer fill + EXPECT_TRUE(glop.fill.colorEnabled); + EXPECT_EQ(makeFloatColor(Color::Black), glop.fill.color); + } else if (glopCount == 1) { + // 1 - Uncolored (textured) layer draw + EXPECT_FALSE(glop.fill.colorEnabled); + } else if (glopCount == 2) { + // 2 - layer overlay, if present + EXPECT_TRUE(glop.fill.colorEnabled); + // blend srcover, different from that of layer + EXPECT_EQ(GLenum(GL_ONE), glop.blend.src); + EXPECT_EQ(GLenum(GL_ONE_MINUS_SRC_ALPHA), glop.blend.dst); + EXPECT_EQ(makeFloatColor(debugLayersUpdates ? 0x7f00ff00 : 0), + glop.fill.color) << "Should be transparent green if debugLayersUpdates"; + } else if (glopCount < 7) { + // 3 - 6 - overdraw indicator overlays, if present + EXPECT_TRUE(glop.fill.colorEnabled); + uint32_t expectedColor = Caches::getInstance().getOverdrawColor(glopCount - 2); + ASSERT_EQ(makeFloatColor(expectedColor), glop.fill.color); + } else { + ADD_FAILURE() << "Too many glops observed"; + } + glopCount++; + }); + int expectedCount = 2; + if (debugLayersUpdates || debugOverdraw) expectedCount++; + if (debugOverdraw) expectedCount += 4; + EXPECT_EQ(expectedCount, glopCount); + } + } +} diff --git a/libs/hwui/tests/unit/TestUtilsTests.cpp b/libs/hwui/tests/unit/TestUtilsTests.cpp new file mode 100644 index 000000000000..490595773724 --- /dev/null +++ b/libs/hwui/tests/unit/TestUtilsTests.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 "tests/common/TestUtils.h" +#include "Properties.h" + +#include <gtest/gtest.h> + +using namespace android::uirenderer; + +TEST(ScopedProperty, simpleBool) { + bool previous = Properties::debugOverdraw; + { + ScopedProperty<bool> debugOverdraw(Properties::debugOverdraw, true); + EXPECT_TRUE(Properties::debugOverdraw); + } + EXPECT_EQ(previous, Properties::debugOverdraw); + { + ScopedProperty<bool> debugOverdraw(Properties::debugOverdraw, false); + EXPECT_FALSE(Properties::debugOverdraw); + } + EXPECT_EQ(previous, Properties::debugOverdraw); +} diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 212c6a0d2c3c..61f78cc069c5 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -84,7 +84,7 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>& mLocked.pointerAlpha = 0.0f; // pointer is initially faded mLocked.pointerSprite = mSpriteController->createSprite(); mLocked.pointerIconChanged = false; - mLocked.requestedPointerShape = mPolicy->getDefaultPointerIconId(); + mLocked.requestedPointerType= mPolicy->getDefaultPointerIconId(); mLocked.animationFrameIndex = 0; mLocked.lastFrameUpdatedTime = 0; @@ -459,10 +459,10 @@ void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_ updatePointerLocked(); } -void PointerController::updatePointerShape(int32_t iconId) { +void PointerController::updatePointerIcon(int32_t iconId) { AutoMutex _l(mLock); - if (mLocked.requestedPointerShape != iconId) { - mLocked.requestedPointerShape = iconId; + if (mLocked.requestedPointerType != iconId) { + mLocked.requestedPointerType = iconId; mLocked.presentationChanged = true; updatePointerLocked(); } @@ -473,7 +473,7 @@ void PointerController::setCustomPointerIcon(const SpriteIcon& icon) { const int32_t iconId = mPolicy->getCustomPointerIconId(); mLocked.additionalMouseResources[iconId] = icon; - mLocked.requestedPointerShape = iconId; + mLocked.requestedPointerType = iconId; mLocked.presentationChanged = true; updatePointerLocked(); @@ -574,7 +574,7 @@ bool PointerController::doFadingAnimationLocked(nsecs_t timestamp) { bool PointerController::doBitmapAnimationLocked(nsecs_t timestamp) { std::map<int32_t, PointerAnimation>::const_iterator iter = mLocked.animationResources.find( - mLocked.requestedPointerShape); + mLocked.requestedPointerType); if (iter == mLocked.animationResources.end()) { return false; } @@ -636,14 +636,14 @@ void PointerController::updatePointerLocked() { if (mLocked.pointerIconChanged || mLocked.presentationChanged) { if (mLocked.presentation == PRESENTATION_POINTER) { - if (mLocked.requestedPointerShape == mPolicy->getDefaultPointerIconId()) { + if (mLocked.requestedPointerType== mPolicy->getDefaultPointerIconId()) { mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } else { std::map<int32_t, SpriteIcon>::const_iterator iter = - mLocked.additionalMouseResources.find(mLocked.requestedPointerShape); + mLocked.additionalMouseResources.find(mLocked.requestedPointerType); if (iter != mLocked.additionalMouseResources.end()) { std::map<int32_t, PointerAnimation>::const_iterator anim_iter = - mLocked.animationResources.find(mLocked.requestedPointerShape); + mLocked.animationResources.find(mLocked.requestedPointerType); if (anim_iter != mLocked.animationResources.end()) { mLocked.animationFrameIndex = 0; mLocked.lastFrameUpdatedTime = systemTime(SYSTEM_TIME_MONOTONIC); @@ -651,7 +651,7 @@ void PointerController::updatePointerLocked() { } mLocked.pointerSprite->setIcon(iter->second); } else { - ALOGW("Can't find the resource for icon id %d", mLocked.requestedPointerShape); + ALOGW("Can't find the resource for icon id %d", mLocked.requestedPointerType); mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index c1381f32a37f..b47139adaf90 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -105,7 +105,7 @@ public: const uint32_t* spotIdToIndex, BitSet32 spotIdBits); virtual void clearSpots(); - void updatePointerShape(int32_t iconId); + void updatePointerIcon(int32_t iconId); void setCustomPointerIcon(const SpriteIcon& icon); void setDisplayViewport(int32_t width, int32_t height, int32_t orientation); void setInactivityTimeout(InactivityTimeout inactivityTimeout); @@ -180,7 +180,7 @@ private: std::map<int32_t, SpriteIcon> additionalMouseResources; std::map<int32_t, PointerAnimation> animationResources; - int32_t requestedPointerShape; + int32_t requestedPointerType; int32_t buttonState; diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java index e834c301f093..e68821b5a220 100644 --- a/location/java/android/location/GnssStatus.java +++ b/location/java/android/location/GnssStatus.java @@ -146,13 +146,11 @@ public final class GnssStatus { * <ul> * <li>GPS: 1-32</li> * <li>SBAS: 120-151, 183-192</li> - * <li>GLONASS: + * <li>GLONASS: One of: OSN, or FCN+100 * <ul> - * <li>The least significant 8 bits, signed, are the orbital slot number (OSN) in the range - * from 1-24, if known, or -127 if unknown</li> - * <li>The next least signficant 8 bits, signed, are the frequency channel number (FCN) in the - * range from -7 to +6, if known, and -127, if unknown</li> - * <li>At least one of the two (FCN & OSN) shall be set to a known value</li> + * <li>1-24 as the orbital slot number (OSN) (preferred, if known)</li> + * <li>93-106 as the frequency channel number (FCN) (-7 to +6) plus 100. + * i.e. encode FCN of -7 as 93, 0 as 100, and +6 as 106</li> * </ul></li> * <li>QZSS: 193-200</li> * <li>Galileo: 1-36</li> diff --git a/location/java/android/location/GpsStatus.java b/location/java/android/location/GpsStatus.java index 038247bb691e..5561b229dd25 100644 --- a/location/java/android/location/GpsStatus.java +++ b/location/java/android/location/GpsStatus.java @@ -32,6 +32,8 @@ import java.util.NoSuchElementException; @Deprecated public final class GpsStatus { private static final int NUM_SATELLITES = 255; + private static final int GLONASS_SVID_OFFSET = 64; + private static final int BEIDOU_SVID_OFFSET = 200; /* These package private values are modified by the LocationManager class */ private int mTimeToFirstFix; @@ -153,11 +155,22 @@ public final class GpsStatus { final int constellationType = (svidWithFlags[i] >> GnssStatus.CONSTELLATION_TYPE_SHIFT_WIDTH) & GnssStatus.CONSTELLATION_TYPE_MASK; - // Skip all non-GPS satellites. - if (constellationType != GnssStatus.CONSTELLATION_GPS) { + int prn = svidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH; + // Other satellites passed through these APIs before GnssSvStatus was availble. + // GPS, SBAS & QZSS can pass through at their nominally + // assigned prn number (as long as it fits in the valid 0-255 range below.) + // Glonass, and Beidou are passed through with the defacto standard offsets + // Other future constellation reporting (e.g. Galileo) needs to use + // GnssSvStatus on (N level) HAL & Java layers. + if (constellationType == GnssStatus.CONSTELLATION_GLONASS) { + prn += GLONASS_SVID_OFFSET; + } else if (constellationType == GnssStatus.CONSTELLATION_BEIDOU) { + prn += BEIDOU_SVID_OFFSET; + } else if ((constellationType != GnssStatus.CONSTELLATION_GPS) && + (constellationType != GnssStatus.CONSTELLATION_QZSS) && + (constellationType != GnssStatus.CONSTELLATION_SBAS)) { continue; } - int prn = svidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH; if (prn > 0 && prn <= NUM_SATELLITES) { GpsSatellite satellite = mSatellites.get(prn); if (satellite == null) { diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index a33b219b074e..3b74ee7ea723 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -48,6 +48,7 @@ import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Retention; @@ -875,10 +876,8 @@ public final class TvInputInfo implements Parcelable { * for the {@link TvInputService} this TV input implements. * * @return TvInputInfo containing information about this TV input. - * @throws IOException If there was an I/O error. - * @throws XmlPullParserException If there was an XML parsing error. */ - public TvInputInfo build() throws IOException, XmlPullParserException { + public TvInputInfo build() { ComponentName componentName = new ComponentName(mResolveInfo.serviceInfo.packageName, mResolveInfo.serviceInfo.name); String id; @@ -925,15 +924,14 @@ public final class TvInputInfo implements Parcelable { + tvInputHardwareInfo.getDeviceId(); } - private void parseServiceMetadata(int inputType) - throws XmlPullParserException, IOException { + private void parseServiceMetadata(int inputType) { ServiceInfo si = mResolveInfo.serviceInfo; PackageManager pm = mContext.getPackageManager(); try (XmlResourceParser parser = si.loadXmlMetaData(pm, TvInputService.SERVICE_META_DATA)) { if (parser == null) { - throw new XmlPullParserException("No " + TvInputService.SERVICE_META_DATA - + " meta-data for " + si.name); + throw new IllegalStateException("No " + TvInputService.SERVICE_META_DATA + + " meta-data found for " + si.name); } Resources res = pm.getResourcesForApplication(si.applicationInfo); @@ -946,26 +944,19 @@ public final class TvInputInfo implements Parcelable { String nodeName = parser.getName(); if (!XML_START_TAG_NAME.equals(nodeName)) { - throw new XmlPullParserException( - "Meta-data does not start with tv-input-service tag in " + si.name); + throw new IllegalStateException("Meta-data does not start with " + + XML_START_TAG_NAME + " tag for " + si.name); } TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.TvInputService); mSetupActivity = sa.getString( com.android.internal.R.styleable.TvInputService_setupActivity); - if (DEBUG) { - Log.d(TAG, "Setup activity loaded. [" + mSetupActivity + "] for " + si.name); - } if (inputType == TYPE_TUNER && TextUtils.isEmpty(mSetupActivity)) { - throw new XmlPullParserException("Setup activity not found in " + si.name); + throw new IllegalStateException("Setup activity not found for " + si.name); } mSettingsActivity = sa.getString( com.android.internal.R.styleable.TvInputService_settingsActivity); - if (DEBUG) { - Log.d(TAG, "Settings activity loaded. [" + mSettingsActivity + "] for " - + si.name); - } if (mCanRecord == null) { mCanRecord = sa.getBoolean( com.android.internal.R.styleable.TvInputService_canRecord, false); @@ -975,8 +966,10 @@ public final class TvInputInfo implements Parcelable { com.android.internal.R.styleable.TvInputService_tunerCount, 1); } sa.recycle(); + } catch (IOException | XmlPullParserException e) { + throw new IllegalStateException("Failed reading meta-data for " + si.packageName, e); } catch (NameNotFoundException e) { - throw new XmlPullParserException("Unable to create context for: " + si.packageName); + throw new IllegalStateException("No resources found for " + si.packageName, e); } } } diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp index 893c41472e07..6de5ea9e9f66 100644 --- a/media/jni/android_media_MediaSync.cpp +++ b/media/jni/android_media_MediaSync.cpp @@ -159,7 +159,7 @@ static void throwExceptionAsNecessary( if (err > 0) { break; } - AString msgWithErrorCode(msg); + AString msgWithErrorCode(msg == NULL ? "" : msg); msgWithErrorCode.append(" error:"); msgWithErrorCode.append(err); jniThrowException(env, "java/lang/IllegalStateException", msgWithErrorCode.c_str()); diff --git a/packages/DocumentsUI/res/values-be-rBY/strings.xml b/packages/DocumentsUI/res/values-be-rBY/strings.xml index 1a0f25453579..a7038aa8efd0 100644 --- a/packages/DocumentsUI/res/values-be-rBY/strings.xml +++ b/packages/DocumentsUI/res/values-be-rBY/strings.xml @@ -53,7 +53,7 @@ <string name="save_error" msgid="6167009778003223664">"Не атрымалася захаваць дакумент"</string> <string name="create_error" msgid="3735649141335444215">"Не атрымалася стварыць папку"</string> <string name="query_error" msgid="5999895349602476581">"Зараз немагчыма загрузіць змесціва"</string> - <string name="root_recent" msgid="4470053704320518133">"Апошнія"</string> + <string name="root_recent" msgid="4470053704320518133">"Нядаўнія"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> свабодна"</string> <string name="root_type_service" msgid="2178854894416775409">"Службы захоўвання"</string> <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлыкі"</string> @@ -129,7 +129,7 @@ <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Даць <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ да вашых даных, у тым ліку фатаграфій і відэа, на <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> <string name="never_ask_again" msgid="4295278542972859268">"Больш не пытацца"</string> <string name="allow" msgid="7225948811296386551">"Дазволіць"</string> - <string name="deny" msgid="2081879885755434506">"Забараніць"</string> + <string name="deny" msgid="2081879885755434506">"Адмовіць"</string> <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> <item quantity="one">Выбраны <xliff:g id="COUNT_1">%1$d</xliff:g></item> <item quantity="few">Выбраны <xliff:g id="COUNT_1">%1$d</xliff:g></item> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index ddb3eb8a8d9e..461b19152fcc 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -63,7 +63,7 @@ <string name="no_results" msgid="6622510343880730446">"Χωρίς αντιστοιχίσεις στο %1$s"</string> <string name="toast_no_application" msgid="4632640357724698144">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string> - <string name="share_via" msgid="8966594246261344259">"Κοινή χρήση μέσω"</string> + <string name="share_via" msgid="8966594246261344259">"Κοινοποίηση μέσω"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Αντιγραφή αρχείων"</string> <string name="move_notification_title" msgid="6193835179777284805">"Μετακίνηση αρχείων"</string> <string name="delete_notification_title" msgid="3329403967712437496">"Διαγραφή αρχείων"</string> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 22b352759f63..1efe13fbae1a 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -43,7 +43,7 @@ <string name="button_select" msgid="527196987259139214">"Seleccionar"</string> <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ignorar"</string> + <string name="button_dismiss" msgid="3714065566893946085">"Descartar"</string> <string name="button_retry" msgid="4392027584153752797">"Reintentar"</string> <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string> <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index c40cd550efee..ad1937fa2776 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -18,12 +18,12 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumendid"</string> <string name="downloads_label" msgid="959113951084633612">"Allalaadimised"</string> - <string name="title_open" msgid="4353228937663917801">"Ava:"</string> + <string name="title_open" msgid="4353228937663917801">"Ava asukohast:"</string> <string name="title_save" msgid="2433679664882857999">"Salvesta:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Uus kaust"</string> <string name="menu_grid" msgid="6878021334497835259">"Ruudustikkuva"</string> <string name="menu_list" msgid="7279285939892417279">"Loendikuva"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortimisalus:"</string> + <string name="menu_sort" msgid="7677740407158414452">"Sortimisalus"</string> <string name="menu_search" msgid="3816712084502856974">"Otsing"</string> <string name="menu_settings" msgid="8239065133341597825">"Salvestusruumi seaded"</string> <string name="menu_open" msgid="432922957274920903">"Ava"</string> @@ -31,8 +31,8 @@ <string name="menu_share" msgid="3075149983979628146">"Jaga"</string> <string name="menu_delete" msgid="8138799623850614177">"Kustuta"</string> <string name="menu_select_all" msgid="8323579667348729928">"Vali kõik"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopeeri asukohta ..."</string> - <string name="menu_move" msgid="1828090633118079817">"Teisaldamine kohta ..."</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopeeri asukohta..."</string> + <string name="menu_move" msgid="1828090633118079817">"Teisalda asukohta..."</string> <string name="menu_new_window" msgid="1226032889278727538">"Uus aken"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopeeri"</string> <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Kleebi"</string> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 916eed556360..b91b148dd006 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -31,7 +31,7 @@ <string name="menu_share" msgid="3075149983979628146">"Partager"</string> <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string> <string name="menu_select_all" msgid="8323579667348729928">"Tout sélectionner"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copier vers..."</string> + <string name="menu_copy" msgid="3612326052677229148">"Copier dans..."</string> <string name="menu_move" msgid="1828090633118079817">"Déplacer dans…"</string> <string name="menu_new_window" msgid="1226032889278727538">"Nouvelle fenêtre"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copier"</string> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml index d975ed5c8e40..aa9d799f59cd 100644 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ b/packages/DocumentsUI/res/values-hu/strings.xml @@ -23,7 +23,7 @@ <string name="menu_create_dir" msgid="2547620241173881754">"Új mappa"</string> <string name="menu_grid" msgid="6878021334497835259">"Rács"</string> <string name="menu_list" msgid="7279285939892417279">"Lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Rendezés"</string> + <string name="menu_sort" msgid="7677740407158414452">"Rendezés alapja"</string> <string name="menu_search" msgid="3816712084502856974">"Keresés"</string> <string name="menu_settings" msgid="8239065133341597825">"Tárolóhely beállításai"</string> <string name="menu_open" msgid="432922957274920903">"Megnyitás"</string> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index e206598459b0..2afb2058c8ea 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -32,7 +32,7 @@ <string name="menu_delete" msgid="8138799623850614177">"Ջնջել"</string> <string name="menu_select_all" msgid="8323579667348729928">"Ընտրել բոլորը"</string> <string name="menu_copy" msgid="3612326052677229148">"Պատճենել…"</string> - <string name="menu_move" msgid="1828090633118079817">"Տեղափոխում դեպի…"</string> + <string name="menu_move" msgid="1828090633118079817">"Տեղափոխել…"</string> <string name="menu_new_window" msgid="1226032889278727538">"Նոր պատուհան"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Պատճենել"</string> <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Տեղադրել"</string> @@ -59,7 +59,7 @@ <string name="root_type_shortcut" msgid="3318760609471618093">"Դյուրանցումներ"</string> <string name="root_type_device" msgid="7121342474653483538">"Սարքեր"</string> <string name="root_type_apps" msgid="8838065367985945189">"Հավելյալ ծրագրեր"</string> - <string name="empty" msgid="7858882803708117596">"Տարրեր չկան"</string> + <string name="empty" msgid="7858882803708117596">"Ոչինչ չկա"</string> <string name="no_results" msgid="6622510343880730446">"%1$s-ում համընկնումներ չկան"</string> <string name="toast_no_application" msgid="4632640357724698144">"Հնարավոր չէ բացել ֆայլը"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index be9b18d2c1bb..6c2bfd6a1471 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -31,7 +31,7 @@ <string name="menu_share" msgid="3075149983979628146">"ແບ່ງປັນ"</string> <string name="menu_delete" msgid="8138799623850614177">"ລຶບ"</string> <string name="menu_select_all" msgid="8323579667348729928">"ເລືອກທັງຫມົດ"</string> - <string name="menu_copy" msgid="3612326052677229148">"ອັດສຳເນົາໃສ່…"</string> + <string name="menu_copy" msgid="3612326052677229148">"ສຳເນົາໄປໃສ່..."</string> <string name="menu_move" msgid="1828090633118079817">"ຍ້າຍໄປໃສ່..."</string> <string name="menu_new_window" msgid="1226032889278727538">"ໜ້າຈໍໃໝ່"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ສຳເນົາ"</string> @@ -53,7 +53,7 @@ <string name="save_error" msgid="6167009778003223664">"ການບັນທຶກເອກະສານລົ້ມເຫລວ"</string> <string name="create_error" msgid="3735649141335444215">"ການສ້າງໂຟນເດີລົ້ມເຫຼວ"</string> <string name="query_error" msgid="5999895349602476581">"ບໍ່ສາມາດໂຫຼດເນື້ອຫາໄດ້ໃນຂະນະນີ້"</string> - <string name="root_recent" msgid="4470053704320518133">"ຫາກໍໃຊ້"</string> + <string name="root_recent" msgid="4470053704320518133">"ຫຼ້າສຸດ"</string> <string name="root_available_bytes" msgid="8568452858617033281">"ຟຣີ <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"ບໍລິການບ່ອນຈັດເກັບຂໍ້ມູນ"</string> <string name="root_type_shortcut" msgid="3318760609471618093">"ທາງລັດ"</string> diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml index 1b1f3c123416..71f5f5956091 100644 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-pa-rIN/strings.xml @@ -80,7 +80,7 @@ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਮਿਟਾ ਰਿਹਾ ਹੈ।</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਮਿਟਾ ਰਿਹਾ ਹੈ।</item> </plurals> - <string name="undo" msgid="7905788502491742328">"ਪਹਿਲਾਂ ਵਰਗਾ ਕਰੋ"</string> + <string name="undo" msgid="7905788502491742328">"ਅਣਕੀਤਾ ਕਰੋ"</string> <string name="copy_preparing" msgid="3896202461003039386">"ਕਾਪੀ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="move_preparing" msgid="2772219441375531410">"ਮੂਵ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ..."</string> <string name="delete_preparing" msgid="5655813182533491992">"ਮਿਟਾਉਣ ਦੀ ਤਿਆਰੀ ਹੋ ਰਹੀ ਹੈ…"</string> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index 78c7988f5bee..1f519f5cae7d 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -38,8 +38,8 @@ <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Inserați"</string> <string name="menu_advanced_show" msgid="4693652895715631401">"Afișați stocarea internă"</string> <string name="menu_advanced_hide" msgid="4218809952721972589">"Ascundeți stocarea internă"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Afișați mărime fișiere"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ascundeți mărime fișiere"</string> + <string name="menu_file_size_show" msgid="3240323619260823076">"Afișați dimensiunea"</string> + <string name="menu_file_size_hide" msgid="8881975928502581042">"Ascundeți dimensiunea"</string> <string name="button_select" msgid="527196987259139214">"Selectați"</string> <string name="button_copy" msgid="8706475544635021302">"Copiați"</string> <string name="button_move" msgid="2202666023104202232">"Mutați"</string> @@ -59,7 +59,7 @@ <string name="root_type_shortcut" msgid="3318760609471618093">"Comenzi rapide"</string> <string name="root_type_device" msgid="7121342474653483538">"Dispozitive"</string> <string name="root_type_apps" msgid="8838065367985945189">"Alte aplicații"</string> - <string name="empty" msgid="7858882803708117596">"Nu există elemente"</string> + <string name="empty" msgid="7858882803708117596">"Niciun element"</string> <string name="no_results" msgid="6622510343880730446">"Niciun rezultat în %1$s"</string> <string name="toast_no_application" msgid="4632640357724698144">"Fișierul nu poate fi deschis"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index a1640269383b..46a02778ed17 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -53,13 +53,13 @@ <string name="save_error" msgid="6167009778003223664">"Imeshindwa kuhifadhi hati"</string> <string name="create_error" msgid="3735649141335444215">"Ilishindwa kuunda folda"</string> <string name="query_error" msgid="5999895349602476581">"Haiwezi kupakia maudhui kwa sasa"</string> - <string name="root_recent" msgid="4470053704320518133">"Hivi karibuni"</string> + <string name="root_recent" msgid="4470053704320518133">"Za hivi karibuni"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bila malipo"</string> <string name="root_type_service" msgid="2178854894416775409">"Huduma za hifadhi"</string> <string name="root_type_shortcut" msgid="3318760609471618093">"Njia za mkato"</string> <string name="root_type_device" msgid="7121342474653483538">"Vifaa"</string> <string name="root_type_apps" msgid="8838065367985945189">"Programu zaidi"</string> - <string name="empty" msgid="7858882803708117596">"Hakuna vipengee"</string> + <string name="empty" msgid="7858882803708117596">"Hakuna chochote"</string> <string name="no_results" msgid="6622510343880730446">"Hakuna zinazolingana katika %1$s"</string> <string name="toast_no_application" msgid="4632640357724698144">"Haiwezi kufungua faili"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index d2d85adc30db..adf1b72bb25b 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -29,7 +29,7 @@ <string name="menu_open" msgid="432922957274920903">"Buksan"</string> <string name="menu_save" msgid="2394743337684426338">"I-save"</string> <string name="menu_share" msgid="3075149983979628146">"Ibahagi"</string> - <string name="menu_delete" msgid="8138799623850614177">"Tanggalin"</string> + <string name="menu_delete" msgid="8138799623850614177">"I-delete"</string> <string name="menu_select_all" msgid="8323579667348729928">"Piliin lahat"</string> <string name="menu_copy" msgid="3612326052677229148">"Kopyahin sa..."</string> <string name="menu_move" msgid="1828090633118079817">"Ilipat sa…"</string> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index 6ee919ee75a6..16afeb4eb25f 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文件"</string> - <string name="downloads_label" msgid="959113951084633612">"下載內容"</string> + <string name="downloads_label" msgid="959113951084633612">"下載"</string> <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> <string name="title_save" msgid="2433679664882857999">"儲存至"</string> <string name="menu_create_dir" msgid="2547620241173881754">"新增資料夾"</string> @@ -33,7 +33,7 @@ <string name="menu_select_all" msgid="8323579667348729928">"全選"</string> <string name="menu_copy" msgid="3612326052677229148">"複製到…"</string> <string name="menu_move" msgid="1828090633118079817">"移至…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"新視窗"</string> + <string name="menu_new_window" msgid="1226032889278727538">"新增視窗"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"複製"</string> <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"貼上"</string> <string name="menu_advanced_show" msgid="4693652895715631401">"顯示內部儲存空間"</string> diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 5e7a229fda9d..870c3439b8a9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -59,6 +59,7 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.OnItemTouchListener; import android.support.v7.widget.RecyclerView.RecyclerListener; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.text.BidiFormatter; import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; @@ -787,11 +788,15 @@ public class DirectoryFragment extends Fragment if (docs.size() == 1) { // Deleteing 1 file xor 1 folder in cwd + + // Address b/28772371, where including user strings in message can result in + // broken bidirectional support. + String displayName = BidiFormatter.getInstance().unicodeWrap(docs.get(0).displayName); message = dirsCount == 0 ? getActivity().getString(R.string.delete_filename_confirmation_message, - docs.get(0).displayName) + displayName) : getActivity().getString(R.string.delete_foldername_confirmation_message, - docs.get(0).displayName); + displayName); } else if (dirsCount == 0) { // Deleting only files in cwd message = Shared.getQuantityString(getActivity(), diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 64b443babde7..60eaad2699ee 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -69,7 +69,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout public void reset() { // start fresh mDismissing = false; - resetPasswordText(false /* animate */); + resetPasswordText(false /* animate */, false /* announce */); // if the user is currently locked out, enforce it. long deadline = mLockPatternUtils.getLockoutAttemptDeadline( KeyguardUpdateMonitor.getCurrentUser()); @@ -169,10 +169,10 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), true); } } - resetPasswordText(true /* animate */); + resetPasswordText(true /* animate */, !matched /* announce deletion if no match */); } - protected abstract void resetPasswordText(boolean animate); + protected abstract void resetPasswordText(boolean animate, boolean announce); protected abstract String getPasswordText(); protected abstract void setPasswordEntryEnabled(boolean enabled); protected abstract void setPasswordEntryInputEnabled(boolean enabled); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java index 4abb795b267b..7ea767c004fb 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java @@ -60,6 +60,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { R.dimen.disappear_y_translation); } + @Override protected void resetState() { super.resetState(); mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java index 189f5b7dcfc7..b75f52987a92 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java @@ -72,6 +72,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView context, android.R.interpolator.fast_out_linear_in); } + @Override protected void resetState() { mSecurityMessageDisplay.setMessage(R.string.kg_password_instructions, false); final boolean wasDisabled = mPasswordEntry.isEnabled(); @@ -159,6 +160,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView // Poke the wakelock any time the text is selected or modified mPasswordEntry.setOnClickListener(new OnClickListener() { + @Override public void onClick(View v) { mCallback.userActivity(); } @@ -175,6 +177,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView switchImeButton.setVisibility(View.VISIBLE); imeOrDeleteButtonVisible = true; switchImeButton.setOnClickListener(new OnClickListener() { + @Override public void onClick(View v) { mCallback.userActivity(); // Leave the screen on a bit longer // Do not show auxiliary subtypes in password lock screen. @@ -202,7 +205,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView } @Override - protected void resetPasswordText(boolean animate) { + protected void resetPasswordText(boolean animate, boolean announce) { mPasswordEntry.setText(""); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java index f14290af172d..c8719f3f88e3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -159,8 +159,8 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView } @Override - protected void resetPasswordText(boolean animate) { - mPasswordEntry.reset(animate); + protected void resetPasswordText(boolean animate, boolean announce) { + mPasswordEntry.reset(animate, announce); } @Override @@ -214,7 +214,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView public boolean onLongClick(View v) { // check for time-based lockouts if (mPasswordEntry.isEnabled()) { - resetPasswordText(true /* animate */); + resetPasswordText(true /* animate */, true /* announce */); } doHapticKeyClick(); return true; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java index 2033159af720..cfaf7b622eb7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java @@ -71,6 +71,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { super(context, attrs); } + @Override public void resetState() { super.resetState(); if (DEBUG) Log.v(TAG, "Resetting state"); @@ -199,6 +200,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]); } post(new Runnable() { + @Override public void run() { onSimCheckResponse(result[0], result[1]); } @@ -206,6 +208,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } catch (RemoteException e) { Log.e(TAG, "RemoteException for supplyPinReportResult:", e); post(new Runnable() { + @Override public void run() { onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); } @@ -250,7 +253,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (entry.length() < 4) { // otherwise, display a message to the user, and don't submit. mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); - resetPasswordText(true); + resetPasswordText(true /* animate */, true /* announce */); mCallback.userActivity(); return; } @@ -259,13 +262,16 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (mCheckSimPinThread == null) { mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) { + @Override void onSimCheckResponse(final int result, final int attemptsRemaining) { post(new Runnable() { + @Override public void run() { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } - resetPasswordText(true /* animate */); + resetPasswordText(true /* animate */, + result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */); if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java index af882395ee79..59c01cf481c7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java @@ -106,7 +106,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { msg = R.string.kg_invalid_confirm_pin_hint; } } - resetPasswordText(true); + resetPasswordText(true /* animate */, true /* announce */); if (msg != 0) { mSecurityMessageDisplay.setMessage(msg, true); } @@ -163,6 +163,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return displayMessage; } + @Override public void resetState() { super.resetState(); mStateMachine.reset(); @@ -242,6 +243,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]); } post(new Runnable() { + @Override public void run() { onSimLockChangedResponse(result[0], result[1]); } @@ -249,6 +251,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } catch (RemoteException e) { Log.e(TAG, "RemoteException for supplyPukReportResult:", e); post(new Runnable() { + @Override public void run() { onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); } @@ -316,13 +319,16 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (mCheckSimPukThread == null) { mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) { + @Override void onSimLockChangedResponse(final int result, final int attemptsRemaining) { post(new Runnable() { + @Override public void run() { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } - resetPasswordText(true /* animate */); + resetPasswordText(true /* animate */, + result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */); if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); diff --git a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java index 7dba5455e642..48737f9a9bfb 100644 --- a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java +++ b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java @@ -268,7 +268,7 @@ public class PasswordTextView extends View { return charState; } - public void reset(boolean animated) { + public void reset(boolean animated, boolean announce) { String textbefore = mText; mText = ""; int length = mTextChars.size(); @@ -297,7 +297,9 @@ public class PasswordTextView extends View { if (!animated) { mTextChars.clear(); } - sendAccessibilityEventTypeViewTextChanged(textbefore, 0, textbefore.length(), 0); + if (announce) { + sendAccessibilityEventTypeViewTextChanged(textbefore, 0, textbefore.length(), 0); + } } void sendAccessibilityEventTypeViewTextChanged(String beforeText, int fromIndex, diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml index fa5ec3f5269c..b9fd6aacea46 100644 --- a/packages/PrintSpooler/res/values-af/strings.xml +++ b/packages/PrintSpooler/res/values-af/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Meer inligting oor hierdie drukker"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Kon nie lêer skep nie"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Sommige drukdienste is gedeaktiveer"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Soek tans vir drukkers"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Geen drukdienste is geaktiveer nie"</string> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 5ada8d31ed42..1eb427bf5a00 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ተጨማሪ የዚህ አታሚ መረጃ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ፋይል መፍጠር አልተቻለም"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"አንዳንድ የህትመት አገልግሎቶች ተሰናክለዋል"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"አታሚዎችን በመፈለግ ላይ"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ምንም የህትመት አገልግሎቶች አልነቁም"</string> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index b9d1902475e4..d23e1bc93595 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -65,6 +65,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"مزيد من المعلومات حول هذه الطابعة"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"تعذَّر إنشاء الملف"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"بعض خدمات الطباعة معطَّلة"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"البحث عن طابعات"</string> <string name="print_no_print_services" msgid="8561247706423327966">"لم يتم تمكين أي خدمات طباعة"</string> diff --git a/packages/PrintSpooler/res/values-az-rAZ/strings.xml b/packages/PrintSpooler/res/values-az-rAZ/strings.xml index 4404aadb4e44..1f5da5fad340 100644 --- a/packages/PrintSpooler/res/values-az-rAZ/strings.xml +++ b/packages/PrintSpooler/res/values-az-rAZ/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Bu printer haqqında daha ətraflı məlumat"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Fayl yaradıla bilmədi"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Bəzi çap xidmətləri deaktiv edilib."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printer axtarılır"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Heç bir çap xidməti aktiv edilməyib"</string> diff --git a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml index 50ce1f96b912..c2b84d0165ca 100644 --- a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml +++ b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Još informacija o ovom štampaču"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Pravljenje datoteke nije uspelo"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Neke usluge štampanja su onemogućene"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Pretraga štampača"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nijedna usluga štampanja nije omogućena"</string> diff --git a/packages/PrintSpooler/res/values-be-rBY/strings.xml b/packages/PrintSpooler/res/values-be-rBY/strings.xml index c264f9266b81..9cbb9111556b 100644 --- a/packages/PrintSpooler/res/values-be-rBY/strings.xml +++ b/packages/PrintSpooler/res/values-be-rBY/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Больш падрабязная інфармацыя пра гэты прынтар"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Не атрымалася стварыць файл"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Некаторыя службы друку адключаны"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук прынтараў"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Службы друку не ўключаны"</string> diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml index 3dd6ec566ce7..dc32b0ffbe8c 100644 --- a/packages/PrintSpooler/res/values-bg/strings.xml +++ b/packages/PrintSpooler/res/values-bg/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Още информация за този принтер"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Файлът не можа да бъде създаден"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Някои услуги за отпечатване са деактивирани"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Търсене на принтери"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Няма активирани услуги за отпечатване"</string> diff --git a/packages/PrintSpooler/res/values-bn-rBD/strings.xml b/packages/PrintSpooler/res/values-bn-rBD/strings.xml index 3789f21db147..c074791498e1 100644 --- a/packages/PrintSpooler/res/values-bn-rBD/strings.xml +++ b/packages/PrintSpooler/res/values-bn-rBD/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"এই মুদ্রকটির বিষয়ে আরো তথ্য"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ফাইল তৈরি করা গেল না"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"কিছু মুদ্রণ পরিষেবা অক্ষম করা আছে"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"মুদ্রকগুলি অনুসন্ধান করা হচ্ছে"</string> <string name="print_no_print_services" msgid="8561247706423327966">"প্রিন্ট পরিষেবা সক্ষম নেই"</string> diff --git a/packages/PrintSpooler/res/values-bs-rBA/strings.xml b/packages/PrintSpooler/res/values-bs-rBA/strings.xml index c3c9bb33e9c3..cc04d6646278 100644 --- a/packages/PrintSpooler/res/values-bs-rBA/strings.xml +++ b/packages/PrintSpooler/res/values-bs-rBA/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Više informacija o ovom štampaču"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Nije uspjelo kreiranje fajla"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Neke usluge za štampanje su isključene"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Traženje štampača"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Usluga za štampanje nije uključena"</string> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index f65a63c95874..f0404abaced4 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Més informació sobre aquesta impressora"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Alguns serveis d\'impressió estan desactivats"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Cerca d\'impressores"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No hi ha cap servei d\'impressió activat"</string> diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml index 9bfa2719ef49..5c0a1ef1af5e 100644 --- a/packages/PrintSpooler/res/values-cs/strings.xml +++ b/packages/PrintSpooler/res/values-cs/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Další informace o této tiskárně"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Soubor nelze vytvořit"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Některé tiskové služby nejsou aktivovány"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhledávání tiskáren"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nejsou aktivovány žádné tiskové služby"</string> diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml index 75a0b56f01de..0d1e2cdc0ce2 100644 --- a/packages/PrintSpooler/res/values-da/strings.xml +++ b/packages/PrintSpooler/res/values-da/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Flere oplysninger om denne printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Filen kunne ikke oprettes"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Nogle udskrivningstjenester er deaktiveret"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Søger efter printere"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ingen udskrivningstjenester er aktiveret"</string> diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml index 8c6181d31b04..7ac57dbd63c7 100644 --- a/packages/PrintSpooler/res/values-de/strings.xml +++ b/packages/PrintSpooler/res/values-de/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Weitere Informationen über diesen Drucker"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Datei konnte nicht erstellt werden"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Einige Druckdienste sind deaktiviert"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Suche nach Druckern"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Keine Druckdienste aktiviert"</string> diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml index 31d3f8333535..929c08231efc 100644 --- a/packages/PrintSpooler/res/values-el/strings.xml +++ b/packages/PrintSpooler/res/values-el/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Περισσότερες πληροφορίες σχετικά με αυτόν τον εκτυπωτή"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Δεν ήταν δυνατή η δημιουργία του αρχείου"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Ορισμένες υπηρ. εκτύπωσης είναι απενεργοποιημένες"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Αναζήτηση για εκτυπωτές"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Δεν έχουν ενεργοποιηθεί υπηρεσίες εκτύπωσης"</string> diff --git a/packages/PrintSpooler/res/values-en-rAU/strings.xml b/packages/PrintSpooler/res/values-en-rAU/strings.xml index 5e32ae48be42..c9c33a8d369c 100644 --- a/packages/PrintSpooler/res/values-en-rAU/strings.xml +++ b/packages/PrintSpooler/res/values-en-rAU/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"More information about this printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Could not create file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Some print services are disabled"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml index 5e32ae48be42..c9c33a8d369c 100644 --- a/packages/PrintSpooler/res/values-en-rGB/strings.xml +++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"More information about this printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Could not create file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Some print services are disabled"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml index 5e32ae48be42..c9c33a8d369c 100644 --- a/packages/PrintSpooler/res/values-en-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"More information about this printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Could not create file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Some print services are disabled"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index a6a9f0780176..e2d261c7c4b2 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Más información sobre esta impresora"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"No se pudo crear el archivo"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Hay servicios de impresión inhabilitados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No hay servicios de impresión habilitados"</string> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index 4f6731d4b3ea..9d7badb5db79 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Más información sobre esta impresora"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"No se ha podido crear el archivo"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Algunos servicios de impresión están inhabilitados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"No hay servicios de impresión habilitados"</string> diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml index 3d0516c21858..569ef31b405a 100644 --- a/packages/PrintSpooler/res/values-et-rEE/strings.xml +++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Lisateave selle printeri kohta"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Faili ei õnnestunud luua"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Mõned printimisteenused on keelatud"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerite otsimine"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ühtegi printimisteenust pole lubatud"</string> diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml index c56692fd333e..5c3d379b2a21 100644 --- a/packages/PrintSpooler/res/values-eu-rES/strings.xml +++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Informazio gehiago inprimagailuari buruz"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Desgaituta daude inprimatzeko zerbitzu batzuk"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Inprimagailuak bilatzen"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ez dago gaituta inprimatzeko zerbitzurik"</string> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 9d9c08a9f357..0606452c6a6c 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"اطلاعات بیشتر درباره چاپگر"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"بعضی از خدمات چاپ غیرفعال هستند"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"درحال جستجوی چاپگرها"</string> <string name="print_no_print_services" msgid="8561247706423327966">"هیچ خدمات چاپی فعال نیست"</string> diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml index 3d6897d6bcce..8c62d5c0191e 100644 --- a/packages/PrintSpooler/res/values-fi/strings.xml +++ b/packages/PrintSpooler/res/values-fi/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Lisätietoja tästä tulostimesta"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Tiedoston luominen epäonnistui."</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Osa tulostuspalveluista on poistettu käytöstä."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Etsitään tulostimia"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ei käytössä olevia tulostuspalveluita"</string> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index 6c9539a3db80..7efd751990d6 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Plus d\'information sur cette imprimante"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Certains services d\'impression sont désactivés"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours..."</string> <string name="print_no_print_services" msgid="8561247706423327966">"Aucun service d\'impression activé"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index 64add68614ee..efd7c5a9d89f 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Plus d\'informations sur cette imprimante"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Certains services d\'impression sont désactivés."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Aucun service d\'impression activé"</string> diff --git a/packages/PrintSpooler/res/values-gl-rES/strings.xml b/packages/PrintSpooler/res/values-gl-rES/strings.xml index 099159d66682..bb4e052467e2 100644 --- a/packages/PrintSpooler/res/values-gl-rES/strings.xml +++ b/packages/PrintSpooler/res/values-gl-rES/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Máis información sobre esta impresora"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Non se puido crear o arquivo"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Algúns servizos de impresión están desactivados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Busca de impresoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Non hai servizos de impresión activados"</string> diff --git a/packages/PrintSpooler/res/values-gu-rIN/strings.xml b/packages/PrintSpooler/res/values-gu-rIN/strings.xml index b42fdabe4035..8178571e4fe1 100644 --- a/packages/PrintSpooler/res/values-gu-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-gu-rIN/strings.xml @@ -33,8 +33,8 @@ <string name="pages_range_example" msgid="8558694453556945172">"દા.ત. 1—5,8,11—13"</string> <string name="print_preview" msgid="8010217796057763343">"પ્રિન્ટ પૂર્વાવલોકન"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"પૂર્વાવલોકન માટે PDF દર્શક ઇન્સ્ટોલ કરો"</string> - <string name="printing_app_crashed" msgid="854477616686566398">"પ્રિન્ટીંગ એપ્લિકેશન ક્રેશ થઈ"</string> - <string name="generating_print_job" msgid="3119608742651698916">"પ્રિન્ટ જોબ બનાવી રહ્યું છે"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"પ્રિન્ટીંગ ઍપ્લિકેશન ક્રેશ થઈ"</string> + <string name="generating_print_job" msgid="3119608742651698916">"છાપ કાર્ય બનાવી રહ્યું છે"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF તરીકે સાચવો"</string> <string name="all_printers" msgid="5018829726861876202">"બધા પ્રિન્ટર્સ…"</string> <string name="print_dialog" msgid="32628687461331979">"પ્રિન્ટ સંવાદ"</string> @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"આ પ્રિન્ટર વિશે વધુ માહિતી"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ફાઇલ બનાવી શક્યાં નથી"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"કેટલીક છાપવાની સેવાઓ અક્ષમ કરેલ છે"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"પ્રિન્ટર્સ માટે શોધી રહ્યું છે"</string> <string name="print_no_print_services" msgid="8561247706423327966">"કોઈ છાપ સેવાઓ સક્ષમ કરેલ નથી"</string> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index 507754a0a4db..8095f0fab92e 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"इस प्रिंटर के बारे में अधिक जानकारी"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"फ़ाइल नहीं बनाई जा सकी"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"कुछ प्रिंट सेवाएं अक्षम हैं"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर खोज रहा है"</string> <string name="print_no_print_services" msgid="8561247706423327966">"कोई भी प्रिंट सेवा सक्षम नहीं है"</string> diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml index 92c97ea3223f..ea8be7000efa 100644 --- a/packages/PrintSpooler/res/values-hr/strings.xml +++ b/packages/PrintSpooler/res/values-hr/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Više informacija o ovom pisaču"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Izrada datoteke nije uspjela"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Neke su usluge ispisa onemogućene"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Traženje pisača"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nije omogućena nijedna usluga ispisa"</string> diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml index a2e53db859e2..6e2a620d9dc1 100644 --- a/packages/PrintSpooler/res/values-hu/strings.xml +++ b/packages/PrintSpooler/res/values-hu/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"További információ erről a nyomtatóról"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Nem sikerült létrehozni a fájlt"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Egyes nyomtatási szolgáltatások le vannak tiltva"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Nyomtatók keresése"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nincs engedélyezett nyomtatási szolgáltatás"</string> diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml index e26c2444280d..65a34d2b1ffa 100644 --- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml +++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Հավելյալ տեղեկություններ այս տպիչի մասին"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Չհաջողվեց ստեղծել ֆայլ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Տպելու որոշ ծառայությունները կասեցված են"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Տպիչների որոնում"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ակտիվացված տպման ծառայություններ չկան"</string> diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml index 4ec06441db7a..e9b49bb82b04 100644 --- a/packages/PrintSpooler/res/values-in/strings.xml +++ b/packages/PrintSpooler/res/values-in/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Informasi selengkapnya tentang printer ini"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Tidak dapat membuat file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Beberapa layanan cetak dinonaktifkan"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari printer"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Tidak ada layanan cetak yang aktif"</string> diff --git a/packages/PrintSpooler/res/values-is-rIS/strings.xml b/packages/PrintSpooler/res/values-is-rIS/strings.xml index e05f07f4bec1..0ec97e16a4f4 100644 --- a/packages/PrintSpooler/res/values-is-rIS/strings.xml +++ b/packages/PrintSpooler/res/values-is-rIS/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Frekari upplýsingar um þennan prentara"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Ekki tókst að búa til skrá"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Hluti prentþjónustunnar er óvirkur"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Leitar að prentara"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Engin prentþjónusta er virk"</string> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 39a0a6182206..c9e893e53203 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Ulteriori informazioni su questa stampante"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Impossibile creare il file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Alcuni servizi di stampa sono disattivati"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Ricerca di stampanti"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Non è stato attivato alcun servizio di stampa"</string> diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 9aa4104c90f7..dcc3f6b0fe39 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"מידע נוסף על מדפסת זו"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"לא ניתן היה ליצור קובץ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"שירותי הדפסה מסוימים מושבתים"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string> <string name="print_no_print_services" msgid="8561247706423327966">"לא הופעלו שירותי הדפסה"</string> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index f97efc1a1502..6d03880d5399 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"このプリンタの詳細"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ファイルを作成できませんでした"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"一部の印刷サービスは無効になっています"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"プリンタの検索中"</string> <string name="print_no_print_services" msgid="8561247706423327966">"使用できる印刷サービスがありません"</string> diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml index 9cb8b39d4035..0991a294d1b9 100644 --- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml +++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> — <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"დამატებითი ინფორმაცია ამ პრინტერის შესახებ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ფაილი ვერ შეიქმნა"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"ბეჭდვის ზოგიერთი სერვისი გათიშულია"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"მიმდინარეობს პრინტერების ძიება"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ბეჭდვის სერვისები გააქტიურებული არ არის"</string> diff --git a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml index 37b2cd3a8862..505e07dc4526 100644 --- a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml +++ b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Осы принтер туралы қосымша ақпарат"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Файл жасалмады"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Кейбір басып шығару қызметтері өшірілген."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтерлерді іздеу"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Басып шығару қызметтері қосылмаған"</string> diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml index 12d296d3f006..5f65c7b90968 100644 --- a/packages/PrintSpooler/res/values-km-rKH/strings.xml +++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ព័ត៌មានបន្ថែមអំពីម៉ាស៊ីបោះពុម្ពនេះ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"មិនអាចបង្កើតឯកសារបានទេ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"សេវាកម្មបោះពុម្ពមួយចំនួនត្រូវបានបិទដំណើរការ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ស្វែងរកម៉ាស៊ីនបោះពុម្ព"</string> <string name="print_no_print_services" msgid="8561247706423327966">"គ្មានការបើកដំណើរការសេវាបោះពុម្ពទេ"</string> diff --git a/packages/PrintSpooler/res/values-kn-rIN/strings.xml b/packages/PrintSpooler/res/values-kn-rIN/strings.xml index 8b1acddcb563..f4b9d6190f4a 100644 --- a/packages/PrintSpooler/res/values-kn-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-kn-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ಈ ಪ್ರಿಂಟರ್ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು ಮಾಹಿತಿ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ಫೈಲ್ ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"ಕೆಲವು ಮುದ್ರಣ ಸೇವೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ಪ್ರಿಂಟರ್ಗಳಿಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ಯಾವುದೇ ಮುದ್ರಣ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ"</string> diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml index e6ca240e7042..abd69597a58b 100644 --- a/packages/PrintSpooler/res/values-ko/strings.xml +++ b/packages/PrintSpooler/res/values-ko/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"이 프린터에 대한 정보 더보기"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"파일을 만들 수 없습니다."</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"프린트 서비스 일부가 사용 중지되었습니다."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"프린터 검색 중"</string> <string name="print_no_print_services" msgid="8561247706423327966">"사용 가능한 프린트 서비스 없음"</string> diff --git a/packages/PrintSpooler/res/values-ky-rKG/strings.xml b/packages/PrintSpooler/res/values-ky-rKG/strings.xml index ae0b05e2a2f0..3886c9fe4188 100644 --- a/packages/PrintSpooler/res/values-ky-rKG/strings.xml +++ b/packages/PrintSpooler/res/values-ky-rKG/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Бул принтер жөнүндө көбүрөөк маалымат"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Файл түзүлбөй койду"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Басып чыгаруу кызматтарынын айрымы өчүрүлгөн"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтерлер изделүүдө"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Принтер-кызматтары иштетилген эмес"</string> diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml index 2392e4a188ea..e424af9169b1 100644 --- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml +++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບເຄື່ອງພິມນີ້"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ບໍ່ສາມາດສ້າງໄຟລ໌ໄດ້"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"ບາງການບໍລິການພິມຖືກປິດການນຳໃຊ້"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ກຳລັງຊອກຫາເຄື່ອງພິມ"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ບໍ່ມີການບໍລິການພິມເປີດໃຊ້ງານໄວ້"</string> diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml index 65ccc2be040b..25a36a457603 100644 --- a/packages/PrintSpooler/res/values-lt/strings.xml +++ b/packages/PrintSpooler/res/values-lt/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"„<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g>“ – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Daugiau informacijos apie šį spausdintuvą"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Nepavyko sukurti failo"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Kai kurios spausdinimo paslaugos išjungtos"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Ieškoma spausdintuvų"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Neįgalinta jokių spausdinimo paslaugų"</string> diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml index 1bcfe783d239..e0a076e41cd2 100644 --- a/packages/PrintSpooler/res/values-lv/strings.xml +++ b/packages/PrintSpooler/res/values-lv/strings.xml @@ -62,6 +62,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> — <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Plašāka informācija par šo printeri"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Daži drukas pakalpojumi ir atspējoti."</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printeru meklēšana"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nav iespējots neviens drukas pakalpojums"</string> diff --git a/packages/PrintSpooler/res/values-mk-rMK/strings.xml b/packages/PrintSpooler/res/values-mk-rMK/strings.xml index d29566bc1edf..624b81b83034 100644 --- a/packages/PrintSpooler/res/values-mk-rMK/strings.xml +++ b/packages/PrintSpooler/res/values-mk-rMK/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Повеќе информации за овој печатач"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Не можеше да се создаде датотека"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Некои услуги за печатење се оневозможени"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пребарување печатачи"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Нема овозможени услуги за печатење"</string> diff --git a/packages/PrintSpooler/res/values-ml-rIN/strings.xml b/packages/PrintSpooler/res/values-ml-rIN/strings.xml index 16d654c63fc0..a213fa65141d 100644 --- a/packages/PrintSpooler/res/values-ml-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ml-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ഈ പ്രിന്ററിനെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ഫയൽ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"ചില പ്രിന്റ് സേവനങ്ങൾ പ്രവർത്തനരഹിതമാക്കി"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"പ്രിന്ററുകൾക്കായി തിരയുന്നു"</string> <string name="print_no_print_services" msgid="8561247706423327966">"പ്രിന്റ് സേവനങ്ങളൊന്നും പ്രവർത്തനക്ഷമാക്കിയിട്ടില്ല"</string> diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml index ded066566499..ab5c30da0c67 100644 --- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml +++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Энэ хэвлэгчийн талаарх дэлгэрэнгүй мэдээлэл"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Файл үүсгэж чадсангүй"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Зарим хэвлэх үйлчилгээг идэвхгүй болгосон байна"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтер хайж байна"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Хэвлэх үйлчилгээг идэвхжүүлээгүй"</string> diff --git a/packages/PrintSpooler/res/values-mr-rIN/strings.xml b/packages/PrintSpooler/res/values-mr-rIN/strings.xml index 5436635ada1c..53d0d41e788e 100644 --- a/packages/PrintSpooler/res/values-mr-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-mr-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"या प्रिंटर विषयी अधिक माहिती"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"फाईल तयार करणेे शक्य झाले नाही"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"काही मुद्रण सेवा अक्षम केल्या आहेत"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर शोधत आहे"</string> <string name="print_no_print_services" msgid="8561247706423327966">"कोणत्याही मुद्रण सेवा सक्षम केलेल्या नाहीत"</string> diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml index 8af5232f8a16..5c43b4f2c14c 100644 --- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml +++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Maklumat lanjut tentang pencetak ini"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Tidak dapat membuat fail"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Sesetengah perkhidmatan cetak dilumpuhkan"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari pencetak"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Perkhidmatan cetak tidak didayakan"</string> diff --git a/packages/PrintSpooler/res/values-my-rMM/strings.xml b/packages/PrintSpooler/res/values-my-rMM/strings.xml index 9b5f46aca49f..1f0700765ec9 100644 --- a/packages/PrintSpooler/res/values-my-rMM/strings.xml +++ b/packages/PrintSpooler/res/values-my-rMM/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ဤပရင်တာ အကြောင်း ပိုမိုလေ့လာပါ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ဖိုင်ဖန်တီး၍မရပါ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"အချို့ပုံနှိပ်ဝန်ဆောင်မှုများကို ပိတ်ထားပါသည်"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"စာထုတ်စက်များကို ရှာနေပါသည်"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ပုံနှိပ်ထုတ်ယူရေး ဝန်ဆောင်မှုများ ဖွင့်မထားပါ"</string> @@ -80,7 +81,7 @@ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ကို ပယ်ဖျက်နေပါသည်"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"စာထုတ်စက်မှ အမှား <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="blocked_notification_title_template" msgid="1175435827331588646">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ကိုစာထုတ်စက်ကငြင်းလိုက်သည်"</string> - <string name="cancel" msgid="4373674107267141885">"ပယ်ဖျက်"</string> + <string name="cancel" msgid="4373674107267141885">"ဖျက်သိမ်းရန်"</string> <string name="restart" msgid="2472034227037808749">"အစက ပြန်စရန်"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"စာထုတ်စက်နဲ့ ဆက်သွယ်ထားမှု မရှိပါ"</string> <string name="reason_unknown" msgid="5507940196503246139">"အကြောင်းအရာ မသိရှိ"</string> diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml index 82282bad9268..720e0ca16690 100644 --- a/packages/PrintSpooler/res/values-nb/strings.xml +++ b/packages/PrintSpooler/res/values-nb/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mer informasjon om denne printeren"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Kunne ikke opprette fil"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Noen utskriftstjenester er slått av"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Søker etter skrivere"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ingen utskriftstjenester er slått på"</string> diff --git a/packages/PrintSpooler/res/values-ne-rNP/strings.xml b/packages/PrintSpooler/res/values-ne-rNP/strings.xml index 4cf2f51b288a..c30e3674af23 100644 --- a/packages/PrintSpooler/res/values-ne-rNP/strings.xml +++ b/packages/PrintSpooler/res/values-ne-rNP/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"यस प्रिन्टरको बारेमा थप जानकारी"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"फाइल सिर्जना गर्न सकिएन"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"केही मुद्रण सम्बन्धी सेवाहरूलाई असक्षम गरिएको छ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिन्टरहरू खोज्दै"</string> <string name="print_no_print_services" msgid="8561247706423327966">"कुनै पनि मुद्रण सेवाहरू सक्रिय छैनन्"</string> diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 83b9a2233166..7e1f37e554a3 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Meer informatie over deze printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Kan bestand niet maken"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Sommige afdrukservices zijn uitgeschakeld"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printers zoeken"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Geen afdrukservices ingeschakeld"</string> diff --git a/packages/PrintSpooler/res/values-pa-rIN/strings.xml b/packages/PrintSpooler/res/values-pa-rIN/strings.xml index 5f3366fb4eda..8a5fc97d7919 100644 --- a/packages/PrintSpooler/res/values-pa-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-pa-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ਇਸ ਪ੍ਰਿੰਟਰ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ਫ਼ਾਈਲ ਨੂੰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"ਕੁਝ ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਅਯੋਗ ਬਣਾਈਆਂ ਗਈਆਂ ਹਨ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ਪ੍ਰਿੰਟਰ ਖੋਜ ਰਿਹਾ ਹੈ"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਯੋਗ ਨਹੀਂ ਬਣਾਈਆਂ ਗਈਆਂ"</string> diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml index e7fb7b61470e..401cbfbb712b 100644 --- a/packages/PrintSpooler/res/values-pl/strings.xml +++ b/packages/PrintSpooler/res/values-pl/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Więcej informacji o tej drukarce"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Nie udało się utworzyć pliku"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Niektóre usługi drukowania są wyłączone"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Szukanie drukarek"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Brak włączonych usług drukowania"</string> diff --git a/packages/PrintSpooler/res/values-pt-rBR/strings.xml b/packages/PrintSpooler/res/values-pt-rBR/strings.xml index dd8cdb25ab73..7efe64fb3bee 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mais informações sobre essa impressora"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Alguns serviços de impressão estão desativados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index c1fe7bfb38a8..09904c030a2c 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mais informações acerca desta impressora"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Não foi possível criar o ficheiro"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Alguns serviços de impressão estão desativados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"A procurar impressoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index dd8cdb25ab73..7efe64fb3bee 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mais informações sobre essa impressora"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Alguns serviços de impressão estão desativados"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index b326e09fbd95..3202bca5a3d1 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -62,6 +62,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mai multe informații despre această imprimantă"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Unele servicii de printare sunt dezactivate"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Se caută imprimante"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Niciun serviciu de printare activat"</string> diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index 5acadbc27662..7bcec0defb5e 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -63,6 +63,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Подробные сведения о принтере"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Некоторые службы печати отключены"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Поиск принтеров…"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Службы печати недоступны"</string> diff --git a/packages/PrintSpooler/res/values-si-rLK/strings.xml b/packages/PrintSpooler/res/values-si-rLK/strings.xml index db4c5fdb070e..c3597a740f78 100644 --- a/packages/PrintSpooler/res/values-si-rLK/strings.xml +++ b/packages/PrintSpooler/res/values-si-rLK/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"මෙම මුද්රණ යන්ත්රය ගැන තවත් තොරතුරු"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ගොනුව සෑදීමට නොහැකි විය"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"සමහර මුද්රණ සේවා අබලයි"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"මුද්රණ යන්ත්ර සොයමින්"</string> <string name="print_no_print_services" msgid="8561247706423327966">"මුද්රණ සේවා සබල නැත"</string> diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml index 63ee5e2a59ad..6234f8cfae3d 100644 --- a/packages/PrintSpooler/res/values-sk/strings.xml +++ b/packages/PrintSpooler/res/values-sk/strings.xml @@ -63,6 +63,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Ďalšie informácie o tejto tlačiarni"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Niektoré tlačové služby sú zakázané"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhľadávanie tlačiarní"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Žiadne tlačové služby nie sú aktivované"</string> diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml index f7616db5db94..b751fbb88fcd 100644 --- a/packages/PrintSpooler/res/values-sl/strings.xml +++ b/packages/PrintSpooler/res/values-sl/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Več informacij o tem tiskalniku"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Datoteke ni bilo mogoče ustvariti"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Nekatere tiskalne storitve so onemogočene"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Iskanje tiskalnikov"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ni omogočenih tiskalnih storitev"</string> diff --git a/packages/PrintSpooler/res/values-sq-rAL/strings.xml b/packages/PrintSpooler/res/values-sq-rAL/strings.xml index f4d2817f0d22..9765e11e1fcb 100644 --- a/packages/PrintSpooler/res/values-sq-rAL/strings.xml +++ b/packages/PrintSpooler/res/values-sq-rAL/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Më shumë informacione mbi këtë printer"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Skedari nuk mund të krijohej"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Disa shërbime printimi janë çaktivizuar"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Po kërkon për printerë"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Nuk ka shërbime printimi të aktivizuara"</string> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index b285044fbbfd..3b66b380bb72 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Још информација о овом штампачу"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Прављење датотеке није успело"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Неке услуге штампања су онемогућене"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Претрага штампача"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Ниједна услуга штампања није омогућена"</string> diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml index 4a728006fe05..eebc9b9908e0 100644 --- a/packages/PrintSpooler/res/values-sv/strings.xml +++ b/packages/PrintSpooler/res/values-sv/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mer information om den här skrivaren"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Det gick inte att skapa filen"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Några utskriftstjänster har inaktiverats"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Söker efter skrivare"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Inga utskriftstjänster har aktiverats"</string> diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index 34b935d5fd95..1944a4b3dc83 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Maelezo zaidi kuhusu printa hii"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Imeshindwa kuunda faili"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Baadhi ya huduma za uchapishaji haziruhusiwi"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Inatafuta printa"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Huduma za kuchapisha hazijawashwa"</string> diff --git a/packages/PrintSpooler/res/values-ta-rIN/strings.xml b/packages/PrintSpooler/res/values-ta-rIN/strings.xml index 22f41bfe7f37..65198e8cf814 100644 --- a/packages/PrintSpooler/res/values-ta-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ta-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"இந்தப் பிரிண்டர் பற்றிய கூடுதல் தகவல்"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"கோப்பை உருவாக்க முடியவில்லை"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"சில அச்சுப் பொறிகள் முடக்கப்பட்டன"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"அச்சுப்பொறிகளைத் தேடுகிறது"</string> <string name="print_no_print_services" msgid="8561247706423327966">"அச்சுப் பொறிகள் இல்லை"</string> diff --git a/packages/PrintSpooler/res/values-te-rIN/strings.xml b/packages/PrintSpooler/res/values-te-rIN/strings.xml index 1211cfdff4c7..ddc48fcc17a3 100644 --- a/packages/PrintSpooler/res/values-te-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-te-rIN/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ఈ ప్రింటర్ గురించి మరింత సమాచారం"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ఫైల్ను సృష్టించలేకపోయాము"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"కొన్ని ముద్రణ సేవలు నిలిపివేయబడ్డాయి"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ప్రింటర్ల కోసం శోధిస్తోంది"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ముద్రణ సేవలు ఏవీ ప్రారంభించలేదు"</string> diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml index 7f9928829dcc..3faa96fbca60 100644 --- a/packages/PrintSpooler/res/values-th/strings.xml +++ b/packages/PrintSpooler/res/values-th/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"ข้อมูลเพิ่มเติมเกี่ยวกับเครื่องพิมพ์นี้"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"ไม่สามารถสร้างไฟล์ได้"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"บริการพิมพ์บางอย่างปิดใช้อยู่"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"กำลังค้นหาเครื่องพิมพ์"</string> <string name="print_no_print_services" msgid="8561247706423327966">"ไม่ได้เปิดใช้บริการพิมพ์"</string> diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml index 7b5081509451..3f8cae17bd3b 100644 --- a/packages/PrintSpooler/res/values-tl/strings.xml +++ b/packages/PrintSpooler/res/values-tl/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Higit pang impormasyon tungkol sa printer na ito"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Hindi makagawa ng file"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Naka-disable ang ilang serbisyo sa pag-print"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Naghahanap ng mga printer"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Walang mga naka-enable na serbisyo sa pag-print"</string> diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml index 1ca722b0b758..df8cd290b246 100644 --- a/packages/PrintSpooler/res/values-tr/strings.xml +++ b/packages/PrintSpooler/res/values-tr/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Bu yazıcıyla ilgili daha fazla bilgi"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Bazı yazdırma hizmetleri devre dışı bırakıldı"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Yazıcılar aranıyor"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Etkin yazıcı hizmeti yok"</string> diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index 800463966678..14cc794040df 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -63,6 +63,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Докладніше про цей принтер"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Не вдалося створити файл"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Деякі служби друку вимкнено"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук принтерів"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Немає служб друку"</string> diff --git a/packages/PrintSpooler/res/values-ur-rPK/strings.xml b/packages/PrintSpooler/res/values-ur-rPK/strings.xml index 19e759cbc377..e612ee8f3229 100644 --- a/packages/PrintSpooler/res/values-ur-rPK/strings.xml +++ b/packages/PrintSpooler/res/values-ur-rPK/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"اس پرنٹر کے بارے میں مزید معلومات"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"پرنٹ کی کچھ سروسز غیر فعال ہیں"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"پرنٹرز تلاش کر رہا ہے"</string> <string name="print_no_print_services" msgid="8561247706423327966">"کوئی پرنٹ سروس فعال نہیں"</string> diff --git a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml index cf87a740d133..8ae65f2da8af 100644 --- a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml +++ b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Printer haqida batafsil ma’lumot"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Faylni yaratib bo‘lmadi"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Ayrim chop etish xizmatlari o‘chirib qo‘yilgan"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerlar qidirilmoqda"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Hech qaysi chop etish xizmati yoqilmagan"</string> diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml index 2c1fa2701120..5baaa3b5a18a 100644 --- a/packages/PrintSpooler/res/values-vi/strings.xml +++ b/packages/PrintSpooler/res/values-vi/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Thông tin khác về máy in này"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Không thể tạo tệp"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Một số dịch vụ in đã bị tắt"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Đang tìm kiếm máy in"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Chưa kích hoạt dịch vụ in nào"</string> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index b3500514fa6f..ca4868b52123 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -61,6 +61,8 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"关于此打印机的更多信息"</string> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> <string name="print_services_disabled_toast" msgid="9089060734685174685">"部分打印服务已停用"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜索打印机"</string> <string name="print_no_print_services" msgid="8561247706423327966">"未启用任何打印服务"</string> diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml index 192b41b06ad5..672ec2e0057c 100644 --- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"此打印機詳情"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"無法建立檔案"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"部分列印服務已停用"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜尋打印機"</string> <string name="print_no_print_services" msgid="8561247706423327966">"沒有已啟用的列印服務"</string> diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml index 4aa5681a6035..834103677f6f 100644 --- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"查看這台印表機的詳細資訊"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"無法建立檔案"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"已停用部分列印服務"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜尋印表機"</string> <string name="print_no_print_services" msgid="8561247706423327966">"未啟用任何列印服務"</string> diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml index 121022b59b1d..b14c9be6e228 100644 --- a/packages/PrintSpooler/res/values-zu/strings.xml +++ b/packages/PrintSpooler/res/values-zu/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Olunye ulwazi mayelana nale phrinta"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Ayikwazanga ukufala ifayela"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Amanye amasevisi okuphrinta akhutshaziwe"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Isesha amaphrinta"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Amasevisi ephrinta akavuliwe."</string> diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index 241581d91d4f..be3df54e12ae 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -718,6 +718,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat SelectPrinterActivity.INTENT_EXTRA_PRINTER); if (printerInfo != null) { mCurrentPrinter = printerInfo; + mPrintJob.setPrinterId(printerInfo.getId()); + mPrintJob.setPrinterName(printerInfo.getName()); + mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerInfo); } } @@ -1964,7 +1967,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat } public void onPrinterAvailable(PrinterInfo printer) { - if (mCurrentPrinter.equals(printer)) { + if (mCurrentPrinter != null && mCurrentPrinter.equals(printer)) { setState(STATE_CONFIGURING); if (canUpdateDocument()) { updateDocument(false); @@ -2459,12 +2462,15 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat PrinterHolder printerHolder = mPrinterHolders.get(i); PrinterId oldPrinterId = printerHolder.printer.getId(); PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId); + if (updatedPrinter != null) { printerHolder.printer = updatedPrinter; printerHolder.removed = false; + onPrinterAvailable(printerHolder.printer); newPrinterHolders.add(printerHolder); } else if (mCurrentPrinter != null && mCurrentPrinter.getId().equals(oldPrinterId)){ printerHolder.removed = true; + onPrinterUnavailable(printerHolder.printer); newPrinterHolders.add(printerHolder); } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java index fcc9f6a36171..7704fa6ef7e8 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java @@ -319,7 +319,7 @@ public final class SelectPrinterActivity extends Activity implements } TextView titleView = (TextView) findViewById(R.id.title); View progressBar = findViewById(R.id.progress_bar); - if (mEnabledPrintServices.size() > 0) { + if (mEnabledPrintServices.size() == 0) { titleView.setText(R.string.print_no_print_services); progressBar.setVisibility(View.GONE); } else if (adapter.getUnfilteredCount() <= 0) { diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 43216af9d9d2..fe726264de9d 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktief. Tik om te wissel."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Lopende dienste"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Sien en beheer dienste wat tans loop"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Aktiveer multiproses-WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Laat loop WebView-leweraars in \'n geïsoleerde proses."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiproses-Webaansig"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Laat Webaansig-leweraars afsonderlik loop"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Stel WebView-implementering"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Hierdie keuse is nie meer geldig nie. Probeer weer."</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 2acad89a03c0..843db182cd7d 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"ለአውታረመረቦች መቃኘት አይቻልም"</string> <string name="wifi_security_none" msgid="7985461072596594400">"የለም"</string> <string name="wifi_remembered" msgid="4955746899347821096">"ተቀምጧል"</string> - <string name="wifi_disabled_generic" msgid="4259794910584943386">"ተሰነክሏል"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"ተሰናክሏል"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"የአይ.ፒ. ውቅረት መሰናከል"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"የWiFi ግንኙነት መሰናከል"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"የማረጋገጫ ችግር"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ገቢር። ለመቀያየር ነካ ያድርጉ።"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"አሂድ አገልግሎቶች"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"ባለብዙ-ሂደት WebViewን አንቃ"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"የWebView ምስል ሰሪዎችን በተገለለ ሂደት ውስጥ አሂድ።"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"ባለብዙ-ሂደት ድር እይታ"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"የድር እይታ ምስል ሰሪዎችን በተናጥል አሂድ"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"የWebView ትግበራ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"የWebView ትግበራን ያዘጋጁ"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ይህ ምርጫ ከአሁን በኋላ የሚሰራ አይደለም። እንደገና ይሞክሩ።"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index a3e5b1cd26ce..27050d1e2942 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"نشط، انقر للتبديل."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"الخدمات قيد التشغيل"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"تمكين عرض ويب متعدد العمليات"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"تشغيل أجهزة عرض الويب في عملية منفصلة."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView متعدد العمليات"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"تشغيل أجهزة عرض WebView بشكل منفصل"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"تطبيق WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"تعيين تطبيق WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"لم يعد هذا الاختيار صالحًا. أعد المحاولة."</string> diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 214d33a25905..8558611dfb8e 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivdir. Keçid etmək üçün basın."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"İşləyən xidmətlər"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Hazırda prosesdə olan xidmətləri görüntüləyin və onlara nəzarət edin"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Çox prosesli WebView\'nu aktiv edin"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView rendererləri təcrid olunmuş prosesdə işlədin."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Çox prosesli WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView rendererləri ayrıca işə salın"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView icrası"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView icrasını ayarlayın"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Bu seçim artıq etibarlı deyil. Yenidən cəhd edin."</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index a9bc326a1f42..2239dee54e7e 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivna. Dodirnite da biste je deaktivirali."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Prikaz i kontrola trenutno pokrenutih usluga"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Omogući višeprocesni WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Pokrećite WebView prikazivače u okviru izolovanog procesa."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Višeprocesni WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Pokrećite WebView prikazivače zasebno"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Primena WebView-a"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Podesite primenu WebView-a"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ovaj izbor više nije važeći. Pokušajte ponovo."</string> diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 23ec3cad5e3f..7e13220467f7 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Не атрымлiваецца выканаць сканаванне для сетак"</string> <string name="wifi_security_none" msgid="7985461072596594400">"Няма"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Захавана"</string> - <string name="wifi_disabled_generic" msgid="4259794910584943386">"Адключаная"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"Адключана"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Збой канфігурацыі IP"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Збой падлучэння Wi-Fi"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Праблема аўтэнтыфікацыі"</string> @@ -71,7 +71,7 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Выкарыстоўваць для ўводу"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Падлучыць"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СПАЛУЧЫЦЬ"</string> - <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Адмена"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Скасаваць"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Спалучэнне дае доступ да вашых кантактаў і гісторыі выклікаў пры падлучэнні."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Не атрымалася падключыцца да прылады <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Не атрымалася спалучыцца з прыладай <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, таму што PIN-код або пароль няправiльныя."</string> @@ -98,7 +98,7 @@ <string name="launch_defaults_some" msgid="313159469856372621">"Некат. параметры па змаўч. усталяваныя"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Параметры па змаўчанні не ўсталяваныя"</string> <string name="tts_settings" msgid="8186971894801348327">"Налады Text-to-speech"</string> - <string name="tts_settings_title" msgid="1237820681016639683">"Выводзіць праз Text-to-speech"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"Сінтэз маўлення"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"Хуткасць гаворкі"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"Хуткасць, з якой кажуць тэкст"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"Тон"</string> @@ -139,7 +139,7 @@ <string name="choose_profile" msgid="8229363046053568878">"Выбраць профіль"</string> <string name="category_personal" msgid="1299663247844969448">"Асабісты"</string> <string name="category_work" msgid="8699184680584175622">"Рабочы"</string> - <string name="development_settings_title" msgid="215179176067683667">"Опцыі распрацоўшчыка"</string> + <string name="development_settings_title" msgid="215179176067683667">"Параметры распрацоўшчыка"</string> <string name="development_settings_enable" msgid="542530994778109538">"Уключыць параметры распрацоўшчыка"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Налада параметраў для распрацоўкі прыкладанняў"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Параметры распрацоўшчыка недаступныя для гэтага карыстальніка"</string> @@ -226,7 +226,7 @@ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Уключэнне слядоў OpenGL"</string> <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Адключыць аўдыёмаршрутызацыю USB"</string> <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Адкл. аўт. перанакір. на перыфер. USB-прыл. аўдыё"</string> - <string name="debug_layout" msgid="5981361776594526155">"Паказаць межы размяшчэння"</string> + <string name="debug_layout" msgid="5981361776594526155">"Паказаць межы макета"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Паказаць межы кліпу, палі і г. д."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Прымусовая раскладка справа налева"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Прымусовая раскладка экрана справа налева для ўсіх рэгіянальных налад"</string> @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"Прымусовае выкананне 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Уключыць 4x MSAA у прыкладаннях з OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Адладка аперацый непрамавугольнага кліпа"</string> - <string name="track_frame_time" msgid="6146354853663863443">"Апрацоўка профілю GPU"</string> + <string name="track_frame_time" msgid="6146354853663863443">"Профіль рэндэрінгу GPU"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Маштаб анімацыі акна"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Маштаб перадачы анімацыі"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"Шкала працягласці анiматара"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Актыўная. Краніце, каб пераключыць."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Запушчаныя службы"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Прагляд запушчаных службаў i кіраванне iмi"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Уключыць шматпрацэсны WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Запусціць апрацоўшчыкі WebView у ізаляваным працэсе."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Шматпрацэсны WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Запусціць апрацоўшчыкі WebView асобна"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Рэалізацыя WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Наладзіць рэалізацыю WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Гэты варыянт больш не даступны. Паспрабуйце яшчэ раз."</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 768a34b815b6..b410590344e7 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Докоснете, за да превключите."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Изпълнявани услуги:"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Многопроц. режим на WebView: Акт."</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Програми за визуализация на WebView: Изпъл. в изолиран процес."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Многопроцесен режим на WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Отделно изпълняване на програмите за визуализация на WebView"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Внедряване на WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Задаване на внедряването на WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Този избор вече не е валиден. Опитайте отново."</string> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index fe7cb8b4c5b0..2019097a2ee6 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -30,7 +30,7 @@ <string name="wifi_not_in_range" msgid="1136191511238508967">"পরিসরের মধ্যে নয়"</string> <string name="wifi_no_internet" msgid="9151470775868728896">"কোনো ইন্টারনেট অ্যাক্সেস শনাক্ত হয়নি, স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ স্থাপন করবে না৷"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> দ্বারা সংরক্ষিত"</string> - <string name="connected_via_wfa" msgid="3805736726317410714">"Wi‑Fi সহায়ক-এর মাধ্যমে সংযুক্ত হয়েছে"</string> + <string name="connected_via_wfa" msgid="3805736726317410714">"ওয়াই-ফাই সহায়ক-এর মাধ্যমে সংযুক্ত হয়েছে"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে সংযুক্ত হয়েছে"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"সংযুক্ত, ইন্টারনেট নেই"</string> @@ -88,7 +88,7 @@ <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"সরানো অ্যাপ্লিকেশানগুলি এবং ব্যবহারকারীগণ"</string> <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB টেদারিং"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"পোর্টেবল হটস্পট"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth টেদারিং"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ব্লুটুথ টেদারিং"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"টেদারিং"</string> <string name="tether_settings_title_all" msgid="8356136101061143841">"টেদারিং ও পোর্টেবল হটস্পট"</string> <string name="managed_user_title" msgid="8109605045406748842">"সমস্ত কাজের অ্যাপ্লিকেশান"</string> @@ -153,7 +153,7 @@ <string name="bugreport_in_power_summary" msgid="1778455732762984579">"একটি ত্রুটি প্রতিবেদন গ্রহণের জন্য পাওয়ার মেনুতে একটি বোতাম দেখান"</string> <string name="keep_screen_on" msgid="1146389631208760344">"জাগিয়ে রাখুন"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"চার্জ হওয়ার স্ক্রীন কখনই নিদ্রা মোডে যাবে না"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI স্নুপ লগ সক্ষম করুন"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ লগ সক্ষম করুন"</string> <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"একটি ফাইলে সব bluetooth HCI প্যাকেট ক্যাপচার করুন"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM আনলক করা হচ্ছে"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুট-লোডার আনলক করার অনুমতি দিন"</string> @@ -164,15 +164,15 @@ <string name="mock_location_app_set" msgid="8966420655295102685">"অনুরূপ অবস্থান অ্যাপ্লিকেশান: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"নেটওয়ার্কিং"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"ওয়্যারলেস ডিসপ্লে সার্টিফিকেশন"</string> - <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi ভারবোস লগিং সক্ষম করুন"</string> - <string name="wifi_aggressive_handover" msgid="9194078645887480917">"Wi‑Fi থেকে সেলুলারে তৎপর পরিবর্তন"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"ওয়াই-ফাই ভারবোস লগিং সক্ষম করুন"</string> + <string name="wifi_aggressive_handover" msgid="9194078645887480917">"ওয়াই-ফাই থেকে সেলুলারে তৎপর পরিবর্তন"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"সর্বদা Wifi রোম স্ক্যানকে অনুমতি দিন"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"সেলুলার ডেটা সর্বদাই সক্রিয় থাকে"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"চূড়ান্ত ভলিউম অক্ষম করুন"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi লগিং স্তর বাড়ান, Wi‑Fi চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string> - <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"সক্ষম করা থাকলে, নিম্নমানের Wi‑Fi সিগন্যালের ক্ষেত্রে, সেলুলার-এ ডেটা সংযোগ প্রদান করতে Wi‑Fi আরো বেশি শক্তিশালীভাবে কাজ করবে"</string> - <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ইন্টারফেসে উপস্থিত ডেটা ট্রাফিকের পরিমাণের উপরে ভিত্তি করে Wi‑Fi রোম স্ক্যানকে অনুমোদিত/অননুমোদিত করুন"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string> + <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"সক্ষম করা থাকলে, নিম্নমানের ওয়াই-ফাই সিগন্যালের ক্ষেত্রে, সেলুলার-এ ডেটা সংযোগ প্রদান করতে ওয়াই-ফাই আরো বেশি শক্তিশালীভাবে কাজ করবে"</string> + <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ইন্টারফেসে উপস্থিত ডেটা ট্রাফিকের পরিমাণের উপরে ভিত্তি করে ওয়াই-ফাই রোম স্ক্যানকে অনুমোদিত/অননুমোদিত করুন"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"লগার বাফারের আকারগুলি"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"লগ বাফার প্রতি অপেক্ষাকৃত বড় আকারগুলির নির্বাচন করুন"</string> <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB কনফিগারেশন নির্বাচন করুন"</string> @@ -181,7 +181,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"মক অবস্থানগুলি মঞ্জুর করুন"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"অ্যাট্রিবিউট পরিদর্শন দেখা সক্ষম করুন"</string> <string name="legacy_dhcp_client_summary" msgid="163383566317652040">"নতুন Android DHCP ক্লায়েন্টের পরিবর্তে Lollipop এর থেকে DHCP ক্লায়েন্ট ব্যবহার করুন৷"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Wi‑Fi সক্রিয় থাকার সময়েও (দ্রুত নেটওয়ার্কে পাল্টানোর জন্য) সর্বদা মোবাইল ডেটা সক্রিয় রাখুন।"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ওয়াই-ফাই সক্রিয় থাকার সময়েও (দ্রুত নেটওয়ার্কে পাল্টানোর জন্য) সর্বদা মোবাইল ডেটা সক্রিয় রাখুন।"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB ডিবাগিং মঞ্জুর করবেন?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB ডিবাগিং কেবলমাত্র বিকাশ করার উদ্দেশ্যে। আপনার কম্পিউটার এবং আপনার ডিভাইসের মধ্যে ডেটা অনুলিপি করতে এটি ব্যবহার করুন, বিজ্ঞপ্তি ছাড়া আপনার ডিভাইসে অ্যাপ্লিকেশানগুলি ইনস্টল করুন এবং ডেটা লগ পড়ুন।"</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"আপনি আগে যে সব কম্পিউটার USB ডিবাগিং এর অ্যাক্সেসের অনুমতি দিয়েছিলেন তা প্রত্যাহার করবেন?"</string> @@ -189,7 +189,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"এইসব সেটিংস কেবলমাত্র উন্নত করার উদ্দেশ্য। সেগুলি কারণে আপনার ডিভাইস ভেঙ্গে এবং অ্যাপ্লিকেশানগুলি ভালো ভাবে কাজ করা নাও কারতে পারে।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB এর অ্যাপ্লিকেশানগুলি যাচাই করুন"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ক্ষতিকারক ক্রিয়াকলাপ করছে কিনা তার জন্য ADB/ADT মারফত ইনস্টল করা অ্যাপ্লিকেশানগুলি চেক করুন।"</string> - <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, Bluetooth চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷"</string> <string name="enable_terminal_title" msgid="95572094356054120">"স্থানীয় টার্মিনাল"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"স্থানীয় শেল অ্যাক্সেসের প্রস্তাব করে এমন টার্মিনাল অ্যাপ্লিকেশন সক্ষম করুন"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP পরীক্ষণ"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"এখন চলছে যে পরিষেবাগুলি"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"বহু-প্রক্রিয়া ওয়েবভিউ সক্ষম করুন"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"একটি বিচ্ছিন্ন প্রক্রিয়ায় ওয়েবভিউ রেন্ডারারগুলি চালান৷"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"বহু-প্রক্রিয়া ওয়েবভিউ"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"ওয়েবভিউ রেন্ডারারগুলি আলাদাভাবে চালান"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"ওয়েবভিউ প্রয়োগ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"ওয়েবভিউ প্রয়োগ সেট করুন"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"এই পছন্দটি আর বৈধ নেই৷ আবার চেষ্টা করুন৷"</string> @@ -290,9 +290,9 @@ <string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB ব্যবহার করুন"</string> <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"অক্ষম হয়েছে"</string> <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"মোনোক্রোমেসি"</string> - <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"দেউতেরানমালি (লাল-সবুজ)"</string> - <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"প্রতানোমালি (লাল-সবুজ)"</string> - <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ত্রিতানোমালি (নীল-হলুদ)"</string> + <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"বর্ণান্ধতা (লাল-সবুজ)"</string> + <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"প্রোটানোম্যালি (লাল-সবুজ)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ট্রিট্যানোম্যালি (নীল-হলুদ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"রঙ সংশোধন"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই বৈশিষ্ট্যটি পরীক্ষামূলক এবং এটি কার্য-সম্পাদনা প্রভাবিত করতে পারে।"</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> এর দ্বারা ওভাররাইড করা হয়েছে"</string> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 415247012fb5..995d85629ffa 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dodirnite za promjenu opcije."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Prikažite trenutno pokrenute usluge i upravljajte njima"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Omogućiti višeprocesni WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Pokrenite WebView operatera u izolovanom procesu."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Višeprocesni WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Pokreni odvojeno WebView rendere"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Postavljanje WebViewa"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Podesi WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ovaj izbor više ne vrijedi. Pokušajte ponovo."</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 0b93b1e34c05..ef52df5da28e 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -86,11 +86,11 @@ <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicacions eliminades"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicacions i usuaris eliminats"</string> - <string name="tether_settings_title_usb" msgid="6688416425801386511">"Ancoratge d\'USB"</string> - <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona Wi-Fi portàtil"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Ancoratge de Bluetooth"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Ancoratge a xarxa"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"Ancoratge a la xarxa i zona Wi-Fi"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartició de xarxa per USB"</string> + <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Punt d\'accés Wi-Fi"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartició de xarxa per Bluetooth"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartició de xarxa"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartició de xarxa i punt d\'accés Wi-Fi"</string> <string name="managed_user_title" msgid="8109605045406748842">"Totes les aplic. de feina"</string> <string name="user_guest" msgid="8475274842845401871">"Convidat"</string> <string name="unknown" msgid="1592123443519355854">"Desconegut"</string> @@ -144,7 +144,7 @@ <string name="development_settings_summary" msgid="1815795401632854041">"Defineix les opcions per al desenvolupament d\'aplicacions"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Les opcions per a desenvolupadors no estan disponibles per a aquest usuari."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"La configuració de la VPN no està disponible per a aquest usuari."</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"La configuració d\'ancoratge no està disponible per a aquest usuari."</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"La configuració de compartició de xarxa no està disponible per a aquest usuari."</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"La configuració del nom del punt d\'accés no està disponible per a aquest usuari."</string> <string name="enable_adb" msgid="7982306934419797485">"Depuració USB"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Activa el mode de depuració quan el dispositiu estigui connectat per USB"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aplicació activa. Toca per desactivar-la."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Serveis en execució"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualitza i controla els serveis en execució"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Activa WebView amb multiprocés"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Executa els renderitzadors de WebView en un procés aïllat."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView amb multiprocés"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Executa els renderitzadors de WebView per separat"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementació de WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Configura la implementació de WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Aquesta opció ja no és vàlida. Torna-ho a provar."</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 53ad9d1acbac..bb0b608dcfd3 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivní. Klepnutím možnost přepnete."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Spuštěné služby"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Povolit WebView ve více procesech"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Spouštět moduly vykreslení WebView jako samostatné procesy."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView ve více procesech"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Spouštět moduly vykreslení WebView samostatně"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementace WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Nastavte implementaci WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Tato volba již není platná. Zkuste to znovu."</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index c2677026cfbd..df024c3eaac9 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"Tving 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Aktivér 4x MSAA i apps med OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Fejlfind på ikke-rektangulære klippehandlinger"</string> - <string name="track_frame_time" msgid="6146354853663863443">"GPU-profilgengivelse"</string> + <string name="track_frame_time" msgid="6146354853663863443">"GPU-gengivelse for profil"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Animationsskala for vindue"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Overgangsanimationsskala"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"Animatorvarighedsskala"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Tryk for at skifte."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Kørende tjenester"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Vis og kontrollér kørende tjenester"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Aktivér WebView i flere processer"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Kør WebView-gengivelse i en isoleret proces."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Webvisning i flere processer"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Kør gengivelser af webvisning separat"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Konfigurer WebView-implementering"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Dette valg er ikke længere gyldigt. Prøv igen."</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 113900af7563..16b6acee5107 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Zum Wechseln tippen."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktive Dienste"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Momentan ausgeführte Dienste anzeigen und steuern"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"WebView-Simultanverarbeitung aktivieren"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView-Renderer isoliert ausführen."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView-Simultanverarbeitung"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView-Renderer getrennt ausführen"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-Implementierung"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView-Implementierung festlegen"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Diese Auswahl ist nicht mehr gültig. Versuche es erneut."</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 640e31984e18..7827ab991588 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ενεργό. Πατήστε για εναλλαγή."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Υπηρεσίες που εκτελούνται"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Ενεργοποίηση WebView πολλαπλών διεργασιών"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Εκτέλεση λειτ.απόδοσης WebView σε μια απομονωμένη διεργασία."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView πολλαπλών διεργασιών"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Εκτέλεση λειτουργικών απόδοσης WebView ξεχωριστά"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Υλοποίηση WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ορισμός υλοποίησης WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Αυτή η επιλογή δεν είναι πια έγκυρη. Δοκιμάστε ξανά."</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 75e8ee18a9cf..ec3d04b301c0 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Enable multi-process WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Run WebView renderers in an isolated process."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Run WebView renderers separately"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Set WebView implementation"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"This choice is no longer valid. Try again."</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 75e8ee18a9cf..ec3d04b301c0 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Enable multi-process WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Run WebView renderers in an isolated process."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Run WebView renderers separately"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Set WebView implementation"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"This choice is no longer valid. Try again."</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 75e8ee18a9cf..ec3d04b301c0 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Enable multi-process WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Run WebView renderers in an isolated process."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Run WebView renderers separately"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Set WebView implementation"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"This choice is no longer valid. Try again."</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 0b98e743371a..2facecbe23f8 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Activa. Presiona para activar o desactivar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"En ejecución"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar servicios actuales en ejecución"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Habilitar multiproceso WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Ejecutar procesadores de WebView en un proceso aislado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiproceso WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Ejecutar procesadores WebView por separado"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Configurar la implementación de WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opción ya no es válida. Vuelve a intentarlo."</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 7012f4a4fbc0..163e846f9fce 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Activa. Toca para alternar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en ejecución"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en ejecución"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Habilitar WebView multiproceso"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Ejecuta procesadores de WebView en un proceso aislado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiproceso"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Ejecuta procesadores de WebView de forma independiente"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Establecer implementación de WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opción ya no está disponible. Vuelve a intentarlo."</string> @@ -332,5 +332,5 @@ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Más grande"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Lo más grande posible"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> - <string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y opiniones"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y sugerencias"</string> </resources> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 810ce762e15d..756e4ad49717 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"Jõusta 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Luba 4x MSAA OpenGL ES 2.0 rakendustes"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Silu klipi mittetäisnurksed toimingud"</string> - <string name="track_frame_time" msgid="6146354853663863443">"Profiili GPU renderdamine"</string> + <string name="track_frame_time" msgid="6146354853663863443">"GPU renderduse profiil"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Akna animatsiooni skaala"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Ülemineku animats. skaala"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"Animaatori kestuse skaala"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiivne. Puudutage vahetamiseks."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Käitatud teenused"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Praegu käitatud teenuste vaatamine ja juhtimine"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Luba mitme protsessiga WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView\' renderdajad käitatakse eraldi protsessis."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Mitme protsessiga WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Käita WebView\' renderdajaid eraldi"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView\' rakendamine"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView\' rakendamise seadistamine"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"See valik ei kehti enam. Proovige uuesti."</string> @@ -293,7 +293,7 @@ <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"Deuteranomaalia (punane-roheline)"</string> <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomaalia (punane-roheline)"</string> <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaalia (sinine-kollane)"</string> - <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Värviparandus"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Värvide korrigeerimine"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"See funktsioon on katseline ja võib mõjutada toimivust."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Alistas <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="4400068916452346544">"Umbes <xliff:g id="TIME">%1$s</xliff:g> on jäänud"</string> @@ -327,7 +327,7 @@ <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> tagasi"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> on jäänud"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Väike"</string> - <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Vaikimisi"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Vaikeseade"</string> <string name="screen_zoom_summary_large" msgid="4835294730065424084">"Suur"</string> <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Suurem"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Suurim"</string> diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index cc1664755d79..ca76b55018cf 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktibo. Aldatzeko, sakatu hau."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Abian diren zerbitzuak"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ikusi eta kontrolatu unean abian diren zerbitzuak"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Gaitu prozesu anitzeko WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Exekutatu WebView errendatzaileak prozesu isolatu batean."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Prozesu anitzeko WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Exekutatu WebView errendatzaileak modu bereizian"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Set WebView implementation"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Jada ez dago erabilgarri aukera hori. Saiatu berriro."</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index bfbb746d8f53..ac48830eafcb 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال. برای تغییر حالت ضربه بزنید."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"سرویسهای در حال اجرا"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"فعال کردن وبنمای چندپردازشی"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"اجرای تولیدکننده تصویر وبنما در یک پردازش مجزا."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"وبنمای چندپردازشی"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"اجرای تولیدکننده تصویر وبنما"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"اجرای وبنما"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"تنظیم اجرای وبنما"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"این انتخاب دیگر معتبر نیست. دوباره امتحان کنید."</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index fcb1c6802017..1f2579b48b21 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Käytössä. Poista käytöstä koskettamalla."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Käynnissä olevat palvelut"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Tarkastele ja hallitse käynnissä olevia palveluita"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"WebView\'n usean prosessin tila"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Suorita WebView\'n hahmontajat erillisinä prosesseina."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView\'n usean prosessin tila"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Suorita WebView\'n hahmontajat erillisinä prosesseina"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-käyttöönotto"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Määritä WebView-käyttöönotto"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Tämä valinta ei ole enää saatavilla. Yritä uudestaan."</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 91d0cb69cc7d..2ada1362526c 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Application active. Touchez ici pour la désactiver."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Afficher et contrôler les services en cours d\'exécution"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Activer WebView multiprocessus"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Exécuter moteurs de rendu WebView dans un processus isolé."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiprocessus"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Exécuter les moteurs de rendu WebView séparément"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Mise en œuvre WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Définir la mise en œuvre WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ce choix n\'est plus valide. Réessayez."</string> @@ -294,7 +294,7 @@ <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomalie (rouge/vert)"</string> <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomalie (bleu/jaune)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correction des couleurs"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Cette fonctionnalité est expérimentale et peut toucher les performances."</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Cette fonctionnalité est expérimentale et peut affecter les performances."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="4400068916452346544">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index b2bf773d6613..1355e77701cf 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Application active. Appuyez ici pour la désactiver."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Afficher et contrôler les services en cours d\'exécution"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Activer WebView multiprocessus"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Exécuter moteurs de rendu WebView dans un processus isolé."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiprocessus"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Exécuter les moteurs de rendu WebView séparément"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Mise en œuvre WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Définir la mise en œuvre WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ce choix n\'est plus valide. Réessayez."</string> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index 13edd04e0783..ce52a7022eb2 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aplicación activa. Toca para alternar a configuración."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servizos en execución"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar servizos actualmente en execución"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Activar WebView multiproceso"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Executa os procesadores de WebView nun proceso illado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiproceso"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Executa os procesadores de WebView por separado"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Definir implementación de WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opción xa non é válida. Téntao de novo."</string> diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index ac41ccbafee4..c3737b50e6ad 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -141,7 +141,7 @@ <string name="category_work" msgid="8699184680584175622">"કાર્યાલય"</string> <string name="development_settings_title" msgid="215179176067683667">"વિકાસકર્તાનાં વિકલ્પો"</string> <string name="development_settings_enable" msgid="542530994778109538">"વિકાસકર્તાનાં વિકલ્પો સક્ષમ કરો"</string> - <string name="development_settings_summary" msgid="1815795401632854041">"એપ્લિકેશન વિકાસ માટે વિકલ્પો સેટ કરો"</string> + <string name="development_settings_summary" msgid="1815795401632854041">"ઍપ્લિકેશન વિકાસ માટે વિકલ્પો સેટ કરો"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"આ વપરાશકર્તા માટે વિકાસકર્તા વિકલ્પો ઉપલબ્ધ નથી"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"આ વપરાશકર્તા માટે VPN સેટિંગ્સ ઉપલબ્ધ નથી"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"આ વપરાશકર્તા માટે ટિથરિંગ સેટિંગ્સ ઉપલબ્ધ નથી"</string> @@ -159,9 +159,9 @@ <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"બુટલોડર અનલૉક કરવાની મંજૂરી આપો"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ને અનલૉક કરવાની મંજૂરી આપીએ?"</string> <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ચેતવણી: જ્યારે આ સેટિંગ ચાલુ હોય ત્યારે આ ઉપકરણ પર ઉપકરણ સંરક્ષણ સુવિધાઓ કાર્ય કરશે નહીં."</string> - <string name="mock_location_app" msgid="7966220972812881854">"મોક સ્થાન એપ્લિકેશન પસંદ કરો"</string> - <string name="mock_location_app_not_set" msgid="809543285495344223">"કોઈ મોક સ્થાન એપ્લિકેશન સેટ કરાયેલ નથી"</string> - <string name="mock_location_app_set" msgid="8966420655295102685">"મોક સ્થાન એપ્લિકેશન: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="mock_location_app" msgid="7966220972812881854">"મોક સ્થાન ઍપ્લિકેશન પસંદ કરો"</string> + <string name="mock_location_app_not_set" msgid="809543285495344223">"કોઈ મોક સ્થાન ઍપ્લિકેશન સેટ કરાયેલ નથી"</string> + <string name="mock_location_app_set" msgid="8966420655295102685">"મોક સ્થાન ઍપ્લિકેશન: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"નેટવર્કિંગ"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"બિનતારી પ્રદર્શન પ્રમાણન"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi-Fi વર્બોઝ લૉગિંગ સક્ષમ કરો"</string> @@ -195,10 +195,10 @@ <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP તપાસણી"</string> <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP તપાસણીની વર્તણૂક બદલો"</string> <string name="debug_debugging_category" msgid="6781250159513471316">"ડીબગિંગ"</string> - <string name="debug_app" msgid="8349591734751384446">"ડીબગ એપ્લિકેશન પસંદ કરો"</string> - <string name="debug_app_not_set" msgid="718752499586403499">"કોઇ ડીબગ એપ્લિકેશન સેટ કરેલી નથી"</string> + <string name="debug_app" msgid="8349591734751384446">"ડીબગ ઍપ્લિકેશન પસંદ કરો"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"કોઇ ડીબગ ઍપ્લિકેશન સેટ કરેલી નથી"</string> <string name="debug_app_set" msgid="2063077997870280017">"એપ્લિકેશનને ડીબગ કરી રહ્યું છે: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="select_application" msgid="5156029161289091703">"એપ્લિકેશન પસંદ કરો"</string> + <string name="select_application" msgid="5156029161289091703">"ઍપ્લિકેશન પસંદ કરો"</string> <string name="no_application" msgid="2813387563129153880">"કંઈ નહીં"</string> <string name="wait_for_debugger" msgid="1202370874528893091">"ડીબગર માટે રાહ જુઓ"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ડીબગ કરેલ એપ્લિકેશનો ક્રિયાન્વિત થતા પહેલાં ડીબગર જોડાઈ તેની રાહ જુએ છે"</string> @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"4x MSAA ને ફરજ પાડો"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 એપ્લિકેશન્સમાં 4x MSAA સક્ષમ કરો"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"બિન-લંબચોરસ ક્લિપ કામગીરી ડીબગ કરો"</string> - <string name="track_frame_time" msgid="6146354853663863443">"પ્રોફાઇલ GPU પ્રદર્શિત થાય છે"</string> + <string name="track_frame_time" msgid="6146354853663863443">"પ્રોફાઇલ GPU રેન્ડરિંગ"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"વિંડો એનિમેશન સ્કેલ"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"સંક્રમણ એનિમેશન સ્કેલ"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"એનિમેટર અવધિ સ્કેલ"</string> @@ -247,7 +247,7 @@ <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"જેવો વપરાશકર્તા તેને છોડે, તરત જ દરેક પ્રવૃત્તિ નષ્ટ કરો"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"પૃષ્ઠભૂમિ પ્રક્રિયા સીમા"</string> <string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string> - <string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ એપ્લિકેશનો માટે એપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"સક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ચાલુ સેવાઓ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"મલ્ટિપ્રોસેસ WebView સક્ષમ કરો"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"પૃથક પ્રક્રિયામાં WebView રેંડરર્સ ચલાવો."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"મલ્ટિપ્રોસેસ WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView રેંડરર્સ અલગથી ચલાવો"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView અમલીકરણ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView અમલીકરણ સેટ કરો"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"આ વિકલ્પ હવે માન્ય નથી. ફરી પ્રયાસ કરો."</string> @@ -292,7 +292,7 @@ <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"મોનોક્રોમેસી"</string> <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"ડીયુટેરેનોમલી (લાલ-લીલો)"</string> <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"પ્રોટેનોમલી (લાલ-લીલો)"</string> - <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ટ્રિટાનોમેલી(વાદળી-પીળો)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ટ્રાઇટેનોમલી(વાદળી-પીળો)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"રંગ સુધારણા"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"આ સુવિધા પ્રાયોગિક છે અને કામગીરી પર અસર કરી શકે છે."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> દ્વારા ઓવરરાઇડ થયું"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 0241c00a643e..0ed67eeddfe0 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करने पर टैप करें."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"चल रही सेवाएं"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"वर्तमान में चल रही सेवाओं को देखें और नियंत्रित करें"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"मल्टीप्रोसेस WebView सक्षम करें"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"किसी अलग प्रक्रिया में WebView रेंडरर चलाएं."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"मल्टीप्रोसेस WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView रेंडरर अलग-अलग चलाएं"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView कार्यान्वयन"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView कार्यान्वयन सेट करें"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"यह चयन अब मान्य नहीं है. पुनः प्रयास करें."</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index e030ff596563..6c87e802b740 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -146,9 +146,9 @@ <string name="vpn_settings_not_available" msgid="956841430176985598">"Postavke VPN-a nisu dostupne ovom korisniku"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke dijeljenja veze nisu dostupne ovom korisniku"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Postavke pristupne točke nisu dostupne ovom korisniku"</string> - <string name="enable_adb" msgid="7982306934419797485">"Uklanjanje pogrešaka putem USB-a"</string> - <string name="enable_adb_summary" msgid="4881186971746056635">"Uklanjanje pogrešaka s priključenim USB-om"</string> - <string name="clear_adb_keys" msgid="4038889221503122743">"Opoziv autorizacija za uklanjanje pogrešaka putem USB-a"</string> + <string name="enable_adb" msgid="7982306934419797485">"Otklanjanje pogrešaka putem USB-a"</string> + <string name="enable_adb_summary" msgid="4881186971746056635">"Otklanjanje pogrešaka s priključenim USB-om"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"Opoziv autorizacija za otklanjanje pogrešaka putem USB-a"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"Prečac izvješća o pogreškama"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Prikaži gumb u izborniku napajanja za izradu izvješća o programskim pogreškama"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Ne pokreći mirovanje"</string> @@ -182,8 +182,8 @@ <string name="debug_view_attributes" msgid="6485448367803310384">"Omogući pregled atributa prikaza"</string> <string name="legacy_dhcp_client_summary" msgid="163383566317652040">"Upotrebljavajte DHCP klijent iz Lollipopa umjesto novog Android DHCP klijenta."</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Neka mobilni podaci uvijek budu aktivni, čak i kada je Wi‑Fi aktivan (za brzo prebacivanje s jedne na drugu mrežu)."</string> - <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti uklanjanje pogrešaka putem USB-a?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"Uklanjanje pogrešaka putem USB-a namijenjeno je samo u razvojne svrhe. Može se upotrijebiti za kopiranje podataka s računala na uređaj i obrnuto, instalaciju aplikacija na uređaju bez obavijesti i za čitanje dnevničkih zapisa."</string> + <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti otklanjanje pogrešaka putem USB-a?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"Otklanjanje pogrešaka putem USB-a namijenjeno je samo u razvojne svrhe. Može se upotrijebiti za kopiranje podataka s računala na uređaj i obrnuto, instalaciju aplikacija na uređaju bez obavijesti i za čitanje dnevničkih zapisa."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"Želite li opozvati pristup uklanjanju pogrešaka putem USB-a sa svih računala koja ste prethodno autorizirali?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"Dopustiti postavke razvojnih programera?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove su postavke namijenjene samo razvojnim programerima. One mogu uzrokovati kvar ili neželjeno ponašanje vašeg uređaja i aplikacija na njemu."</string> @@ -194,14 +194,14 @@ <string name="enable_terminal_summary" msgid="67667852659359206">"Omogući aplikaciju terminala koja nudi pristup lokalnoj ovojnici"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provjera"</string> <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Postav. ponaš. HDCP prov."</string> - <string name="debug_debugging_category" msgid="6781250159513471316">"Uklanjanje pogrešaka"</string> - <string name="debug_app" msgid="8349591734751384446">"Aplikacija za uklanjanje pogrešaka"</string> - <string name="debug_app_not_set" msgid="718752499586403499">"Nema aplikacije za uklanjanje pogrešaka"</string> - <string name="debug_app_set" msgid="2063077997870280017">"Aplikacija za uklanjanje pogrešaka: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="debug_debugging_category" msgid="6781250159513471316">"Otklanjanje pogrešaka"</string> + <string name="debug_app" msgid="8349591734751384446">"Aplikacija za otklanjanje pogrešaka"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"Nema aplikacije za otklanjanje pogrešaka"</string> + <string name="debug_app_set" msgid="2063077997870280017">"Aplikacija za otklanjanje pogrešaka: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="5156029161289091703">"Odaberite aplikaciju"</string> <string name="no_application" msgid="2813387563129153880">"Ništa"</string> - <string name="wait_for_debugger" msgid="1202370874528893091">"Čeka se program za uklanjanje pogrešaka"</string> - <string name="wait_for_debugger_summary" msgid="1766918303462746804">"Aplikacija čeka priključivanje programa za uklanjanje pogrešaka"</string> + <string name="wait_for_debugger" msgid="1202370874528893091">"Čeka se program za otklanjanje pogrešaka"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"Aplikacija čeka priključivanje programa za otklanjanje pogrešaka"</string> <string name="debug_input_category" msgid="1811069939601180246">"Ulaz"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"Crtež"</string> <string name="debug_hw_drawing_category" msgid="6220174216912308658">"Hardverski ubrzano renderiranje"</string> @@ -226,7 +226,7 @@ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Omogući OpenGL praćenja"</string> <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Onemogući USB audiousmj."</string> <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Onemogući aut. usmjeravanje na USB audioperiferiju"</string> - <string name="debug_layout" msgid="5981361776594526155">"Prikaži granice izgleda"</string> + <string name="debug_layout" msgid="5981361776594526155">"Prikaži okvir prikaza"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Prikazuju se obrubi, margine itd. isječaka."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Nametni zdesna ulijevo"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Nametni smjer zdesna ulijevo za sve zemlje/jezike"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dodirnite da biste to promijenili."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Pogledajte i nadzirite pokrenute procese"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Omogući višeprocesni WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Pokreni ispunjivače WebViewa u izoliranim procesima."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Višeprocesni web-prikaz"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Ispunjivače web-prikaza pokreni zasebno"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementacija WebViewa"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Postavi implementaciju WebViewa"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Taj izbor više nije važeći. Pokušajte ponovo."</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 7bf9ba54e3f1..5b8525cffb5c 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Bekapcsolva. Koppintson ide a váltáshoz."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Futó szolgáltatások"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Többfolyamatos WebView indítása"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView-megjelenítők futtatása külön folyamatként."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Többfolyamatos WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView-megjelenítők futtatása külön"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-megvalósítás"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView-megvalósítás beállítása"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ez a választás már nem érvényes. Próbálkozzon újra."</string> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index 9bf3f8999080..8db93c6d5b9a 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Աշխատեցվող ծառայություններ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Դիտել և վերահսկել ընթացիկ աշխատեցվող ծառայությունները"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Միացնել բազմագործընթաց WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Գործարկել WebView-ի մշակիչները առանձնացված գործընթացում:"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Բազմագործընթաց WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Գործարկել WebView-ի մշակիչներն առանձին"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-ի իրականացում"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ընտրեք WebView-ի իրականացումը"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Այս ընտրանքն այլևս վավեր չէ: Փորձեք նորից:"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index bb776250c1ba..1083a8f16869 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Ketuk untuk beralih."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Layanan yang sedang berjalan"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Melihat dan mengontrol layanan yang sedang berjalan"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Aktifkan WebView multiproses"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Jalankan perender WebView dalam proses yang terisolasi."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView Multiproses"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Jalankan perender WebView secara terpisah"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Penerapan WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Setel penerapan WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Pilihan ini tidak valid lagi. Coba lagi."</string> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index dfc7f18f8dc0..3558270a96f5 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -226,7 +226,7 @@ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Kveikja á OpenGL-rakningu"</string> <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Slökkva á USB-hljóðbeiningu"</string> <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Slökkva á sjálfvirkri beiningu til USB-hljóðtækja"</string> - <string name="debug_layout" msgid="5981361776594526155">"Sýna mörk í uppsetningu"</string> + <string name="debug_layout" msgid="5981361776594526155">"Sýna uppsetningarmörk"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Sýna skurðlínur, spássíur o.s.frv."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Þvinga umbrot frá hægri til vinstri"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Þvinga umbrot skjás frá hægri til vinstri fyrir alla tungumálskóða"</string> @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"Þvinga 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Virkja 4x MSAA í OpenGL ES 2.0 forritum"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Villuleita klippt svæði sem ekki eru rétthyrnd"</string> - <string name="track_frame_time" msgid="6146354853663863443">"Greina teiknun skjákorts"</string> + <string name="track_frame_time" msgid="6146354853663863443">"Greina skjákortsteiknun"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Kvarði gluggahreyfinga"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Lengd hreyfiumbreytinga"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"Tímalengd hreyfiáhrifa"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Virkt. Ýttu til að breyta."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Þjónustur í gangi"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Skoða og stjórna þjónustum í gangi"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Virkja WebView í fjölvinnslu"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Keyra WebView teiknun í lokuðu ferli."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView í fjölvinnslu"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Keyra WebView teiknun í aðskildu lagi"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Innleiðing WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Stilla innleiðingu WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Þetta val er ekki lengur gilt. Reyndu aftur."</string> @@ -323,7 +323,7 @@ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Stjórnað af kerfisstjóra"</string> <string name="enabled_by_admin" msgid="2386503803463071894">"Virkjað af stjórnanda"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Stjórnandi gerði óvirkt"</string> - <string name="home" msgid="3256884684164448244">"Aðalsíða stillinga"</string> + <string name="home" msgid="3256884684164448244">"Stillingar"</string> <string name="charge_length_format" msgid="8978516217024434156">"Fyrir <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> eftir"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Lítið"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index bce3e0044330..4c998874d389 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Attiva. Tocca per attivare/disattivare."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servizi in esecuzione"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizza e controlla i servizi attualmente in esecuzione"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Attiva WebView multiprocesso"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Esegui renderer WebView in un processo isolato."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiprocesso"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Esegui renderer WebView separatamente"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementazione di WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Imposta l\'implementazione di WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"La selezione non è più valida. Riprova."</string> @@ -327,7 +327,7 @@ <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> fa"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> rimanenti"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Piccolo"</string> - <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Predefinito"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Predefinite"</string> <string name="screen_zoom_summary_large" msgid="4835294730065424084">"Grande"</string> <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Più grande"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Massimo"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 031718bff904..7574322a9abc 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"אפליקציה פעילה. הקש כדי להחליף מצב."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"שירותים פועלים"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"הצג ושלוט בשירותים הפועלים כעת"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"הפעל תצוגת אתר לריבוי עיבודים"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"הרץ מעבדי תצוגת אתר בהליך מבודד"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"הרץ כלי WebView לעיבוד/יצירת תמונה ממוחשבת בנפרד"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"יישום WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"הגדרת יישום WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"אפשרות זו כבר אינה תקפה. נסה שוב."</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 808cd34def6a..b25ad19dba74 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"有効です。タップすると切り替わります。"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"実行中のサービス"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"現在実行中のサービスを表示して制御する"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"複数プロセス WebView を有効化"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"別個のプロセスで WebView レンダラを実行します。"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"マルチプロセス WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView レンダラを別個に実行"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView の実装"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView の実装の設定"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"この選択は無効になりました。もう一度お試しください。"</string> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index de88b0d6806c..1edca1b868b3 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -182,7 +182,7 @@ <string name="debug_view_attributes" msgid="6485448367803310384">"ნახვის ატრიბუტის ინსპექტირების ჩართვა"</string> <string name="legacy_dhcp_client_summary" msgid="163383566317652040">"ახალი Android DHCP კლიენტის ნაცვლად, Lollipop-ის DHCP კლიენტის გამოყენება."</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"მობილური მოწყობილობის მონაცემები ყოველთვის აქტიური დარჩეს, მაშინაც კი, როდესაც Wi-Fi აქტიურია (ქსელის სწრაფი გადართვისთვის)."</string> - <string name="adb_warning_title" msgid="6234463310896563253">"ჩავრთო USB გამართვა?"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"ჩაირთოს USB გამართვა?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB გამართვა განკუთვნილია მხოლოდ დეველოპერული მიზნებისთვის. გამოიყენეთ კომპიუტერსა და თქვენ მოწყობილობას შორის მონაცემების გადასატანად, თქვენ მოწყობილობაზე აპების შეტყობინების გარეშე დასაყენებლად და ჟურნალის მონაცემების წასაკითხად."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"გავაუქმოთ ყველა იმ კომპიუტერიდან USB გამართვაზე წვდომა, რომლებიდანაც აქამდე განახორციელეთ შესვლა?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"გსურთ, დეველოპმენტის პარამეტრების ნების დართვა?"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"აქტიური. შეეხეთ გადასართავად."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"მიმდინარე სერვისები"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"მრავალპროც. WebView-ს ჩართვა"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView ვიზუალიზატორების იზოლირებულ პროცესში გაშვება."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"მრავალპროცესიანი WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView ვიზუალიზატორების განცალკევებულად გაშვება"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView რეალიზაცია"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView რეალიზაციის დაყენება"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"თქვენი არჩევანი აღარ მოქმედებს. ცადეთ ხელახლა."</string> @@ -313,7 +313,7 @@ <string name="battery_info_status_charging" msgid="1705179948350365604">"იტენება"</string> <string name="battery_info_status_charging_ac" msgid="2909861890674399949">"დატენვა ელკვებაზე"</string> <string name="battery_info_status_charging_ac_short" msgid="7431401092096415502">"იტენება"</string> - <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"დატენვა USB-ზე"</string> + <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"იტენება USB-ზე"</string> <string name="battery_info_status_charging_usb_short" msgid="6733371990319101366">"იტენება"</string> <string name="battery_info_status_charging_wireless" msgid="3574032603735446573">"დატენვა უსადენოდ"</string> <string name="battery_info_status_charging_wireless_short" msgid="752569941028903610">"იტენება"</string> diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 4768b794c07b..51002828e4b5 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Белсенді. Ауыстырып қосу үшін түртіңіз."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Қосылып тұрған қызметтер"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ағымдағы қосылып тұрған қызметтерді көру және басқару"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Бірнеше процесті веб-көріністі қосу"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Веб-көрініс бейнелеушілерін оқшауланған процесте іске қосу."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Бірнеше процесті WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView бейнелеушілерін бөлек қолдану"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ендіру"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ендіруін орнату"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Бұл таңдау енді жарамды емес. Әрекетті қайталаңыз."</string> diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index a79fd983b2d2..941c01d11e59 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"សេវាកម្មកំពុងដំណើរការ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"បើកដំណើរការ WebView ដែលមានអង្គដំណើរការច្រើន"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ដំណើរការកម្មវិធីបំលែង WebView ក្នុងដំណើរការដាច់ដោយឡែក"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView ដែលមានអង្គដំណើរការច្រើន"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"ដំណើរការកម្មវិធីបម្លែង WebView ដោយឡែក"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"ការប្រតិបត្តិ WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"កំណត់ការប្រតិបត្តិ WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ជម្រើសនេះលែងមានសុពលភាពទៀតហើយ ព្យាយាមម្តងទៀត"</string> diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index b70ea6332d88..99fb1b2efea3 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"ಬಹುಪ್ರಕ್ರಿಯೆ WebView ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ಪ್ರತ್ಯೇಕಗೊಳಿಸಿದ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ WebView ರೆಂಡರರ್ ರನ್ ಮಾಡಿ."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"ಬಹುಪ್ರಕ್ರಿಯೆ WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView ರೆಂಡರರ್ಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ರನ್ ಮಾಡಿ"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ಈ ಆಯ್ಕೆಯು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿರುವುದಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -332,5 +332,5 @@ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"ಸ್ವಲ್ಪ ದೊಡ್ಡ"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ದೊಡ್ಡ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ಕಸ್ಟಮ್ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> - <string name="help_feedback_label" msgid="6815040660801785649">"ಸಹಾಯ & amp; ಪ್ರತಿಕ್ರಿಯೆ"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"ಸಹಾಯ & ಪ್ರತಿಕ್ರಿಯೆ"</string> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index fed421163169..0f48a45d6dec 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"활성화되었습니다. 전환하려면 탭하세요."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"실행 중인 서비스"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"현재 실행 중인 서비스 보기 및 제어"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"멀티 프로세스 WebView 사용"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"단독 프로세스 내에서 WebView 렌더러를 실행합니다."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"멀티 프로세스 WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"개별적으로 WebView 렌더기 실행"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 구현"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView 구현 설정"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"선택이 더 이상 유효하지 않습니다. 다시 시도하세요."</string> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 19c18e666d4e..204c66697e16 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Иштеп турат. Которуштуруу үчүн таптап коюңуз."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Иштеп жаткан кызматтар"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Учурда иштеп жаткан кызматтарды көрүү жана көзөмөлдөө"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Көп процесстүү WebView иштт"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView рендерерлерин корголгон процессте иштетүү."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Көп процесстүү WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView рендерерлерин өзүнчө иштетүү"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView аткарылышы"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView аткарылышын коюу"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Тандалган нерсе жараксыз болуп калган. Кайра аракет кылыңыз."</string> diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index f6f7e6bd4264..d76821412065 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ນຳໃຊ້ຢູ່. ແຕະເພື່ອສັບປ່ຽນ."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ເບິ່ງ ແລະຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"ອະນຸຍາດໃຫ້ມີໂປຣເຊສ WebView ຫຼາຍອັນໄດ້"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ເປີດໃຊ້ຕົວປະມວນ WebView ໃນໂປຣເຊສທີ່ແຍກຈາກກັນໄດ້."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"ໃຊ້ຕົວເຣນເດີ WebView ແຍກຕ່າງຫາກ"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"ຕັ້ງການຈັດຕັ້ງປະຕິບັດ WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ບໍ່ສາມາດໃຊ້ການເລືອກນີ້ໄດ້ອີກຕໍ່ໄປແລ້ວ. ກະລຸນາລອງໃໝ່."</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 3358683e994f..7318b41fef10 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktyvi. Palieskite, kad perjungtumėte."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Vykdomos paslaugos"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Įgal. kelių procesų „WebView“"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Paleisti „WebView“ pateikimo priemones vienam procesui."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Kelių procesų „WebView“"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Paleisti „WebView“ pateikimo priemones atskirai"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"„WebView“ diegimas"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"„WebView“ diegimo nustatymas"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Šios parinkties nebegalima pasirinkti. Bandykite dar kartą."</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index bcdba2dbfa28..e11a4b2e920f 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktīva. Pieskarieties, lai pārslēgtu."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktīvie pakalpojumi"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Iespējot vairākprocesu WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Atsevišķā procesā tiek palaisti WebView renderētāji."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Vairākprocesu WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Palaist WebView renderētājus atsevišķi"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ieviešana"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Iestatīt WebView ieviešanu"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Šī iespēja vairs nav derīga. Mēģiniet vēlreiz."</string> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 9839ebb21adc..2a80e6d72f5c 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Допрете за да смените."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Активни услуги"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Погледнете и контролирајте услуги што се моментално активни"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Овозможи мултипроцесен WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Активирајте ги WebView-прикажувачите во изолиран процес."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Повеќекратен процес на WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Посебно извршувајте ги прикажувачите на WebView"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Воведување WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Поставете воведување WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Овој избор веќе не важи. Обидете се повторно."</string> diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 6cab99adcf68..82ef83d6f5b9 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"സജീവം. മാറ്റുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"മൾട്ടിപ്രോസസ്സ് WebView പ്രവർത്തനക്ഷമമാക്കൂ"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ഒറ്റപ്പെട്ടൊരു പ്രോസസ്സിൽ WebView റെൻഡററുകൾ റൺ ചെയ്യുക."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"മൾട്ടിപ്രോസസ്സ് WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView റെൻഡററുകൾ പ്രത്യേകമായി റൺ ചെയ്യുക"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView നടപ്പാക്കൽ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView നടപ്പാക്കൽ സജ്ജമാക്കുക"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ഈ തിരഞ്ഞെടുപ്പിന് തുടർന്നങ്ങോട്ട് സാധുതയില്ല. വീണ്ടും ശ്രമിക്കുക."</string> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index e0ea442f2329..07575084919d 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -88,7 +88,7 @@ <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Арилгасан апп-ууд болон хэрэглэгчид"</string> <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB модем болгох"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Зөөврийн сүлжээний цэг"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Блютүүт модем болгох"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth модем болгох"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Модем болгох"</string> <string name="tether_settings_title_all" msgid="8356136101061143841">"Модем болгох & зөөврийн сүлжээний цэг"</string> <string name="managed_user_title" msgid="8109605045406748842">"Ажлын бүх апп"</string> @@ -153,7 +153,7 @@ <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Цэсэнд согогийн репорт авахад зориулсан товчийг харуулах"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Идэвхтэй байлгах"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"Цэнэглэж байх үед дэлгэц хэзээ ч амрахгүй"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Блютүүт HCI снүүп логыг идэвхжүүлэх"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI снүүп логыг идэвхжүүлэх"</string> <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Файл доторх бүх блютүүт HCI пакетуудыг унших"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM түгжээ тайлагч"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-н түгжээг тайлахыг зөвшөөрөх"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Идэвхтэй байна. Унтраах/асаахын тулд дарна уу."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Ажиллаж байгаа үйлчилгээнүүд"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"WebView-н олон боловсруулалтыг идэвхжүүлэх"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView хөрвүүлэгчийг тусдаа боловсруулалтаар ажиллуулна уу."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Олон боловсруулалттай WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView хөрвүүлэгчийг тусад нь ажиллуулах"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView хэрэгжилт"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView хэрэгжилтийг тохируулах"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Энэ сонголт хүчингүй байна. Дахин оролдоно уу."</string> diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index 7ae8b1791722..ba020da79a57 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करण्यासाठी टॅप करा."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"चालू सेवा"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"सध्या चालत असलेल्या सेवा पहा आणि नियंत्रित करा"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"एकाधिक प्रक्रिया WebView सक्षम करा"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"एक वेगळ्या प्रक्रियेत WebView प्रस्तुतकर्ते चालवा."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"एकाधिक प्रक्रिया वेबदृश्य"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"वेबदृश्य प्रस्तुतकर्ते स्वतंत्रपणे चालवा"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"वेबदृश्य अंमलबजावणी"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"वेबदृश्य अंमलबजावणी सेट करा"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ही निवड यापुढे वैध असणार नाही. पुन्हा प्रयत्न करा."</string> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index 794482f729e7..554b3afa942b 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Ketik untuk menogol."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Perkhidmatan dijalankan"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Dayakan WebView berbilang proses"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Jalankan pemapar WebView dalam proses terpencil."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Paparan Web Berbilang Proses"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Jalankan pemapar Paparan Web secara berasingan"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Pelaksanaan WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Tetapkan pelaksanaan WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Pilihan ini tidak lagi sah. Cuba lagi."</string> diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 8c64bd78e234..d7d6b56a5ca3 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -71,7 +71,7 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ထည့်သွင်းရန်အသုံးပြုသည်"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"အတူတွဲပါ"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ချိတ်တွဲရန်"</string> - <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ထားတော့"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ဖျက်သိမ်းရန်"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ချိတ်တွဲမှုက ချိတ်ဆက်ထားလျှင် သင်၏ အဆက်အသွယ်များ နှင့် ခေါ်ဆိုမှု မှတ်တမ်းကို ရယူခွင့် ပြုသည်။"</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်မရပါ"</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ပင်နံပါတ် သို့မဟုတ် ဖြတ်သန်းခွင့်ကီးမမှန်ကန်သောကြောင့်<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်မရပါ။"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ပွင့်နေသည်။ ပြောင်းရန်တို့ပါ။"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ယခုအလုပ်လုပ်နေသောဝန်ဆောင်မှုကို ကြည့်ခြင်းနှင့် ထိန်းသိမ်းခြင်းအား ပြုလုပ်မည်လား?"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"လုပ်ငန်းဖြစ်စဉ်များစွာကြည့်နိုင်သည့် ဝဘ်မြင်ကွင်းကိုဖွင့်ပါ"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"လုပ်ငန်းဖြစ်စဉ်တစ်ခုတည်းအတွက် ဝဘ်မြင်ကွင်း အဖြစ်ပြုလုပ်ခြင်းကို ဖွင့်ပါ။"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"တဘ်တစ်ခုထက်ပိုဖွင့်ထားနိုင်သော WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView ပြင်ဆင်မှုစနစ်ကို သီးခြားဖွင့်ပါ"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView အကောင်အထည်ဖော်မှု"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView အကောင်အထည်ဖော်မှု သတ်မှတ်ပါ"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ဤရွေးချယ်မှု မှန်ကန်မှု မရှိတော့ပါ။ ထပ်စမ်းကြည့်ပါ။"</string> @@ -332,5 +332,5 @@ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"ပိုကြီး"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"အကြီးဆုံး"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"စိတ်ကြိုက် (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> - <string name="help_feedback_label" msgid="6815040660801785649">"အကူအညီ နှင့်တုံ့ပြန်ချက်"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"အကူအညီနှင့် တုံ့ပြန်ချက်"</string> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 11ce40cef3dd..fa15cd3f7c70 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Trykk for å slå av/på."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktive tjenester"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Se og kontrollér tjenester som kjører for øyeblikket"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Slå på WebView for flere prosesser"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Kjør WebView-gjengivelser i en isolert prosess."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView for flere prosesser"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Kjør WebView-gjengivere separat"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Angi WebView-implementering"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Dette valget er ikke gyldig lenger. Prøv på nytt."</string> diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index d1f46076089b..e091138336b8 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"चलिरहेका सेवाहरू"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"मल्टिप्रोसेस वेबभ्यु सक्षम गर्नुहोस्"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"एउटा पृथक प्रक्रियामा वेबभ्यु रेन्डररहरू चलाउनुहोस्।"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"मल्टिप्रोसेस WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView रेन्डररहरूलाई पृथक रूपमा सञ्चालन गर्नुहोस्"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView कार्यान्वयन"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView कार्यान्वयन सेट गर्नुहोस्"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"यो छनोट अब मान्य छैन। फेरि प्रयास गर्नुहोस्।"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index abca5c8e9461..2c2c5d065009 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Actief. Tik om te schakelen."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Actieve services"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Services die momenteel actief zijn, weergeven en beheren"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Multiproces-WebView aan"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView-weergaveprogramma\'s uitvoeren in geïsoleerd proces."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess-WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView-weergaveprogramma\'s afzonderlijk uitvoeren"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementatie"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView-implementatie instellen"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Deze keuze is niet meer geldig. Probeer het opnieuw."</string> diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index 3234c4913523..19893d62fc15 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -46,7 +46,7 @@ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਔਡੀਓ"</string> <string name="bluetooth_profile_headset" msgid="8658779596261212609">"ਫੋਨ ਔਡੀਓ"</string> <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string> - <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ਇਨਪੁਟ ਡਿਵਾਈਸ"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ਇਨਪੁਟ ਡੀਵਾਈਸ"</string> <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ"</string> <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ"</string> <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ ਲਈ ਵਰਤੋ"</string> @@ -59,9 +59,9 @@ <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"ਨਕਸ਼ੇ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string> - <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ਇਨਪੁਟ ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> - <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> - <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ਡਿਵਾਈਸ ਨਾਲ ਸਥਾਨਕ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਸ਼ੇਅਰ ਕਰ ਰਿਹਾ ਹੈ"</string> + <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ਇਨਪੁਟ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ਡੀਵਾਈਸ ਨਾਲ ਸਥਾਨਕ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਸ਼ੇਅਰ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"ਨਕਸ਼ੇ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string> @@ -98,7 +98,7 @@ <string name="launch_defaults_some" msgid="313159469856372621">"ਕੁਝ ਡਿਫੌਲਟਸ ਸੈਟ ਕੀਤੇ"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"ਕੋਈ ਡਿਫੌਲਟਸ ਸੈਟ ਨਹੀਂ ਕੀਤੇ"</string> <string name="tts_settings" msgid="8186971894801348327">"ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਸੈਟਿੰਗਾਂ"</string> - <string name="tts_settings_title" msgid="1237820681016639683">"ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਆਉਟਪੁਟ"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"ਲਿਖਤ-ਤੋਂ-ਬੋਲੀ ਆਊਟਪੁਟ"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"ਸਪੀਚ ਰੇਟ"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"ਸਪੀਡ ਜਿਸਤੇ ਟੈਕਸਟ ਬੋਲਿਆ ਜਾਂਦਾ ਹੈ"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"ਪਿਚ"</string> @@ -109,14 +109,14 @@ <string name="tts_default_lang_summary" msgid="5219362163902707785">"ਬੋਲੇ ਗਏ ਟੈਕਸਟ ਲਈ ਭਾਸ਼ਾ-ਵਿਸ਼ੇਸ਼ ਵੌਇਸ ਸੈਟ ਕਰਦਾ ਹੈ"</string> <string name="tts_play_example_title" msgid="7094780383253097230">"ਇੱਕ ਉਦਾਹਰਨ ਲਈ ਸੁਣੋ"</string> <string name="tts_play_example_summary" msgid="8029071615047894486">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਦਾ ਇੱਕ ਛੋਟਾ ਪ੍ਰਦਰਸ਼ਨ ਪਲੇ ਕਰੋ"</string> - <string name="tts_install_data_title" msgid="4264378440508149986">"ਵੌਇਸ ਡਾਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string> - <string name="tts_install_data_summary" msgid="5742135732511822589">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਲਈ ਲੁੜੀਂਦਾ ਵੌਇਸ ਡਾਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string> - <string name="tts_engine_security_warning" msgid="8786238102020223650">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਉਹ ਸਾਰਾ ਟੈਕਸਟ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦਾ ਹੈ, ਜੋ ਬੋਲਿਆ ਜਾਏਗਾ, ਨਿੱਜੀ ਡਾਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ਇੰਜਣ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਸ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string> - <string name="tts_engine_network_required" msgid="1190837151485314743">"ਇਸ ਭਾਸ਼ਾ ਲਈ ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਆਉਟਪੁਟ ਲਈ ਇੱਕ ਚਾਲੂ ਨੈਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਲੋੜ ਹੈ।"</string> + <string name="tts_install_data_title" msgid="4264378440508149986">"ਵੌਇਸ ਡੈਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਲਈ ਲੁੜੀਂਦਾ ਵੌਇਸ ਡੈਟਾ ਇੰਸਟੌਲ ਕਰੋ"</string> + <string name="tts_engine_security_warning" msgid="8786238102020223650">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਉਹ ਸਾਰਾ ਟੈਕਸਟ ਇਕੱਤਰ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੋ ਸਕਦਾ ਹੈ, ਜੋ ਬੋਲਿਆ ਜਾਏਗਾ, ਨਿੱਜੀ ਡੈਟਾ ਸਮੇਤ ਜਿਵੇਂ ਪਾਸਵਰਡ ਅਤੇ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ। ਇਹ <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ਇੰਜਣ ਤੋਂ ਆਉਂਦਾ ਹੈ। ਕੀ ਇਸ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਇੰਜਣ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string> + <string name="tts_engine_network_required" msgid="1190837151485314743">"ਇਸ ਭਾਸ਼ਾ ਲਈ ਟੈਕਸਟ-ਟੂ-ਸਪੀਚ ਆਊਟਪੁਟ ਲਈ ਇੱਕ ਚਾਲੂ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਲੋੜ ਹੈ।"</string> <string name="tts_default_sample_string" msgid="4040835213373086322">"ਇਹ ਸਪੀਚ ਸਿੰਥੈਸਿਸ ਦਾ ਇੱਕ ਉਦਾਹਰਨ ਹੈ"</string> <string name="tts_status_title" msgid="7268566550242584413">"ਡਿਫੌਲਟ ਭਾਸ਼ਾ ਸਥਿਤੀ"</string> <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਮਰਥਿਤ ਹੈ"</string> - <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> ਲਈ ਨੈਟਵਰਕ ਕਨੈਕਸ਼ਨ ਲੁੜੀਂਦਾ ਹੈ"</string> + <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> ਲਈ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਲੁੜੀਂਦਾ ਹੈ"</string> <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string> <string name="tts_status_checking" msgid="5339150797940483592">"ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string> <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> ਲਈ ਸੈਟਿੰਗਾਂ"</string> @@ -141,7 +141,7 @@ <string name="category_work" msgid="8699184680584175622">"ਦਫ਼ਤਰ"</string> <string name="development_settings_title" msgid="215179176067683667">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ"</string> <string name="development_settings_enable" msgid="542530994778109538">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ ਨੂੰ ਯੋਗ ਬਣਾਓ"</string> - <string name="development_settings_summary" msgid="1815795401632854041">"ਐਪ ਵਿਕਾਸ ਲਈ ਚੋਣਾਂ ਸੈਟ ਕਰੋ"</string> + <string name="development_settings_summary" msgid="1815795401632854041">"ਐਪ ਵਿਕਾਸ ਲਈ ਚੋਣਾਂ ਸੈੱਟ ਕਰੋ"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ VPN ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"ਇਸ ਉਪਭੋਗਤਾ ਲਈ ਟੀਥਰਿੰਗ ਸੈਟਿੰਗਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string> @@ -158,7 +158,7 @@ <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਨਲੌਕ ਕਰਨਾ"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ਬੂਟਲੋਡਰ ਨੂੰ ਅਨਲੌਕ ਕੀਤੇ ਜਾਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਡਿਵਾਈਸ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਉਦੋਂ ਇਸ ਡਿਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਡੀਵਾਈਸ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਉਦੋਂ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string> <string name="mock_location_app" msgid="7966220972812881854">"ਮੌਕ ਸਥਾਨ ਐਪ ਚੁਣੋ"</string> <string name="mock_location_app_not_set" msgid="809543285495344223">"ਕੋਈ ਵੀ ਮੌਕ ਸਥਾਨ ਐਪ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string> <string name="mock_location_app_set" msgid="8966420655295102685">"ਮੌਕ ਸਥਾਨ ਐਪ: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -171,8 +171,8 @@ <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ਪੂਰਨ ਵੌਲਯੂਮ ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਦਿਖਾਓ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, Wi‑Fi Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string> - <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ਜਦੋਂ ਸਮਰਥਿਤ ਹੋਵੇ, ਤਾਂ Wi‑Fi ਸੈਲਿਊਲਰ ਨੂੰ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਹੈਂਡ ਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਅਗ੍ਰੈਸਿਵ ਹੋ ਜਾਏਗਾ, ਜਦੋਂ Wi‑Fi ਸਿਗਨਲ ਘੱਟ ਹੋਵੇ"</string> - <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ਇੰਟਰਫੇਸ ਤੇ ਮੌਜੂਦ ਡਾਟਾ ਟ੍ਰੈਫਿਕ ਦੀ ਮਾਤਰਾ ਦੇ ਆਧਾਰ ਤੇ Wi‑Fi ਰੋਮ ਸਕੈਨ ਦੀ ਆਗਿਆ ਦਿਓ/ਅਸਵੀਕਾਰ ਕਰੋ"</string> + <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ਜਦੋਂ ਸਮਰਥਿਤ ਹੋਵੇ, ਤਾਂ Wi‑Fi ਸੈਲਿਊਲਰ ਨੂੰ ਡੈਟਾ ਕਨੈਕਸ਼ਨ ਹੈਂਡ ਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਅਗ੍ਰੈਸਿਵ ਹੋ ਜਾਏਗਾ, ਜਦੋਂ Wi‑Fi ਸਿਗਨਲ ਘੱਟ ਹੋਵੇ"</string> + <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ਇੰਟਰਫੇਸ ਤੇ ਮੌਜੂਦ ਡੈਟਾ ਟ੍ਰੈਫਿਕ ਦੀ ਮਾਤਰਾ ਦੇ ਆਧਾਰ ਤੇ Wi‑Fi ਰੋਮ ਸਕੈਨ ਦੀ ਆਗਿਆ ਦਿਓ/ਅਸਵੀਕਾਰ ਕਰੋ"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"ਲੌਗਰ ਬਫਰ ਆਕਾਰ"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ ਲੌਗਰ ਆਕਾਰ ਚੁਣੋ"</string> <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB ਕੌਂਫਿਗਰੇਸ਼ਨ ਚੁਣੋ"</string> @@ -183,17 +183,17 @@ <string name="legacy_dhcp_client_summary" msgid="163383566317652040">"ਨਵੇਂ Android DHCP ਕਲਾਈਂਟ ਦੀ ਬਜਾਇ Lollipop ਦਾ DHCP ਕਲਾਈਂਟ ਵਰਤੋ।"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ਹਮੇਸ਼ਾ ਮੋਬਾਈਲ ਡੇਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ ਭਾਵੇਂ Wi‑Fi ਕਿਰਿਆਸ਼ੀਲ ਹੋਵੇ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string> <string name="adb_warning_title" msgid="6234463310896563253">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB ਡੀਬਗਿੰਗ ਕੇਵਲ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੀ ਡਿਵਾਈਸ ਵਿਚਕਾਰ ਡਾਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਡਿਵਾਈਸ ਤੇ ਐਪਸ ਇੰਸਟੌਲ ਕਰੋ ਅਤੇ ਲੌਗ ਡਾਟਾ ਪੜ੍ਹੋ।"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB ਡੀਬਗਿੰਗ ਕੇਵਲ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੀ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਡੈਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਡੀਵਾਈਸ ਤੇ ਐਪਸ ਇੰਸਟੌਲ ਕਰੋ ਅਤੇ ਲੌਗ ਡੈਟਾ ਪੜ੍ਹੋ।"</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"ਕੀ ਉਹਨਾਂ ਸਾਰੇ ਕੰਪਿਊਟਰਾਂ ਤੋਂ USB ਡੀਬਗਿੰਗ ਤੱਕ ਪਹੁੰਚ ਰੱਦ ਕਰਨੀ ਹੈ, ਜਿਹਨਾਂ ਲਈ ਪਹਿਲਾਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਕੀਤਾ ਹੈ?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"ਕੀ ਵਿਕਾਸ ਸੈਟਿੰਗਾਂ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="dev_settings_warning_message" msgid="2298337781139097964">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ਤੇ ਐਪਸ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਦੀ ਜਾਂਚ ਕਰੋ।"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਵੌਲਯੂਮ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਵੌਲਯੂਮ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਵੌਲਯੂਮ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਅਯੋਗ ਬਣਾਉਂਦਾ ਹੈ।"</string> <string name="enable_terminal_title" msgid="95572094356054120">"ਸਥਾਨਕ ਟਰਮੀਨਲ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਆੱਫਰ ਕਰਦਾ ਹੈ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ਜਾਂਚ"</string> - <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP ਜਾਂਚ ਵਿਵਹਾਰ ਸੈਟ ਕਰੋ"</string> + <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP ਜਾਂਚ ਵਿਵਹਾਰ ਸੈੱਟ ਕਰੋ"</string> <string name="debug_debugging_category" msgid="6781250159513471316">"ਡੀਬਗਿੰਗ"</string> <string name="debug_app" msgid="8349591734751384446">"ਡੀਬਗ ਐਪ ਚੁਣੋ"</string> <string name="debug_app_not_set" msgid="718752499586403499">"ਕੋਈ ਡੀਬਗ ਐਪਲੀਕੇਸ਼ਨ ਸੈਟ ਨਹੀਂ ਕੀਤੀ"</string> @@ -209,8 +209,8 @@ <string name="debug_monitoring_category" msgid="7640508148375798343">"ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="strict_mode" msgid="1938795874357830695">"ਸਟ੍ਰਿਕਟ ਮੋਡ ਸਮਰਥਿਤ"</string> <string name="strict_mode_summary" msgid="142834318897332338">"ਜਦੋਂ ਐਪਸ ਮੇਨ ਥ੍ਰੈਡ ਤੇ ਲੰਮੇ ਓਪਰੇਸ਼ਨ ਕਰਨ ਤਾਂ ਸਕ੍ਰੀਨ ਫਲੈਸ਼ ਕਰੋ"</string> - <string name="pointer_location" msgid="6084434787496938001">"ਪੌਇੰਟਰ ਨਿਰਧਾਰਿਤ ਸਥਾਨ"</string> - <string name="pointer_location_summary" msgid="840819275172753713">"ਸਕ੍ਰੀਨ ਓਵਰਲੇ ਮੌਜੂਦਾ ਟਚ ਡਾਟਾ ਦਿਖਾ ਰਿਹਾ ਹੈ"</string> + <string name="pointer_location" msgid="6084434787496938001">"ਪੌਇੰਟਰ ਟਿਕਾਣਾ"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"ਸਕ੍ਰੀਨ ਓਵਰਲੇ ਮੌਜੂਦਾ ਟਚ ਡੈਟਾ ਦਿਖਾ ਰਿਹਾ ਹੈ"</string> <string name="show_touches" msgid="2642976305235070316">"ਟੈਪਾਂ ਵਿਖਾਓ"</string> <string name="show_touches_summary" msgid="6101183132903926324">"ਟੈਪਾਂ ਲਈ ਨਜ਼ਰ ਸਬੰਧੀ ਪ੍ਰਤੀਕਰਮ ਵਿਖਾਓ"</string> <string name="show_screen_updates" msgid="5470814345876056420">"ਸਰਫਸ ਅਪਡੇਟਾਂ ਦਿਖਾਓ"</string> @@ -242,7 +242,7 @@ <string name="transition_animation_scale_title" msgid="387527540523595875">"ਟ੍ਰਾਂਜਿਸ਼ਨ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"ਐਨੀਮੇਟਰ ਮਿਆਦ ਸਕੇਲ"</string> <string name="overlay_display_devices_title" msgid="5364176287998398539">"ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ ਦੀ ਨਕਲ ਕਰੋ"</string> - <string name="debug_applications_category" msgid="4206913653849771549">"ਐਪਸ"</string> + <string name="debug_applications_category" msgid="4206913653849771549">"ਐਪਾਂ"</string> <string name="immediately_destroy_activities" msgid="1579659389568133959">"ਗਤੀਵਿਧੀਆਂ ਨਾ ਰੱਖੋ"</string> <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ਹਰੇਕ ਗਤੀਵਿਧੀ ਨੂੰ ਨਸ਼ਟ ਕਰੋ ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਇਸਨੂੰ ਛੱਡ ਦੇਵੇ"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆ ਸੀਮਾ"</string> @@ -257,7 +257,7 @@ <string name="local_backup_password_title" msgid="3860471654439418822">"ਡੈਸਕਟੌਪ ਬੈਕਅਪ ਪਾਸਵਰਡ"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ਡੈਸਕਟੌਪ ਪੂਰੇ ਬੈਕਅਪਸ ਇਸ ਵੇਲੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹਨ"</string> <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ਡੈਸਕਟਾਪ ਦੇ ਮੁਕੰਮਲ ਬੈਕਅੱਪਾਂ ਲਈ ਪਾਸਵਰਡ ਨੂੰ ਬਦਲਣ ਜਾਂ ਹਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ"</string> - <string name="local_backup_password_toast_success" msgid="582016086228434290">"ਨਵਾਂ ਬੈਕਅਪ ਪਾਸਵਰਡ ਸੈਟ ਕੀਤਾ"</string> + <string name="local_backup_password_toast_success" msgid="582016086228434290">"ਨਵਾਂ ਬੈਕਅਪ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ਨਵਾਂ ਪਾਸਵਰਡ ਅਤੇ ਪੁਸ਼ਟੀ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ਬੈਕਅਪ ਪਾਸਵਰਡ ਸੈਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ"</string> <string-array name="color_mode_names"> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"ਬਹੁ-ਮੰਤਵ WebView ਨੂੰ ਯੋਗ ਬਣਾਓ"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ਕਿਸੇ ਵੱਖ ਕੀਤੀ ਗਈ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ WebView ਰੈਂਡਰਰਾਂ ਨੂੰ ਚਲਾਓ।"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"ਮਲਟੀਪ੍ਰੋਸੈੱਸ WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView ਰੈਂਡਰਰਾਂ ਨੂੰ ਵੱਖਰੇ ਤੌਰ \'ਤੇ ਚਲਾਓ"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ਅਮਲ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ਅਮਲ ਸੈੱਟ ਕਰੋ"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ਇਹ ਚੋਣ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 16b3df286b88..e0c51f1b3e50 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktywna. Dotknij, by zmienić."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Uruchomione usługi"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Wyświetl obecnie uruchomione usługi i zarządzaj nimi"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Włącz wieloprocesowy WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Uruchom WebView jako izolowany proces."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Wieloprocesowy WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Uruchom mechanizmy renderowania WebView osobno"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementacja WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ustaw implementację WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ta opcja nie jest już obsługiwana. Spróbuj ponownie."</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 6125493e5d41..b2ca4370516d 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Tocar para alternar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizar e controlar os serviços em execução no momento"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Ativar WebView de vários processos"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Executar renderizadores de WebView em um processo isolado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView de vários processos"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Executar renderizadores de WebView separadamente"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação do WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Configurar implementação do WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opção não é mais válida. Tente novamente."</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 440512d15708..55e4def58038 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -98,7 +98,7 @@ <string name="launch_defaults_some" msgid="313159469856372621">"Algumas predefinições definidas"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Nenhuma predefinição definida"</string> <string name="tts_settings" msgid="8186971894801348327">"Definições de texto para voz"</string> - <string name="tts_settings_title" msgid="1237820681016639683">"Saída de texto para voz"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"Saída de síntese de voz"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"Taxa de voz"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"Velocidade a que o texto é falado"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tonalidade"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Toque para ativar/desativar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar os serviços actualmente em execução"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Ativar WebView multiprocessos"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Executar renderizadores WebView num processo isolado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView multiprocessos"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Executar renderizadores WebView separadamente"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Definir implementação WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opção já não é válida. Tente novamente."</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 6125493e5d41..b2ca4370516d 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Tocar para alternar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizar e controlar os serviços em execução no momento"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Ativar WebView de vários processos"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Executar renderizadores de WebView em um processo isolado."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView de vários processos"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Executar renderizadores de WebView separadamente"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação do WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Configurar implementação do WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opção não é mais válida. Tente novamente."</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 1dc0c7d8f84b..5dfdba525b02 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -139,7 +139,7 @@ <string name="choose_profile" msgid="8229363046053568878">"Alegeți un profil"</string> <string name="category_personal" msgid="1299663247844969448">"Personal"</string> <string name="category_work" msgid="8699184680584175622">"Serviciu"</string> - <string name="development_settings_title" msgid="215179176067683667">"Opțiuni dezvoltator"</string> + <string name="development_settings_title" msgid="215179176067683667">"Opțiuni pentru dezvoltatori"</string> <string name="development_settings_enable" msgid="542530994778109538">"Activați opțiunile pentru dezvoltatori"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Setați opțiuni pentru dezvoltarea aplicației"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Opțiunile de dezvoltator nu sunt disponibile pentru acest utilizator"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Activă. Atingeți pentru a comuta."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicii în curs de funcționare"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Vedeți și controlați serviciile care funcționează în prezent"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Activați WebView cu mai multe procese"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Rulați programele de redare WebView într-un proces izolat."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView cu mai multe procese"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Rulați programele de redare WebView separat"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementare WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Setați implementarea WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Această opțiune nu mai este validă. Încercați din nou."</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index f26264ad4f08..339d2b065f04 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Включено. Нажмите, чтобы отключить."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Работающие приложения"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Просмотр и управление работающими приложениями"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Включить многопроц. WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Выполнять обработчики WebView в изолированном процессе"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Многопроцессорный WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Выполнять обработчики WebView отдельно"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Сервис WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Настройки сервиса WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Вариант недействителен. Повторите попытку."</string> diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index 0de437ba0e0e..994acb9d6145 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"සක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ධාවනය වන සේවා"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"බහු සැකසීම් WebView සබල කරන්න"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"හුදකලා වූ ක්රියාවලියක WebView විදහා දැක්වීම් ධාවනය කරන්න."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"බහු සැකසීම් WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView විදහා දැක්වීම් ධාවනය කරන්න"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ක්රියාත්මක කිරීම"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ක්රියාත්මක කිරීම සකසන්න"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"මෙම තෝරා ගැනීම තව දුරටත් වලංගු නැත. නැවත උත්සාහ කරන්න."</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 3e356ee8b168..5ad82d62dbeb 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktívne. Prepnite klepnutím."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Spustené služby"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Zobrazenie a ovládanie aktuálne spustených služieb"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Povoliť viacprocesové moduly WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Spúšťať vykresľovacie moduly WebView v izolovanom procese."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Viacprocesový prvok WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Spúšťať vykresľovacie moduly WebView samostatne"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementácia komponenta WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Nastavenie implementácie komponenta WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Táto voľba už nie je platná. Skúste to znova."</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index b1e1760260be..4f003602508e 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -237,7 +237,7 @@ <string name="force_msaa" msgid="7920323238677284387">"Vsili 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"V aplikacijah OpenGL ES 2.0 omogoči 4x MSAA"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Odpr. težav s postopki nepravokotnega izrezovanja"</string> - <string name="track_frame_time" msgid="6146354853663863443">"Upod. profilov z GPE-jem"</string> + <string name="track_frame_time" msgid="6146354853663863443">"Upod. profilov z GPE"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Merilo animacije okna"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Merilo animacije prehoda"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"Lestvica trajanja animacije"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dotaknite se za preklop."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Zagnane storitve"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Preglejte in nadzorujte storitve, ki so trenutno zagnane"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Omogoči večprocesni WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Izvajanje upodabljalnikov za WebView v ločenem procesu."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Večprocesni WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Izvajanje upodabljalnikov za WebView ločeno"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Izvedba spletnega pogleda"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Nastavitev izvedbe spletnega pogleda"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ta izbira ni več veljavna. Poskusite znova."</string> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index f45d047639f6..753d7e39b8f5 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Trokit për ta ndryshuar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Shërbimet në ekzekutim"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Aktivizo WebView të multiprocesit"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Ekzekuto renderizuesit e WebView në një proces të izoluar."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView me shumë procese"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Ekzekuto më vete interpretuesit e WebView"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Zbatimi i WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Cakto zbatimin e WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Kjo zgjedhje nuk është më e vlefshme. Provo përsëri."</string> @@ -323,7 +323,7 @@ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolluar nga administratori"</string> <string name="enabled_by_admin" msgid="2386503803463071894">"Aktivizuar nga administratori"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Çaktivizuar nga administratori"</string> - <string name="home" msgid="3256884684164448244">"Krey i cilësimeve"</string> + <string name="home" msgid="3256884684164448244">"Kreu i cilësimeve"</string> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> më parë"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> të mbetura"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"I vogël"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index b47bcf1e6dd3..2fee5672ce40 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активна. Додирните да бисте је деактивирали."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Покренуте услуге"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Приказ и контрола тренутно покренутих услуга"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Омогући вишепроцесни WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Покрећите WebView приказиваче у оквиру изолованог процеса."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Вишепроцесни WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Покрећите WebView приказиваче засебно"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Примена WebView-а"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Подесите примену WebView-а"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Овај избор више није важећи. Покушајте поново."</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 29c7481c5ae1..60704e0dbcf4 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Tryck om du vill inaktivera."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktiva tjänster"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Visa och styr aktiva tjänster"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Aktivera WebView-multibearb."</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Kör WebView-renderare i en isolerad bearbetning."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView-multibearbetning"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Kör WebView-renderare separat"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ange WebView-implementering"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Det här alternativet är inte längre giltigt. Försök igen."</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 59389466de0b..245cabae1b88 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Haiwezi kutambaza mitandao"</string> <string name="wifi_security_none" msgid="7985461072596594400">"Hamna"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Imehifadhiwa"</string> - <string name="wifi_disabled_generic" msgid="4259794910584943386">"Imelemazwa"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"Imezimwa"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Haikuweza Kusanidi IP"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Haikuweza Kuunganisha kwenye WiFi"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Tatizo la uthibitishaji"</string> @@ -34,7 +34,7 @@ <string name="connected_via_passpoint" msgid="2826205693803088747">"Imeunganishwa kupitia %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Inapatikana kupitia %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Imeunganishwa, hakuna Intaneti"</string> - <string name="bluetooth_disconnected" msgid="6557104142667339895">"Imetenganishwa"</string> + <string name="bluetooth_disconnected" msgid="6557104142667339895">"Haijaunganishwa"</string> <string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inatenganisha..."</string> <string name="bluetooth_connecting" msgid="8555009514614320497">"Inaunganisha…"</string> <string name="bluetooth_connected" msgid="6038755206916626419">"Umeunganishwa"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Inatumika. Gonga ili ugeuze."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Huduma zinazoendeshwa"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Onyesha na dhibiti huduma zinazoendeshwa kwa sasa"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Washa WebView ya michakato mingi"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Tekeleza vitoaji huduma vya WebView katika mchakato mahususi."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Mwonekano wa Wavuti wa michakato mingi"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Tekeleza vitoaji huduma vya Mwonekano wa Wavuti kando"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Utekelezaji wa WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Weka utekelezaji wa WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Chaguo hili halipo tena. Jaribu tena."</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index ca6bde08b12b..5c0c9cf7498b 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"செயலில் உள்ளது. மாற்ற, தட்டவும்."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"இயங்கும் சேவைகள்"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"பல செயல்முறை WebViewஐ இயக்கு"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"தனிப்படுத்தப்பட்ட செயல்முறையில் WebView ரெண்டரர்களை இயக்கு."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"பல செயல்முறை WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView ரெண்டரர்களைத் தனித்தனியாக இயக்கு"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView செயல்படுத்தல்"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView செயல்படுத்தலை அமை"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"இனி இந்தத் தேர்வைப் பயன்படுத்த முடியாது. மீண்டும் முயலவும்."</string> diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index 374b62ca608f..0c43480decab 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"సక్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"అమలులో ఉన్న సేవలు"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ప్రస్తుతం అమలులో ఉన్న సేవలను వీక్షించండి మరియు నియంత్రించండి"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"మల్టీప్రాసెస్ వెబ్ వీక్షణ ఆరం."</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"ప్రత్యేకప్రాసెస్లో వెబ్ వీక్షణ రెండెరెర్లను అమలుచేస్తుంది."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"మల్టీప్రాసెస్ వెబ్ వీక్షణ"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"వెబ్ వీక్షణ రెండెరెర్లను అమలు చేయి"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"వెబ్ వీక్షణ అమలు"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"వెబ్ వీక్షణ అమలుని సెట్ చేయండి"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ఈ ఎంపిక ఇప్పుడు లేదు. మళ్లీ ప్రయత్నించండి."</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 5337a0d66adc..7d2c9fba55e4 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ใช้งานอยู่ แตะเพื่อสลับ"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"บริการที่ทำงานอยู่"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ดูและควบคุมบริการที่ทำงานอยู่"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"เปิดใช้ WebView แบบหลายขั้นตอน"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"เรียกใช้โหมดแสดงภาพ WebView ในการดำเนินการที่แยกออกมา"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView แบบหลายขั้นตอน"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"เรียกใช้โหมดแสดงภาพ WebView แยกต่างหาก"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"การใช้งาน WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"ตั้งค่าการใช้งาน WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ตัวเลือกนี้ใช้ไม่ได้อีกต่อไป โปรดลองอีกครั้ง"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 07b9d54d50af..4c12a7df3744 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Hindi makapag-scan ng mga network"</string> <string name="wifi_security_none" msgid="7985461072596594400">"Wala"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Na-save"</string> - <string name="wifi_disabled_generic" msgid="4259794910584943386">"Hindi Pinagana"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"Naka-disable"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Pagkabigo ng Configuration ng IP"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Pagkabigo ng Koneksyon sa WiFi"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema sa pagpapatotoo"</string> @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktibo. I-tap upang i-toggle."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Mga tumatakbong serbisyo"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"I-enable, multiprocess WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Tagapag-render ng WebView, patakbuhin sa hiwalay na proseso."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Multiprocess na WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Magpatakbo ng mga tagapag-render ng WebView nang hiwalay"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Pagpapatupad sa WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Itakda ang pagpapatupad sa WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Wala nang bisa ang napiling ito. Subukang muli."</string> @@ -294,7 +294,7 @@ <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomaly (pula-berde)"</string> <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (asul-dilaw)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Pagtatama ng kulay"</string> - <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ang feature na ito ay pinag-eeksperimentuhan at maaaring makaapekto sa pagganap."</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ang feature na ito ay pinag-eeksperimentuhan at maaaring makaapekto sa performance."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Na-override ng <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="4400068916452346544">"Humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> na lang ang natitira"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> pa"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 2417572b76c9..ff62803e29ad 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Etkin. Geçiş yapmak için hafifçe dokunun."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Çalışan hizmetler"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Çoklu işlem WebView\'ı etkinleştir"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView oluşturucuları yalıtılmış bir işlemde çalıştırın."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Çoklu İşlem WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView oluşturucularını ayrı ayrı çalıştır"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView kullanımı"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView kullanımını ayarla"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Bu seçenek artık geçerli değil. Tekrar deneyin."</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index c288d172fd94..e09ef5985959 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активний додаток. Торкніться, щоб дезактивувати."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Запущені служби"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Перегляд і керування запущеними службами"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Увімк. багатопроцесний WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Запустити засоби обробки відео WebView окремим процесом."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Багатопроцесний WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Запустити засоби обробки відео WebView окремим процесом"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Застосування WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Налаштувати застосування WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ця опція більше не дійсна. Повторіть спробу."</string> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index 90ac0acf89fa..c6b6d8081381 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"چل رہی سروسز"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"ملٹی پراسیس WebView بحال کریں"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView رینڈررز کو ایک علیحدہ پراسیس میں چلائیں۔"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"ملٹی پراسیس WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView رینڈررز کو علیحدہ علیحدہ چلائیں"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView کا نفاذ"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView کا نفاذ سیٹ کریں"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"یہ انتخاب اب درست نہیں رہا۔ دوبارہ کوشش کریں۔"</string> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index 6749cfd23cdd..6196179fb34f 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Faol. O‘zgartirish uchun bu yerga bosing."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Ishlab turgan ilovalar"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"WebView multiprocess’ni yoqish"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView renderlovchilarini alohida jarayonda ishga tushirish."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"Ko‘p jarayonli WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"WebView renderlovchilarini alohida ishga tushirish"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ta’minotchisi"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ta’minotchisini sozlash"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Bu variant endi yaroqsiz. Qaytadan urining."</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 8ffe7c85a74b..975aa58147b3 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Hiện hoạt. Nhấn để chuyển đổi."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Các dịch vụ đang hoạt động"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Xem và kiểm soát các dịch vụ hiện đang hoạt động"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Bật WebView đa quy trình"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Chạy kết xuất đồ họa WebView trong quy trình tách biệt."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"WebView đa quy trình"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Chạy riêng kết xuất đồ họa WebView"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Triển khai WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Đặt triển khai WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Lựa chọn này không còn hợp lệ nữa. Hãy thử lại."</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 96a9b54e8e14..b81c995c60e4 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"已启用。点按即可切换。"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"正在运行的服务"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"查看和控制当前正在运行的服务"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"启用多进程 WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"在独立进程中运行 WebView 渲染程序。"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"多进程 WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"单独运行 WebView 渲染程序"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 实现"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"设置 WebView 实现"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"此选项已失效,请重试。"</string> @@ -323,7 +323,7 @@ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"由管理员控制"</string> <string name="enabled_by_admin" msgid="2386503803463071894">"已被管理员启用"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"已被管理员禁用"</string> - <string name="home" msgid="3256884684164448244">"设置首页"</string> + <string name="home" msgid="3256884684164448244">"设置主屏幕"</string> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"还剩 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 4af73b3e8be6..3388c27fbf63 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"已啟用。輕按即可切換。"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"執行中的服務"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"查看並控制目前正在執行中的服務"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"啟用多重處理程序 WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"在獨立的處理程序中執行 WebView 轉譯器。"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"多重處理程序 WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"單獨執行 WebView 轉譯器"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 設置"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"設定 WebView 設置"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"此選擇已失效,請再試一次。"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 02f2a577120c..437e8995726b 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"已啟用。輕觸即可切換。"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"正在運作的服務"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"查看並管理目前正在執行的服務"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"啟用多重處理程序 WebView"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"在獨立的處理程序中執行 WebView 轉譯器。"</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"多重處理程序 WebView"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"個別執行 WebView 轉譯器"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 實作"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"設定 WebView 實作"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"這個選項已失效,請再試一次。"</string> @@ -323,7 +323,7 @@ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"已由管理員停用"</string> <string name="enabled_by_admin" msgid="2386503803463071894">"已由管理員啟用"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"已由管理員停用"</string> - <string name="home" msgid="3256884684164448244">"「設定」主畫面"</string> + <string name="home" msgid="3256884684164448244">"設定主畫面"</string> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"還剩 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index c5e7fabb38da..aa8ae4260427 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -275,8 +275,8 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Kuyasebenza. Thepha ukuze ushintshe."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Amasevisi asebenzayo"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Buka futhi ulawule amasevisi asebenzayo okwamanje"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"Nika amandla i-WebView kokucubungula okuningi"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Sebenzisa abasebenzeli be-WebView kwinqubo ekhethiwe."</string> + <string name="enable_webview_multiprocess" msgid="3352660896640797330">"I-WebView yokucubungula okuningi"</string> + <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Qalisa izinikezeli ze-WebView ngokuhlukile"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Ukufakwa ke-WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Sesba ukufakwa kwe-WebView"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Lokhu kukhetha akusavumelekile. Zama futhi."</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java index 3c32615d5b05..8e43bffbbfdc 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.content.pm.IPackageManager; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; -import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; @@ -74,45 +73,31 @@ public class RestrictedLockUtils { if (dpm == null) { return null; } - ComponentName deviceOwner = dpm.getDeviceOwnerComponentOnAnyUser(); - int deviceOwnerUserId = dpm.getDeviceOwnerUserId(); - boolean enforcedByDeviceOwner = false; - if (deviceOwner != null && deviceOwnerUserId != UserHandle.USER_NULL) { - Bundle enforcedRestrictions = - dpm.getUserRestrictionsForUser(deviceOwner, deviceOwnerUserId); - if (enforcedRestrictions != null - && enforcedRestrictions.getBoolean(userRestriction, false)) { - enforcedByDeviceOwner = true; - } - } - - ComponentName profileOwner = null; - boolean enforcedByProfileOwner = false; - if (userId != UserHandle.USER_NULL) { - profileOwner = dpm.getProfileOwnerAsUser(userId); - if (profileOwner != null) { - Bundle enforcedRestrictions = - dpm.getUserRestrictionsForUser(profileOwner, userId); - if (enforcedRestrictions != null - && enforcedRestrictions.getBoolean(userRestriction, false)) { - enforcedByProfileOwner = true; - } - } - } + UserManager um = UserManager.get(context); + int restrictionSource = um.getUserRestrictionSource(userRestriction, + UserHandle.of(userId)); - if (!enforcedByDeviceOwner && !enforcedByProfileOwner) { + // If the restriction is not enforced or enforced only by system then return null + if (restrictionSource == UserManager.RESTRICTION_NOT_SET + || restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) { return null; } - EnforcedAdmin admin = null; - if (enforcedByDeviceOwner && enforcedByProfileOwner) { - admin = new EnforcedAdmin(); + final boolean enforcedByProfileOwner = + (restrictionSource & UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) != 0; + final boolean enforcedByDeviceOwner = + (restrictionSource & UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) != 0; + if (enforcedByProfileOwner) { + return getProfileOwner(context, userId); } else if (enforcedByDeviceOwner) { - admin = new EnforcedAdmin(deviceOwner, deviceOwnerUserId); - } else { - admin = new EnforcedAdmin(profileOwner, userId); + // When the restriction is enforced by device owner, return the device owner admin only + // if the admin is for the {@param userId} otherwise return a default EnforcedAdmin. + final EnforcedAdmin deviceOwner = getDeviceOwner(context); + return deviceOwner.userId == userId + ? deviceOwner + : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN; } - return admin; + return null; } public static boolean hasBaseUserRestriction(Context context, @@ -479,6 +464,9 @@ public class RestrictedLockUtils { public static EnforcedAdmin checkIfMaximumTimeToLockIsSet(Context context) { final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( Context.DEVICE_POLICY_SERVICE); + if (dpm == null) { + return null; + } LockPatternUtils lockPatternUtils = new LockPatternUtils(context); EnforcedAdmin enforcedAdmin = null; final int userId = UserHandle.myUserId(); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java index 9c5abf3a00dd..26836099c9de 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java @@ -208,7 +208,7 @@ public final class LocalBluetoothAdapter { return false; } - public void setBluetoothEnabled(boolean enabled) { + public boolean setBluetoothEnabled(boolean enabled) { boolean success = enabled ? mAdapter.enable() : mAdapter.disable(); @@ -225,6 +225,7 @@ public final class LocalBluetoothAdapter { syncBluetoothState(); } + return success; } public BluetoothDevice getRemoteDevice(String address) { diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 4e9b59fe6b18..9c0aa35da9a4 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -111,6 +111,7 @@ <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> + <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> <!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) --> <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" /> diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index c1fe1a806d11..59952e09555f 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -38,5 +38,5 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" - android:pointerShape="crosshair"/> + android:pointerIcon="crosshair"/> </FrameLayout> diff --git a/packages/SystemUI/res/values-be-rBY/strings.xml b/packages/SystemUI/res/values-be-rBY/strings.xml index b650c22b0d4d..42994cf27839 100644 --- a/packages/SystemUI/res/values-be-rBY/strings.xml +++ b/packages/SystemUI/res/values-be-rBY/strings.xml @@ -98,7 +98,7 @@ <string name="voice_assist_label" msgid="3956854378310019854">"адкрыць галасавую дапамогу"</string> <string name="camera_label" msgid="7261107956054836961">"адкрыць камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберыце новы макет заданняў"</string> - <string name="cancel" msgid="6442560571259935130">"Адмяніць"</string> + <string name="cancel" msgid="6442560571259935130">"Скасаваць"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка сумяшчальнасці маштаба."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Маштабаванне малых элементаў для большага экрана."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-сувязь."</string> @@ -431,7 +431,7 @@ <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Схаваць"</string> <string name="volumeui_prompt_message" msgid="918680947433389110">"<xliff:g id="APP_NAME">%1$s</xliff:g> хоча быць дыялогам гучнасці."</string> <string name="volumeui_prompt_allow" msgid="7954396902482228786">"Дазволіць"</string> - <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Адхiлiць"</string> + <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Адмовіць"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> з\'яўляецца дыялогам гучнасці"</string> <string name="volumeui_notification_text" msgid="8819536904234337445">"Дакраніцеся, каб аднавіць арыгінал."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Вы выкарыстоўваеце свой працоўны профіль"</string> @@ -599,7 +599,7 @@ <string name="keycode" msgid="7335281375728356499">"Код клавішы"</string> <string name="keycode_description" msgid="1403795192716828949">"Кнопка Код клавішы дазваляе дадаваць клавішы ў Панэль навігацыі. Пры націску гэтай кнопкі эмулюецца выбраная клавіша. Спачатку трэба выбраць клавішу для кнопкі, а потым відарыс, які будзе паказвацца на кнопцы."</string> <string name="select_keycode" msgid="7413765103381924584">"Выберыце клавішу клавіятуры"</string> - <string name="preview" msgid="9077832302472282938">"Папярэдні прагляд"</string> + <string name="preview" msgid="9077832302472282938">"Перадпрагляд"</string> <string name="drag_to_add_tiles" msgid="7058945779098711293">"Перацягніце, каб дадаць пліткі"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Перацягніце сюды, каб выдаліць"</string> <string name="qs_edit" msgid="2232596095725105230">"Рэдагаваць"</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 2547a2e99341..70530301f0bf 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -43,12 +43,12 @@ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"চালু করুন"</string> <string name="battery_saver_start_action" msgid="5576697451677486320">"ব্যাটারি সঞ্চয়কারী চালু"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"সেটিংস"</string> - <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> + <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ওয়াই-ফাই"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"স্বতঃ-ঘূর্ণায়মান স্ক্রীণ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"নিঃশব্দ করুন"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"স্বতঃ"</string> <string name="status_bar_settings_notifications" msgid="397146176280905137">"বিজ্ঞপ্তিগুলি"</string> - <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth টিথার করা হয়েছে"</string> + <string name="bluetooth_tethered" msgid="7094101612161133267">"ব্লুটুথ টিথার করা হয়েছে"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ইনপুট পদ্ধতিগুলি সেট আপ করুন"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ফিজিক্যাল কীবোর্ড"</string> <string name="usb_device_permission_prompt" msgid="834698001271562057">"এই <xliff:g id="APPLICATION">%1$s</xliff:g> অ্যাপ্লিকেশানটিকে কি USB ডিভাইস অ্যাক্সেস করা মঞ্জুরি দেবেন?"</string> @@ -99,8 +99,8 @@ <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"সামঞ্জস্যের জুম বোতাম৷"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ছোট থেকে বৃহৎ স্ক্রীণে জুম করুন৷"</string> - <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth সংযুক্ত হয়েছে৷"</string> - <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth সংযোগ বিচ্ছিন্ন হয়েছে৷"</string> + <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string> + <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ব্লুটুথ সংযোগ বিচ্ছিন্ন হয়েছে৷"</string> <string name="accessibility_no_battery" msgid="358343022352820946">"কোনো ব্যাটারি নেই৷"</string> <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"এক দন্ড ব্যাটারি রয়েছে৷"</string> <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"দুই দন্ড ব্যাটারি রয়েছে৷"</string> @@ -147,12 +147,12 @@ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string> <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"রোমিং"</string> <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string> - <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string> + <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ওয়াই-ফাই"</string> <string name="accessibility_no_sim" msgid="8274017118472455155">"কোনো সিম নেই৷"</string> <string name="accessibility_cell_data" msgid="7080312242791850520">"সেলুলার ডেটা"</string> <string name="accessibility_cell_data_on" msgid="4310018593519761767">"সেলুলার ডেটা চালু রয়েছে"</string> <string name="accessibility_cell_data_off" msgid="8000803571751407635">"সেলুলার ডেটা বন্ধ আছে"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth টিথারিং৷"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টিথারিং৷"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"বিমান মোড৷"</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"কোনো SIM কার্ড নেই।"</string> <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তিত হচ্ছে।"</string> @@ -200,13 +200,13 @@ <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"“বিরক্ত করবেন না” বন্ধ৷"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"বিরক্ত করবেন না বন্ধ রয়েছে৷"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"বিরক্ত করবেন না চালু রয়েছে৷"</string> - <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"Bluetooth"</string> - <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth বন্ধ আছে।"</string> - <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth চালু আছে।"</string> - <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"Bluetooth সংযুক্ত হচ্ছে।"</string> - <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth সংযুক্ত হয়েছে৷"</string> - <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"Bluetooth বন্ধ হয়েছে।"</string> - <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"Bluetooth চালু হয়েছে।"</string> + <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"ব্লুটুথ"</string> + <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ব্লুটুথ বন্ধ আছে।"</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ব্লুটুথ চালু আছে।"</string> + <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ব্লুটুথ সংযুক্ত হচ্ছে।"</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string> + <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ব্লুটুথ বন্ধ হয়েছে।"</string> + <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ব্লুটুথ চালু হয়েছে।"</string> <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"অবস্থানের প্রতিবেদন বন্ধ আছে।"</string> <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"অবস্থানের প্রতিবেদন চালু আছে।"</string> <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"অবস্থানের প্রতিবেদন বন্ধ হয়েছে।"</string> @@ -239,7 +239,7 @@ <string name="data_usage_disabled_dialog" msgid="8453242888903772524">"আপনার সেট ডেটার সীমা অবধি পৌঁছনোর কারনে ডিভাইস এই চক্রের অবশিষ্টাংশের জন্য ডেটা ব্যবহারে বিরতি দেওয়া হয়েছে৷ \n\nপুনরায় চালু করা হলে পরিষেবা প্রদানকারীর দ্বারা চার্জের করা হতে পারে৷"</string> <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"পুনঃসূচনা করুন"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"কোনো ইন্টারনেট সংযোগ নেই"</string> - <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi সংযুক্ত হয়েছে"</string> + <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ওয়াই-ফাই সংযুক্ত হয়েছে"</string> <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS এর জন্য অনুসন্ধান করা হচ্ছে"</string> <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS এর দ্বারা সেট করা অবস্থান"</string> <string name="accessibility_location_active" msgid="2427290146138169014">"অবস্থান অনুরোধ সক্রিয় রয়েছে"</string> @@ -260,9 +260,9 @@ <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"শুধুমাত্র অ্যালার্মগুলি"</string> <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"একদম নিরব"</string> - <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> - <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> টি ডিভাইস)"</string> - <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth বন্ধ"</string> + <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ব্লুটুথ"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ব্লুটুথ (<xliff:g id="NUMBER">%d</xliff:g> টি ডিভাইস)"</string> + <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ব্লুটুথ বন্ধ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"যুক্ত করা কোন ডিভাইস উপলব্ধ নয়"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বতঃ ঘূর্ণায়মান"</string> @@ -282,12 +282,12 @@ <string name="quick_settings_user_label" msgid="5238995632130897840">"আমাকে"</string> <string name="quick_settings_user_title" msgid="4467690427642392403">"ব্যবহারকারী"</string> <string name="quick_settings_user_new_user" msgid="9030521362023479778">"নতুন ব্যবহারকারী"</string> - <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string> + <string name="quick_settings_wifi_label" msgid="9135344704899546041">"ওয়াই-ফাই"</string> <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"সংযুক্ত নয়"</string> <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"কোনো নেটওয়ার্ক নেই"</string> - <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi বন্ধ"</string> - <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi চালু আছে"</string> - <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো Wi-Fi নেটওয়ার্ক উপলব্ধ নেই"</string> + <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ওয়াই-ফাই বন্ধ"</string> + <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string> + <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাস্ট করুন"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string> @@ -472,8 +472,8 @@ <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"উপরের দিকে সোয়াইপ করে বিভক্ত-স্ক্রীনে প্রবেশ করার অঙ্গভঙ্গি সক্ষম করুন"</string> <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"\'এক নজরে\' বোতাম থেকে উপরের দিকে সোয়াইপ করে, বিভক্ত-স্ক্রীনে প্রবেশ করতে অঙ্গভঙ্গি সক্ষম করুন"</string> <string name="experimental" msgid="6198182315536726162">"পরীক্ষামূলক"</string> - <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth চালু করবেন?"</string> - <string name="enable_bluetooth_message" msgid="9106595990708985385">"আপনার ট্যাবলেটের সাথে আপনার কীবোর্ড সংযুক্ত করতে, আপনাকে প্রথমে Bluetooth চালু করতে হবে।"</string> + <string name="enable_bluetooth_title" msgid="5027037706500635269">"ব্লুটুথ চালু করবেন?"</string> + <string name="enable_bluetooth_message" msgid="9106595990708985385">"আপনার ট্যাবলেটের সাথে আপনার কীবোর্ড সংযুক্ত করতে, আপনাকে প্রথমে ব্লুটুথ চালু করতে হবে।"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"চালু করুন"</string> <string name="show_silently" msgid="6841966539811264192">"নীরবভাবে বিজ্ঞপ্তিগুলি দেখায়"</string> <string name="block" msgid="2734508760962682611">"সমস্ত বিজ্ঞপ্তি অবরুদ্ধ করুন"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index f836a99563a4..166282a770b8 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -302,7 +302,7 @@ <string name="quick_settings_connected" msgid="1722253542984847487">"Connectat"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"S\'està connectant..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoratge a xarxa"</string> - <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> + <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Punt d\'accés Wi-Fi"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificacions"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Llanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"Dades mòbils"</string> @@ -455,7 +455,7 @@ <string name="alarm_template" msgid="3980063409350522735">"Hora: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="alarm_template_far" msgid="4242179982586714810">"Dia: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuració ràpida, <xliff:g id="TITLE">%s</xliff:g>."</string> - <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona Wi-Fi"</string> + <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Punt d\'accés Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil professional"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Diversió per a uns quants, però no per a tothom"</string> <string name="tuner_warning" msgid="8730648121973575701">"El Personalitzador d\'interfície d\'usuari presenta opcions addicionals per canviar i personalitzar la interfície d\'usuari d\'Android. És possible que aquestes funcions experimentals canviïn, deixin de funcionar o desapareguin en versions futures. Continua amb precaució."</string> @@ -584,7 +584,7 @@ <string name="select_button" msgid="1597989540662710653">"Tria un botó per afegir-lo"</string> <string name="add_button" msgid="4134946063432258161">"Afegeix un botó"</string> <string name="save" msgid="2311877285724540644">"Desa"</string> - <string name="reset" msgid="2448168080964209908">"Reinicia"</string> + <string name="reset" msgid="2448168080964209908">"Restableix"</string> <string name="no_home_title" msgid="1563808595146071549">"No s\'ha trobat cap botó d\'inici"</string> <string name="no_home_message" msgid="5408485011659260911">"Per poder navegar per aquest dispositiu, cal un botó d\'inici. Afegeix-ne un abans de desar."</string> <string name="adjust_button_width" msgid="6138616087197632947">"Ajusta l\'amplada del botó"</string> @@ -595,7 +595,7 @@ <string name="keycode_description" msgid="1403795192716828949">"Amb els botons de codi de tecla es poden afegir tecles del teclat a la barra de navegació. En prémer aquests botons es duen a terme les mateixes accions que quan es prem la tecla corresponent. Primer cal seleccionar la tecla del botó i, a continuació, triar la imatge que es mostrarà."</string> <string name="select_keycode" msgid="7413765103381924584">"Selecciona un botó de teclat"</string> <string name="preview" msgid="9077832302472282938">"Previsualització"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrossega per afegir camps"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrossega per afegir funcions"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrossega\'ls aquí per suprimir-los"</string> <string name="qs_edit" msgid="2232596095725105230">"Edita"</string> <string name="tuner_time" msgid="6572217313285536011">"Hora"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 039be4e152f3..2f1db1b659e1 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -600,7 +600,7 @@ <string name="select_keycode" msgid="7413765103381924584">"Vyberte klávesu na klávesnici"</string> <string name="preview" msgid="9077832302472282938">"Náhled"</string> <string name="drag_to_add_tiles" msgid="7058945779098711293">"Dlaždice přidáte přetažením"</string> - <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Přetažením sem tituly odstraníte"</string> + <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Přetažením sem dlaždice odstraníte"</string> <string name="qs_edit" msgid="2232596095725105230">"Upravit"</string> <string name="tuner_time" msgid="6572217313285536011">"Čas"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index b9c04b80b4b3..7d3ca4fcfa5b 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -316,7 +316,7 @@ <string name="recents_empty_message" msgid="808480104164008572">"Ingen nye elementer"</string> <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Du har ryddet alt"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Oplysninger om applikationen"</string> - <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"bliv i app"</string> + <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skærmfastholdelse"</string> <string name="recents_search_bar_label" msgid="8074997400187836677">"søg"</string> <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> kunne ikke startes."</string> <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er deaktiveret i sikker tilstand."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 3527fe9d98f4..da7d87294177 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -24,7 +24,7 @@ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string> <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí aparecerán tus pantallas recientes"</string> - <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicaciones recientes"</string> + <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Descartar aplicaciones recientes"</string> <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> <item quantity="other">%d pantallas en Visión general</item> <item quantity="one">1 pantalla en Visión general</item> @@ -172,7 +172,7 @@ <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> <string name="accessibility_work_mode" msgid="2478631941714607225">"Modo de trabajo"</string> - <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignorar <xliff:g id="APP">%s</xliff:g>."</string> + <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Se ha eliminado <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se han ignorado todas las aplicaciones recientes."</string> <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre la información de la aplicación <xliff:g id="APP">%s</xliff:g>."</string> @@ -311,11 +311,11 @@ <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Uso de datos"</string> <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Datos restantes"</string> <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Límite superado"</string> - <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizado"</string> + <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> usado"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Modo de trabajo"</string> - <string name="recents_empty_message" msgid="808480104164008572">"Ningún elemento reciente"</string> + <string name="recents_empty_message" msgid="808480104164008572">"No hay elementos recientes"</string> <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Has rechazado todo"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fijación de pantalla"</string> @@ -572,9 +572,9 @@ <string name="headset" msgid="4534219457597457353">"Auriculares"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auriculares conectados"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auriculares conectados"</string> - <string name="data_saver" msgid="5037565123367048522">"Economizador de datos"</string> - <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Economizador de datos activado"</string> - <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Economizador de datos desactivado"</string> + <string name="data_saver" msgid="5037565123367048522">"Economizador de Datos"</string> + <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Economizador de Datos activado"</string> + <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Economizador de Datos desactivado"</string> <string name="switch_bar_on" msgid="1142437840752794229">"Sí"</string> <string name="switch_bar_off" msgid="8803270596930432874">"No"</string> <string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string> @@ -597,9 +597,9 @@ <string name="keycode_description" msgid="1403795192716828949">"Con los botones del código de teclado puedes añadir teclas a la barra de navegación que, al pulsarlas, emulan la tecla seleccionada. Primero debes seleccionar la tecla para el botón y, a continuación, la imagen que se va a mostrar en él."</string> <string name="select_keycode" msgid="7413765103381924584">"Selecciona un botón de teclado"</string> <string name="preview" msgid="9077832302472282938">"Vista previa"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastrar para añadir mosaicos"</string> - <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastrar aquí para eliminar"</string> - <string name="qs_edit" msgid="2232596095725105230">"Cambiar"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastra para añadir funciones"</string> + <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra aquí para quitar una función"</string> + <string name="qs_edit" msgid="2232596095725105230">"Editar"</string> <string name="tuner_time" msgid="6572217313285536011">"Hora"</string> <string-array name="clock_options"> <item msgid="5965318737560463480">"Mostrar horas, minutos y segundos"</item> diff --git a/packages/SystemUI/res/values-es/strings_tv.xml b/packages/SystemUI/res/values-es/strings_tv.xml index 35153d416423..32b3b8c59473 100644 --- a/packages/SystemUI/res/values-es/strings_tv.xml +++ b/packages/SystemUI/res/values-es/strings_tv.xml @@ -27,5 +27,5 @@ <string name="pip_onboarding_title" msgid="7850436557670253991">"Imagen en imagen"</string> <string name="pip_onboarding_description" msgid="4028124563309465267">"El vídeo estará visible hasta que reproduzcas otro. Mantén pulsado el botón "<b>"INICIO"</b>" para controlarlo."</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Entendido"</string> - <string name="recents_tv_dismiss" msgid="3555093879593377731">"Ignorar"</string> + <string name="recents_tv_dismiss" msgid="3555093879593377731">"Descartar"</string> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 7b5aa6fc1824..72cd8179fe19 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -231,8 +231,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Töörežiim on sees."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Töörežiim on välja lülitatud."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Töörežiim on sisse lülitatud."</string> - <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Andmemahu säästja on välja lülitatud."</string> - <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Andmemahu säästja on sisse lülitatud."</string> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Andmeside mahu säästja on välja lülitatud."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Andmeside mahu säästja on sisse lülitatud."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekraani heledus"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G andmekasutus on peatatud"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G andmekasutus on peatatud"</string> @@ -572,9 +572,9 @@ <string name="headset" msgid="4534219457597457353">"Peakomplekt"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Kõrvaklapid on ühendatud"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Peakomplekt on ühendatud"</string> - <string name="data_saver" msgid="5037565123367048522">"Andmemahu säästja"</string> - <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Andmemahu säästja on sisse lülitatud"</string> - <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Andmemahu säästja on välja lülitatud"</string> + <string name="data_saver" msgid="5037565123367048522">"Andmeside mahu säästja"</string> + <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Andmeside mahu säästja on sisse lülitatud"</string> + <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Andmeside mahu säästja on välja lülitatud"</string> <string name="switch_bar_on" msgid="1142437840752794229">"Sees"</string> <string name="switch_bar_off" msgid="8803270596930432874">"Väljas"</string> <string name="nav_bar" msgid="1993221402773877607">"Navigeerimisriba"</string> @@ -599,7 +599,7 @@ <string name="preview" msgid="9077832302472282938">"Eelvaade"</string> <string name="drag_to_add_tiles" msgid="7058945779098711293">"Lohistage paanide lisamiseks"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Lohistage eemaldamiseks siia"</string> - <string name="qs_edit" msgid="2232596095725105230">"Muuda"</string> + <string name="qs_edit" msgid="2232596095725105230">"Muutmine"</string> <string name="tuner_time" msgid="6572217313285536011">"Kellaaeg"</string> <string-array name="clock_options"> <item msgid="5965318737560463480">"Kuva tunnid, minutid ja sekundid"</item> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 5e7e661b2cc5..732abb3d60c0 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -597,7 +597,7 @@ <string name="keycode_description" msgid="1403795192716828949">"Les boutons de codes de touche permettent d\'ajouter des touches du clavier à la barre de navigation. Lorsque vous appuyez sur l\'un de ces boutons, il reproduit la fonction du clavier correspondante. Vous devez d\'abord sélectionner la touche pour le bouton, puis l\'image à afficher sur celui-ci."</string> <string name="select_keycode" msgid="7413765103381924584">"Sélectionnez la touche du clavier"</string> <string name="preview" msgid="9077832302472282938">"Aperçu"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Faites glisser des tuiles ici pour les ajouter"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Faites glisser des tuiles pour les ajouter"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Faites glisser les tuiles ici pour les supprimer"</string> <string name="qs_edit" msgid="2232596095725105230">"Modifier"</string> <string name="tuner_time" msgid="6572217313285536011">"Heure"</string> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 753e78476762..e405db4d2bba 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -22,7 +22,7 @@ <string name="app_label" msgid="7164937344850004466">"સિસ્ટમ UI"</string> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"સાફ કરો"</string> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"સૂચિમાંથી દૂર કરો"</string> - <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"એપ્લિકેશન માહિતી"</string> + <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ઍપ્લિકેશન માહિતી"</string> <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"તમારી તાજેતરની સ્ક્રીન્સ અહીં દેખાય છે"</string> <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"તાજેતરની એપ્લિકેશનો કાઢી નાખો."</string> <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> @@ -79,7 +79,7 @@ <string name="usb_preference_title" msgid="6551050377388882787">"USB ફાઇલ ટ્રાન્સફર વિકલ્પો"</string> <string name="use_mtp_button_title" msgid="4333504413563023626">"મીડિયા પ્લેયર તરીકે માઉન્ટ કરો (MTP)"</string> <string name="use_ptp_button_title" msgid="7517127540301625751">"કૅમેરા તરીકે માઉન્ટ કરો (PTP)"</string> - <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac માટે Android ફાઇલ ટ્રાન્સફર એપ્લિકેશન ઇન્સ્ટોલ કરો"</string> + <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac માટે Android ફાઇલ ટ્રાન્સફર ઍપ્લિકેશન ઇન્સ્ટોલ કરો"</string> <string name="accessibility_back" msgid="567011538994429120">"પાછળ"</string> <string name="accessibility_home" msgid="8217216074895377641">"હોમ"</string> <string name="accessibility_menu" msgid="316839303324695949">"મેનુ"</string> @@ -279,7 +279,7 @@ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ફક્ત કટોકટીના કૉલ્સ"</string> <string name="quick_settings_settings_label" msgid="5326556592578065401">"સેટિંગ્સ"</string> <string name="quick_settings_time_label" msgid="4635969182239736408">"સમય"</string> - <string name="quick_settings_user_label" msgid="5238995632130897840">"મારા"</string> + <string name="quick_settings_user_label" msgid="5238995632130897840">"હું"</string> <string name="quick_settings_user_title" msgid="4467690427642392403">"વપરાશકર્તા"</string> <string name="quick_settings_user_new_user" msgid="9030521362023479778">"નવો વપરાશકર્તા"</string> <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string> @@ -315,7 +315,7 @@ <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"કાર્ય મોડ"</string> <string name="recents_empty_message" msgid="808480104164008572">"કોઇ તાજેતરની આઇટમ્સ નથી"</string> <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"તમે બધું સાફ કર્યું"</string> - <string name="recents_app_info_button_label" msgid="2890317189376000030">"એપ્લિકેશન માહિતી"</string> + <string name="recents_app_info_button_label" msgid="2890317189376000030">"ઍપ્લિકેશન માહિતી"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"સ્ક્રીન પિનિંગ"</string> <string name="recents_search_bar_label" msgid="8074997400187836677">"શોધ"</string> <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> પ્રારંભ કરી શકાયું નથી."</string> @@ -381,7 +381,7 @@ <string name="user_add_user_title" msgid="4553596395824132638">"નવા વપરાશકર્તાને ઉમેરીએ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે."</string> <string name="user_remove_user_title" msgid="4681256956076895559">"વપરાશકર્તાને દૂર કરીએ?"</string> - <string name="user_remove_user_message" msgid="1453218013959498039">"આ વપરાશકર્તાની તમામ એપ્લિકેશન્સ અને ડેટા કાઢી નાખવામાં આવશે."</string> + <string name="user_remove_user_message" msgid="1453218013959498039">"આ વપરાશકર્તાની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"દૂર કરો"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"બેટરી સેવર ચાલુ છે"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"પ્રદર્શન અને પૃષ્ઠભૂમિ ડેટા ઘટાડે છે"</string> @@ -400,7 +400,7 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN અક્ષમ કરો"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ડિસ્કનેક્ટ કરો"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, એપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે. વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> - <string name="monitoring_description_vpn" msgid="4445150119515393526">"તમે VPN કનેક્શન સેટ કરવા માટે એપ્લિકેશન પરવાનગી આપી.\n\nઆ એપ્લિકેશન ઇમેઇલ્સ, એપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારા ઉપકરણ અને નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="monitoring_description_vpn" msgid="4445150119515393526">"તમે VPN કનેક્શન સેટ કરવા માટે ઍપ્લિકેશન પરવાનગી આપી.\n\nઆ ઍપ્લિકેશન ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારા ઉપકરણ અને નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, એપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે.\n\nતમે VPN સાથે કનેક્ટ થયેલા છો જે ઇમેઇલ્સ, એપ્લિકેશનો અને વેબસાઇટ્સ સહિતની, તમારી નેટવર્ક પ્રવૃત્તિ મોનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક ઇમેઇલ્સ, એપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરવામાં સમર્થ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ છો, જે તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> @@ -465,7 +465,7 @@ <string name="tuner_toast" msgid="603429811084428439">"અભિનંદન! સિસ્ટમ UI ટ્યૂનરને સેટિંગ્સમાં ઉમેરવામાં આવ્યું છે"</string> <string name="remove_from_settings" msgid="8389591916603406378">"સેટિંગ્સમાંથી દૂર કરો"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"સેટિંગ્સમાંથી સિસ્ટમ UI ટ્યૂનર દૂર કરી અને તેની તમામ સુવિધાઓનો ઉપયોગ કરવાનું બંધ કરીએ?"</string> - <string name="activity_not_found" msgid="348423244327799974">"તમારા ઉપકરણ પર એપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી"</string> + <string name="activity_not_found" msgid="348423244327799974">"તમારા ઉપકરણ પર ઍપ્લિકેશન ઇન્સ્ટોલ થયેલ નથી"</string> <string name="clock_seconds" msgid="7689554147579179507">"ઘડિયાળ સેકન્ડ બતાવો"</string> <string name="clock_seconds_desc" msgid="6282693067130470675">"ઘડિયાળ સેકન્ડ સ્થિતિ બારમાં બતાવો. બૅટરીની આવરદા પર અસર કરી શકે છે."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ઝડપી સેટિંગ્સને ફરીથી ગોઠવો"</string> @@ -515,7 +515,7 @@ <string name="night_mode_disclaimer" msgid="598914896926759578">"ઘાટી થીમને Android OS ના મુખ્ય ક્ષેત્રો પર લાગુ કરે છે જે સામાન્ય રીતે સેટિંગ્સ જેવી લાઇટ થીમમાં પ્રદર્શિત કરવામાં આવે છે."</string> <string name="color_apply" msgid="9212602012641034283">"લાગુ કરો"</string> <string name="color_revert_title" msgid="4746666545480534663">"સેટિંગ્સની પુષ્ટિ કરો"</string> - <string name="color_revert_message" msgid="9116001069397996691">"કેટલીક રંગ સેટિંગ્સ આ ઉપકરણને બિનઉપયોગી બનાવી શકે છે. આ રંગ સેટિંગ્સની પુષ્ટિ કરવા માટે ઑકે ક્લિક કરો, અન્યથા 10 સેકંડ પછી આ સેટિંગ્સ ફરીથી સેટ થશે."</string> + <string name="color_revert_message" msgid="9116001069397996691">"કેટલીક રંગ સેટિંગ્સ આ ઉપકરણને બિનઉપયોગી બનાવી શકે છે. આ રંગ સેટિંગ્સની પુષ્ટિ કરવા માટે ઓકે ક્લિક કરો, અન્યથા 10 સેકંડ પછી આ સેટિંગ્સ ફરીથી સેટ થશે."</string> <string name="battery_panel_title" msgid="7944156115535366613">"બૅટરી વપરાશ"</string> <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ચાર્જિંગ દરમિયાન બૅટરી બચતકર્તા ઉપલબ્ધ નથી"</string> <string name="battery_detail_switch_title" msgid="6285872470260795421">"બૅટરી બચતકર્તા"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 384d1257a38c..699294039198 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -61,7 +61,7 @@ <string name="label_view" msgid="6304565553218192990">"Prikaži"</string> <string name="always_use_device" msgid="1450287437017315906">"Koristi se prema zadanim postavkama za ovaj USB uređaj"</string> <string name="always_use_accessory" msgid="1210954576979621596">"Koristi se prema zadanim postavkama za ovaj USB pribor"</string> - <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti uklanjanje pogrešaka putem USB-a?"</string> + <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje pogrešaka putem USB-a?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Otisak prsta RSA ključa računala je: \n <xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog računala"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string> @@ -296,7 +296,7 @@ <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Nema dostupnih uređaja"</string> <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svjetlina"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATSKI"</string> - <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Preokreni boje"</string> + <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Zamijeni boje"</string> <string name="quick_settings_color_space_label" msgid="853443689745584770">"Način korekcije boje"</string> <string name="quick_settings_more_settings" msgid="326112621462813682">"Više postavki"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Gotovo"</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 8c92ab1f8b41..b7a333b0e832 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -51,8 +51,8 @@ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-ը կապված է"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Կարգավորել մուտքագրման եղանակները"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Ֆիզիկական ստեղնաշար"</string> - <string name="usb_device_permission_prompt" msgid="834698001271562057">"Թույլատրե՞լ <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածի մուտքը USB սարք:"</string> - <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Թույլատրե՞լ, որ <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածը մուտք գործի USB լրասարք:"</string> + <string name="usb_device_permission_prompt" msgid="834698001271562057">"Թույլատրե՞լ <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին օգտագործել USB սարքը։"</string> + <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Թույլատրե՞լ, <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին օգտագործել USB սարքը։"</string> <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Բացե՞լ <xliff:g id="ACTIVITY">%1$s</xliff:g>-ը, երբ այս USB կրիչը կապակցված է:"</string> <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Բացե՞լ <xliff:g id="ACTIVITY">%1$s</xliff:g>-ը, երբ այս USB լրասարքը կապակցված է:"</string> <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Այս USB լրասարքի հետ ոչ մի հավելված չի աշխատում: Իմացեք ավելին այս լրասարքի մասին <xliff:g id="URL">%1$s</xliff:g>-ում"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index e5229501fd1a..f352d50ca3d0 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -597,8 +597,8 @@ <string name="keycode_description" msgid="1403795192716828949">"I pulsanti keycode consentono di aggiungere tasti della tastiera alla barra di navigazione. Quando vengono premuti, emulano il tasto selezionato. Innanzitutto è necessario selezionare il tasto da associare al pulsante, poi un\'immagine da mostrare sul pulsante."</string> <string name="select_keycode" msgid="7413765103381924584">"Seleziona il tasto della tastiera"</string> <string name="preview" msgid="9077832302472282938">"Anteprima"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Trascina per aggiungere i riquadri"</string> - <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Trascinali qui per rimuoverli"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Trascina per aggiungere le funzioni"</string> + <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Trascina qui per rimuovere"</string> <string name="qs_edit" msgid="2232596095725105230">"Modifica"</string> <string name="tuner_time" msgid="6572217313285536011">"Ora"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 5485b5da5804..1c295e6dc32f 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -378,7 +378,7 @@ <string name="user_logout_notification_text" msgid="3350262809611876284">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ಔಟ್ ಮಾಡಿ"</string> <string name="user_logout_notification_action" msgid="1195428991423425062">"ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ಔಟ್ ಮಾಡಿ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string> - <string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನವೀಕರಿಸಬಹುದು."</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."</string> <string name="user_remove_user_title" msgid="4681256956076895559">"ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"ಈ ಬಳಕೆದಾರರ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುವುದು."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"ತೆಗೆದುಹಾಕಿ"</string> @@ -570,9 +570,9 @@ <string name="headset" msgid="4534219457597457353">"ಹೆಡ್ಸೆಟ್"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"ಹೆಡ್ಫೋನ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"ಹೆಡ್ಸೆಟ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> - <string name="data_saver" msgid="5037565123367048522">"ಡೇಟಾ ಉಳಿಸುವಿಕೆ"</string> - <string name="accessibility_data_saver_on" msgid="8454111686783887148">"ಡೇಟಾ ಉಳಿಸುವಿಕೆ ಆನ್ ಆಗಿದೆ"</string> - <string name="accessibility_data_saver_off" msgid="8841582529453005337">"ಡೇಟಾ ಉಳಿಸುವಿಕೆ ಆಫ್ ಆಗಿದೆ"</string> + <string name="data_saver" msgid="5037565123367048522">"ಡೇಟಾ ಸೇವರ್"</string> + <string name="accessibility_data_saver_on" msgid="8454111686783887148">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಆಗಿದೆ"</string> + <string name="accessibility_data_saver_off" msgid="8841582529453005337">"ಡೇಟಾ ಸೇವರ್ ಆಫ್ ಆಗಿದೆ"</string> <string name="switch_bar_on" msgid="1142437840752794229">"ಆನ್"</string> <string name="switch_bar_off" msgid="8803270596930432874">"ಆಫ್"</string> <string name="nav_bar" msgid="1993221402773877607">"ನ್ಯಾವಿಗೇಷನ್ ಬಾರ್"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 5d9743c4c11e..9eba95604edb 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -231,8 +231,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"작업 모드가 사용 설정되었습니다."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"작업 모드가 사용 중지되었습니다."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"작업 모드가 사용 설정되었습니다."</string> - <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"데이터 세이버를 사용 중지했습니다."</string> - <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"데이터 세이버를 사용 설정했습니다."</string> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"데이터 절약 모드를 사용 중지했습니다."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"데이터 절약 모드를 사용 설정했습니다."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"디스플레이 밝기"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 데이터 사용 중지됨"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 데이터 사용 중지됨"</string> @@ -572,9 +572,9 @@ <string name="headset" msgid="4534219457597457353">"헤드셋"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"헤드폰 연결됨"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"헤드셋 연결됨"</string> - <string name="data_saver" msgid="5037565123367048522">"데이터 세이버"</string> - <string name="accessibility_data_saver_on" msgid="8454111686783887148">"데이터 세이버 사용"</string> - <string name="accessibility_data_saver_off" msgid="8841582529453005337">"데이터 세이버 사용 안함"</string> + <string name="data_saver" msgid="5037565123367048522">"데이터 절약 모드"</string> + <string name="accessibility_data_saver_on" msgid="8454111686783887148">"데이터 절약 모드 사용"</string> + <string name="accessibility_data_saver_off" msgid="8841582529453005337">"데이터 절약 모드 사용 안함"</string> <string name="switch_bar_on" msgid="1142437840752794229">"사용"</string> <string name="switch_bar_off" msgid="8803270596930432874">"사용 안함"</string> <string name="nav_bar" msgid="1993221402773877607">"탐색 메뉴"</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index c0e15207ebb2..4fd8485eff0c 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -23,7 +23,7 @@ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ລຶບ"</string> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ເອົາອອກຈາກລາຍການ"</string> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ຂໍ້ມູນແອັບຯ"</string> - <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string> + <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ໜ້າຈໍຫຼ້າສຸດຂອງທ່ານຈະປາກົດຢູ່ບ່ອນນີ້"</string> <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ປິດແອັບຯຫຼ້າສຸດທີ່ໃຊ້"</string> <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> <item quantity="other">%d ໜ້າຈໍຢູ່ໃນພາບລວມ</item> @@ -359,7 +359,7 @@ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ປ່ຽນຜູ່ໃຊ້, ຜູ່ໃຊ້ປະຈຸບັນ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"ຜູ້ໃຊ້ປະຈຸບັນ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ສະແດງໂປຣໄຟລ໌"</string> - <string name="user_add_user" msgid="5110251524486079492">"ເພີ່ມຜູ່ໃຊ້"</string> + <string name="user_add_user" msgid="5110251524486079492">"ເພີ່ມຜູ້ໃຊ້"</string> <string name="user_new_user_name" msgid="426540612051178753">"ຜູ່ໃຊ້ໃໝ່"</string> <string name="guest_nickname" msgid="8059989128963789678">"ແຂກ"</string> <string name="guest_new_guest" msgid="600537543078847803">"ເພີ່ມແຂກ"</string> @@ -378,7 +378,7 @@ <string name="user_logout_notification_text" msgid="3350262809611876284">"ອອກຈາກຜູ້ໃຊ້ປະຈຸບັນ"</string> <string name="user_logout_notification_action" msgid="1195428991423425062">"ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ເພີ່ມຜູ່ໃຊ້ໃໝ່ບໍ?"</string> - <string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ່ໃຊ້ໃໝ່, ຜູ່ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ່ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ່ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ຜູ້ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ້ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ້ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string> <string name="user_remove_user_title" msgid="4681256956076895559">"ລຶບຜູ້ໃຊ້ອອກບໍ?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"ທຸກແອັບ ແລະ ຂໍ້ມູນຂອງຜູ້ໃຊ້ນີ້ຈະຖືກລຶບ."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"ເອົາອອກ"</string> @@ -595,7 +595,7 @@ <string name="keycode_description" msgid="1403795192716828949">"ປຸ່ມ Keycode ອະນຸຍາດໃຫ້ເພີ່ມປຸ່ມແປ້ນພິມໃສ່ແຖບການນຳທາງ. ເມື່ອກົດແລ້ວພວກມັນຈະຮຽນແບບປຸ່ມແປ້ນພິມທີ່ເລືອກ. ທຳອິດຕ້ອງເລືອກປຸ່ມແປ້ນພິມສຳລັບປຸ່ມນັ້ນ, ຕາມດ້ວຍຮູບທີ່ຈະປາກົດຂຶ້ນເທິງປຸ່ມນັ້ນ."</string> <string name="select_keycode" msgid="7413765103381924584">"ເລືອກປຸ່ມແປ້ນພິມ"</string> <string name="preview" msgid="9077832302472282938">"ສະແດງຕົວຢ່າງ"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"ລາກເພື່ອເພີ່ມໄທລ໌"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"ລາກເພື່ອເພີ່ມໄອຄອນ"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"ລາກມາບ່ອນນີ້ເພື່ອລຶບອອກ"</string> <string name="qs_edit" msgid="2232596095725105230">"ແກ້ໄຂ"</string> <string name="tuner_time" msgid="6572217313285536011">"ເວລາ"</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index b8320821f3bf..af1bab183006 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -38,11 +38,11 @@ <string name="invalid_charger" msgid="4549105996740522523">"USB ചാർജ്ജുചെയ്യൽ പിന്തുണയ്ക്കുന്നില്ല.\nഅതിന്റെ അനുബന്ധ ചാർജ്ജർ മാത്രം ഉപയോഗിക്കുക."</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB ചാർജ്ജുചെയ്യൽ പിന്തുണച്ചില്ല."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"വിതരണം ചെയ്ത ചാർജ്ജർ മാത്രം ഉപയോഗിക്കുക."</string> - <string name="battery_low_why" msgid="4553600287639198111">"ക്രമീകരണങ്ങൾ"</string> + <string name="battery_low_why" msgid="4553600287639198111">"ക്രമീകരണം"</string> <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ബാറ്ററി സേവർ ഓണാക്കണോ?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ഓൺ ചെയ്യുക"</string> <string name="battery_saver_start_action" msgid="5576697451677486320">"ബാറ്ററി സേവർ ഓണാക്കുക"</string> - <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ക്രമീകരണങ്ങൾ"</string> + <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ക്രമീകരണം"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"വൈഫൈ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"സ്ക്രീൻ സ്വയമേതിരിക്കുക"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"മ്യൂട്ടുചെയ്യുക"</string> @@ -180,7 +180,7 @@ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"അറിയിപ്പ് ഷെയ്ഡ്."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ദ്രുത ക്രമീകരണങ്ങൾ."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ലോക്ക് സ്ക്രീൻ."</string> - <string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണങ്ങൾ"</string> + <string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണം"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"കാഴ്ച."</string> <string name="accessibility_desc_close" msgid="7479755364962766729">"അടയ്ക്കുക"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</string> @@ -246,7 +246,7 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"എല്ലാ വിവരങ്ങളും മായ്ക്കുക."</string> <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"അറിയിപ്പ് ക്രമീകരണങ്ങൾ"</string> - <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ക്രമീകരണങ്ങൾ"</string> + <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ക്രമീകരണം"</string> <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"സ്ക്രീൻ യാന്ത്രികമായി തിരിയും."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"സ്ക്രീൻ ലാൻഡ്സ്കേപ്പ് ഓറിയന്റേഷനിൽ ലോക്കുചെയ്തു."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"സ്ക്രീൻ പോർട്രെയ്റ്റ് ഓറിയന്റേഷനിൽ ലോക്കുചെയ്തു."</string> @@ -277,7 +277,7 @@ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"മീഡിയ ഉപകരണം"</string> <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string> <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"അടിയന്തിര കോളുകൾ മാത്രം"</string> - <string name="quick_settings_settings_label" msgid="5326556592578065401">"ക്രമീകരണങ്ങൾ"</string> + <string name="quick_settings_settings_label" msgid="5326556592578065401">"ക്രമീകരണം"</string> <string name="quick_settings_time_label" msgid="4635969182239736408">"സമയം"</string> <string name="quick_settings_user_label" msgid="5238995632130897840">"ഞാന്"</string> <string name="quick_settings_user_title" msgid="4467690427642392403">"ഉപയോക്താവ്"</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index d146210b5569..278468afeb42 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -97,8 +97,8 @@ <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой өсгөх товч."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Жижгээс том дэлгэцрүү өсгөх."</string> - <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Блютүүт холбогдсон."</string> - <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Блютүүт тасрав."</string> + <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth холбогдсон."</string> + <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth тасрав."</string> <string name="accessibility_no_battery" msgid="358343022352820946">"Батерей байхгүй."</string> <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Батерей нэг баганатай."</string> <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Батерей хоёр баганатай."</string> @@ -150,7 +150,7 @@ <string name="accessibility_cell_data" msgid="7080312242791850520">"Мобайл дата"</string> <string name="accessibility_cell_data_on" msgid="4310018593519761767">"Мобайл дата асаалттай"</string> <string name="accessibility_cell_data_off" msgid="8000803571751407635">"Мобайл датаг унтраасан байна"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Блютүүт модем болж байна."</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth модем болж байна."</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"Нислэгийн горим"</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"SIM карт байхгүй."</string> <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Дамжуулагч сүлжээг өөрчилж байна."</string> @@ -199,10 +199,10 @@ <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Идэвхгүй болгох үйлдэлд бүү саад бол."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Идэвхжүүлэх үйлдэлд бүү саад бол."</string> <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"Bluetooth."</string> - <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Блютүүт идэвхгүй."</string> - <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Блютүүт идэвхтэй."</string> + <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth идэвхгүй."</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth идэвхтэй."</string> <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"Блютүүтийг холбож байна."</string> - <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Блютүүт холбогдсон."</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth холбогдсон."</string> <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"Блютүүтийг унтраасан."</string> <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"Блютүүтийг асаасан."</string> <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Байршил мэдээлэлт идэвхгүй."</string> @@ -258,9 +258,9 @@ <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Зөвхөн чухал зүйлс"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Зөвхөн сэрүүлэг"</string> <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Дуугүй болгох"</string> - <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Блютүүт"</string> - <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Блютүүт (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string> - <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Блютүүт унтраалттай"</string> + <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string> + <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth унтраалттай"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Хослуулсан төхөөрөмж байхгүй"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматаар эргэх"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 2c51984a20be..219f9f81a10f 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -96,7 +96,7 @@ <string name="voice_assist_label" msgid="3956854378310019854">"အသံ အကူအညီအား ဖွင့်ရန်"</string> <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string> - <string name="cancel" msgid="6442560571259935130">"ထားတော့"</string> + <string name="cancel" msgid="6442560571259935130">"ဖျက်သိမ်းရန်"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"အံ့ဝင်သောချုံ့ချဲ့ခလုတ်"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ဖန်သားပြင်ပေါ်တွင် အသေးမှအကြီးသို့ချဲ့ခြင်း"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 5cab544c344f..9ca2df0cb304 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -51,20 +51,20 @@ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth ਟੀਥਰ ਕੀਤੀ"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ਇਨਪੁਟ ਵਿਧੀਆਂ ਸੈਟ ਅਪ ਕਰੋ"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ਫਿਜੀਕਲ ਕੀਬੋਰਡ"</string> - <string name="usb_device_permission_prompt" msgid="834698001271562057">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਡਿਵਾਈਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> + <string name="usb_device_permission_prompt" msgid="834698001271562057">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਡੀਵਾਈਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ਕੀ ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨੂੰ USB ਐਕਸੈਸਰੀ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ਕੀ ਜਦੋਂ ਇਹ USB ਡਿਵਾਈਸ ਕਨੈਕਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਂਣਾ ਹੈ?"</string> + <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ਕੀ ਜਦੋਂ ਇਹ USB ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਂਣਾ ਹੈ?"</string> <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"ਕੀ ਜਦੋਂ ਇਹ USB ਐਕਸੈਸਰੀ ਕਨੈਕਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string> <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ਕੋਈ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਇਸ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੇ। <xliff:g id="URL">%1$s</xliff:g> ਤੇ ਇਸ ਐਕਸੈਸਰੀ ਬਾਰੇ ਹੋਰ ਜਾਣੋ"</string> <string name="title_usb_accessory" msgid="4966265263465181372">"USB ਐਕਸੈਸਰੀ"</string> <string name="label_view" msgid="6304565553218192990">"ਦੇਖੋ"</string> - <string name="always_use_device" msgid="1450287437017315906">"ਇਸ USB ਡਿਵਾਈਸ ਲਈ ਬਾਇ ਡਿਫੌਲਟ ਵਰਤੋ"</string> + <string name="always_use_device" msgid="1450287437017315906">"ਇਸ USB ਡੀਵਾਈਸ ਲਈ ਬਾਇ ਡਿਫੌਲਟ ਵਰਤੋ"</string> <string name="always_use_accessory" msgid="1210954576979621596">"ਇਸ USB ਐਕਸਸੈਰੀ ਲਈ ਬਾਇ ਡਿਫੌਲਟ ਵਰਤੋ"</string> <string name="usb_debugging_title" msgid="4513918393387141949">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ਕੰਪਿਊਟਰ ਦਾ RSA ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹੈ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ਹਮੇਸ਼ਾਂ ਇਸ ਕੰਪਿਊਟਰ ਤੋਂ ਆਗਿਆ ਦਿਓ"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string> - <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ਇਸ ਡਿਵਾਈਸ ਵਿੱਚ ਵਰਤਮਾਨ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕੀਤਾ ਉਪਭੋਗਤਾ USB ਡਿਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ। ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਉਪਯੋਗ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਪ੍ਰਸ਼ਾਸਕ ਉਪਭੋਗਤਾ ਵਿੱਚ ਸਵਿੱਚ ਕਰੋ।"</string> + <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਵਰਤਮਾਨ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕੀਤਾ ਉਪਭੋਗਤਾ USB ਡਿਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ। ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦਾ ਉਪਯੋਗ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਪ੍ਰਸ਼ਾਸਕ ਉਪਭੋਗਤਾ ਵਿੱਚ ਸਵਿੱਚ ਕਰੋ।"</string> <string name="compat_mode_on" msgid="6623839244840638213">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string> @@ -111,11 +111,11 @@ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ਫੋਨ ਦੋ ਬਾਰਸ।"</string> <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ਫੋਨ ਤਿੰਨ ਬਾਰਸ।"</string> <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ਫੋਨ ਸਿਗਨਲ ਪੂਰਾ।"</string> - <string name="accessibility_no_data" msgid="4791966295096867555">"ਕੋਈ ਡਾਟਾ ਨਹੀਂ।"</string> - <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ਡਾਟਾ ਇੱਕ ਬਾਰ।"</string> - <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ਡਾਟਾ ਦੋ ਬਾਰਸ।"</string> - <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ਡਾਟਾ ਤਿੰਨ ਬਾਰ।"</string> - <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ਡਾਟਾ ਸਿਗਨਲ ਪੂਰਾ।"</string> + <string name="accessibility_no_data" msgid="4791966295096867555">"ਕੋਈ ਡੈਟਾ ਨਹੀਂ।"</string> + <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ਡੈਟਾ ਇੱਕ ਬਾਰ।"</string> + <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ਡੈਟਾ ਦੋ ਬਾਰਸ।"</string> + <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ਡੈਟਾ ਤਿੰਨ ਬਾਰ।"</string> + <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ਡੈਟਾ ਸਿਗਨਲ ਪੂਰਾ।"</string> <string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string> <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string> <string name="accessibility_cast_name" msgid="4026393061247081201">"<xliff:g id="CAST">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"</string> @@ -207,11 +207,11 @@ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string> <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"Bluetooth ਬੰਦ ਹੈ।"</string> <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"Bluetooth ਚਾਲੂ ਕੀਤੀ।"</string> - <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਰਿਪੋਰਟਿੰਗ ਬੰਦ।"</string> - <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਰਿਪੋਰਟਿੰਗ ਚਾਲੂ।"</string> - <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਰਿਪੋਰਟਿੰਗ ਬੰਦ ਕੀਤੀ।"</string> - <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਰਿਪੋਰਟਿੰਗ ਚਾਲੂ ਕੀਤੀ।"</string> - <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ਅਲਾਰਮ <xliff:g id="TIME">%s</xliff:g> ਲਈ ਸੈਟ ਕੀਤਾ।"</string> + <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਬੰਦ।"</string> + <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਚਾਲੂ।"</string> + <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਬੰਦ ਕੀਤੀ।"</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਚਾਲੂ ਕੀਤੀ।"</string> + <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ਅਲਾਰਮ <xliff:g id="TIME">%s</xliff:g> ਲਈ ਸੈੱਟ ਕੀਤਾ ਗਿਆ।"</string> <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"ਪੈਨਲ ਬੰਦ ਕਰੋ।"</string> <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"ਹੋਰ ਸਮਾਂ।"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"ਘੱਟ ਸਮਾਂ।"</string> @@ -232,16 +232,16 @@ <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ਡੈਟਾ ਸੇਵਰ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ਡੈਟਾ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string> <string name="accessibility_brightness" msgid="8003681285547803095">"ਡਿਸਪਲੇ ਚਮਕ"</string> - <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> - <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> - <string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ਸੈਲਿਊਲਰ ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> - <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> - <string name="data_usage_disabled_dialog" msgid="8453242888903772524">"ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਸੈਟ ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ ਸੀ, ਡਿਵਾਈਸ ਨੇ ਇਸ ਬਾਕੀ ਚੱਕਰ ਲਈ ਡਾਟਾ ਵਰਤੋਂ ਰੋਕ ਦਿੱਤੀ ਹੈ।\n\nਇਸਨੂੰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰਨ ਨਾਲ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਖ਼ਰਚੇ ਪਾਏ ਜਾ ਸਕਦੇ ਹਨ।"</string> + <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> + <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> + <string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ਸੈਲਿਊਲਰ ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> + <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> + <string name="data_usage_disabled_dialog" msgid="8453242888903772524">"ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਸੈਟ ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ ਸੀ, ਡੀਵਾਈਸ ਨੇ ਇਸ ਬਾਕੀ ਚੱਕਰ ਲਈ ਡੈਟਾ ਵਰਤੋਂ ਰੋਕ ਦਿੱਤੀ ਹੈ।\n\nਇਸਨੂੰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰਨ ਨਾਲ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਖ਼ਰਚੇ ਪਾਏ ਜਾ ਸਕਦੇ ਹਨ।"</string> <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string> - <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ਵੱਲੋਂ ਸੈਟ ਕੀਤਾ ਨਿਰਧਾਰਿਤ ਸਥਾਨ"</string> + <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਟਿਕਾਣਾ"</string> <string name="accessibility_location_active" msgid="2427290146138169014">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸੇਵਾ ਬੇਨਤੀਆਂ ਸਕਿਰਿਆ"</string> <string name="accessibility_clear_all" msgid="5235938559247164925">"ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਹਟਾਓ।"</string> <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> @@ -272,9 +272,9 @@ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ਤਸਵੀਰ"</string> <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ਲੈਂਡਸਕੇਪ"</string> <string name="quick_settings_ime_label" msgid="7073463064369468429">"ਇਨਪੁਟ ਵਿਧੀ"</string> - <string name="quick_settings_location_label" msgid="5011327048748762257">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ"</string> + <string name="quick_settings_location_label" msgid="5011327048748762257">"ਟਿਕਾਣਾ"</string> <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਬੰਦ"</string> - <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ਮੀਡੀਆ ਡਿਵਾਈਸ"</string> + <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ਮੀਡੀਆ ਡੀਵਾਈਸ"</string> <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string> <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ਕੇਵਲ ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ"</string> <string name="quick_settings_settings_label" msgid="5326556592578065401">"ਸੈਟਿੰਗਾਂ"</string> @@ -284,13 +284,13 @@ <string name="quick_settings_user_new_user" msgid="9030521362023479778">"ਨਵਾਂ ਉਪਭੋਗਤਾ"</string> <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string> <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string> - <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ਕੋਈ ਨੈਟਵਰਕ ਨਹੀਂ"</string> + <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ਕੋਈ ਨੈੱਟਵਰਕ ਨਹੀਂ"</string> <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ਬੰਦ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ਚਾਲੂ"</string> - <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ Wi-Fi ਨੈਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string> + <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ Wi-Fi ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ਜੋੜੋ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string> - <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਿੱਤੀ ਡਿਵਾਈਸ"</string> + <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਿੱਤੀ ਡੀਵਾਈਸ"</string> <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ਜੋੜਨ ਲਈ ਤਿਆਰ"</string> <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"ਕੋਈ ਡਿਵਾਈਸਾਂ ਉਪਲਬਧ ਨਹੀਂ"</string> <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ਚਮਕ"</string> @@ -305,9 +305,9 @@ <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ਹੌਟਸਪੌਟ"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ਸੂਚਨਾਵਾਂ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ਫਲੈਸ਼ਲਾਈਟ"</string> - <string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"ਸੈਲਿਊਲਰ ਡਾਟਾ"</string> - <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ਡਾਟਾ ਵਰਤੋਂ"</string> - <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ਬਾਕੀ ਡਾਟਾ"</string> + <string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"ਸੈਲਿਊਲਰ ਡੈਟਾ"</string> + <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ਡੈਟਾ ਵਰਤੋਂ"</string> + <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ਬਾਕੀ ਡੈਟਾ"</string> <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ਸੀਮਾ ਤੋਂ ਵੱਧ"</string> <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ਵਰਤਿਆ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਸੀਮਾ"</string> @@ -330,7 +330,7 @@ <string name="expanded_header_battery_charging" msgid="205623198487189724">"ਚਾਰਜ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ਪੂਰਾ ਹੋਣ ਤੱਕ"</string> <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string> - <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ਨੈਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ\nਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"</string> + <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ\nਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"</string> <string name="description_target_search" msgid="3091587249776033139">"ਖੋਜੋ"</string> <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਉੱਪਰ ਸਲਾਈਡ ਕਰੋ।"</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string> @@ -366,14 +366,14 @@ <string name="guest_new_guest" msgid="600537543078847803">"ਮਹਿਮਾਨ ਜੋੜੋ"</string> <string name="guest_exit_guest" msgid="7187359342030096885">"ਮਹਿਮਾਨ ਹਟਾਓ"</string> <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ਕੀ ਮਹਿਮਾਨ ਹਟਾਉਣਾ ਹੈ?"</string> - <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ਇਸ ਸੈਸ਼ਨ ਵਿੱਚ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> + <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ਇਸ ਸੈਸ਼ਨ ਵਿੱਚ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ਹਟਾਓ"</string> <string name="guest_wipe_session_title" msgid="6419439912885956132">"ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!"</string> <string name="guest_wipe_session_message" msgid="8476238178270112811">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ਹਾਂ, ਜਾਰੀ ਰੱਖੋ"</string> <string name="guest_notification_title" msgid="1585278533840603063">"ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ"</string> - <string name="guest_notification_text" msgid="335747957734796689">"ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ ਹਟਾਓ"</string> + <string name="guest_notification_text" msgid="335747957734796689">"ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ ਹਟਾਓ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ਮਹਿਮਾਨ ਨੂੰ ਹਟਾਓ"</string> <string name="user_logout_notification_title" msgid="1453960926437240727">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string> <string name="user_logout_notification_text" msgid="3350262809611876284">"ਵਰਤਮਾਨ ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗਆਉਟ ਕਰੋ"</string> @@ -381,35 +381,35 @@ <string name="user_add_user_title" msgid="4553596395824132638">"ਕੀ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਨਾ ਹੈ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਦੇ ਹੋ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣਾ ਸਪੇਸ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n\nਕੋਈ ਵੀ ਉਪਭੋਗਤਾ ਹੋਰ ਸਾਰੇ ਉਪਭੋਗਤਾਵਾਂ ਦੇ ਐਪਸ ਨੂੰ ਅਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string> <string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਉਪਭੋਗਤਾ ਹਟਾਉਣਾ ਹੈ?"</string> - <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> + <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"ਹਟਾਓ"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string> - <string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string> + <string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡੈਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ਸਾਰੇ ਹਟਾਓ"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"ਹੁਣ ਚਾਲੂ ਕਰੋ"</string> <string name="empty_shade_text" msgid="708135716272867002">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string> - <string name="device_owned_footer" msgid="3802752663326030053">"ਡਿਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> + <string name="device_owned_footer" msgid="3802752663326030053">"ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> - <string name="vpn_footer" msgid="2388611096129106812">"ਨੈਟਵਰਕ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> - <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ਡਿਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string> + <string name="vpn_footer" msgid="2388611096129106812">"ਨੈੱਟਵਰਕ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> + <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string> - <string name="monitoring_title" msgid="169206259253048106">"ਨੈਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ"</string> + <string name="monitoring_title" msgid="169206259253048106">"ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="disable_vpn" msgid="4435534311510272506">"VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string> - <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="monitoring_description_vpn" msgid="4445150119515393526">"ਤੁਸੀਂ ਇੱਕ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਅਤੇ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।"</string> - <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="monitoring_description_vpn" msgid="4445150119515393526">"ਤੁਸੀਂ ਇੱਕ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਅਤੇ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।"</string> + <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਸ, ਅਤੇ ਵੈੱਬਪੰਨੇ ਸੰਤੇ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।"</string> <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> - <string name="monitoring_description_app" msgid="6259179342284742878">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> - <string name="monitoring_description_app_personal" msgid="484599052118316268">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> - <string name="monitoring_description_app_work" msgid="1754325860918060897">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।"</string> - <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ਡਿਵਾਈਸ ਲੌਕ ਰਹੇਗੀ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ"</string> + <string name="monitoring_description_app" msgid="6259179342284742878">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> + <string name="monitoring_description_app_personal" msgid="484599052118316268">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> + <string name="monitoring_description_app_work" msgid="1754325860918060897">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ਡੀਵਾਈਸ ਲੌਕ ਰਹੇਗੀ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"ਤੇਜ਼ੀ ਨਾਲ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"ਅਨਲੌਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ"</string> <string name="hidden_notifications_cancel" msgid="3690709735122344913">"ਨਹੀਂ ਧੰਨਵਾਦ"</string> @@ -465,7 +465,7 @@ <string name="tuner_toast" msgid="603429811084428439">"ਵਧਾਈਆਂ! ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਸੈਟਿੰਗਜ਼ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ ਹੈ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ਸੈਟਿੰਗਜ਼ ਤੋਂ ਹਟਾਓ"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ਕੀ ਸੈਟਿੰਗਜ਼ ਤੋਂ ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਹਟਾਉਣਾ ਹੈ ਅਤੇ ਇਸਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਉਪਯੋਗ ਕਰਨ ਤੋਂ ਰੋਕਣਾ ਹੈ?"</string> - <string name="activity_not_found" msgid="348423244327799974">"ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਤੇ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ"</string> + <string name="activity_not_found" msgid="348423244327799974">"ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਤੇ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ"</string> <string name="clock_seconds" msgid="7689554147579179507">"ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ"</string> <string name="clock_seconds_desc" msgid="6282693067130470675">"ਸਥਿਤੀ ਬਾਰ ਵਿੱਚ ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ। ਬੈਟਰੀ ਸਮਰੱਥਾ ਤੇ ਅਸਰ ਪੈ ਸਕਦਾ ਹੈ।"</string> <string name="qs_rearrange" msgid="8060918697551068765">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕ੍ਰਮ ਦਿਓ"</string> @@ -585,7 +585,7 @@ <string name="select_button" msgid="1597989540662710653">"ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਬਟਨ ਚੁਣੋ"</string> <string name="add_button" msgid="4134946063432258161">"ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="save" msgid="2311877285724540644">"ਰੱਖਿਅਤ ਕਰੋ"</string> - <string name="reset" msgid="2448168080964209908">"ਰੀਸੈਟ ਕਰੋ"</string> + <string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string> <string name="no_home_title" msgid="1563808595146071549">"ਕੋਈ ਹੋਮ ਬਟਨ ਨਹੀਂ ਮਿਲਿਆ"</string> <string name="no_home_message" msgid="5408485011659260911">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਆਵਾਗੌਣ ਕਰਨ ਲਈ ਇੱਕ ਹੋਮ ਬਟਨ ਦੀ ਲੋੜ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਰੱਖਿਅਤ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਇੱਕ ਹੋਮ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ।"</string> <string name="adjust_button_width" msgid="6138616087197632947">"ਬਟਨ ਚੁੜਾਈ ਵਿਵਸਥਿਤ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 33c12c281bc0..65e2a92fd136 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -174,7 +174,7 @@ <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> <string name="accessibility_work_mode" msgid="2478631941714607225">"Pracovný režim"</string> - <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zrušiť aplikáciu <xliff:g id="APP">%s</xliff:g>"</string> + <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zavrieť aplikáciu <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všetky nedávne aplikácie boli odmietnuté."</string> <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otvoriť informácie o aplikácii <xliff:g id="APP">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index afd2334961ce..66334d42b30e 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -495,7 +495,7 @@ <string name="high_importance" msgid="3441537905162782568">"Pomembnost: stopnja 4"</string> <string name="max_importance" msgid="4880179829869865275">"Pomembnost: stopnja 5"</string> <string name="notification_importance_user_unspecified" msgid="2868359605125272874">"Aplikacija določi pomembnost za posamezno obvestilo."</string> - <string name="notification_importance_blocked" msgid="4237497046867398057">"Nikoli ne pokaži obvestil za to aplikacijo."</string> + <string name="notification_importance_blocked" msgid="4237497046867398057">"Nikoli ne pokaži obvestil te aplikacije."</string> <string name="notification_importance_min" msgid="7844224511187027155">"Brez prekinitev, predog., zvoka ali vibrir. v celoz. načinu. Skrij na zakl. zasl. in v vrst. stanja."</string> <string name="notification_importance_low" msgid="7950291702044409847">"Brez prekinitev, hitrih predogledov, zvoka ali vibriranja v celozaslonskem načinu."</string> <string name="notification_importance_default" msgid="5924405820269074915">"Brez prekinitev ali hitrih predogledov v celozaslonskem načinu."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 1a4ea4991c86..3fe37b95f1f7 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -43,7 +43,7 @@ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Washa"</string> <string name="battery_saver_start_action" msgid="5576697451677486320">"Washa kiokoa betri"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mipangilio"</string> - <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Mtandao-Hewa"</string> + <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Skrini ijizungushe kiotomatiki"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"PUUZA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"KIOTOMATIKI"</string> @@ -378,7 +378,7 @@ <string name="user_logout_notification_text" msgid="3350262809611876284">"Mwondoe mtumiaji wa sasa"</string> <string name="user_logout_notification_action" msgid="1195428991423425062">"ONDOA MTUMIAJI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string> - <string name="user_add_user_message_short" msgid="2161624834066214559">"Unapomwongeza mtumiaji mpya, mtu huyo anahitaji kusanidi nafasi yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa ajili ya watumiaji wengine wote."</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"Mtumiaji mpya unayemwongeza anahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya watumiaji wengine wote."</string> <string name="user_remove_user_title" msgid="4681256956076895559">"Je, ungependa kuondoa mtumiaji?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"Programu na data yote ya mtumiaji huyu itafutwa."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"Ondoa"</string> @@ -491,7 +491,7 @@ <string name="high_importance" msgid="3441537905162782568">"Umuhimu wa Arifa: Kiwango cha 4"</string> <string name="max_importance" msgid="4880179829869865275">"Umuhimu wa Arifa: Kiwango cha 5"</string> <string name="notification_importance_user_unspecified" msgid="2868359605125272874">"Programu hubaini umuhimu wa kila arifa."</string> - <string name="notification_importance_blocked" msgid="4237497046867398057">"Usionyeshe kamwe arifa kutoka programu hii."</string> + <string name="notification_importance_blocked" msgid="4237497046867398057">"Usionyeshe arifa zozote kutoka programu hii."</string> <string name="notification_importance_min" msgid="7844224511187027155">"Usiruhusu ukatizaji wa skrini nzima, arifa za kuchungulia, sauti au mtetemo. Usionyeshe katika skrini iliyofungwa na sehemu ya kuonyesha hali."</string> <string name="notification_importance_low" msgid="7950291702044409847">"Usiruhusu ukatizaji wa skrini nzima, arifa za kuchungulia, sauti au mtetemo."</string> <string name="notification_importance_default" msgid="5924405820269074915">"Usiruhusu arifa za kuchungulia au ukatizaji wa skrini nzima."</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 184c5acdae1b..d618073058b1 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -44,7 +44,7 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"I-on ang pagtitipid ng baterya"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mga Setting"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"I-auto-rotate ang screen"</string> + <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"I-auto rotate ang screen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> <string name="status_bar_settings_notifications" msgid="397146176280905137">"Mga Notification"</string> @@ -383,7 +383,7 @@ <string name="user_remove_user_message" msgid="1453218013959498039">"Made-delete ang lahat ng app at data ng user na ito."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"Alisin"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string> - <string name="battery_saver_notification_text" msgid="820318788126672692">"Binabawasan ang pagganap at data sa background"</string> + <string name="battery_saver_notification_text" msgid="820318788126672692">"Binabawasan ang performance at data sa background"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"I-off ang pagtitipid ng baterya"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"Sisimulan ng i-capture ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang lahat ng ipinapakita sa iyong screen."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"Huwag ipakitang muli"</string> @@ -518,7 +518,7 @@ <string name="battery_panel_title" msgid="7944156115535366613">"Paggamit ng baterya"</string> <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Hindi available ang Pangtipid sa Baterya kapag nagcha-charge"</string> <string name="battery_detail_switch_title" msgid="6285872470260795421">"Pangtipid sa Baterya"</string> - <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Binabawasan ang pagganap at data sa background"</string> + <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Binabawasan ang performance at data sa background"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button na <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> <string name="keyboard_key_back" msgid="2337450286042721351">"Back"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 3e200b232bba..7764073a7df7 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -570,7 +570,7 @@ <string name="headset" msgid="4534219457597457353">"耳機"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"已與耳機連線"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"已與耳機連線"</string> - <string name="data_saver" msgid="5037565123367048522">"Data Saver"</string> + <string name="data_saver" msgid="5037565123367048522">"數據節省模式"</string> <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Data Saver 已開啟"</string> <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Data Saver 已關閉"</string> <string name="switch_bar_on" msgid="1142437840752794229">"開啟"</string> diff --git a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java index 0afab88288a4..2aca7889f31b 100644 --- a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java +++ b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java @@ -18,8 +18,8 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; +import android.os.LocaleList; import android.util.AttributeSet; -import android.util.LocaleList; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index a0d9dfe1c1c1..f76a68c9fec0 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -31,6 +31,7 @@ import android.graphics.Region.Op; import android.opengl.GLUtils; import android.os.AsyncTask; import android.os.SystemProperties; +import android.os.Trace; import android.renderscript.Matrix4f; import android.service.wallpaper.WallpaperService; import android.util.Log; @@ -310,8 +311,6 @@ public class ImageWallpaper extends WallpaperService { Log.d(TAG, "onSurfaceRedrawNeeded"); } super.onSurfaceRedrawNeeded(holder); - - mLastSurfaceHeight = mLastSurfaceWidth = -1; drawFrame(); } @@ -325,6 +324,7 @@ public class ImageWallpaper extends WallpaperService { return; } try { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "drawWallpaper"); DisplayInfo displayInfo = getDefaultDisplayInfo(); int newRotation = displayInfo.rotation; @@ -419,6 +419,7 @@ public class ImageWallpaper extends WallpaperService { drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels); } } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); if (FIXED_SIZED_SURFACE && !mIsHwAccelerated) { // If the surface is fixed-size, we should only need to // draw it once and then we'll let the window manager diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 611f9f201f1e..cfc6c52e608b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -826,7 +826,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener boolean useThumbnailTransition = (runningTask != null) && !isHomeStackVisible && hasRecentTasks; // Update the launch state that we need in updateHeaderBarLayout() - launchState.launchedFromHome = !useThumbnailTransition; + launchState.launchedFromHome = !useThumbnailTransition && !mLaunchedWhileDocking; launchState.launchedFromApp = useThumbnailTransition || mLaunchedWhileDocking; launchState.launchedViaDockGesture = mLaunchedWhileDocking; launchState.launchedViaDragGesture = mDraggingInRecents; diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 15bc2796e53e..64f83a938928 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -371,11 +371,19 @@ public class SystemServicesProxy { try { ActivityManager.StackInfo stackInfo = mIam.getStackInfo( ActivityManager.StackId.HOME_STACK_ID); + ActivityManager.StackInfo fullscreenStackInfo = mIam.getStackInfo( + ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID); ComponentName topActivity = stackInfo.topActivity; + boolean homeStackVisibleNotOccluded = stackInfo.visible; + if (fullscreenStackInfo != null) { + boolean isFullscreenStackOccludingHome = fullscreenStackInfo.visible && + fullscreenStackInfo.position > stackInfo.position; + homeStackVisibleNotOccluded &= !isFullscreenStackOccludingHome; + } if (isHomeStackVisible != null) { - isHomeStackVisible.value = stackInfo.visible; + isHomeStackVisible.value = homeStackVisibleNotOccluded; } - return (stackInfo.visible && topActivity != null + return (homeStackVisibleNotOccluded && topActivity != null && topActivity.getPackageName().equals(RecentsImpl.RECENTS_PACKAGE) && (topActivity.getClassName().equals(RecentsImpl.RECENTS_ACTIVITY) || topActivity.getClassName().equals(RecentsTvImpl.RECENTS_TV_ACTIVITY))); diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java index 99c821131e56..4341ab9cd869 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java @@ -73,6 +73,8 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { private final static boolean DEBUG = false; public final static int EVENT_BUS_PRIORITY = Recents.EVENT_BUS_PRIORITY + 1; + private final static String RECENTS_HOME_INTENT_EXTRA = + "com.android.systemui.recents.tv.RecentsTvActivity.RECENTS_HOME_INTENT_EXTRA"; private boolean mFinishedOnStartup; private RecentsPackageMonitor mPackageMonitor; @@ -320,6 +322,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + homeIntent.putExtra(RECENTS_HOME_INTENT_EXTRA, true); mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent); mPipManager.addListener(mPipListener); @@ -332,9 +335,19 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { } @Override - protected void onStart() { - super.onStart(); + public void onEnterAnimationComplete() { + super.onEnterAnimationComplete(); + if(mLaunchedFromHome) { + mHomeRecentsEnterExitAnimationHolder.startEnterAnimation(mPipManager.isPipShown()); + } + mTaskStackViewAdapter.setResetAddedCards(true); + EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); + } + @Override + public void onResume() { + super.onResume(); + mPipRecentsOverlayManager.onRecentsResumed(); // Update the recent tasks updateRecentsTasks(); @@ -365,24 +378,6 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { // Notify that recents is now visible SystemServicesProxy ssp = Recents.getSystemServices(); EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, true)); - - updatePipUI(); - } - - @Override - public void onEnterAnimationComplete() { - super.onEnterAnimationComplete(); - if(mLaunchedFromHome) { - mHomeRecentsEnterExitAnimationHolder.startEnterAnimation(mPipManager.isPipShown()); - } - mTaskStackViewAdapter.setResetAddedCards(true); - EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); - } - - @Override - public void onResume() { - super.onResume(); - mPipRecentsOverlayManager.onRecentsResumed(); if(mTaskStackHorizontalGridView.getStack().getTaskCount() > 1 && !mLaunchedFromHome) { // If there are 2 or more tasks, and we are not launching from home // set the selected position to the 2nd task to allow for faster app switching @@ -390,6 +385,8 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { } else { mTaskStackHorizontalGridView.setSelectedPosition(0); } + + updatePipUI(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index cc8e83242fb4..f4c13d7b8cdc 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -276,12 +276,13 @@ public class TaskStackAnimationHelper { tv.onStartFrontTaskEnterAnimation(mStackView.mScreenPinningEnabled); } } else if (launchState.launchedViaDockGesture) { - // Animate the tasks up + // Animate the tasks up - add some delay to match the divider animation AnimationProps taskAnimation = new AnimationProps() .setDuration(AnimationProps.BOUNDS, dockGestureAnimDuration + (taskIndexFromBack * DOUBLE_FRAME_OFFSET_MS)) .setInterpolator(AnimationProps.BOUNDS, ENTER_WHILE_DOCKING_INTERPOLATOR) + .setStartDelay(AnimationProps.BOUNDS, 48) .setListener(postAnimationTrigger.decrementOnAnimationEnd()); postAnimationTrigger.increment(); mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index f017803d4cbf..e89c136d8772 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -169,10 +169,12 @@ public class Divider extends SystemUI { if (mAdjustedForIme != adjustedForIme) { mAdjustedForIme = adjustedForIme; updateTouchable(); - if (animDuration > 0) { - mView.setAdjustedForIme(adjustedForIme, animDuration); - } else { - mView.setAdjustedForIme(adjustedForIme); + if (!mMinimized) { + if (animDuration > 0) { + mView.setAdjustedForIme(adjustedForIme, animDuration); + } else { + mView.setAdjustedForIme(adjustedForIme); + } } } }); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 3fc66dd2f62b..64eaeec98948 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -16,8 +16,8 @@ package com.android.systemui.stackdivider; -import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW; -import static android.view.PointerIcon.STYLE_VERTICAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -266,7 +266,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, boolean landscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; mHandle.setPointerIcon(PointerIcon.getSystemIcon(getContext(), - landscape ? STYLE_HORIZONTAL_DOUBLE_ARROW : STYLE_VERTICAL_DOUBLE_ARROW)); + landscape ? TYPE_HORIZONTAL_DOUBLE_ARROW : TYPE_VERTICAL_DOUBLE_ARROW)); getViewTreeObserver().addOnComputeInternalInsetsListener(this); mHandle.setAccessibilityDelegate(mHandleDelegate); mGestureDetector = new GestureDetector(mContext, new SimpleOnGestureListener() { @@ -1075,11 +1075,13 @@ public class DividerView extends FrameLayout implements OnTouchListener, mAnimateAfterRecentsDrawn = false; updateDockSide(); - // Delay switching resizing mode because this might cause jank in recents animation - // that's long than this animation. - stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), - mLongPressEntraceAnimDuration, Interpolators.FAST_OUT_SLOW_IN, - 200 /* endDelay */); + post(() -> { + // Delay switching resizing mode because this might cause jank in recents animation + // that's longer than this animation. + stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), + mLongPressEntraceAnimDuration, Interpolators.FAST_OUT_SLOW_IN, + 200 /* endDelay */); + }); } if (mGrowAfterRecentsDrawn) { mGrowAfterRecentsDrawn = false; diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java index 34a37ba51bf1..5f083d57f9ae 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java @@ -111,7 +111,7 @@ public class ForcedResizableInfoActivityController { Intent intent = new Intent(mContext, ForcedResizableInfoActivity.class); ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchTaskId(mPendingTaskIds.valueAt(i)); - options.setAvoidMoveToFront(true); + options.setTaskOverlay(true); mContext.startActivity(intent, options.toBundle()); } mPendingTaskIds.clear(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 593e170ab5a8..e66dc74c7958 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -956,32 +956,39 @@ public abstract class BaseStatusBar extends SystemUI implements protected View bindVetoButtonClickListener(View row, final StatusBarNotification n) { View vetoButton = row.findViewById(R.id.veto); - final String _pkg = n.getPackageName(); - final String _tag = n.getTag(); - final int _id = n.getId(); - final int _userId = n.getUserId(); vetoButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Accessibility feedback v.announceForAccessibility( mContext.getString(R.string.accessibility_notification_dismissed)); - try { - mBarService.onNotificationClear(_pkg, _tag, _id, _userId); - if (FORCE_REMOTE_INPUT_HISTORY - && mKeysKeptForRemoteInput.contains(n.getKey())) { - removeNotification(n.getKey(), null); - mKeysKeptForRemoteInput.remove(n.getKey()); - } - - } catch (RemoteException ex) { - // system process is dead if we're here. - } + performRemoveNotification(n, false /* removeView */); } }); vetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); return vetoButton; } + private void performRemoveNotification(StatusBarNotification n, boolean removeView) { + final String pkg = n.getPackageName(); + final String tag = n.getTag(); + final int id = n.getId(); + final int userId = n.getUserId(); + try { + mBarService.onNotificationClear(pkg, tag, id, userId); + if (FORCE_REMOTE_INPUT_HISTORY + && mKeysKeptForRemoteInput.contains(n.getKey())) { + mKeysKeptForRemoteInput.remove(n.getKey()); + removeView = true; + } + if (removeView) { + removeNotification(n.getKey(), null); + } + + } catch (RemoteException ex) { + // system process is dead if we're here. + } + } + protected void applyColorsAndBackgrounds(StatusBarNotification sbn, NotificationData.Entry entry) { @@ -1826,6 +1833,13 @@ public abstract class BaseStatusBar extends SystemUI implements }, afterKeyguardGone); } + public void addPostCollapseAction(Runnable r) { + } + + public boolean isCollapsing() { + return false; + } + private final class NotificationClicker implements View.OnClickListener { public void onClick(final View v) { if (!(v instanceof ExpandableNotificationRow)) { @@ -1875,6 +1889,15 @@ public abstract class BaseStatusBar extends SystemUI implements HeadsUpManager.setIsClickedNotification(row, true); mHeadsUpManager.releaseImmediately(notificationKey); } + StatusBarNotification parentToCancel = null; + if (shouldAutoCancel(sbn) && mGroupManager.isOnlyChildInGroup(sbn)) { + StatusBarNotification summarySbn = mGroupManager.getLogicalGroupSummary(sbn) + .getStatusBarNotification(); + if (shouldAutoCancel(summarySbn)) { + parentToCancel = summarySbn; + } + } + final StatusBarNotification parentToCancelFinal = parentToCancel; new Thread() { @Override public void run() { @@ -1930,6 +1953,28 @@ public abstract class BaseStatusBar extends SystemUI implements } catch (RemoteException ex) { // system process is dead if we're here. } + if (parentToCancelFinal != null) { + // We have to post it to the UI thread for synchronization + mHandler.post(new Runnable() { + @Override + public void run() { + Runnable removeRunnable = new Runnable() { + @Override + public void run() { + performRemoveNotification(parentToCancelFinal, + true); + } + }; + if (isCollapsing()) { + // To avoid lags we're only performing the remove + // after the shade was collapsed + addPostCollapseAction(removeRunnable); + } else { + removeRunnable.run(); + } + } + }); + } } }.start(); @@ -1943,6 +1988,17 @@ public abstract class BaseStatusBar extends SystemUI implements }, afterKeyguardGone); } + private boolean shouldAutoCancel(StatusBarNotification sbn) { + int flags = sbn.getNotification().flags; + if ((flags & Notification.FLAG_AUTO_CANCEL) != Notification.FLAG_AUTO_CANCEL) { + return false; + } + if ((flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) { + return false; + } + return true; + } + public void register(ExpandableNotificationRow row, StatusBarNotification sbn) { Notification notification = sbn.getNotification(); if (notification.contentIntent != null || notification.fullScreenIntent != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index a5d65d210268..280663bf6c35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -38,7 +38,6 @@ public abstract class ExpandableView extends FrameLayout { protected int mClipTopAmount; private boolean mDark; private ArrayList<View> mMatchParentViews = new ArrayList<View>(); - private int mClipTopOptimization; private static Rect mClipRect = new Rect(); private boolean mWillBeGone; private int mMinClipTopAmount = 0; @@ -218,6 +217,7 @@ public abstract class ExpandableView extends FrameLayout { */ public void setClipTopAmount(int clipTopAmount) { mClipTopAmount = clipTopAmount; + updateClipping(); } public int getClipTopAmount() { @@ -306,7 +306,7 @@ public abstract class ExpandableView extends FrameLayout { public void getBoundsOnScreen(Rect outRect, boolean clipToParent) { super.getBoundsOnScreen(outRect, clipToParent); outRect.bottom = outRect.top + getActualHeight(); - outRect.top += getClipTopOptimization(); + outRect.top += getClipTopAmount(); } public boolean isSummaryWithChildren() { @@ -319,7 +319,7 @@ public abstract class ExpandableView extends FrameLayout { private void updateClipping() { if (mClipToActualHeight) { - int top = mClipTopOptimization; + int top = getClipTopAmount(); if (top >= getActualHeight()) { top = getActualHeight() - 1; } @@ -335,21 +335,6 @@ public abstract class ExpandableView extends FrameLayout { updateClipping(); } - public int getClipTopOptimization() { - return mClipTopOptimization; - } - - /** - * Set that the view will be clipped by a given amount from the top. Contrary to - * {@link #setClipTopAmount} this amount doesn't effect shadows and the background. - * - * @param clipTopOptimization the amount to clip from the top - */ - public void setClipTopOptimization(int clipTopOptimization) { - mClipTopOptimization = clipTopOptimization; - updateClipping(); - } - public boolean willBeGone() { return mWillBeGone; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java index 3363993dd289..7575dc8157b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java @@ -198,7 +198,7 @@ public class NotificationHeaderUtil { } // in case no view is visible we make sure the time is visible int timeVisibility = !hasVisibleText - || mRow.getStatusBarNotification().getNotification().showsTimeOrChronometer() + || mRow.getStatusBarNotification().getNotification().showsTime() ? View.VISIBLE : View.GONE; time.setVisibility(timeVisibility); View left = null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index ce0163e66eaf..bc33b305432e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -328,7 +328,7 @@ public class StatusBarIconView extends AnimatedImageView { Notification.Builder builder = Notification.Builder.recoverBuilder(c, n); String appName = builder.loadHeaderAppName(); - CharSequence title = n.extras.getString(Notification.EXTRA_TITLE); + CharSequence title = n.extras.getCharSequence(Notification.EXTRA_TITLE); CharSequence ticker = n.tickerText; CharSequence desc = !TextUtils.isEmpty(ticker) ? ticker diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index 270b6edbe367..182075f15186 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -215,7 +215,11 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged public boolean isOnlyChildInSuppressedGroup(StatusBarNotification sbn) { return isGroupSuppressed(sbn.getGroupKey()) - && !sbn.getNotification().isGroupSummary() + && isOnlyChildInGroup(sbn); + } + + public boolean isOnlyChildInGroup(StatusBarNotification sbn) { + return !sbn.getNotification().isGroupSummary() && getTotalNumberOfChildren(sbn) == 1; } @@ -426,7 +430,6 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged private boolean isGroupNotFullyVisible(NotificationGroup notificationGroup) { return notificationGroup.summary == null - || notificationGroup.summary.row.getClipTopOptimization() > 0 || notificationGroup.summary.row.getClipTopAmount() > 0 || notificationGroup.summary.row.getTranslationY() < 0; } 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 4bb97974b88b..e3ce1e27f3e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1178,6 +1178,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mKeyguardIndicationController.setStatusBarKeyguardViewManager( mStatusBarKeyguardViewManager); mFingerprintUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); + mIconPolicy.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mRemoteInputController.addCallback(mStatusBarKeyguardViewManager); if (FORCE_REMOTE_INPUT_HISTORY) { @@ -3828,10 +3829,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateMediaMetaData(true /* metaDataChanged */, true); } + @Override public boolean isCollapsing() { return mNotificationPanel.isCollapsing(); } + @Override public void addPostCollapseAction(Runnable r) { mPostCollapseRunnables.add(r); } @@ -4065,12 +4068,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { mScrimController.setKeyguardShowing(true); - mIconPolicy.setKeyguardShowing(true); } else { mScrimController.setKeyguardShowing(false); - mIconPolicy.setKeyguardShowing(false); } - + mIconPolicy.notifyKeyguardShowingChanged(); mNotificationPanel.setBarState(mState, mKeyguardFadingAway, goingToFullShade); updateDozingState(); updatePublicMode(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 823af36fff5a..d9dd9e243b94 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -80,6 +80,7 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro private final StatusBarIconController mIconController; private final RotationLockController mRotationLockController; private final DataSaverController mDataSaver; + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; // Assume it's all good unless we hear otherwise. We don't always seem // to get broadcasts that it *is* there. @@ -95,7 +96,6 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro private boolean mManagedProfileIconVisible = false; private boolean mManagedProfileInQuietMode = false; - private boolean mKeyguardVisible = true; private BluetoothController mBluetooth; public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController, @@ -192,6 +192,11 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro mDataSaver.addListener(this); } + public void setStatusBarKeyguardViewManager( + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; + } + public void setZenMode(int zen) { mZen = zen; updateVolumeZen(); @@ -385,10 +390,9 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro private void updateManagedProfile() { if (DEBUG) Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: " - + mManagedProfileFocused - + " mKeyguardVisible: " + mKeyguardVisible); + + mManagedProfileFocused); final boolean showIcon; - if (mManagedProfileFocused && !mKeyguardVisible) { + if (mManagedProfileFocused && !mStatusBarKeyguardViewManager.isShowing()) { showIcon = true; mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status, @@ -411,20 +415,35 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro new SynchronousUserSwitchObserver() { @Override public void onUserSwitching(int newUserId) throws RemoteException { - mUserInfoController.reloadUserInfo(); + mHandler.post(new Runnable() { + @Override + public void run() { + mUserInfoController.reloadUserInfo(); + } + }); } @Override public void onUserSwitchComplete(int newUserId) throws RemoteException { - updateAlarm(); - profileChanged(newUserId); - updateQuietState(); - updateManagedProfile(); + mHandler.post(new Runnable() { + @Override + public void run() { + updateAlarm(); + profileChanged(newUserId); + updateQuietState(); + updateManagedProfile(); + } + }); } @Override public void onForegroundProfileSwitch(int newProfileId) { - profileChanged(newProfileId); + mHandler.post(new Runnable() { + @Override + public void run() { + profileChanged(newProfileId); + } + }); } }; @@ -446,8 +465,7 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro updateManagedProfile(); } - public void setKeyguardShowing(boolean visible) { - mKeyguardVisible = visible; + public void notifyKeyguardShowingChanged() { updateManagedProfile(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java index e6e189f0ffd8..cc02ece48a13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java @@ -93,6 +93,9 @@ public class DataSaverController { @Override public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) { } + @Override + public void onRestrictBackgroundBlacklistChanged(int uid, boolean blacklisted) { + } }; public interface Listener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index dafaf61df1ea..e919d5c48d3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -393,7 +393,6 @@ public class NotificationChildrenContainer extends ViewGroup { childState.hideSensitive = parentState.hideSensitive; childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; - childState.topOverLap = 0; childState.alpha = 0; if (i < firstOverflowIndex) { childState.alpha = 1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 1edaa0f6b68d..70d4aec0f8df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1757,6 +1757,9 @@ public class NotificationStackScrollLayout extends ViewGroup } private void startBackgroundAnimation() { + // left and right are always instantly applied + mCurrentBounds.left = mBackgroundBounds.left; + mCurrentBounds.right = mBackgroundBounds.right; startBottomAnimation(); startTopAnimation(); } @@ -2211,7 +2214,7 @@ public class NotificationStackScrollLayout extends ViewGroup updateAnimationState(false, child); // Make sure the clipRect we might have set is removed - expandableView.setClipTopOptimization(0); + expandableView.setClipTopAmount(0); } private boolean isChildInGroup(View child) { @@ -3395,9 +3398,6 @@ public class NotificationStackScrollLayout extends ViewGroup public void setDismissAllInProgress(boolean dismissAllInProgress) { mDismissAllInProgress = dismissAllInProgress; mAmbientState.setDismissAllInProgress(dismissAllInProgress); - if (dismissAllInProgress) { - disableClipOptimization(); - } handleDismissAllClipping(); } @@ -3418,17 +3418,6 @@ public class NotificationStackScrollLayout extends ViewGroup } } - private void disableClipOptimization() { - final int count = getChildCount(); - for (int i = 0; i < count; i++) { - ExpandableView child = (ExpandableView) getChildAt(i); - if (child.getVisibility() == GONE) { - continue; - } - child.setClipTopOptimization(0); - } - } - public boolean isDismissViewNotGone() { return mDismissView.getVisibility() != View.GONE && !mDismissView.willBeGone(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index c7333c2721b4..5d2698898e30 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -138,11 +138,9 @@ public class StackScrollAlgorithm { private void updateClipping(StackScrollState resultState, StackScrollAlgorithmState algorithmState, AmbientState ambientState) { - boolean dismissAllInProgress = ambientState.isDismissAllInProgress(); float drawStart = ambientState.getTopPadding() + ambientState.getStackTranslation(); float previousNotificationEnd = 0; float previousNotificationStart = 0; - boolean previousNotificationIsSwiped = false; int childCount = algorithmState.visibleChildren.size(); for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); @@ -153,36 +151,21 @@ public class StackScrollAlgorithm { } float newYTranslation = state.yTranslation; float newHeight = state.height; - // apply clipping and shadow float newNotificationEnd = newYTranslation + newHeight; - float clipHeight; - if (previousNotificationIsSwiped) { - // When the previous notification is swiped, we don't clip the content to the - // bottom of it. - clipHeight = newHeight; + if (newYTranslation < previousNotificationEnd) { + // The previous view is overlapping on top, clip! + float overlapAmount = previousNotificationEnd - newYTranslation; + state.clipTopAmount = (int) overlapAmount; } else { - clipHeight = newNotificationEnd - previousNotificationEnd; - clipHeight = Math.max(0.0f, clipHeight); - } - - updateChildClippingAndBackground(state, newHeight, clipHeight, - newHeight - (previousNotificationStart - newYTranslation)); - - if (dismissAllInProgress) { - state.clipTopAmount = Math.max(child.getMinClipTopAmount(), state.clipTopAmount); + state.clipTopAmount = 0; } if (!child.isTransparent()) { // Only update the previous values if we are not transparent, // otherwise we would clip to a transparent view. - if ((dismissAllInProgress && canChildBeDismissed(child))) { - previousNotificationIsSwiped = true; - } else { - previousNotificationIsSwiped = ambientState.getDraggedViews().contains(child); - previousNotificationEnd = newNotificationEnd; - previousNotificationStart =newYTranslation + state.clipTopAmount; - } + previousNotificationEnd = newNotificationEnd; + previousNotificationStart = newYTranslation; } } } @@ -193,31 +176,6 @@ public class StackScrollAlgorithm { } /** - * Updates the shadow outline and the clipping for a view. - * - * @param state the viewState to update - * @param realHeight the currently applied height of the view - * @param clipHeight the desired clip height, the rest of the view will be clipped from the top - * @param backgroundHeight the desired background height. The shadows of the view will be - * based on this height and the content will be clipped from the top - */ - private void updateChildClippingAndBackground(StackViewState state, float realHeight, - float clipHeight, float backgroundHeight) { - if (realHeight > clipHeight) { - // Rather overlap than create a hole. - state.topOverLap = (int) Math.floor(realHeight - clipHeight); - } else { - state.topOverLap = 0; - } - if (realHeight > backgroundHeight) { - // Rather overlap than create a hole. - state.clipTopAmount = (int) Math.floor(realHeight - backgroundHeight); - } else { - state.clipTopAmount = 0; - } - } - - /** * Updates the dimmed, activated and hiding sensitive states of the children. */ private void updateDimmedActivatedHideSensitive(AmbientState ambientState, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java index 1fedc1e40ac3..1ccc9083f72c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java @@ -110,11 +110,11 @@ public class StackScrollState { } if (child instanceof DismissView) { DismissView dismissView = (DismissView) child; - boolean visible = state.topOverLap < mClearAllTopPadding; + boolean visible = state.clipTopAmount < mClearAllTopPadding; dismissView.performVisibilityAnimation(visible && !dismissView.willBeGone()); } else if (child instanceof EmptyShadeView) { EmptyShadeView emptyShadeView = (EmptyShadeView) child; - boolean visible = state.topOverLap <= 0; + boolean visible = state.clipTopAmount <= 0; emptyShadeView.performVisibilityAnimation( visible && !emptyShadeView.willBeGone()); } @@ -171,10 +171,6 @@ public class StackScrollState { if (oldClipTopAmount != state.clipTopAmount) { view.setClipTopAmount(state.clipTopAmount); } - float oldClipTopOptimization = view.getClipTopOptimization(); - if (oldClipTopOptimization != state.topOverLap) { - view.setClipTopOptimization(state.topOverLap); - } if (view instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) view; row.applyChildrenState(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index 0c08d1303aaa..6f451ffa381a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -91,7 +91,6 @@ public class StackStateAnimator { private int mCurrentLastNotAddedIndex; private ValueAnimator mTopOverScrollAnimator; private ValueAnimator mBottomOverScrollAnimator; - private ExpandableNotificationRow mChildExpandingView; private int mHeadsUpAppearHeightBottom; private boolean mShadeExpanded; private ArrayList<View> mChildrenToClearFromOverlay = new ArrayList<>(); @@ -128,7 +127,6 @@ public class StackStateAnimator { continue; } - child.setClipTopOptimization(0); startStackAnimations(child, viewState, finalState, i, -1 /* fixedDelay */); } if (!isRunning()) { @@ -139,7 +137,6 @@ public class StackStateAnimator { mHeadsUpDisappearChildren.clear(); mNewEvents.clear(); mNewAddChildren.clear(); - mChildExpandingView = null; } /** @@ -871,7 +868,6 @@ public class StackStateAnimator { .AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) { ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView; row.prepareExpansionChanged(finalState); - mChildExpandingView = row; } else if (event.animationType == NotificationStackScrollLayout .AnimationEvent.ANIMATION_TYPE_HEADS_UP_APPEAR) { // This item is added, initialize it's properties. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java index fa151950c1cc..1114e0359d6d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java @@ -40,18 +40,12 @@ public class StackViewState extends ViewState { public float shadowAlpha; /** - * The amount which the view should be clipped from the top. This is calculated to - * perceive consistent shadows. + * How much the child overlaps with the previous child on top. This is used to + * show the background properly when the child on top is translating away. */ public int clipTopAmount; /** - * How much does the child overlap with the previous view on the top? Can be used for - * a clipping optimization - */ - public int topOverLap; - - /** * The index of the view, only accounting for views not equal to GONE */ public int notGoneIndex; @@ -75,7 +69,6 @@ public class StackViewState extends ViewState { hideSensitive = svs.hideSensitive; belowSpeedBump = svs.belowSpeedBump; clipTopAmount = svs.clipTopAmount; - topOverLap = svs.topOverLap; notGoneIndex = svs.notGoneIndex; location = svs.location; } diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index cfe038cf0c23..1ab816085660 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -85,7 +85,9 @@ import android.os.storage.StorageManager; import android.provider.Settings; import android.system.ErrnoException; import android.system.Os; +import android.text.TextUtils; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.EventLog; import android.util.Log; @@ -99,6 +101,7 @@ import com.android.internal.backup.IBackupTransport; import com.android.internal.backup.IObbBackupService; import com.android.server.AppWidgetBackupBridge; import com.android.server.EventLogTags; +import com.android.server.SystemConfig; import com.android.server.SystemService; import com.android.server.backup.PackageManagerBackupAgent.Metadata; @@ -318,6 +321,7 @@ public class BackupManagerService { volatile boolean mClearingData; // Transport bookkeeping + final ArraySet<ComponentName> mTransportWhitelist; final Intent mTransportServiceIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST); final ArrayMap<String,String> mTransportNames = new ArrayMap<String,String>(); // component name -> registration name @@ -1168,11 +1172,15 @@ public class BackupManagerService { // Set up our transport options and initialize the default transport // TODO: Don't create transports that we don't need to? - mCurrentTransport = Settings.Secure.getString(context.getContentResolver(), + SystemConfig systemConfig = SystemConfig.getInstance(); + mTransportWhitelist = systemConfig.getBackupTransportWhitelist(); + + String transport = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT); - if ("".equals(mCurrentTransport)) { - mCurrentTransport = null; + if (TextUtils.isEmpty(transport)) { + transport = null; } + mCurrentTransport = transport; if (DEBUG) Slog.v(TAG, "Starting with transport " + mCurrentTransport); // Find all transport hosts and bind to their services @@ -1184,11 +1192,11 @@ public class BackupManagerService { } if (hosts != null) { for (int i = 0; i < hosts.size(); i++) { - final ServiceInfo transport = hosts.get(i).serviceInfo; + final ServiceInfo transportService = hosts.get(i).serviceInfo; if (MORE_DEBUG) { - Slog.v(TAG, " " + transport.packageName + "/" + transport.name); + Slog.v(TAG, " " + transportService.packageName + "/" + transportService.name); } - tryBindTransport(transport); + tryBindTransport(transportService); } } @@ -2082,6 +2090,11 @@ public class BackupManagerService { // Actually bind; presumes that we have already validated the transport service boolean bindTransport(ServiceInfo transport) { ComponentName svcName = new ComponentName(transport.packageName, transport.name); + if (!mTransportWhitelist.contains(svcName)) { + Slog.w(TAG, "Proposed transport " + svcName + " not whitelisted; ignoring"); + return false; + } + if (MORE_DEBUG) { Slog.i(TAG, "Binding to transport host " + svcName); } @@ -3515,6 +3528,7 @@ public class BackupManagerService { private void routeSocketDataToOutput(ParcelFileDescriptor inPipe, OutputStream out) throws IOException { + // We do not take close() responsibility for the pipe FD FileInputStream raw = new FileInputStream(inPipe.getFileDescriptor()); DataInputStream in = new DataInputStream(raw); @@ -4432,7 +4446,8 @@ public class BackupManagerService { (new Thread(backupRunner, "package-backup-bridge")).start(); // Read data off the engine pipe and pass it to the transport - // pipe until we hit EOD on the input stream. + // pipe until we hit EOD on the input stream. We do not take + // close() responsibility for these FDs into these stream wrappers. FileInputStream in = new FileInputStream( enginePipes[0].getFileDescriptor()); FileOutputStream out = new FileOutputStream( @@ -8566,7 +8581,10 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF EngineThread(FullRestoreEngine engine, ParcelFileDescriptor engineSocket) { mEngine = engine; engine.setRunning(true); - mEngineStream = new FileInputStream(engineSocket.getFileDescriptor()); + // We *do* want this FileInputStream to own the underlying fd, so that + // when we are finished with it, it closes this end of the pipe in a way + // that signals its other end. + mEngineStream = new FileInputStream(engineSocket.getFileDescriptor(), true); } public boolean isRunning() { @@ -8585,6 +8603,8 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF mEngine.restoreOneFile(mEngineStream, false); } } finally { + // Because mEngineStream adopted its underlying FD, this also + // closes this end of the pipe. IoUtils.closeQuietly(mEngineStream); } } @@ -10271,6 +10291,12 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF + " (now = " + System.currentTimeMillis() + ')'); pw.println(" next scheduled: " + KeyValueBackupJob.nextScheduled()); + pw.println("Transport whitelist:"); + for (ComponentName transport : mTransportWhitelist) { + pw.print(" "); + pw.println(transport.flattenToShortString()); + } + pw.println("Available transports:"); final String[] transports = listAllTransports(); if (transports != null) { diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 0a814ab579d3..5e8687a904c1 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -613,7 +613,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub { "Need BLUETOOTH ADMIN permission"); if (DBG) { Slog.d(TAG,"enable(): mBluetooth =" + mBluetooth + - " mBinding = " + mBinding); + " mBinding = " + mBinding + " mState = " + mState); + } + // We do not honor ON requests when the adapter is already turned ON or in the process of + // turning ON. + // As a protective mechanism to make sure that the native stack gets cleaned up properly + // before turning it back ON we ignore requests while the bluetooth is turning OFF. + // Bug: b/28318203 + if (mState == BluetoothAdapter.STATE_BLE_TURNING_OFF || + mState == BluetoothAdapter.STATE_TURNING_OFF || + mState == BluetoothAdapter.STATE_ON || + mState == BluetoothAdapter.STATE_BLE_ON || + mState == BluetoothAdapter.STATE_TURNING_ON || + mState == BluetoothAdapter.STATE_BLE_TURNING_ON) { + return false; } synchronized(mReceiver) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 53b29427b29c..c096fa5f3946 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -915,6 +915,13 @@ public class ConnectivityService extends IConnectivityManager.Stub final boolean networkMetered; final int uidRules; + synchronized (mVpns) { + final Vpn vpn = mVpns.get(UserHandle.getUserId(uid)); + if (vpn != null && vpn.isBlockingUid(uid)) { + return true; + } + } + final String iface = (lp == null ? "" : lp.getInterfaceName()); synchronized (mRulesLock) { networkMetered = mMeteredIfaces.contains(iface); @@ -1445,6 +1452,14 @@ public class ConnectivityService extends IConnectivityManager.Stub + whitelisted + ")"); } } + @Override + public void onRestrictBackgroundBlacklistChanged(int uid, boolean blacklisted) { + if (LOGD_RULES) { + // caller is NPMS, since we only register with them + log("onRestrictBackgroundBlacklistChanged(uid=" + uid + ", blacklisted=" + + blacklisted + ")"); + } + } }; /** @@ -3357,23 +3372,42 @@ public class ConnectivityService extends IConnectivityManager.Stub } /** - * Sets up or tears down the always-on VPN for user {@param user} as appropriate. + * Starts the always-on VPN {@link VpnService} for user {@param userId}, which should perform + * some setup and then call {@code establish()} to connect. * - * @return {@code false} in case of errors; {@code true} otherwise. + * @return {@code true} if the service was started, the service was already connected, or there + * was no always-on VPN to start. {@code false} otherwise. */ - private boolean updateAlwaysOnVpn(int user) { - final String lockdownPackage = getAlwaysOnVpnPackage(user); - if (lockdownPackage == null) { - return true; + private boolean startAlwaysOnVpn(int userId) { + final String alwaysOnPackage; + synchronized (mVpns) { + Vpn vpn = mVpns.get(userId); + if (vpn == null) { + // Shouldn't happen as all codepaths that point here should have checked the Vpn + // exists already. + Slog.wtf(TAG, "User " + userId + " has no Vpn configuration"); + return false; + } + alwaysOnPackage = vpn.getAlwaysOnPackage(); + // Skip if there is no service to start. + if (alwaysOnPackage == null) { + return true; + } + // Skip if the service is already established. This isn't bulletproof: it's not bound + // until after establish(), so if it's mid-setup onStartCommand will be sent twice, + // which may restart the connection. + if (vpn.getNetworkInfo().isConnected()) { + return true; + } } - // Create an intent to start the VPN service declared in the app's manifest. + // Start the VPN service declared in the app's manifest. Intent serviceIntent = new Intent(VpnConfig.SERVICE_INTERFACE); - serviceIntent.setPackage(lockdownPackage); - + serviceIntent.setPackage(alwaysOnPackage); try { - return mContext.startServiceAsUser(serviceIntent, UserHandle.of(user)) != null; + return mContext.startServiceAsUser(serviceIntent, UserHandle.of(userId)) != null; } catch (RuntimeException e) { + Slog.w(TAG, "VpnService " + serviceIntent + " failed to start", e); return false; } } @@ -3388,25 +3422,35 @@ public class ConnectivityService extends IConnectivityManager.Stub return false; } - // If the current VPN package is the same as the new one, this is a no-op - final String oldPackage = getAlwaysOnVpnPackage(userId); - if (TextUtils.equals(oldPackage, packageName)) { - return true; - } - synchronized (mVpns) { Vpn vpn = mVpns.get(userId); if (vpn == null) { Slog.w(TAG, "User " + userId + " has no Vpn configuration"); return false; } - if (!vpn.setAlwaysOnPackage(packageName)) { + // If the current VPN package is the same as the new one, this is a no-op + if (TextUtils.equals(packageName, vpn.getAlwaysOnPackage())) { + return true; + } + if (!vpn.setAlwaysOnPackage(packageName, lockdown)) { return false; } - if (!updateAlwaysOnVpn(userId)) { - vpn.setAlwaysOnPackage(null); + if (!startAlwaysOnVpn(userId)) { + vpn.setAlwaysOnPackage(null, false); return false; } + + // Save the configuration + final long token = Binder.clearCallingIdentity(); + try { + final ContentResolver cr = mContext.getContentResolver(); + Settings.Secure.putStringForUser(cr, Settings.Secure.ALWAYS_ON_VPN_APP, + packageName, userId); + Settings.Secure.putIntForUser(cr, Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, + (lockdown ? 1 : 0), userId); + } finally { + Binder.restoreCallingIdentity(token); + } } return true; } @@ -3677,11 +3721,18 @@ public class ConnectivityService extends IConnectivityManager.Stub } userVpn = new Vpn(mHandler.getLooper(), mContext, mNetd, userId); mVpns.put(userId, userVpn); + + final ContentResolver cr = mContext.getContentResolver(); + String alwaysOnPackage = Settings.Secure.getStringForUser(cr, + Settings.Secure.ALWAYS_ON_VPN_APP, userId); + final boolean alwaysOnLockdown = Settings.Secure.getIntForUser(cr, + Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, /* default */ 0, userId) != 0; + if (alwaysOnPackage != null) { + userVpn.setAlwaysOnPackage(alwaysOnPackage, alwaysOnLockdown); + } } if (mUserManager.getUserInfo(userId).isPrimary() && LockdownVpnTracker.isEnabled()) { updateLockdownVpn(); - } else { - updateAlwaysOnVpn(userId); } } @@ -3692,6 +3743,7 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("Stopped user has no VPN"); return; } + userVpn.onUserStopped(); mVpns.delete(userId); } } @@ -3721,7 +3773,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (mUserManager.getUserInfo(userId).isPrimary() && LockdownVpnTracker.isEnabled()) { updateLockdownVpn(); } else { - updateAlwaysOnVpn(userId); + startAlwaysOnVpn(userId); } } diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index b60f3e2f0bc3..69960c7223d2 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -325,9 +325,7 @@ public class DeviceIdleController extends SystemService @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case ConnectivityManager.CONNECTIVITY_ACTION: { - synchronized (DeviceIdleController.this) { - updateConnectivityStateLocked(intent); - } + updateConnectivityState(intent); } break; case Intent.ACTION_BATTERY_CHANGED: { synchronized (DeviceIdleController.this) { @@ -1426,9 +1424,9 @@ public class DeviceIdleController extends SystemService mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray); mLocalAlarmManager.setDeviceIdleUserWhitelist(mPowerSaveWhitelistUserAppIdArray); mDisplayManager.registerDisplayListener(mDisplayListener, null); - updateConnectivityStateLocked(null); updateDisplayLocked(); } + updateConnectivityState(null); } } @@ -1707,9 +1705,17 @@ public class DeviceIdleController extends SystemService } } - void updateConnectivityStateLocked(Intent connIntent) { - if (mConnectivityService != null) { - NetworkInfo ni = mConnectivityService.getActiveNetworkInfo(); + void updateConnectivityState(Intent connIntent) { + ConnectivityService cm; + synchronized (this) { + cm = mConnectivityService; + } + if (cm == null) { + return; + } + // Note: can't call out to ConnectivityService with our lock held. + NetworkInfo ni = cm.getActiveNetworkInfo(); + synchronized (this) { boolean conn; if (ni == null) { conn = false; diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index b0a00e654b80..727bf5c6bec9 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -82,6 +82,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.IInterface; import android.os.Message; +import android.os.LocaleList; import android.os.Parcel; import android.os.Process; import android.os.RemoteException; @@ -97,7 +98,6 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; import android.util.EventLog; -import android.util.LocaleList; import android.util.LruCache; import android.util.Pair; import android.util.PrintWriterPrinter; diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index 5b6117d55633..cec32291cb30 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -790,10 +790,11 @@ public class LockSettingsService extends ILockSettings.Stub { if (isSecure) { tieManagedProfileLockIfNecessary(managedUserId, null); } else { + clearUserKeyProtection(managedUserId); getGateKeeperService().clearSecureUserId(managedUserId); mStorage.writePatternHash(null, managedUserId); setKeystorePassword(null, managedUserId); - clearUserKeyProtection(managedUserId); + fixateNewestUserKeyAuth(managedUserId); mStorage.removeChildProfileLock(managedUserId); removeKeystoreProfileKey(managedUserId); } @@ -828,10 +829,11 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] currentHandle = getCurrentHandle(userId); if (pattern == null) { + clearUserKeyProtection(userId); getGateKeeperService().clearSecureUserId(userId); mStorage.writePatternHash(null, userId); setKeystorePassword(null, userId); - clearUserKeyProtection(userId); + fixateNewestUserKeyAuth(userId); onUserLockChanged(userId); return; } @@ -861,8 +863,12 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] enrolledHandle = enrollCredential(currentHandle, savedCredential, pattern, userId); if (enrolledHandle != null) { + CredentialHash willStore + = new CredentialHash(enrolledHandle, CredentialHash.VERSION_GATEKEEPER); + setUserKeyProtection(userId, pattern, + doVerifyPattern(pattern, willStore, true, 0, userId)); mStorage.writePatternHash(enrolledHandle, userId); - setUserKeyProtection(userId, pattern, verifyPattern(pattern, 0, userId)); + fixateNewestUserKeyAuth(userId); onUserLockChanged(userId); } else { throw new RemoteException("Failed to enroll pattern"); @@ -885,10 +891,11 @@ public class LockSettingsService extends ILockSettings.Stub { throws RemoteException { byte[] currentHandle = getCurrentHandle(userId); if (password == null) { + clearUserKeyProtection(userId); getGateKeeperService().clearSecureUserId(userId); mStorage.writePasswordHash(null, userId); setKeystorePassword(null, userId); - clearUserKeyProtection(userId); + fixateNewestUserKeyAuth(userId); onUserLockChanged(userId); return; } @@ -916,8 +923,12 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] enrolledHandle = enrollCredential(currentHandle, savedCredential, password, userId); if (enrolledHandle != null) { + CredentialHash willStore + = new CredentialHash(enrolledHandle, CredentialHash.VERSION_GATEKEEPER); + setUserKeyProtection(userId, password, + doVerifyPassword(password, willStore, true, 0, userId)); mStorage.writePasswordHash(enrolledHandle, userId); - setUserKeyProtection(userId, password, verifyPassword(password, 0, userId)); + fixateNewestUserKeyAuth(userId); onUserLockChanged(userId); } else { throw new RemoteException("Failed to enroll password"); @@ -1022,11 +1033,11 @@ public class LockSettingsService extends ILockSettings.Stub { if (token == null) { throw new RemoteException("Empty payload verifying a credential we just set"); } - changeUserKey(userId, token, secretFromCredential(credential)); + addUserKeyAuth(userId, token, secretFromCredential(credential)); } private void clearUserKeyProtection(int userId) throws RemoteException { - changeUserKey(userId, null, null); + addUserKeyAuth(userId, null, null); } private static byte[] secretFromCredential(String credential) throws RemoteException { @@ -1045,18 +1056,23 @@ public class LockSettingsService extends ILockSettings.Stub { } } - private void changeUserKey(int userId, byte[] token, byte[] secret) + private void addUserKeyAuth(int userId, byte[] token, byte[] secret) throws RemoteException { final UserInfo userInfo = UserManager.get(mContext).getUserInfo(userId); final IMountService mountService = getMountService(); final long callingId = Binder.clearCallingIdentity(); try { - mountService.changeUserKey(userId, userInfo.serialNumber, token, null, secret); + mountService.addUserKeyAuth(userId, userInfo.serialNumber, token, secret); } finally { Binder.restoreCallingIdentity(callingId); } } + private void fixateNewestUserKeyAuth(int userId) + throws RemoteException { + getMountService().fixateNewestUserKeyAuth(userId); + } + @Override public VerifyCredentialResponse checkPattern(String pattern, int userId) throws RemoteException { return doVerifyPattern(pattern, false, 0, userId); @@ -1072,6 +1088,11 @@ public class LockSettingsService extends ILockSettings.Stub { long challenge, int userId) throws RemoteException { checkPasswordReadPermission(userId); CredentialHash storedHash = mStorage.readPatternHash(userId); + return doVerifyPattern(pattern, storedHash, hasChallenge, challenge, userId); + } + + private VerifyCredentialResponse doVerifyPattern(String pattern, CredentialHash storedHash, + boolean hasChallenge, long challenge, int userId) throws RemoteException { boolean shouldReEnrollBaseZero = storedHash != null && storedHash.isBaseZeroPattern; String patternToVerify; @@ -1109,7 +1130,6 @@ public class LockSettingsService extends ILockSettings.Stub { } return response; - } @Override @@ -1159,6 +1179,11 @@ public class LockSettingsService extends ILockSettings.Stub { long challenge, int userId) throws RemoteException { checkPasswordReadPermission(userId); CredentialHash storedHash = mStorage.readPasswordHash(userId); + return doVerifyPassword(password, storedHash, hasChallenge, challenge, userId); + } + + private VerifyCredentialResponse doVerifyPassword(String password, CredentialHash storedHash, + boolean hasChallenge, long challenge, int userId) throws RemoteException { return verifyCredential(userId, storedHash, password, hasChallenge, challenge, new CredentialUtil() { @Override diff --git a/services/core/java/com/android/server/LockSettingsStorage.java b/services/core/java/com/android/server/LockSettingsStorage.java index 9ab63003c8dc..ab91a732f3cc 100644 --- a/services/core/java/com/android/server/LockSettingsStorage.java +++ b/services/core/java/com/android/server/LockSettingsStorage.java @@ -74,7 +74,7 @@ class LockSettingsStorage { private SparseArray<Integer> mStoredCredentialType; - class CredentialHash { + static class CredentialHash { static final int TYPE_NONE = -1; static final int TYPE_PATTERN = 1; static final int TYPE_PASSWORD = 2; diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 25ce4856be1f..c89b6ea4f18d 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -2816,15 +2816,36 @@ class MountService extends IMountService.Stub } } + /* + * Add this token/secret pair to the set of ways we can recover a disk encryption key. + * Changing the token/secret for a disk encryption key is done in two phases: first, adding + * a new token/secret pair with this call, then delting all other pairs with + * fixateNewestUserKeyAuth. This allows other places where a credential is used, such as + * Gatekeeper, to be updated between the two calls. + */ + @Override + public void addUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) { + enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); + waitForReady(); + + try { + mCryptConnector.execute("cryptfs", "add_user_key_auth", userId, serialNumber, + encodeBytes(token), encodeBytes(secret)); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + + /* + * Delete all disk encryption token/secret pairs except the most recently added one + */ @Override - public void changeUserKey(int userId, int serialNumber, - byte[] token, byte[] oldSecret, byte[] newSecret) { + public void fixateNewestUserKeyAuth(int userId) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); waitForReady(); try { - mCryptConnector.execute("cryptfs", "change_user_key", userId, serialNumber, - encodeBytes(token), encodeBytes(oldSecret), encodeBytes(newSecret)); + mCryptConnector.execute("cryptfs", "fixate_newest_user_key_auth", userId); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index 22f01abc951f..f2368779336d 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -556,7 +556,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub // chain. if (DBG) Slog.d(TAG, "Pushing " + size + " active firewall " + name + "UID rules"); for (int i = 0; i < rules.size(); i++) { - setFirewallUidRuleInternal(chain, rules.keyAt(i), rules.valueAt(i)); + setFirewallUidRuleLocked(chain, rules.keyAt(i), rules.valueAt(i)); } } } @@ -1850,6 +1850,22 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override + public void setAllowOnlyVpnForUids(boolean add, UidRange[] uidRanges) + throws ServiceSpecificException { + try { + mNetdService.networkRejectNonSecureVpn(add, uidRanges); + } catch (ServiceSpecificException e) { + Log.w(TAG, "setAllowOnlyVpnForUids(" + add + ", " + Arrays.toString(uidRanges) + ")" + + ": netd command failed", e); + throw e; + } catch (RemoteException e) { + Log.w(TAG, "setAllowOnlyVpnForUids(" + add + ", " + Arrays.toString(uidRanges) + ")" + + ": netd command failed", e); + throw e.rethrowAsRuntimeException(); + } + } + + @Override public void setUidCleartextNetworkPolicy(int uid, int policy) { if (Binder.getCallingUid() != uid) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); @@ -2240,7 +2256,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub for (int index = uids.length - 1; index >= 0; --index) { int uid = uids[index]; int rule = rules[index]; - setFirewallUidRule(chain, uid, rule); + updateFirewallUidRuleLocked(chain, uid, rule); newRules.put(uid, rule); } // collect the rules to remove. @@ -2254,7 +2270,25 @@ public class NetworkManagementService extends INetworkManagementService.Stub // remove dead rules for (int index = rulesToRemove.size() - 1; index >= 0; --index) { int uid = rulesToRemove.keyAt(index); - setFirewallUidRuleInternal(chain, uid, FIREWALL_RULE_DEFAULT); + updateFirewallUidRuleLocked(chain, uid, FIREWALL_RULE_DEFAULT); + } + try { + switch (chain) { + case FIREWALL_CHAIN_DOZABLE: + mNetdService.firewallReplaceUidChain("fw_dozable", true, uids); + break; + case FIREWALL_CHAIN_STANDBY: + mNetdService.firewallReplaceUidChain("fw_standby", false, uids); + break; + case FIREWALL_CHAIN_POWERSAVE: + mNetdService.firewallReplaceUidChain("fw_powersave", true, uids); + break; + case FIREWALL_CHAIN_NONE: + default: + Slog.d(TAG, "setFirewallUidRules() called on invalid chain: " + chain); + } + } catch (RemoteException e) { + Slog.w(TAG, "Error flushing firewall chain " + chain, e); } } } @@ -2262,44 +2296,48 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setFirewallUidRule(int chain, int uid, int rule) { enforceSystemUid(); - setFirewallUidRuleInternal(chain, uid, rule); - } - - private void setFirewallUidRuleInternal(int chain, int uid, int rule) { synchronized (mQuotaLock) { - SparseIntArray uidFirewallRules = getUidFirewallRules(chain); - - final int oldUidFirewallRule = uidFirewallRules.get(uid, FIREWALL_RULE_DEFAULT); - if (DBG) { - Slog.d(TAG, "oldRule = " + oldUidFirewallRule - + ", newRule=" + rule + " for uid=" + uid + " on chain " + chain); - } - if (oldUidFirewallRule == rule) { - if (DBG) Slog.d(TAG, "!!!!! Skipping change"); - // TODO: eventually consider throwing - return; - } + setFirewallUidRuleLocked(chain, uid, rule); + } + } + private void setFirewallUidRuleLocked(int chain, int uid, int rule) { + if (updateFirewallUidRuleLocked(chain, uid, rule)) { try { - String ruleName = getFirewallRuleName(chain, rule); - String oldRuleName = getFirewallRuleName(chain, oldUidFirewallRule); - - if (rule == NetworkPolicyManager.FIREWALL_RULE_DEFAULT) { - uidFirewallRules.delete(uid); - } else { - uidFirewallRules.put(uid, rule); - } - - if (!ruleName.equals(oldRuleName)) { - mConnector.execute("firewall", "set_uid_rule", getFirewallChainName(chain), uid, - ruleName); - } + mConnector.execute("firewall", "set_uid_rule", getFirewallChainName(chain), uid, + getFirewallRuleName(chain, rule)); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } } } + // TODO: now that netd supports batching, NMS should not keep these data structures anymore... + private boolean updateFirewallUidRuleLocked(int chain, int uid, int rule) { + SparseIntArray uidFirewallRules = getUidFirewallRules(chain); + + final int oldUidFirewallRule = uidFirewallRules.get(uid, FIREWALL_RULE_DEFAULT); + if (DBG) { + Slog.d(TAG, "oldRule = " + oldUidFirewallRule + + ", newRule=" + rule + " for uid=" + uid + " on chain " + chain); + } + if (oldUidFirewallRule == rule) { + if (DBG) Slog.d(TAG, "!!!!! Skipping change"); + // TODO: eventually consider throwing + return false; + } + + String ruleName = getFirewallRuleName(chain, rule); + String oldRuleName = getFirewallRuleName(chain, oldUidFirewallRule); + + if (rule == NetworkPolicyManager.FIREWALL_RULE_DEFAULT) { + uidFirewallRules.delete(uid); + } else { + uidFirewallRules.put(uid, rule); + } + return !ruleName.equals(oldRuleName); + } + private @NonNull String getFirewallRuleName(int chain, int rule) { String ruleName; if (getFirewallType(chain) == FIREWALL_TYPE_WHITELIST) { diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 36f51fcca1f8..95dee019dfa9 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -2805,28 +2805,63 @@ public final class ActiveServices { /** * Prints a list of ServiceRecords (dumpsys activity services) */ - void dumpServicesLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) { - boolean needSep = false; - boolean printedAnything = false; + List<ServiceRecord> collectServicesToDumpLocked(ItemMatcher matcher, String dumpPackage) { + final ArrayList<ServiceRecord> services = new ArrayList<>(); + final int[] users = mAm.mUserController.getUsers(); + for (int user : users) { + ServiceMap smap = getServiceMap(user); + if (smap.mServicesByName.size() > 0) { + for (int si=0; si<smap.mServicesByName.size(); si++) { + ServiceRecord r = smap.mServicesByName.valueAt(si); + if (!matcher.match(r, r.name)) { + continue; + } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + services.add(r); + } + } + } - ItemMatcher matcher = new ItemMatcher(); - matcher.build(args, opti); + return services; + } - pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)"); - try { - if (mLastAnrDump != null) { - pw.println(" Last ANR service:"); - pw.print(mLastAnrDump); - pw.println(); - } - int[] users = mAm.mUserController.getUsers(); + final class ServiceDumper { + private final FileDescriptor fd; + private final PrintWriter pw; + private final String[] args; + private final int opti; + private final boolean dumpAll; + private final String dumpPackage; + private final ItemMatcher matcher; + private final ArrayList<ServiceRecord> services = new ArrayList<>(); + + private final long nowReal = SystemClock.elapsedRealtime(); + + private boolean needSep = false; + private boolean printedAnything = false; + private boolean printed = false; + + /** + * Note: do not call directly, use {@link #newServiceDumperLocked} instead (this + * must be called with the lock held). + */ + ServiceDumper(FileDescriptor fd, PrintWriter pw, String[] args, + int opti, boolean dumpAll, String dumpPackage) { + this.fd = fd; + this.pw = pw; + this.args = args; + this.opti = opti; + this.dumpAll = dumpAll; + this.dumpPackage = dumpPackage; + matcher = new ItemMatcher(); + matcher.build(args, opti); + + final int[] users = mAm.mUserController.getUsers(); for (int user : users) { ServiceMap smap = getServiceMap(user); - boolean printed = false; if (smap.mServicesByName.size() > 0) { - long nowReal = SystemClock.elapsedRealtime(); - needSep = false; for (int si=0; si<smap.mServicesByName.size(); si++) { ServiceRecord r = smap.mServicesByName.valueAt(si); if (!matcher.match(r, r.name)) { @@ -2835,215 +2870,325 @@ public final class ActiveServices { if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { continue; } - if (!printed) { - if (printedAnything) { - pw.println(); - } - pw.println(" User " + user + " active services:"); - printed = true; - } - printedAnything = true; - if (needSep) { - pw.println(); - } - pw.print(" * "); - pw.println(r); - if (dumpAll) { - r.dump(pw, " "); - needSep = true; - } else { - pw.print(" app="); - pw.println(r.app); - pw.print(" created="); - TimeUtils.formatDuration(r.createTime, nowReal, pw); - pw.print(" started="); - pw.print(r.startRequested); - pw.print(" connections="); - pw.println(r.connections.size()); - if (r.connections.size() > 0) { - pw.println(" Connections:"); - for (int conni=0; conni<r.connections.size(); conni++) { - ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni); - for (int i = 0; i < clist.size(); i++) { - ConnectionRecord conn = clist.get(i); - pw.print(" "); - pw.print(conn.binding.intent.intent.getIntent() - .toShortString(false, false, false, false)); - pw.print(" -> "); - ProcessRecord proc = conn.binding.client; - pw.println(proc != null ? proc.toShortString() : "null"); - } - } - } - } - if (dumpClient && r.app != null && r.app.thread != null) { - pw.println(" Client:"); - pw.flush(); - try { - TransferPipe tp = new TransferPipe(); - try { - r.app.thread.dumpService(tp.getWriteFd().getFileDescriptor(), - r, args); - tp.setBufferPrefix(" "); - // Short timeout, since blocking here can - // deadlock with the application. - tp.go(fd, 2000); - } finally { - tp.kill(); - } - } catch (IOException e) { - pw.println(" Failure while dumping the service: " + e); - } catch (RemoteException e) { - pw.println(" Got a RemoteException while dumping the service"); - } - needSep = true; - } + services.add(r); } - needSep |= printed; } - printed = false; - for (int si=0, SN=smap.mDelayedStartList.size(); si<SN; si++) { - ServiceRecord r = smap.mDelayedStartList.get(si); - if (!matcher.match(r, r.name)) { - continue; - } - if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { - continue; + } + } + + private void dumpHeaderLocked() { + pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)"); + if (mLastAnrDump != null) { + pw.println(" Last ANR service:"); + pw.print(mLastAnrDump); + pw.println(); + } + } + + void dumpLocked() { + dumpHeaderLocked(); + + try { + int[] users = mAm.mUserController.getUsers(); + for (int user : users) { + // Find the first service for this user. + int serviceIdx = 0; + while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) { + serviceIdx++; } - if (!printed) { - if (printedAnything) { - pw.println(); + printed = false; + if (serviceIdx < services.size()) { + needSep = false; + while (serviceIdx < services.size()) { + ServiceRecord r = services.get(serviceIdx); + serviceIdx++; + if (r.userId != user) { + break; + } + dumpServiceLocalLocked(r); } - pw.println(" User " + user + " delayed start services:"); - printed = true; + needSep |= printed; } - printedAnything = true; - pw.print(" * Delayed start "); pw.println(r); + + dumpUserRemainsLocked(user); } - printed = false; - for (int si=0, SN=smap.mStartingBackground.size(); si<SN; si++) { - ServiceRecord r = smap.mStartingBackground.get(si); - if (!matcher.match(r, r.name)) { - continue; - } - if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { - continue; + } catch (Exception e) { + Slog.w(TAG, "Exception in dumpServicesLocked", e); + } + + dumpRemainsLocked(); + } + + void dumpWithClient() { + synchronized(mAm) { + dumpHeaderLocked(); + } + + try { + int[] users = mAm.mUserController.getUsers(); + for (int user : users) { + // Find the first service for this user. + int serviceIdx = 0; + while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) { + serviceIdx++; } - if (!printed) { - if (printedAnything) { - pw.println(); + printed = false; + if (serviceIdx < services.size()) { + needSep = false; + while (serviceIdx < services.size()) { + ServiceRecord r = services.get(serviceIdx); + serviceIdx++; + if (r.userId != user) { + break; + } + synchronized(mAm) { + dumpServiceLocalLocked(r); + } + dumpServiceClient(r); } - pw.println(" User " + user + " starting in background:"); - printed = true; + needSep |= printed; + } + + synchronized(mAm) { + dumpUserRemainsLocked(user); } - printedAnything = true; - pw.print(" * Starting bg "); pw.println(r); } + } catch (Exception e) { + Slog.w(TAG, "Exception in dumpServicesLocked", e); + } + + synchronized(mAm) { + dumpRemainsLocked(); } - } catch (Exception e) { - Slog.w(TAG, "Exception in dumpServicesLocked", e); } - if (mPendingServices.size() > 0) { - boolean printed = false; - for (int i=0; i<mPendingServices.size(); i++) { - ServiceRecord r = mPendingServices.get(i); - if (!matcher.match(r, r.name)) { - continue; + private void dumpUserHeaderLocked(int user) { + if (!printed) { + if (printedAnything) { + pw.println(); } - if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { - continue; + pw.println(" User " + user + " active services:"); + printed = true; + } + printedAnything = true; + if (needSep) { + pw.println(); + } + } + + private void dumpServiceLocalLocked(ServiceRecord r) { + dumpUserHeaderLocked(r.userId); + pw.print(" * "); + pw.println(r); + if (dumpAll) { + r.dump(pw, " "); + needSep = true; + } else { + pw.print(" app="); + pw.println(r.app); + pw.print(" created="); + TimeUtils.formatDuration(r.createTime, nowReal, pw); + pw.print(" started="); + pw.print(r.startRequested); + pw.print(" connections="); + pw.println(r.connections.size()); + if (r.connections.size() > 0) { + pw.println(" Connections:"); + for (int conni=0; conni<r.connections.size(); conni++) { + ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni); + for (int i = 0; i < clist.size(); i++) { + ConnectionRecord conn = clist.get(i); + pw.print(" "); + pw.print(conn.binding.intent.intent.getIntent() + .toShortString(false, false, false, false)); + pw.print(" -> "); + ProcessRecord proc = conn.binding.client; + pw.println(proc != null ? proc.toShortString() : "null"); + } + } } - printedAnything = true; - if (!printed) { - if (needSep) pw.println(); - needSep = true; - pw.println(" Pending services:"); - printed = true; + } + } + + private void dumpServiceClient(ServiceRecord r) { + final ProcessRecord proc = r.app; + if (proc == null) { + return; + } + final IApplicationThread thread = proc.thread; + if (thread == null) { + return; + } + pw.println(" Client:"); + pw.flush(); + try { + TransferPipe tp = new TransferPipe(); + try { + thread.dumpService(tp.getWriteFd().getFileDescriptor(), r, args); + tp.setBufferPrefix(" "); + // Short timeout, since blocking here can + // deadlock with the application. + tp.go(fd, 2000); + } finally { + tp.kill(); } - pw.print(" * Pending "); pw.println(r); - r.dump(pw, " "); + } catch (IOException e) { + pw.println(" Failure while dumping the service: " + e); + } catch (RemoteException e) { + pw.println(" Got a RemoteException while dumping the service"); } needSep = true; } - if (mRestartingServices.size() > 0) { - boolean printed = false; - for (int i=0; i<mRestartingServices.size(); i++) { - ServiceRecord r = mRestartingServices.get(i); + private void dumpUserRemainsLocked(int user) { + ServiceMap smap = getServiceMap(user); + printed = false; + for (int si=0, SN=smap.mDelayedStartList.size(); si<SN; si++) { + ServiceRecord r = smap.mDelayedStartList.get(si); if (!matcher.match(r, r.name)) { continue; } if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { continue; } - printedAnything = true; if (!printed) { - if (needSep) pw.println(); - needSep = true; - pw.println(" Restarting services:"); + if (printedAnything) { + pw.println(); + } + pw.println(" User " + user + " delayed start services:"); printed = true; } - pw.print(" * Restarting "); pw.println(r); - r.dump(pw, " "); + printedAnything = true; + pw.print(" * Delayed start "); pw.println(r); } - needSep = true; - } - - if (mDestroyingServices.size() > 0) { - boolean printed = false; - for (int i=0; i< mDestroyingServices.size(); i++) { - ServiceRecord r = mDestroyingServices.get(i); + printed = false; + for (int si=0, SN=smap.mStartingBackground.size(); si<SN; si++) { + ServiceRecord r = smap.mStartingBackground.get(si); if (!matcher.match(r, r.name)) { continue; } if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { continue; } - printedAnything = true; if (!printed) { - if (needSep) pw.println(); - needSep = true; - pw.println(" Destroying services:"); + if (printedAnything) { + pw.println(); + } + pw.println(" User " + user + " starting in background:"); printed = true; } - pw.print(" * Destroy "); pw.println(r); - r.dump(pw, " "); + printedAnything = true; + pw.print(" * Starting bg "); pw.println(r); } - needSep = true; } - if (dumpAll) { - boolean printed = false; - for (int ic=0; ic<mServiceConnections.size(); ic++) { - ArrayList<ConnectionRecord> r = mServiceConnections.valueAt(ic); - for (int i=0; i<r.size(); i++) { - ConnectionRecord cr = r.get(i); - if (!matcher.match(cr.binding.service, cr.binding.service.name)) { + private void dumpRemainsLocked() { + if (mPendingServices.size() > 0) { + printed = false; + for (int i=0; i<mPendingServices.size(); i++) { + ServiceRecord r = mPendingServices.get(i); + if (!matcher.match(r, r.name)) { continue; } - if (dumpPackage != null && (cr.binding.client == null - || !dumpPackage.equals(cr.binding.client.info.packageName))) { + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { continue; } printedAnything = true; if (!printed) { if (needSep) pw.println(); needSep = true; - pw.println(" Connection bindings to services:"); + pw.println(" Pending services:"); printed = true; } - pw.print(" * "); pw.println(cr); - cr.dump(pw, " "); + pw.print(" * Pending "); pw.println(r); + r.dump(pw, " "); } + needSep = true; } - } - if (!printedAnything) { - pw.println(" (nothing)"); + if (mRestartingServices.size() > 0) { + printed = false; + for (int i=0; i<mRestartingServices.size(); i++) { + ServiceRecord r = mRestartingServices.get(i); + if (!matcher.match(r, r.name)) { + continue; + } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + printedAnything = true; + if (!printed) { + if (needSep) pw.println(); + needSep = true; + pw.println(" Restarting services:"); + printed = true; + } + pw.print(" * Restarting "); pw.println(r); + r.dump(pw, " "); + } + needSep = true; + } + + if (mDestroyingServices.size() > 0) { + printed = false; + for (int i=0; i< mDestroyingServices.size(); i++) { + ServiceRecord r = mDestroyingServices.get(i); + if (!matcher.match(r, r.name)) { + continue; + } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + printedAnything = true; + if (!printed) { + if (needSep) pw.println(); + needSep = true; + pw.println(" Destroying services:"); + printed = true; + } + pw.print(" * Destroy "); pw.println(r); + r.dump(pw, " "); + } + needSep = true; + } + + if (dumpAll) { + printed = false; + for (int ic=0; ic<mServiceConnections.size(); ic++) { + ArrayList<ConnectionRecord> r = mServiceConnections.valueAt(ic); + for (int i=0; i<r.size(); i++) { + ConnectionRecord cr = r.get(i); + if (!matcher.match(cr.binding.service, cr.binding.service.name)) { + continue; + } + if (dumpPackage != null && (cr.binding.client == null + || !dumpPackage.equals(cr.binding.client.info.packageName))) { + continue; + } + printedAnything = true; + if (!printed) { + if (needSep) pw.println(); + needSep = true; + pw.println(" Connection bindings to services:"); + printed = true; + } + pw.print(" * "); pw.println(cr); + cr.dump(pw, " "); + } + } + } + + if (!printedAnything) { + pw.println(" (nothing)"); + } } } + ServiceDumper newServiceDumperLocked(FileDescriptor fd, PrintWriter pw, String[] args, + int opti, boolean dumpAll, String dumpPackage) { + return new ServiceDumper(fd, pw, args, opti, dumpAll, dumpPackage); + } + /** * There are three ways to call this: * - no service specified: dump all the services diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index d0ec7ce02bb1..dec5e4184bff 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16,6 +16,7 @@ package com.android.server.am; +import com.android.internal.telephony.TelephonyIntents; import com.google.android.collect.Lists; import com.google.android.collect.Maps; import com.android.internal.R; @@ -169,6 +170,7 @@ import android.os.IBinder; import android.os.IPermissionController; import android.os.IProcessInfoService; import android.os.IProgressListener; +import android.os.LocaleList; import android.os.Looper; import android.os.Message; import android.os.Parcel; @@ -204,7 +206,6 @@ import android.util.ArraySet; import android.util.AtomicFile; import android.util.DebugUtils; import android.util.EventLog; -import android.util.LocaleList; import android.util.Log; import android.util.Pair; import android.util.PrintWriterPrinter; @@ -239,6 +240,7 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; @@ -7050,6 +7052,41 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override + public int sendIntentSender(IIntentSender target, int code, Intent intent, String resolvedType, + IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { + if (target instanceof PendingIntentRecord) { + return ((PendingIntentRecord)target).sendWithResult(code, intent, resolvedType, + finishedReceiver, requiredPermission, options); + } else { + if (intent == null) { + // Weird case: someone has given us their own custom IIntentSender, and now + // they have someone else trying to send to it but of course this isn't + // really a PendingIntent, so there is no base Intent, and the caller isn't + // supplying an Intent... but we never want to dispatch a null Intent to + // a receiver, so um... let's make something up. + Slog.wtf(TAG, "Can't use null intent with direct IIntentSender call"); + intent = new Intent(Intent.ACTION_MAIN); + } + try { + target.send(code, intent, resolvedType, null, requiredPermission, options); + } catch (RemoteException e) { + } + // Platform code can rely on getting a result back when the send is done, but if + // this intent sender is from outside of the system we can't rely on it doing that. + // So instead we don't give it the result receiver, and instead just directly + // report the finish immediately. + if (finishedReceiver != null) { + try { + finishedReceiver.performReceive(intent, 0, + null, null, false, false, UserHandle.getCallingUserId()); + } catch (RemoteException e) { + } + } + return 0; + } + } + + @Override public void cancelIntentSender(IIntentSender sender) { if (!(sender instanceof PendingIntentRecord)) { return; @@ -11088,8 +11125,12 @@ public final class ActivityManagerService extends ActivityManagerNative .getPackageInfo(pkgName, matchFlags, userId); if (pkgInfo != null && !ArrayUtils.isEmpty(pkgInfo.providers)) { for (ProviderInfo provInfo : pkgInfo.providers) { - Log.v(TAG, "Installing " + provInfo); - app.thread.scheduleInstallProvider(provInfo); + if (Objects.equals(provInfo.processName, app.processName)) { + Log.v(TAG, "Installing " + provInfo); + app.thread.scheduleInstallProvider(provInfo); + } else { + Log.v(TAG, "Skipping " + provInfo); + } } } } catch (RemoteException ignored) { @@ -13777,8 +13818,18 @@ public final class ActivityManagerService extends ActivityManagerNative dumpAssociationsLocked(fd, pw, args, opti, true, dumpClient, dumpPackage); } } else if ("services".equals(cmd) || "s".equals(cmd)) { - synchronized (this) { - mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage); + if (dumpClient) { + ActiveServices.ServiceDumper dumper; + synchronized (this) { + dumper = mServices.newServiceDumperLocked(fd, pw, args, opti, true, + dumpPackage); + } + dumper.dumpWithClient(); + } else { + synchronized (this) { + mServices.newServiceDumperLocked(fd, pw, args, opti, true, + dumpPackage).dumpLocked(); + } } } else if ("locks".equals(cmd)) { LockGuard.dump(fd, pw, args); @@ -13800,50 +13851,105 @@ public final class ActivityManagerService extends ActivityManagerNative } // No piece of data specified, dump everything. - synchronized (this) { - dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - mServices.dumpServicesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); + if (dumpClient) { + ActiveServices.ServiceDumper sdumper; + synchronized (this) { + dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + sdumper = mServices.newServiceDumperLocked(fd, pw, args, opti, dumpAll, + dumpPackage); } - dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + sdumper.dumpWithClient(); pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); - if (mAssociations.size() > 0) { + synchronized (this) { + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); + if (mAssociations.size() > 0) { + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); + } pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); + dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage); } - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); + + } else { + synchronized (this) { + dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpPermissionsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + mServices.newServiceDumperLocked(fd, pw, args, opti, dumpAll, dumpPackage) + .dumpLocked(); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpRecentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); + if (mAssociations.size() > 0) { + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); + } + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage); } - dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage); } Binder.restoreCallingIdentity(origId); } @@ -16148,8 +16254,8 @@ public final class ActivityManagerService extends ActivityManagerNative catPw.println(); dumpProcessesLocked(null, catPw, emptyArgs, 0, false, null); catPw.println(); - mServices.dumpServicesLocked(null, catPw, emptyArgs, 0, - false, false, null); + mServices.newServiceDumperLocked(null, catPw, emptyArgs, 0, + false, null).dumpLocked(); catPw.println(); dumpActivitiesLocked(null, catPw, emptyArgs, 0, false, false, null); catPw.flush(); @@ -17252,7 +17358,8 @@ public final class ActivityManagerService extends ActivityManagerNative || Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS.equals(action) || AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(action) || AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) - || LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action)) { + || LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action) + || TelephonyIntents.ACTION_REQUEST_OMADM_CONFIGURATION_UPDATE.equals(action)) { // Broadcast is either protected, or it's a public action that // we've relaxed, so it's fine for system internals to send. } else { diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index fa69b4a857df..3ccac9e2f1e4 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -202,6 +202,7 @@ final class ActivityRecord { static final int STARTING_WINDOW_SHOWN = 1; static final int STARTING_WINDOW_REMOVED = 2; int mStartingWindowState = STARTING_WINDOW_NOT_SHOWN; + boolean mTaskOverlay = false; // Task is always on-top of other activities in the task. boolean mUpdateTaskThumbnailWhenHidden; ActivityContainer mInitialActivityContainer; @@ -1390,6 +1391,17 @@ final class ActivityRecord { pendingVoiceInteractionStart = false; } + void showStartingWindow(ActivityRecord prev, boolean createIfNeeded) { + final CompatibilityInfo compatInfo = + service.compatibilityInfoForPackageLocked(info.applicationInfo); + final boolean shown = service.mWindowManager.setAppStartingWindow( + appToken, packageName, theme, compatInfo, nonLocalizedLabel, labelRes, icon, + logo, windowFlags, prev != null ? prev.appToken : null, createIfNeeded); + if (shown) { + mStartingWindowState = STARTING_WINDOW_SHOWN; + } + } + void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException { out.attribute(null, ATTR_ID, String.valueOf(createTime)); out.attribute(null, ATTR_LAUNCHEDFROMUID, String.valueOf(launchedFromUid)); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 62d114d1257a..3811b616a7f2 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1725,13 +1725,9 @@ final class ActivityStack { continue; } aboveTop = false; - // mLaunchingBehind: Activities launching behind are at the back of the task stack - // but must be drawn initially for the animation as though they were visible. - final boolean activityVisibleBehind = - (behindTranslucentActivity || stackVisibleBehind) && visibleBehind == r; - final boolean isVisible = (!behindFullscreenActivity || r.mLaunchTaskBehind - || activityVisibleBehind) && okToShowLocked(r); - if (isVisible) { + + if (shouldBeVisible(r, behindTranslucentActivity, stackVisibleBehind, + visibleBehind, behindFullscreenActivity)) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r + " finishing=" + r.finishing + " state=" + r.state); // First: if this is not the current activity being started, make @@ -1819,6 +1815,31 @@ final class ActivityStack { } } + /** Return true if the input activity should be made visible */ + private boolean shouldBeVisible(ActivityRecord r, boolean behindTranslucentActivity, + boolean stackVisibleBehind, ActivityRecord visibleBehind, + boolean behindFullscreenActivity) { + // mLaunchingBehind: Activities launching behind are at the back of the task stack + // but must be drawn initially for the animation as though they were visible. + final boolean activityVisibleBehind = + (behindTranslucentActivity || stackVisibleBehind) && visibleBehind == r; + + if (!okToShowLocked(r)) { + return false; + } + + boolean isVisible = + !behindFullscreenActivity || r.mLaunchTaskBehind || activityVisibleBehind; + + if (isVisible && r.isRecentsActivity()) { + // Recents activity can only be visible if the home stack isn't fullscreen or is the + // focused stack. + isVisible = !mFullscreen || mStackSupervisor.isFocusedStack(this); + } + + return isVisible; + } + private void checkTranslucentActivityWaiting(ActivityRecord top) { if (mTranslucentActivityWaiting != top) { mUndrawnActivitiesBelowTopTranslucent.clear(); @@ -2017,6 +2038,9 @@ final class ActivityStack { void cancelInitializingActivities() { final ActivityRecord topActivity = topRunningActivityLocked(); boolean aboveTop = true; + // We don't want to clear starting window for activities that aren't behind fullscreen + // activities as we need to display their starting window until they are done initializing. + boolean behindFullscreenActivity = false; for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities; for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { @@ -2025,16 +2049,20 @@ final class ActivityStack { if (r == topActivity) { aboveTop = false; } + behindFullscreenActivity |= r.fullscreen; continue; } if (r.state == ActivityState.INITIALIZING - && r.mStartingWindowState == STARTING_WINDOW_SHOWN) { + && r.mStartingWindowState == STARTING_WINDOW_SHOWN + && behindFullscreenActivity) { if (DEBUG_VISIBILITY) Slog.w(TAG_VISIBILITY, "Found orphaned starting window " + r); r.mStartingWindowState = STARTING_WINDOW_REMOVED; mWindowManager.removeAppStartingWindow(r.appToken); } + + behindFullscreenActivity |= r.fullscreen; } } } @@ -2459,12 +2487,7 @@ final class ActivityStack { next.hasBeenLaunched = true; } else if (SHOW_APP_STARTING_PREVIEW && lastStack != null && mStackSupervisor.isFrontStack(lastStack)) { - mWindowManager.setAppStartingWindow( - next.appToken, next.packageName, next.theme, - mService.compatibilityInfoForPackageLocked(next.info.applicationInfo), - next.nonLocalizedLabel, next.labelRes, next.icon, next.logo, - next.windowFlags, null, true); - next.mStartingWindowState = STARTING_WINDOW_SHOWN; + next.showStartingWindow(null, true); } mStackSupervisor.startSpecificActivityLocked(next, true, false); if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); @@ -2490,14 +2513,7 @@ final class ActivityStack { next.hasBeenLaunched = true; } else { if (SHOW_APP_STARTING_PREVIEW) { - mWindowManager.setAppStartingWindow( - next.appToken, next.packageName, next.theme, - mService.compatibilityInfoForPackageLocked( - next.info.applicationInfo), - next.nonLocalizedLabel, - next.labelRes, next.icon, next.logo, next.windowFlags, - null, true); - next.mStartingWindowState = STARTING_WINDOW_SHOWN; + next.showStartingWindow(null, true); } if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next); } @@ -2712,7 +2728,7 @@ final class ActivityStack { // "has the same starting icon" as the next one. This allows the // window manager to keep the previous window it had previously // created, if it still had one. - ActivityRecord prev = mResumedActivity; + ActivityRecord prev = r.task.topRunningActivityWithStartingWindowLocked(); if (prev != null) { // We don't want to reuse the previous starting preview if: // (1) The current activity is in a different task. @@ -2724,13 +2740,7 @@ final class ActivityStack { prev = null; } } - mWindowManager.setAppStartingWindow( - r.appToken, r.packageName, r.theme, - mService.compatibilityInfoForPackageLocked( - r.info.applicationInfo), r.nonLocalizedLabel, - r.labelRes, r.icon, r.logo, r.windowFlags, - prev != null ? prev.appToken : null, showStartingIcon); - r.mStartingWindowState = STARTING_WINDOW_SHOWN; + r.showStartingWindow(prev, showStartingIcon); } } else { // If this is the first activity, don't do any fancy animations, @@ -4383,14 +4393,49 @@ final class ActivityStack { } /** - * Make sure the given activity matches the current configuration. Returns - * false if the activity had to be destroyed. Returns true if the - * configuration is the same, or the activity will remain running as-is - * for whatever reason. Ensures the HistoryRecord is updated with the + * Ensures all visible activities at or below the input activity have the right configuration. + */ + void ensureVisibleActivitiesConfigurationLocked(ActivityRecord start, boolean preserveWindow) { + if (start == null || !start.visible) { + return; + } + + final TaskRecord startTask = start.task; + boolean behindFullscreen = false; + boolean updatedConfig = false; + + for (int taskIndex = mTaskHistory.indexOf(startTask); taskIndex >= 0; --taskIndex) { + final TaskRecord task = mTaskHistory.get(taskIndex); + final ArrayList<ActivityRecord> activities = task.mActivities; + int activityIndex = + (start.task == task) ? activities.indexOf(start) : activities.size() - 1; + for (; activityIndex >= 0; --activityIndex) { + final ActivityRecord r = activities.get(activityIndex); + updatedConfig |= ensureActivityConfigurationLocked(r, 0, preserveWindow); + if (r.fullscreen) { + behindFullscreen = true; + break; + } + } + if (behindFullscreen) { + break; + } + } + if (updatedConfig) { + // Ensure the resumed state of the focus activity if we updated the confiugaration of + // any activity. + mStackSupervisor.resumeFocusedStackTopActivityLocked(); + } + } + + /** + * Make sure the given activity matches the current configuration. Returns false if the activity + * had to be destroyed. Returns true if the configuration is the same, or the activity will + * remain running as-is for whatever reason. Ensures the HistoryRecord is updated with the * correct configuration and all other bookkeeping is handled. */ - final boolean ensureActivityConfigurationLocked(ActivityRecord r, int globalChanges, - boolean preserveWindow) { + boolean ensureActivityConfigurationLocked( + ActivityRecord r, int globalChanges, boolean preserveWindow) { if (mConfigWillChange) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Skipping config check (will change): " + r); @@ -4878,8 +4923,8 @@ final class ActivityStack { " Task id #" + task.taskId + "\n" + " mFullscreen=" + task.mFullscreen + "\n" + " mBounds=" + task.mBounds + "\n" + - " mMinimalWidth=" + task.mMinimalWidth + "\n" + - " mMinimalHeight=" + task.mMinimalHeight + "\n" + + " mMinWidth=" + task.mMinWidth + "\n" + + " mMinHeight=" + task.mMinHeight + "\n" + " mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds); if (printed) { header = null; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e86ba22c5bd2..01b2eb4607eb 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -123,7 +123,6 @@ import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; -import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; @@ -410,7 +409,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // The default minimal size that will be used if the activity doesn't specify its minimal size. // It will be calculated when the default display gets added. - int mDefaultMinimalSizeOfResizeableTask = -1; + int mDefaultMinSizeOfResizeableTask = -1; // Whether tasks have moved and we need to rank the tasks before next OOM scoring private boolean mTaskLayersChanged = true; @@ -2014,8 +2013,8 @@ public final class ActivityStackSupervisor implements DisplayListener { try { resizeStackUncheckedLocked(stack, bounds, tempTaskBounds, tempTaskInsetBounds); if (!deferResume) { - ensureConfigurationAndResume( - stack, stack.topRunningActivityLocked(), preserveWindows); + stack.ensureVisibleActivitiesConfigurationLocked( + stack.topRunningActivityLocked(), preserveWindows); } } finally { mWindowManager.continueSurfaceLayout(); @@ -2091,18 +2090,6 @@ public final class ActivityStackSupervisor implements DisplayListener { stack.setBounds(bounds); } - private void ensureConfigurationAndResume(ActivityStack stack, ActivityRecord r, - boolean preserveWindows) { - if (r == null || !r.visible) { - return; - } - final boolean updated = stack.ensureActivityConfigurationLocked(r, 0, - preserveWindows); - if (!updated) { - resumeFocusedStackTopActivityLocked(); - } - } - void moveTasksToFullscreenStackLocked(int fromStackId, boolean onTop) { final ActivityStack stack = getStack(fromStackId); if (stack == null) { @@ -2204,7 +2191,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } } } - ensureConfigurationAndResume(stack, r, preserveWindows); + stack.ensureVisibleActivitiesConfigurationLocked(r, preserveWindows); } finally { mAllowDockedStackResize = true; mWindowManager.continueSurfaceLayout(); @@ -2230,7 +2217,7 @@ public final class ActivityStackSupervisor implements DisplayListener { ActivityRecord r = stack.topRunningActivityLocked(); resizeStackUncheckedLocked(stack, pinnedBounds, tempPinnedTaskBounds, null); - ensureConfigurationAndResume(stack, r, false); + stack.ensureVisibleActivitiesConfigurationLocked(r, false); } finally { mWindowManager.continueSurfaceLayout(); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); @@ -3388,7 +3375,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } private void calculateDefaultMinimalSizeOfResizeableTasks(ActivityDisplay display) { - mDefaultMinimalSizeOfResizeableTask = + mDefaultMinSizeOfResizeableTask = mService.mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.default_minimal_size_resizable_task); } @@ -3418,12 +3405,16 @@ public final class ActivityStackSupervisor implements DisplayListener { } private StackInfo getStackInfoLocked(ActivityStack stack) { + final ActivityDisplay display = mActivityDisplays.get(Display.DEFAULT_DISPLAY); StackInfo info = new StackInfo(); mWindowManager.getStackBounds(stack.mStackId, info.bounds); info.displayId = Display.DEFAULT_DISPLAY; info.stackId = stack.mStackId; info.userId = stack.mCurrentUser; info.visible = stack.getStackVisibilityLocked(null) == STACK_VISIBLE; + info.position = display != null + ? display.mStacks.indexOf(stack) + : 0; ArrayList<TaskRecord> tasks = stack.getAllTasks(); final int numTasks = tasks.size(); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 7641827425f1..ad57ae2cecb3 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -620,6 +620,10 @@ class ActivityStarter { .getSystemService(Context.KEYGUARD_SERVICE); final Intent credential = km.createConfirmDeviceCredentialIntent(null, null, userId); + // For safety, check null here in case users changed the setting after the checking. + if (credential == null) { + return; + } final ActivityRecord activityRecord = targetStack.topRunningActivityLocked(); if (activityRecord != null) { final IIntentSender target = mService.getIntentSenderLocked( @@ -1120,17 +1124,23 @@ class ActivityStarter { // activity. mService.setFocusedActivityLocked(mStartActivity, "startedActivity"); } - if (mTargetStack.isFocusable()) { - mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity, - mOptions); - } else { + final ActivityRecord topTaskActivity = mStartActivity.task.topRunningActivityLocked(); + if (!mTargetStack.isFocusable() + || (topTaskActivity != null && topTaskActivity.mTaskOverlay + && mStartActivity != topTaskActivity)) { // If the activity is not focusable, we can't resume it, but still would like to // make sure it becomes visible as it starts (this will also trigger entry // animation). An example of this are PIP activities. + // Also, we don't want to resume activities in a task that currently has an overlay + // as the starting activity just needs to be in the visible paused state until the + // over is removed. mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); // Go ahead and tell window manager to execute app transition for this activity // since the app transition will not be triggered through the resume channel. mWindowManager.executeAppTransition(); + } else { + mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity, + mOptions); } } else { mTargetStack.addRecentActivityLocked(mStartActivity); @@ -1197,7 +1207,8 @@ class ActivityStarter { mDoResume = false; } - if (mOptions != null && mOptions.getLaunchTaskId() != -1 && mOptions.getAvoidMoveToFront()) { + if (mOptions != null && mOptions.getLaunchTaskId() != -1 && mOptions.getTaskOverlay()) { + r.mTaskOverlay = true; final TaskRecord task = mSupervisor.anyTaskForIdLocked(mOptions.getLaunchTaskId()); final ActivityRecord top = task != null ? task.getTopActivity() : null; if (top != null && !top.visible) { diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 96934f064383..b4df10f51691 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -1323,55 +1323,60 @@ public final class BatteryStatsService extends IBatteryStats.Stub delta.mTimestamp = latest.getTimeStamp(); delta.mStackState = latest.getStackState(); - // These times seem to be the most reliable. - delta.mControllerTxTimeMs = latest.mControllerTxTimeMs - lastTxMs; - delta.mControllerRxTimeMs = latest.mControllerRxTimeMs - lastRxMs; - - // WiFi calculates the idle time as a difference from the on time and the various - // Rx + Tx times. There seems to be some missing time there because this sometimes - // becomes negative. Just cap it at 0 and move on. - // b/21613534 - delta.mControllerIdleTimeMs = Math.max(0, latest.mControllerIdleTimeMs - lastIdleMs); - delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); - - if (delta.mControllerTxTimeMs < 0 || delta.mControllerRxTimeMs < 0) { + final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs; + final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs; + final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; + + if (txTimeMs < 0 || rxTimeMs < 0) { // The stats were reset by the WiFi system (which is why our delta is negative). // Returns the unaltered stats. delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; - Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); - } - - // There is some accuracy error in reports so allow some slop in the results. - final long SAMPLE_ERROR_MILLIS = 750; - final long totalTimeMs = delta.mControllerIdleTimeMs + delta.mControllerRxTimeMs + - delta.mControllerTxTimeMs; - if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) { - StringBuilder sb = new StringBuilder(); - sb.append("Total time "); - TimeUtils.formatDuration(totalTimeMs, sb); - sb.append(" is longer than sample period "); - TimeUtils.formatDuration(timePeriodMs, sb); - sb.append(".\n"); - sb.append("Previous WiFi snapshot: ").append("idle="); - TimeUtils.formatDuration(lastIdleMs, sb); - sb.append(" rx="); - TimeUtils.formatDuration(lastRxMs, sb); - sb.append(" tx="); - TimeUtils.formatDuration(lastTxMs, sb); - sb.append(" e=").append(lastEnergy); - sb.append("\n"); - sb.append("Current WiFi snapshot: ").append("idle="); - TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); - sb.append(" rx="); - TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); - sb.append(" tx="); - TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); - sb.append(" e=").append(latest.mControllerEnergyUsed); - Slog.wtf(TAG, sb.toString()); + } else { + final long totalActiveTimeMs = txTimeMs + rxTimeMs; + long maxExpectedIdleTimeMs; + // Active time can never be greater than the total time, the stats received seem + // to be corrupt. + if (totalActiveTimeMs > timePeriodMs) { + maxExpectedIdleTimeMs = timePeriodMs; + StringBuilder sb = new StringBuilder(); + sb.append("Total Active time "); + TimeUtils.formatDuration(totalActiveTimeMs, sb); + sb.append(" is longer than sample period "); + TimeUtils.formatDuration(timePeriodMs, sb); + sb.append(".\n"); + sb.append("Previous WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(lastIdleMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(lastRxMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(lastTxMs, sb); + sb.append(" e=").append(lastEnergy); + sb.append("\n"); + sb.append("Current WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); + sb.append(" e=").append(latest.mControllerEnergyUsed); + Slog.wtf(TAG, sb.toString()); + } else { + maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; + } + // These times seem to be the most reliable. + delta.mControllerTxTimeMs = txTimeMs; + delta.mControllerRxTimeMs = rxTimeMs; + // WiFi calculates the idle time as a difference from the on time and the various + // Rx + Tx times. There seems to be some missing time there because this sometimes + // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle + // time from the difference in timestamps. + // b/21613534 + delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)); + delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); } mLastInfo = latest; diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 1222f54d15e8..0acc2a07e153 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -38,7 +38,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Build; import android.os.Bundle; -import android.os.DeadObjectException; import android.os.Handler; import android.os.IBinder; import android.os.Looper; diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index b8f45bc342a8..1f8d26bc55d0 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -198,16 +198,21 @@ final class PendingIntentRecord extends IIntentSender.Stub { ref = new WeakReference<PendingIntentRecord>(this); } - public int send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, - String requiredPermission, Bundle options) throws TransactionTooLargeException { + public void send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, + String requiredPermission, Bundle options) { + sendInner(code, intent, resolvedType, finishedReceiver, + requiredPermission, null, null, 0, 0, 0, options, null); + } + + public int sendWithResult(int code, Intent intent, String resolvedType, + IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { return sendInner(code, intent, resolvedType, finishedReceiver, requiredPermission, null, null, 0, 0, 0, options, null); } int sendInner(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, IBinder resultTo, String resultWho, int requestCode, - int flagsMask, int flagsValues, Bundle options, IActivityContainer container) - throws TransactionTooLargeException { + int flagsMask, int flagsValues, Bundle options, IActivityContainer container) { if (intent != null) intent.setDefusable(true); if (options != null) options.setDefusable(true); @@ -253,6 +258,7 @@ final class PendingIntentRecord extends IIntentSender.Stub { if (userId == UserHandle.USER_CURRENT) { userId = owner.mUserController.getCurrentOrTargetUserIdLocked(); } + int res = 0; switch (key.type) { case ActivityManager.INTENT_SENDER_ACTIVITY: if (options == null) { @@ -312,21 +318,23 @@ final class PendingIntentRecord extends IIntentSender.Stub { resolvedType, key.packageName, userId); } catch (RuntimeException e) { Slog.w(TAG, "Unable to send startService intent", e); + } catch (TransactionTooLargeException e) { + res = ActivityManager.START_CANCELED; } break; } - if (sendFinish) { + if (sendFinish && res != ActivityManager.START_CANCELED) { try { finishedReceiver.performReceive(new Intent(finalIntent), 0, null, null, false, false, key.userId); } catch (RemoteException e) { } } - + Binder.restoreCallingIdentity(origId); - - return 0; + + return res; } } return ActivityManager.START_CANCELED; diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index af7740f8083a..8e9af40ba924 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -88,6 +88,7 @@ import static com.android.server.am.ActivityManagerService.LOCK_SCREEN_SHOWN; import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN; final class TaskRecord { private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_AM; @@ -126,14 +127,14 @@ final class TaskRecord { private static final String ATTR_RESIZE_MODE = "resize_mode"; private static final String ATTR_PRIVILEGED = "privileged"; private static final String ATTR_NON_FULLSCREEN_BOUNDS = "non_fullscreen_bounds"; - private static final String ATTR_MINIMAL_WIDTH = "minimal_width"; - private static final String ATTR_MINIMAL_HEIGHT = "minimal_height"; + private static final String ATTR_MIN_WIDTH = "min_width"; + private static final String ATTR_MIN_HEIGHT = "min_height"; private static final String TASK_THUMBNAIL_SUFFIX = "_task_thumbnail"; static final int INVALID_TASK_ID = -1; - static final int INVALID_MINIMAL_SIZE = -1; + static final int INVALID_MIN_SIZE = -1; final int taskId; // Unique identifier for this task. String affinity; // The affinity name for this task, or null; may change identity. @@ -259,8 +260,8 @@ final class TaskRecord { Rect mLastNonFullscreenBounds = null; // Minimal width and height of this task when it's resizeable. -1 means it should use the // default minimal width/height. - int mMinimalWidth; - int mMinimalHeight; + int mMinWidth; + int mMinHeight; // Ranking (from top) of this task among all visible tasks. (-1 means it's not visible) // This number will be assigned when we evaluate OOM scores for all visible tasks. @@ -330,7 +331,7 @@ final class TaskRecord { TaskThumbnailInfo lastThumbnailInfo, int taskAffiliation, int prevTaskId, int nextTaskId, int taskAffiliationColor, int callingUid, String callingPackage, int resizeMode, boolean privileged, boolean _realActivitySuspended, - boolean userSetupComplete, int minimalWidth, int minimalHeight) { + boolean userSetupComplete, int minWidth, int minHeight) { mService = service; mFilename = String.valueOf(_taskId) + TASK_THUMBNAIL_SUFFIX + TaskPersister.IMAGE_EXTENSION; @@ -370,8 +371,8 @@ final class TaskRecord { mCallingPackage = callingPackage; mResizeMode = resizeMode; mPrivileged = privileged; - mMinimalWidth = minimalWidth; - mMinimalHeight = minimalHeight; + mMinWidth = minWidth; + mMinHeight = minHeight; } void touchActiveTime() { @@ -480,11 +481,11 @@ final class TaskRecord { /** Sets the original minimal width and height. */ private void setMinDimensions(ActivityInfo info) { if (info != null && info.windowLayout != null) { - mMinimalWidth = info.windowLayout.minimalWidth; - mMinimalHeight = info.windowLayout.minimalHeight; + mMinWidth = info.windowLayout.minWidth; + mMinHeight = info.windowLayout.minHeight; } else { - mMinimalWidth = INVALID_MINIMAL_SIZE; - mMinimalHeight = INVALID_MINIMAL_SIZE; + mMinWidth = INVALID_MIN_SIZE; + mMinHeight = INVALID_MIN_SIZE; } } @@ -685,6 +686,20 @@ final class TaskRecord { return null; } + ActivityRecord topRunningActivityWithStartingWindowLocked() { + if (stack != null) { + for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) { + ActivityRecord r = mActivities.get(activityNdx); + if (r.mStartingWindowState != STARTING_WINDOW_SHOWN + || r.finishing || !stack.okToShowLocked(r)) { + continue; + } + return r; + } + } + return null; + } + void setFrontOfTask() { setFrontOfTask(null); } @@ -760,6 +775,18 @@ final class TaskRecord { // Otherwise make all added activities match this one. r.mActivityType = taskType; } + + final int size = mActivities.size(); + + if (index == size && size > 0) { + final ActivityRecord top = mActivities.get(size - 1); + if (top.mTaskOverlay) { + // Place below the task overlay activity since the overlay activity should always + // be on top. + index--; + } + } + mActivities.add(index, r); updateEffectiveIntent(); if (r.isPersistable()) { @@ -1153,8 +1180,8 @@ final class TaskRecord { out.attribute( null, ATTR_NON_FULLSCREEN_BOUNDS, mLastNonFullscreenBounds.flattenToString()); } - out.attribute(null, ATTR_MINIMAL_WIDTH, String.valueOf(mMinimalWidth)); - out.attribute(null, ATTR_MINIMAL_HEIGHT, String.valueOf(mMinimalHeight)); + out.attribute(null, ATTR_MIN_WIDTH, String.valueOf(mMinWidth)); + out.attribute(null, ATTR_MIN_HEIGHT, String.valueOf(mMinHeight)); if (affinityIntent != null) { out.startTag(null, TAG_AFFINITYINTENT); @@ -1219,8 +1246,8 @@ final class TaskRecord { int resizeMode = RESIZE_MODE_FORCE_RESIZEABLE; boolean privileged = false; Rect bounds = null; - int minimalWidth = INVALID_MINIMAL_SIZE; - int minimalHeight = INVALID_MINIMAL_SIZE; + int minWidth = INVALID_MIN_SIZE; + int minHeight = INVALID_MIN_SIZE; for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { final String attrName = in.getAttributeName(attrNdx); @@ -1288,10 +1315,10 @@ final class TaskRecord { privileged = Boolean.valueOf(attrValue); } else if (ATTR_NON_FULLSCREEN_BOUNDS.equals(attrName)) { bounds = Rect.unflattenFromString(attrValue); - } else if (ATTR_MINIMAL_WIDTH.equals(attrName)) { - minimalWidth = Integer.parseInt(attrValue); - } else if (ATTR_MINIMAL_HEIGHT.equals(attrName)) { - minimalHeight = Integer.parseInt(attrValue); + } else if (ATTR_MIN_WIDTH.equals(attrName)) { + minWidth = Integer.parseInt(attrValue); + } else if (ATTR_MIN_HEIGHT.equals(attrName)) { + minHeight = Integer.parseInt(attrValue); } else { Slog.w(TAG, "TaskRecord: Unknown attribute=" + attrName); } @@ -1352,7 +1379,7 @@ final class TaskRecord { activities, firstActiveTime, lastActiveTime, lastTimeOnTop, neverRelinquishIdentity, taskDescription, thumbnailInfo, taskAffiliation, prevTaskId, nextTaskId, taskAffiliationColor, callingUid, callingPackage, resizeMode, privileged, - realActivitySuspended, userSetupComplete, minimalWidth, minimalHeight); + realActivitySuspended, userSetupComplete, minWidth, minHeight); task.updateOverrideConfiguration(bounds); for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) { @@ -1367,41 +1394,41 @@ final class TaskRecord { if (bounds == null) { return; } - int minimalWidth = mMinimalWidth; - int minimalHeight = mMinimalHeight; + int minWidth = mMinWidth; + int minHeight = mMinHeight; // If the task has no requested minimal size, we'd like to enforce a minimal size // so that the user can not render the task too small to manipulate. We don't need // to do this for the pinned stack as the bounds are controlled by the system. if (stack.mStackId != PINNED_STACK_ID) { - if (minimalWidth == INVALID_MINIMAL_SIZE) { - minimalWidth = mService.mStackSupervisor.mDefaultMinimalSizeOfResizeableTask; + if (minWidth == INVALID_MIN_SIZE) { + minWidth = mService.mStackSupervisor.mDefaultMinSizeOfResizeableTask; } - if (minimalHeight == INVALID_MINIMAL_SIZE) { - minimalHeight = mService.mStackSupervisor.mDefaultMinimalSizeOfResizeableTask; + if (minHeight == INVALID_MIN_SIZE) { + minHeight = mService.mStackSupervisor.mDefaultMinSizeOfResizeableTask; } } - final boolean adjustWidth = minimalWidth > bounds.width(); - final boolean adjustHeight = minimalHeight > bounds.height(); + final boolean adjustWidth = minWidth > bounds.width(); + final boolean adjustHeight = minHeight > bounds.height(); if (!(adjustWidth || adjustHeight)) { return; } if (adjustWidth) { if (mBounds != null && bounds.right == mBounds.right) { - bounds.left = bounds.right - minimalWidth; + bounds.left = bounds.right - minWidth; } else { // Either left bounds match, or neither match, or the previous bounds were // fullscreen and we default to keeping left. - bounds.right = bounds.left + minimalWidth; + bounds.right = bounds.left + minWidth; } } if (adjustHeight) { if (mBounds != null && bounds.bottom == mBounds.bottom) { - bounds.top = bounds.bottom - minimalHeight; + bounds.top = bounds.bottom - minHeight; } else { // Either top bounds match, or neither match, or the previous bounds were // fullscreen and we default to keeping top. - bounds.bottom = bounds.top + minimalHeight; + bounds.bottom = bounds.top + minHeight; } } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index c4e39c940e33..595d086abf35 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1468,7 +1468,7 @@ final class UserController { } final KeyguardManager km = (KeyguardManager) mService.mContext .getSystemService(KEYGUARD_SERVICE); - return km.isDeviceLocked(userId); + return km.isDeviceLocked(userId) && km.isDeviceSecure(userId); } boolean isLockScreenDisabled(@UserIdInt int userId) { diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 6c1e1a703300..32b9429ae656 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -22,6 +22,9 @@ import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNREACHABLE; import android.Manifest; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.PendingIntent; @@ -63,13 +66,14 @@ import android.os.SystemClock; import android.os.SystemService; import android.os.UserHandle; import android.os.UserManager; -import android.provider.Settings; import android.security.Credentials; import android.security.KeyStore; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Log; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; @@ -88,7 +92,10 @@ import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.atomic.AtomicInteger; @@ -119,9 +126,39 @@ public class Vpn { private final Looper mLooper; private final NetworkCapabilities mNetworkCapabilities; - /* list of users using this VPN. */ + /** + * Whether to keep the connection active after rebooting, or upgrading or reinstalling. This + * only applies to {@link VpnService} connections. + */ + private boolean mAlwaysOn = false; + + /** + * Whether to disable traffic outside of this VPN even when the VPN is not connected. System + * apps can still bypass by choosing explicit networks. Has no effect if {@link mAlwaysOn} is + * not set. + */ + private boolean mLockdown = false; + + /** + * List of UIDs that are set to use this VPN by default. Normally, every UID in the user is + * added to this set but that can be changed by adding allowed or disallowed applications. It + * is non-null iff the VPN is connected. + * + * Unless the VPN has set allowBypass=true, these UIDs are forced into the VPN. + * + * @see VpnService.Builder#addAllowedApplication(String) + * @see VpnService.Builder#addDisallowedApplication(String) + */ @GuardedBy("this") - private List<UidRange> mVpnUsers = null; + private Set<UidRange> mVpnUsers = null; + + /** + * List of UIDs for which networking should be blocked until VPN is ready, during brief periods + * when VPN is not running. For example, during system startup or after a crash. + * @see mLockdown + */ + @GuardedBy("this") + private Set<UidRange> mBlockedUsers = new ArraySet<>(); // Handle of user initiating VPN. private final int mUserHandle; @@ -177,9 +214,10 @@ public class Vpn { * manifest guarded by {@link android.Manifest.permission.BIND_VPN_SERVICE}, * otherwise the call will fail. * - * @param newPackage the package to designate as always-on VPN supplier. + * @param packageName the package to designate as always-on VPN supplier. + * @param lockdown whether to prevent traffic outside of a VPN, for example while connecting. */ - public synchronized boolean setAlwaysOnPackage(String packageName) { + public synchronized boolean setAlwaysOnPackage(String packageName, boolean lockdown) { enforceControlPermissionOrInternalCaller(); // Disconnect current VPN. @@ -193,14 +231,9 @@ public class Vpn { prepareInternal(packageName); } - // Save the new package name in Settings.Secure. - final long token = Binder.clearCallingIdentity(); - try { - Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.ALWAYS_ON_VPN_APP, packageName, mUserHandle); - } finally { - Binder.restoreCallingIdentity(token); - } + mAlwaysOn = (packageName != null); + mLockdown = (mAlwaysOn && lockdown); + setVpnForcedLocked(mLockdown); return true; } @@ -212,14 +245,7 @@ public class Vpn { */ public synchronized String getAlwaysOnPackage() { enforceControlPermissionOrInternalCaller(); - - final long token = Binder.clearCallingIdentity(); - try { - return Settings.Secure.getStringForUser(mContext.getContentResolver(), - Settings.Secure.ALWAYS_ON_VPN_APP, mUserHandle); - } finally { - Binder.restoreCallingIdentity(token); - } + return (mAlwaysOn ? mPackage : null); } /** @@ -241,6 +267,11 @@ public class Vpn { * @return true if the operation is succeeded. */ public synchronized boolean prepare(String oldPackage, String newPackage) { + // Stop an existing always-on VPN from being dethroned by other apps. + if (mAlwaysOn && !TextUtils.equals(mPackage, newPackage)) { + return false; + } + if (oldPackage != null) { if (getAppUid(oldPackage, mUserHandle) != mOwnerUID) { // The package doesn't match. We return false (to obtain user consent) unless the @@ -264,11 +295,6 @@ public class Vpn { return true; } - // Stop an existing always-on VPN from being dethroned by other apps. - if (getAlwaysOnPackage() != null) { - return false; - } - // Check that the caller is authorized. enforceControlPermission(); @@ -452,7 +478,7 @@ public class Vpn { mNetworkInfo.setDetailedState(DetailedState.CONNECTING, null, null); NetworkMisc networkMisc = new NetworkMisc(); - networkMisc.allowBypass = mConfig.allowBypass; + networkMisc.allowBypass = mConfig.allowBypass && !mLockdown; long token = Binder.clearCallingIdentity(); try { @@ -467,22 +493,8 @@ public class Vpn { Binder.restoreCallingIdentity(token); } - addVpnUserLocked(mUserHandle); - // If the user can have restricted profiles, assign all its restricted profiles to this VPN - if (canHaveRestrictedProfile(mUserHandle)) { - token = Binder.clearCallingIdentity(); - List<UserInfo> users; - try { - users = UserManager.get(mContext).getUsers(); - } finally { - Binder.restoreCallingIdentity(token); - } - for (UserInfo user : users) { - if (user.isRestricted() && (user.restrictedProfileParentId == mUserHandle)) { - addVpnUserLocked(user.id); - } - } - } + mVpnUsers = createUserAndRestrictedProfilesRanges(mUserHandle, + mConfig.allowedApplications, mConfig.disallowedApplications); mNetworkAgent.addUidRanges(mVpnUsers.toArray(new UidRange[mVpnUsers.size()])); mNetworkInfo.setIsAvailable(true); @@ -568,7 +580,7 @@ public class Vpn { Connection oldConnection = mConnection; NetworkAgent oldNetworkAgent = mNetworkAgent; mNetworkAgent = null; - List<UidRange> oldUsers = mVpnUsers; + Set<UidRange> oldUsers = mVpnUsers; // Configure the interface. Abort if any of these steps fails. ParcelFileDescriptor tun = ParcelFileDescriptor.adoptFd(jniCreate(config.mtu)); @@ -601,8 +613,6 @@ public class Vpn { mConfig = config; // Set up forwarding and DNS rules. - mVpnUsers = new ArrayList<UidRange>(); - agentConnect(); if (oldConnection != null) { @@ -657,44 +667,93 @@ public class Vpn { return uids; } - // Note: This function adds to mVpnUsers but does not publish list to NetworkAgent. - private void addVpnUserLocked(int userHandle) { - if (mVpnUsers == null) { - throw new IllegalStateException("VPN is not active"); + /** + * Creates a {@link Set} of non-intersecting {@link UidRange} objects including all UIDs + * associated with one user, and any restricted profiles attached to that user. + * + * <p>If one of {@param allowedApplications} or {@param disallowedApplications} is provided, + * the UID ranges will match the app whitelist or blacklist specified there. Otherwise, all UIDs + * in each user and profile will be included. + * + * @param userHandle The userId to create UID ranges for along with any of its restricted + * profiles. + * @param allowedApplications (optional) whitelist of applications to include. + * @param disallowedApplications (optional) blacklist of applications to exclude. + */ + @VisibleForTesting + Set<UidRange> createUserAndRestrictedProfilesRanges(@UserIdInt int userHandle, + @Nullable List<String> allowedApplications, + @Nullable List<String> disallowedApplications) { + final Set<UidRange> ranges = new ArraySet<>(); + + // Assign the top-level user to the set of ranges + addUserToRanges(ranges, userHandle, allowedApplications, disallowedApplications); + + // If the user can have restricted profiles, assign all its restricted profiles too + if (canHaveRestrictedProfile(userHandle)) { + final long token = Binder.clearCallingIdentity(); + List<UserInfo> users; + try { + users = UserManager.get(mContext).getUsers(true); + } finally { + Binder.restoreCallingIdentity(token); + } + for (UserInfo user : users) { + if (user.isRestricted() && (user.restrictedProfileParentId == userHandle)) { + addUserToRanges(ranges, user.id, allowedApplications, disallowedApplications); + } + } } + return ranges; + } - if (mConfig.allowedApplications != null) { + /** + * Updates a {@link Set} of non-intersecting {@link UidRange} objects to include all UIDs + * associated with one user. + * + * <p>If one of {@param allowedApplications} or {@param disallowedApplications} is provided, + * the UID ranges will match the app whitelist or blacklist specified there. Otherwise, all UIDs + * in the user will be included. + * + * @param ranges {@link Set} of {@link UidRange}s to which to add. + * @param userHandle The userId to add to {@param ranges}. + * @param allowedApplications (optional) whitelist of applications to include. + * @param disallowedApplications (optional) blacklist of applications to exclude. + */ + @VisibleForTesting + void addUserToRanges(@NonNull Set<UidRange> ranges, @UserIdInt int userHandle, + @Nullable List<String> allowedApplications, + @Nullable List<String> disallowedApplications) { + if (allowedApplications != null) { // Add ranges covering all UIDs for allowedApplications. int start = -1, stop = -1; - for (int uid : getAppsUids(mConfig.allowedApplications, userHandle)) { + for (int uid : getAppsUids(allowedApplications, userHandle)) { if (start == -1) { start = uid; } else if (uid != stop + 1) { - mVpnUsers.add(new UidRange(start, stop)); + ranges.add(new UidRange(start, stop)); start = uid; } stop = uid; } - if (start != -1) mVpnUsers.add(new UidRange(start, stop)); - } else if (mConfig.disallowedApplications != null) { + if (start != -1) ranges.add(new UidRange(start, stop)); + } else if (disallowedApplications != null) { // Add all ranges for user skipping UIDs for disallowedApplications. final UidRange userRange = UidRange.createForUser(userHandle); int start = userRange.start; - for (int uid : getAppsUids(mConfig.disallowedApplications, userHandle)) { + for (int uid : getAppsUids(disallowedApplications, userHandle)) { if (uid == start) { start++; } else { - mVpnUsers.add(new UidRange(start, uid - 1)); + ranges.add(new UidRange(start, uid - 1)); start = uid + 1; } } - if (start <= userRange.stop) mVpnUsers.add(new UidRange(start, userRange.stop)); + if (start <= userRange.stop) ranges.add(new UidRange(start, userRange.stop)); } else { // Add all UIDs for the user. - mVpnUsers.add(UidRange.createForUser(userHandle)); + ranges.add(UidRange.createForUser(userHandle)); } - - prepareStatusIntent(); } // Returns the subset of the full list of active UID ranges the VPN applies to (mVpnUsers) that @@ -703,7 +762,7 @@ public class Vpn { final UidRange userRange = UidRange.createForUser(userHandle); final List<UidRange> ranges = new ArrayList<UidRange>(); for (UidRange range : mVpnUsers) { - if (range.start >= userRange.start && range.stop <= userRange.stop) { + if (userRange.containsRange(range)) { ranges.add(range); } } @@ -719,23 +778,27 @@ public class Vpn { mNetworkAgent.removeUidRanges(ranges.toArray(new UidRange[ranges.size()])); } mVpnUsers.removeAll(ranges); - mStatusIntent = null; } public void onUserAdded(int userHandle) { // If the user is restricted tie them to the parent user's VPN UserInfo user = UserManager.get(mContext).getUserInfo(userHandle); - if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle - && mVpnUsers != null) { + if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle) { synchronized(Vpn.this) { - try { - addVpnUserLocked(userHandle); - if (mNetworkAgent != null) { - final List<UidRange> ranges = uidRangesForUser(userHandle); - mNetworkAgent.addUidRanges(ranges.toArray(new UidRange[ranges.size()])); + if (mVpnUsers != null) { + try { + addUserToRanges(mVpnUsers, userHandle, mConfig.allowedApplications, + mConfig.disallowedApplications); + if (mNetworkAgent != null) { + final List<UidRange> ranges = uidRangesForUser(userHandle); + mNetworkAgent.addUidRanges(ranges.toArray(new UidRange[ranges.size()])); + } + } catch (Exception e) { + Log.wtf(TAG, "Failed to add restricted user to owner", e); } - } catch (Exception e) { - Log.wtf(TAG, "Failed to add restricted user to owner", e); + } + if (mAlwaysOn) { + setVpnForcedLocked(mLockdown); } } } @@ -744,19 +807,101 @@ public class Vpn { public void onUserRemoved(int userHandle) { // clean up if restricted UserInfo user = UserManager.get(mContext).getUserInfo(userHandle); - if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle - && mVpnUsers != null) { + if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle) { synchronized(Vpn.this) { - try { - removeVpnUserLocked(userHandle); - } catch (Exception e) { - Log.wtf(TAG, "Failed to remove restricted user to owner", e); + if (mVpnUsers != null) { + try { + removeVpnUserLocked(userHandle); + } catch (Exception e) { + Log.wtf(TAG, "Failed to remove restricted user to owner", e); + } + } + if (mAlwaysOn) { + setVpnForcedLocked(mLockdown); } } } } /** + * Called when the user associated with this VPN has just been stopped. + */ + public synchronized void onUserStopped() { + // Switch off networking lockdown (if it was enabled) + setVpnForcedLocked(false); + mAlwaysOn = false; + + // Quit any active connections + agentDisconnect(); + } + + /** + * Restrict network access from all UIDs affected by this {@link Vpn}, apart from the VPN + * service app itself, to only sockets that have had {@code protect()} called on them. All + * non-VPN traffic is blocked via a {@code PROHIBIT} response from the kernel. + * + * The exception for the VPN UID isn't technically necessary -- setup should use protected + * sockets -- but in practice it saves apps that don't protect their sockets from breaking. + * + * Calling multiple times with {@param enforce} = {@code true} will recreate the set of UIDs to + * block every time, and if anything has changed update using {@link #setAllowOnlyVpnForUids}. + * + * @param enforce {@code true} to require that all traffic under the jurisdiction of this + * {@link Vpn} goes through a VPN connection or is blocked until one is + * available, {@code false} to lift the requirement. + * + * @see #mBlockedUsers + */ + @GuardedBy("this") + private void setVpnForcedLocked(boolean enforce) { + final Set<UidRange> removedRanges = new ArraySet<>(mBlockedUsers); + if (enforce) { + final Set<UidRange> addedRanges = createUserAndRestrictedProfilesRanges(mUserHandle, + /* allowedApplications */ null, + /* disallowedApplications */ Collections.singletonList(mPackage)); + + removedRanges.removeAll(addedRanges); + addedRanges.removeAll(mBlockedUsers); + + setAllowOnlyVpnForUids(false, removedRanges); + setAllowOnlyVpnForUids(true, addedRanges); + } else { + setAllowOnlyVpnForUids(false, removedRanges); + } + } + + /** + * Either add or remove a list of {@link UidRange}s to the list of UIDs that are only allowed + * to make connections through sockets that have had {@code protect()} called on them. + * + * @param enforce {@code true} to add to the blacklist, {@code false} to remove. + * @param ranges {@link Collection} of {@link UidRange}s to add (if {@param enforce} is + * {@code true}) or to remove. + * @return {@code true} if all of the UIDs were added/removed. {@code false} otherwise, + * including added ranges that already existed or removed ones that didn't. + */ + @GuardedBy("this") + private boolean setAllowOnlyVpnForUids(boolean enforce, Collection<UidRange> ranges) { + if (ranges.size() == 0) { + return true; + } + final UidRange[] rangesArray = ranges.toArray(new UidRange[ranges.size()]); + try { + mNetd.setAllowOnlyVpnForUids(enforce, rangesArray); + } catch (RemoteException | RuntimeException e) { + Log.e(TAG, "Updating blocked=" + enforce + + " for UIDs " + Arrays.toString(ranges.toArray()) + " failed", e); + return false; + } + if (enforce) { + mBlockedUsers.addAll(ranges); + } else { + mBlockedUsers.removeAll(ranges); + } + return true; + } + + /** * Return the configuration of the currently running VPN. */ public VpnConfig getVpnConfig() { @@ -902,7 +1047,22 @@ public class Vpn { return false; } for (UidRange uidRange : mVpnUsers) { - if (uidRange.start <= uid && uid <= uidRange.stop) { + if (uidRange.contains(uid)) { + return true; + } + } + return false; + } + + /** + * @return {@code true} if the set of users blocked whilst waiting for VPN to connect includes + * the UID {@param uid}, {@code false} otherwise. + * + * @see #mBlockedUsers + */ + public synchronized boolean isBlockingUid(int uid) { + for (UidRange uidRange : mBlockedUsers) { + if (uidRange.contains(uid)) { return true; } } @@ -1408,7 +1568,7 @@ public class Vpn { // Now INetworkManagementEventObserver is watching our back. mInterface = mConfig.interfaze; - mVpnUsers = new ArrayList<UidRange>(); + prepareStatusIntent(); agentConnect(); diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index c64901235ebc..0daa8ba57d69 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -18,7 +18,7 @@ package com.android.server.input; import android.annotation.NonNull; import android.annotation.Nullable; -import android.util.LocaleList; +import android.os.LocaleList; import android.view.Display; import com.android.internal.inputmethod.InputMethodSubtypeHandle; import com.android.internal.os.SomeArgs; @@ -219,7 +219,7 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeReloadDeviceAliases(long ptr); private static native String nativeDump(long ptr); private static native void nativeMonitor(long ptr); - private static native void nativeSetPointerIconShape(long ptr, int iconId); + private static native void nativeSetPointerIconType(long ptr, int iconId); private static native void nativeReloadPointerIcons(long ptr); private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon); private static native void nativeSetPointerIconDetached(long ptr, boolean detached); @@ -1691,8 +1691,8 @@ public class InputManagerService extends IInputManager.Stub // Binder call @Override - public void setPointerIconShape(int iconId) { - nativeSetPointerIconShape(mPtr, iconId); + public void setPointerIconType(int iconId) { + nativeSetPointerIconType(mPtr, iconId); } // Binder call diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java index 9fd22686a9a0..7d28633104cd 100644 --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java @@ -178,6 +178,11 @@ public class ConnectivityController extends StateController implements public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) { updateTrackedJobs(uid); } + + @Override + public void onRestrictBackgroundBlacklistChanged(int uid, boolean blacklisted) { + updateTrackedJobs(uid); + } }; @Override diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 4bdc23730fbe..67cd7c32483b 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -266,6 +266,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED = 9; private static final int MSG_UPDATE_INTERFACE_QUOTA = 10; private static final int MSG_REMOVE_INTERFACE_QUOTA = 11; + private static final int MSG_RESTRICT_BACKGROUND_BLACKLIST_CHANGED = 12; private final Context mContext; private final IActivityManager mActivityManager; @@ -1707,9 +1708,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void setUidPolicyUncheckedLocked(int uid, int oldPolicy, int policy, boolean persist) { setUidPolicyUncheckedLocked(uid, policy, persist); + final boolean isBlacklisted = policy == POLICY_REJECT_METERED_BACKGROUND; + mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_BLACKLIST_CHANGED, uid, + isBlacklisted ? 1 : 0).sendToTarget(); + + final boolean wasBlacklisted = oldPolicy == POLICY_REJECT_METERED_BACKGROUND; // Checks if app was added or removed to the blacklist. - if ((oldPolicy == POLICY_NONE && policy == POLICY_REJECT_METERED_BACKGROUND) - || (oldPolicy == POLICY_REJECT_METERED_BACKGROUND && policy == POLICY_NONE)) { + if ((oldPolicy == POLICY_NONE && isBlacklisted) + || (wasBlacklisted && policy == POLICY_NONE)) { mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED, uid, 1, null) .sendToTarget(); } @@ -3096,6 +3102,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } + private void dispatchRestrictBackgroundBlacklistChanged(INetworkPolicyListener listener, + int uid, boolean blacklisted) { + if (listener != null) { + try { + listener.onRestrictBackgroundBlacklistChanged(uid, blacklisted); + } catch (RemoteException ignored) { + } + } + } + private Handler.Callback mHandlerCallback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { @@ -3186,7 +3202,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } mListeners.finishBroadcast(); } - final PackageManager pm = mContext.getPackageManager(); final String[] packages = pm.getPackagesForUid(uid); if (changed && packages != null) { @@ -3202,6 +3217,21 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } return true; } + case MSG_RESTRICT_BACKGROUND_BLACKLIST_CHANGED: { + final int uid = msg.arg1; + final boolean blacklisted = msg.arg2 == 1; + + dispatchRestrictBackgroundBlacklistChanged(mConnectivityListener, uid, + blacklisted); + final int length = mListeners.beginBroadcast(); + for (int i = 0; i < length; i++) { + final INetworkPolicyListener listener = mListeners.getBroadcastItem(i); + dispatchRestrictBackgroundBlacklistChanged(listener, uid, + blacklisted); + } + mListeners.finishBroadcast(); + return true; + } case MSG_ADVISE_PERSIST_THRESHOLD: { final long lowestRule = (Long) msg.obj; try { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 41f62e03feda..fe6ecbd0a770 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -22,7 +22,6 @@ import static android.service.notification.NotificationRankerService.REASON_DELE import static android.service.notification.NotificationRankerService.REASON_DELEGATE_CANCEL_ALL; import static android.service.notification.NotificationRankerService.REASON_DELEGATE_CLICK; import static android.service.notification.NotificationRankerService.REASON_DELEGATE_ERROR; -import static android.service.notification.NotificationRankerService.REASON_GROUP_OPTIMIZATION; import static android.service.notification.NotificationRankerService.REASON_GROUP_SUMMARY_CANCELED; import static android.service.notification.NotificationRankerService.REASON_LISTENER_CANCEL; import static android.service.notification.NotificationRankerService.REASON_LISTENER_CANCEL_ALL; @@ -164,7 +163,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -2221,8 +2219,14 @@ public class NotificationManagerService extends SystemService { int userId = -1; NotificationRecord summaryRecord = null; synchronized (mNotificationList) { - final StatusBarNotification adjustedSbn - = mNotificationsByKey.get(adjustment.getKey()).sbn; + NotificationRecord notificationRecord = + mNotificationsByKey.get(adjustment.getKey()); + if (notificationRecord == null) { + // The notification could have been cancelled again already. A successive + // adjustment will post a summary if needed. + return; + } + final StatusBarNotification adjustedSbn = notificationRecord.sbn; userId = adjustedSbn.getUser().getIdentifier(); ArrayMap<String, String> summaries = mAutobundledSummaries.get(userId); if (summaries == null) { @@ -2666,6 +2670,12 @@ public class NotificationManagerService extends SystemService { int callingUid, int callingPid) { StatusBarNotification sbn = r.sbn; Notification n = sbn.getNotification(); + if (n.isGroupSummary() && !sbn.isAppGroup()) { + // notifications without a group shouldn't be a summary, otherwise autobundling can + // lead to bugs + n.flags &= ~Notification.FLAG_GROUP_SUMMARY; + } + String group = sbn.getGroupKey(); boolean isSummary = n.isGroupSummary(); diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index 1315bcbce278..7c89e9f0ba93 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -176,7 +176,7 @@ public final class NotificationRecord { mRankingTimeMs = calculateRankingTimeMs(previous.getRankingTimeMs()); mCreationTimeMs = previous.mCreationTimeMs; mVisibleSinceMs = previous.mVisibleSinceMs; - if(previous.sbn.getOverrideGroupKey() != null) { + if (previous.sbn.getOverrideGroupKey() != null && !sbn.isAppGroup()) { sbn.setOverrideGroupKey(previous.sbn.getOverrideGroupKey()); } // Don't copy importance information or mGlobalSortKey, recompute them. diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 89747b5f79b7..26a840da094b 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -328,10 +328,11 @@ class PackageDexOptimizer { for (String apkPath : pkg.getAllCodePathsExcludingResourceOnly()) { try { - apkPath = new File(apkPath).getCanonicalPath(); + apkPath = PackageManagerServiceUtils.realpath(new File(apkPath)); } catch (IOException e) { // Log an error but continue without it. Slog.w(TAG, "Failed to get canonical path", e); + continue; } String useMarker = apkPath.replace('/', '@'); final int[] currentUserIds = UserManagerService.getInstance().getUserIds(); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a9ec7dddc534..35bcaa98bd64 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2724,6 +2724,7 @@ public class PackageManagerService extends IPackageManager.Stub { StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } + clearAppProfilesLIF(ps.pkg, UserHandle.USER_ALL); } ver.fingerprint = Build.FINGERPRINT; } @@ -7581,15 +7582,62 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private void destroyAppProfilesLIF(PackageParser.Package pkg) { + private void destroyAppProfilesLIF(PackageParser.Package pkg, int userId) { if (pkg == null) { Slog.wtf(TAG, "Package was null!", new Throwable()); return; } destroyAppProfilesLeafLIF(pkg); + destroyAppReferenceProfileLeafLIF(pkg, userId); final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; for (int i = 0; i < childCount; i++) { destroyAppProfilesLeafLIF(pkg.childPackages.get(i)); + destroyAppReferenceProfileLeafLIF(pkg.childPackages.get(i), userId); + } + } + + private void destroyAppReferenceProfileLeafLIF(PackageParser.Package pkg, int userId) { + if (pkg.isForwardLocked()) { + return; + } + + for (String path : pkg.getAllCodePathsExcludingResourceOnly()) { + try { + path = PackageManagerServiceUtils.realpath(new File(path)); + } catch (IOException e) { + // TODO: Should we return early here ? + Slog.w(TAG, "Failed to get canonical path", e); + continue; + } + + final String useMarker = path.replace('/', '@'); + for (int realUserId : resolveUserIds(userId)) { + File profileDir = Environment.getDataProfilesDeForeignDexDirectory(realUserId); + File foreignUseMark = new File(profileDir, useMarker); + if (foreignUseMark.exists()) { + if (!foreignUseMark.delete()) { + Slog.w(TAG, "Unable to delete foreign user mark for package: " + + pkg.packageName); + } + } + + File[] markers = profileDir.listFiles(); + if (markers != null) { + final String searchString = "@" + pkg.packageName + "@"; + // We also delete all markers that contain the package name we're + // uninstalling. These are associated with secondary dex-files belonging + // to the package. Reconstructing the path of these dex files is messy + // in general. + for (File marker : markers) { + if (marker.getName().indexOf(searchString) > 0) { + if (!marker.delete()) { + Slog.w(TAG, "Unable to delete foreign user mark for package: " + + pkg.packageName); + } + } + } + } + } } } @@ -7601,12 +7649,13 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private void clearAppProfilesLIF(PackageParser.Package pkg) { + private void clearAppProfilesLIF(PackageParser.Package pkg, int userId) { if (pkg == null) { Slog.wtf(TAG, "Package was null!", new Throwable()); return; } clearAppProfilesLeafLIF(pkg); + destroyAppReferenceProfileLeafLIF(pkg, userId); final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; for (int i = 0; i < childCount; i++) { clearAppProfilesLeafLIF(pkg.childPackages.get(i)); @@ -7810,7 +7859,7 @@ public class PackageManagerService extends IPackageManager.Stub { // DELETE_DATA_ON_FAILURES is only used by frozen paths destroyAppDataLIF(pkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); - destroyAppProfilesLIF(pkg); + destroyAppProfilesLIF(pkg, UserHandle.USER_ALL); } } } @@ -14158,7 +14207,7 @@ public class PackageManagerService extends IPackageManager.Stub { clearAppDataLIF(pkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); - clearAppProfilesLIF(pkg); + clearAppProfilesLIF(deletedPackage, UserHandle.USER_ALL); try { final PackageParser.Package newPackage = scanPackageTracedLI(pkg, policyFlags, @@ -14284,7 +14333,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Successfully disabled the old package. Now proceed with re-installation clearAppDataLIF(pkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); - clearAppProfilesLIF(pkg); + clearAppProfilesLIF(deletedPackage, UserHandle.USER_ALL); res.setReturnCode(PackageManager.INSTALL_SUCCEEDED); pkg.setApplicationInfoFlags(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, @@ -15528,7 +15577,7 @@ public class PackageManagerService extends IPackageManager.Stub { } destroyAppDataLIF(resolvedPkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); - destroyAppProfilesLIF(resolvedPkg); + destroyAppProfilesLIF(resolvedPkg, UserHandle.USER_ALL); if (outInfo != null) { outInfo.dataRemoved = true; } @@ -16063,6 +16112,7 @@ public class PackageManagerService extends IPackageManager.Stub { destroyAppDataLIF(pkg, userId, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + destroyAppProfilesLIF(pkg, userId); removeKeystoreDataIfNeeded(nextUserId, ps.appId); schedulePackageCleaning(ps.name, nextUserId, false); synchronized (mPackages) { @@ -16168,7 +16218,7 @@ public class PackageManagerService extends IPackageManager.Stub { try (PackageFreezer freezer = freezePackage(packageName, "clearApplicationProfileData")) { synchronized (mInstallLock) { - clearAppProfilesLIF(pkg); + clearAppProfilesLIF(pkg, UserHandle.USER_ALL); } } } @@ -17500,13 +17550,45 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); throw new IllegalArgumentException( "Unknown component: " + packageName + "/" + className); } - // Allow root and verify that userId is not being specified by a different user - if (!allowedByPermission && !UserHandle.isSameApp(uid, pkgSetting.appId)) { + } + + // Limit who can change which apps + if (!UserHandle.isSameApp(uid, pkgSetting.appId)) { + // Don't allow apps that don't have permission to modify other apps + if (!allowedByPermission) { throw new SecurityException( "Permission Denial: attempt to change component state from pid=" + Binder.getCallingPid() + ", uid=" + uid + ", package uid=" + pkgSetting.appId); } + // Don't allow changing profile and device owners. Calling into DPMS, so no locking. + final DevicePolicyManagerInternal dpmi = LocalServices + .getService(DevicePolicyManagerInternal.class); + if (dpmi != null && dpmi.hasDeviceOwnerOrProfileOwner(packageName, userId)) { + throw new SecurityException("Cannot disable a device owner or a profile owner"); + } + } + + synchronized (mPackages) { + if (uid == Process.SHELL_UID) { + // Shell can only change whole packages between ENABLED and DISABLED_USER states + int oldState = pkgSetting.getEnabled(userId); + if (className == null + && + (oldState == COMPONENT_ENABLED_STATE_DISABLED_USER + || oldState == COMPONENT_ENABLED_STATE_DEFAULT + || oldState == COMPONENT_ENABLED_STATE_ENABLED) + && + (newState == COMPONENT_ENABLED_STATE_DISABLED_USER + || newState == COMPONENT_ENABLED_STATE_DEFAULT + || newState == COMPONENT_ENABLED_STATE_ENABLED)) { + // ok + } else { + throw new SecurityException( + "Shell cannot change component state for " + packageName + "/" + + className + " to " + newState); + } + } if (className == null) { // We're dealing with an application/package level state change if (pkgSetting.getEnabled(userId) == newState) { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 67cbcd88ead1..b305ba71863b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -25,9 +25,13 @@ import android.content.pm.PackageParser; import android.content.pm.ResolveInfo; import android.os.RemoteException; import android.os.UserHandle; +import android.system.ErrnoException; import android.util.ArraySet; import android.util.Log; +import libcore.io.Libcore; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -163,4 +167,16 @@ public class PackageManagerServiceUtils { return result; } -}
\ No newline at end of file + + /** + * Returns the canonicalized path of {@code path} as per {@code realpath(3)} + * semantics. + */ + public static String realpath(File path) throws IOException { + try { + return Libcore.os.realpath(path.getAbsolutePath()); + } catch (ErrnoException ee) { + throw ee.rethrowAsIOException(); + } + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 4de8b57d4087..1eeff14568c6 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -1463,14 +1463,13 @@ class PackageManagerShellCommand extends ShellCommand { private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() { @Override - public int send(int code, Intent intent, String resolvedType, + public void send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { try { mResult.offer(intent, 5, TimeUnit.SECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } - return 0; } }; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 2d8dcf0c98dd..33ccf160f8d0 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -22,6 +22,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; @@ -30,7 +31,9 @@ import android.app.ActivityManagerNative; import android.app.IActivityManager; import android.app.IStopUserCallback; import android.app.KeyguardManager; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -142,6 +145,7 @@ public class UserManagerService extends IUserManager.Stub { private static final String TAG_USER = "user"; private static final String TAG_RESTRICTIONS = "restrictions"; private static final String TAG_DEVICE_POLICY_RESTRICTIONS = "device_policy_restrictions"; + private static final String TAG_GLOBAL_RESTRICTION_OWNER_ID = "globalRestrictionOwnerUserId"; private static final String TAG_ENTRY = "entry"; private static final String TAG_VALUE = "value"; private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions"; @@ -275,6 +279,12 @@ public class UserManagerService extends IUserManager.Stub { private Bundle mDevicePolicyGlobalUserRestrictions; /** + * Id of the user that set global restrictions. + */ + @GuardedBy("mRestrictionsLock") + private int mGlobalRestrictionOwnerUserId = UserHandle.USER_NULL; + + /** * User restrictions set by {@link com.android.server.devicepolicy.DevicePolicyManagerService} * for each user. */ @@ -995,6 +1005,13 @@ public class UserManagerService extends IUserManager.Stub { if (globalChanged) { mDevicePolicyGlobalUserRestrictions = global; } + // Remember the global restriction owner userId to be able to make a distinction + // in getUserRestrictionSource on who set local policies. + mGlobalRestrictionOwnerUserId = userId; + } else { + // When profile owner sets restrictions it passes null global bundle and we reset + // global restriction owner userId. + mGlobalRestrictionOwnerUserId = UserHandle.USER_NULL; } { // Update local. @@ -1078,6 +1095,54 @@ public class UserManagerService extends IUserManager.Stub { } /** + * @hide + * + * Returns who set a user restriction on a user. + * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. + * @param restrictionKey the string key representing the restriction + * @param userId the id of the user for whom to retrieve the restrictions. + * @return The source of user restriction. Any combination of + * {@link UserManager#RESTRICTION_NOT_SET}, + * {@link UserManager#RESTRICTION_SOURCE_SYSTEM}, + * {@link UserManager#RESTRICTION_SOURCE_DEVICE_OWNER} + * and {@link UserManager#RESTRICTION_SOURCE_PROFILE_OWNER} + */ + @Override + public int getUserRestrictionSource(String restrictionKey, int userId) { + checkManageUsersPermission("getUserRestrictionSource"); + int result = UserManager.RESTRICTION_NOT_SET; + + // Shortcut for the most common case + if (!hasUserRestriction(restrictionKey, userId)) { + return result; + } + + if (hasBaseUserRestriction(restrictionKey, userId)) { + result |= UserManager.RESTRICTION_SOURCE_SYSTEM; + } + + synchronized(mRestrictionsLock) { + Bundle localRestrictions = mDevicePolicyLocalUserRestrictions.get(userId); + if (!UserRestrictionsUtils.isEmpty(localRestrictions) + && localRestrictions.getBoolean(restrictionKey)) { + // Local restrictions may have been set by device owner the userId of which is + // stored in mGlobalRestrictionOwnerUserId. + if (mGlobalRestrictionOwnerUserId == userId) { + result |= UserManager.RESTRICTION_SOURCE_DEVICE_OWNER; + } else { + result |= UserManager.RESTRICTION_SOURCE_PROFILE_OWNER; + } + } + if (!UserRestrictionsUtils.isEmpty(mDevicePolicyGlobalUserRestrictions) + && mDevicePolicyGlobalUserRestrictions.getBoolean(restrictionKey)) { + result |= UserManager.RESTRICTION_SOURCE_DEVICE_OWNER; + } + } + + return result; + } + + /** * @return UserRestrictions that are in effect currently. This always returns a new * {@link Bundle}. */ @@ -1474,6 +1539,11 @@ public class UserManagerService extends IUserManager.Stub { break; } } + } else if (name.equals(TAG_GLOBAL_RESTRICTION_OWNER_ID)) { + String ownerUserId = parser.getAttributeValue(null, ATTR_ID); + if (ownerUserId != null) { + mGlobalRestrictionOwnerUserId = Integer.parseInt(ownerUserId); + } } } } @@ -1733,6 +1803,9 @@ public class UserManagerService extends IUserManager.Stub { UserRestrictionsUtils.writeRestrictions(serializer, mDevicePolicyGlobalUserRestrictions, TAG_DEVICE_POLICY_RESTRICTIONS); } + serializer.startTag(null, TAG_GLOBAL_RESTRICTION_OWNER_ID); + serializer.attribute(null, ATTR_ID, Integer.toString(mGlobalRestrictionOwnerUserId)); + serializer.endTag(null, TAG_GLOBAL_RESTRICTION_OWNER_ID); int[] userIdsToWrite; synchronized (mUsersLock) { userIdsToWrite = new int[mUsers.size()]; @@ -2972,6 +3045,8 @@ public class UserManagerService extends IUserManager.Stub { .dumpRestrictions(pw, " ", mDevicePolicyGlobalUserRestrictions); } pw.println(); + pw.println(" Global restrictions owner id:" + mGlobalRestrictionOwnerUserId); + pw.println(); pw.println(" Guest restrictions:"); synchronized (mGuestRestrictions) { UserRestrictionsUtils.dumpRestrictions(pw, " ", mGuestRestrictions); diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index 29b9b92e8183..a77d512201ed 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -380,6 +380,10 @@ public class ImmersiveModeConfirmation { @Override public void onVrStateChanged(boolean enabled) throws RemoteException { mVrModeEnabled = enabled; + if (mVrModeEnabled) { + mHandler.removeMessages(H.SHOW); + mHandler.sendEmptyMessage(H.HIDE); + } } }; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b2cf89b17cfc..b30817f53cdb 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -553,6 +553,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final Rect mTmpStableFrame = new Rect(); static final Rect mTmpNavigationFrame = new Rect(); static final Rect mTmpOutsetFrame = new Rect(); + private static final Rect mTmpRect = new Rect(); WindowState mTopFullscreenOpaqueWindowState; WindowState mTopFullscreenOpaqueOrDimmingWindowState; @@ -3797,8 +3798,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public boolean getInsetHintLw(WindowManager.LayoutParams attrs, int displayRotation, - Rect outContentInsets, Rect outStableInsets, Rect outOutsets) { + public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds, + int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets, + Rect outStableInsets, Rect outOutsets) { final int fl = PolicyControl.getWindowFlags(null, attrs); final int sysuiVis = PolicyControl.getSystemUiVisibility(null, attrs); final int systemUiVisibility = (sysuiVis | attrs.subtreeSystemUiVisibility); @@ -3852,6 +3854,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { outStableInsets.set(mStableLeft, mStableTop, availRight - mStableRight, availBottom - mStableBottom); + if (taskBounds != null) { + calculateRelevantTaskInsets(taskBounds, outContentInsets, + displayWidth, displayHeight); + calculateRelevantTaskInsets(taskBounds, outStableInsets, + displayWidth, displayHeight); + } return mForceShowSystemBars; } outContentInsets.setEmpty(); @@ -3859,6 +3867,22 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mForceShowSystemBars; } + /** + * For any given task bounds, the insets relevant for these bounds given the insets relevant + * for the entire display. + */ + private void calculateRelevantTaskInsets(Rect taskBounds, Rect inOutInsets, int displayWidth, + int displayHeight) { + mTmpRect.set(0, 0, displayWidth, displayHeight); + mTmpRect.inset(inOutInsets); + mTmpRect.intersect(taskBounds); + int leftInset = mTmpRect.left - taskBounds.left; + int topInset = mTmpRect.top - taskBounds.top; + int rightInset = taskBounds.right - mTmpRect.right; + int bottomInset = taskBounds.bottom - mTmpRect.bottom; + inOutInsets.set(leftInset, topInset, rightInset, bottomInset); + } + private boolean shouldUseOutsets(WindowManager.LayoutParams attrs, int fl) { return attrs.type == TYPE_WALLPAPER || (fl & (WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN)) != 0; diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 2946bb594634..b488297bbe8c 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -331,7 +331,7 @@ public final class TvInputManagerService extends SystemService { try { TvInputInfo info = new TvInputInfo.Builder(mContext, ri).build(); inputList.add(info); - } catch (XmlPullParserException | IOException e) { + } catch (Exception e) { Slog.e(TAG, "failed to load TV input " + si.name, e); continue; } diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index 48c0feec4bdd..3700c71e1da7 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -212,12 +212,14 @@ public class VrManagerService extends SystemService implements EnabledComponentC if (!packageNames.contains(pkg)) { revokeNotificationListenerAccess(pkg); revokeNotificationPolicyAccess(pkg); + revokeCoarseLocationAccess(pkg, currentUserHandle); } } for (String pkg : packageNames) { if (!allowed.contains(pkg)) { grantNotificationPolicyAccess(pkg); grantNotificationListenerAccess(pkg, currentUserHandle); + grantCoarseLocationAccess(pkg, currentUserHandle); } } @@ -585,8 +587,6 @@ public class VrManagerService extends SystemService implements EnabledComponentC Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() + " for user " + mCurrentVrService.getUserId()); mCurrentVrService.disconnect(); - disableImpliedPermissionsLocked(mCurrentVrService.getComponent(), - new UserHandle(mCurrentVrService.getUserId())); mCurrentVrService = null; } } else { @@ -595,19 +595,13 @@ public class VrManagerService extends SystemService implements EnabledComponentC if (mCurrentVrService.disconnectIfNotMatching(component, userId)) { Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() + " for user " + mCurrentVrService.getUserId()); - disableImpliedPermissionsLocked(mCurrentVrService.getComponent(), - new UserHandle(mCurrentVrService.getUserId())); createAndConnectService(component, userId); - enableImpliedPermissionsLocked(mCurrentVrService.getComponent(), - new UserHandle(mCurrentVrService.getUserId())); sendUpdatedCaller = true; } // The service with the correct component/user is bound } else { // Nothing was previously running, bind a new service createAndConnectService(component, userId); - enableImpliedPermissionsLocked(mCurrentVrService.getComponent(), - new UserHandle(mCurrentVrService.getUserId())); sendUpdatedCaller = true; } } @@ -636,93 +630,6 @@ public class VrManagerService extends SystemService implements EnabledComponentC } } - /** - * Enable the permission given in {@link #IMPLIED_VR_LISTENER_PERMISSIONS} for the given - * component package and user. - * - * @param component the component whose package should be enabled. - * @param userId the user that owns the given component. - */ - private void enableImpliedPermissionsLocked(ComponentName component, UserHandle userId) { - if (mGuard) { - // Impossible - throw new IllegalStateException("Enabling permissions without disabling."); - } - mGuard = true; - - PackageManager pm = mContext.getPackageManager(); - - String pName = component.getPackageName(); - if (pm == null) { - Slog.e(TAG, "Couldn't set implied permissions for " + pName + - ", PackageManager isn't running"); - return; - } - - ApplicationInfo info = null; - try { - info = pm.getApplicationInfo(pName, PackageManager.GET_META_DATA); - } catch (NameNotFoundException e) { - } - - if (info == null || !(info.isSystemApp() || info.isUpdatedSystemApp())) { - return; - } - - mWasDefaultGranted = true; - AppOpsManager mgr = mContext.getSystemService(AppOpsManager.class); - if (mgr == null) { - Slog.e(TAG, "No AppOpsManager, failed to set permissions for: " + pName); - return; - } - grantCoarseLocationAccess(mgr, pName, info.uid); - grantOverlayAccess(mgr, pName, info.uid); - } - - /** - * Disable the permission given in {@link #IMPLIED_VR_LISTENER_PERMISSIONS} for the given - * component package and user. - * - * @param component the component whose package should be disabled. - * @param userId the user that owns the given component. - */ - private void disableImpliedPermissionsLocked(ComponentName component, UserHandle userId) { - if (!mGuard) { - // Impossible - throw new IllegalStateException("Disabling permissions without enabling."); - } - mGuard = false; - - PackageManager pm = mContext.getPackageManager(); - - if (pm == null) { - Slog.e(TAG, "Couldn't remove implied permissions for " + component + - ", PackageManager isn't running"); - return; - } - - String pName = component.getPackageName(); - if (mWasDefaultGranted) { - ApplicationInfo info = null; - try { - info = pm.getApplicationInfo(pName, PackageManager.GET_META_DATA); - } catch (NameNotFoundException e) { - } - - if (info != null) { - AppOpsManager mgr = mContext.getSystemService(AppOpsManager.class); - if (mgr == null) { - Slog.e(TAG, "No AppOpsManager, failed to set permissions for: " + pName); - return; - } - revokeCoarseLocationAccess(mgr, pName, info.uid); - revokeOverlayAccess(mgr, pName, info.uid); - } - mWasDefaultGranted = false; - } - - } - private boolean isDefaultAllowed(String packageName) { PackageManager pm = mContext.getPackageManager(); @@ -738,41 +645,16 @@ public class VrManagerService extends SystemService implements EnabledComponentC return true; } - private void grantCoarseLocationAccess(AppOpsManager mgr, String packageName, int uid) { - mPreviousCoarseLocationMode = mgr.checkOpNoThrow(AppOpsManager.OP_COARSE_LOCATION, uid, - packageName); - - if (mPreviousCoarseLocationMode != AppOpsManager.MODE_ALLOWED) { - mgr.setMode(AppOpsManager.OP_COARSE_LOCATION, uid, packageName, - AppOpsManager.MODE_ALLOWED); - } - } - - private void revokeCoarseLocationAccess(AppOpsManager mgr, String packageName, int uid) { - if (mPreviousCoarseLocationMode != AppOpsManager.MODE_ALLOWED) { - mgr.setMode(AppOpsManager.OP_COARSE_LOCATION, uid, packageName, - mPreviousCoarseLocationMode); - mPreviousCoarseLocationMode = INVALID_APPOPS_MODE; - } - } - - private void grantOverlayAccess(AppOpsManager mgr, String packageName, int uid) { - - mPreviousManageOverlayMode = mgr.checkOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, - packageName); - - if (mPreviousManageOverlayMode != AppOpsManager.MODE_ALLOWED) { - mgr.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, packageName, - AppOpsManager.MODE_ALLOWED); - } + private void grantCoarseLocationAccess(String pkg, UserHandle userId) { + PackageManager pm = mContext.getPackageManager(); + pm.grantRuntimePermission(pkg, android.Manifest.permission.ACCESS_COARSE_LOCATION, + userId); } - private void revokeOverlayAccess(AppOpsManager mgr, String packageName, int uid) { - if (mPreviousManageOverlayMode != AppOpsManager.MODE_ALLOWED) { - mgr.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, packageName, - mPreviousManageOverlayMode); - mPreviousManageOverlayMode = INVALID_APPOPS_MODE; - } + private void revokeCoarseLocationAccess(String pkg, UserHandle userId) { + PackageManager pm = mContext.getPackageManager(); + pm.revokeRuntimePermission(pkg, + android.Manifest.permission.ACCESS_COARSE_LOCATION, userId); } private void grantNotificationPolicyAccess(String pkg) { diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 06b93293b9ba..efd238201e7a 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1011,7 +1011,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { public void clearWallpaper(String callingPackage, int which, int userId) { if (DEBUG) Slog.v(TAG, "clearWallpaper"); checkPermission(android.Manifest.permission.SET_WALLPAPER); - if (!isWallpaperSupported(callingPackage) || !isWallpaperSettingAllowed(callingPackage)) { + if (!isWallpaperSupported(callingPackage) || !isSetWallpaperAllowed(callingPackage)) { return; } userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), @@ -1326,11 +1326,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { checkPermission(android.Manifest.permission.SET_WALLPAPER); if ((which & (FLAG_LOCK|FLAG_SYSTEM)) == 0) { - Slog.e(TAG, "Must specify a valid wallpaper category to set"); - return null; + final String msg = "Must specify a valid wallpaper category to set"; + Slog.e(TAG, msg); + throw new IllegalArgumentException(msg); } - if (!isWallpaperSupported(callingPackage) || !isWallpaperSettingAllowed(callingPackage)) { + if (!isWallpaperSupported(callingPackage) || !isSetWallpaperAllowed(callingPackage)) { return null; } @@ -1341,7 +1342,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { if (cropHint.isEmpty() || cropHint.left < 0 || cropHint.top < 0) { - return null; + throw new IllegalArgumentException("Invalid crop rect supplied: " + cropHint); } } @@ -1449,7 +1450,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void setWallpaperComponentChecked(ComponentName name, String callingPackage) { - if (isWallpaperSupported(callingPackage) && isWallpaperSettingAllowed(callingPackage)) { + if (isWallpaperSupported(callingPackage) && isSetWallpaperAllowed(callingPackage)) { setWallpaperComponent(name); } } @@ -1699,7 +1700,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } @Override - public boolean isWallpaperSettingAllowed(String callingPackage) { + public boolean isSetWallpaperAllowed(String callingPackage) { final PackageManager pm = mContext.getPackageManager(); String[] uidPackages = pm.getPackagesForUid(Binder.getCallingUid()); boolean uidMatchPackage = Arrays.asList(uidPackages).contains(callingPackage); diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index 51c40456c66a..5bfece414446 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -156,12 +156,10 @@ public class BoundsAnimationController { + mTmpRect + " from=" + mFrom + " mTo=" + mTo + " value=" + value + " remains=" + remains); - if (remains != 0) { - mTmpTaskBounds.set(mTmpRect.left, mTmpRect.top, - mTmpRect.left + mFrozenTaskWidth, mTmpRect.top + mFrozenTaskHeight); - } + mTmpTaskBounds.set(mTmpRect.left, mTmpRect.top, + mTmpRect.left + mFrozenTaskWidth, mTmpRect.top + mFrozenTaskHeight); - if (!mTarget.setPinnedStackSize(mTmpRect, remains != 0 ? mTmpTaskBounds : null)) { + if (!mTarget.setPinnedStackSize(mTmpRect, mTmpTaskBounds)) { // Whoops, the target doesn't feel like animating anymore. Let's immediately finish // any further animation. animation.cancel(); @@ -205,11 +203,12 @@ public class BoundsAnimationController { return; } + finishAnimation(); + + mTarget.setPinnedStackSize(mTo, null); if (mMoveToFullScreen && !mWillReplace) { mTarget.moveToFullscreen(); } - - finishAnimation(); } @Override diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index d2d93635d9c9..1b31d07cf31e 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -300,7 +300,7 @@ public class DockedStackDividerController implements DimLayerUser { boolean animate, WindowState imeWin, int imeHeight) { if (mAdjustedForIme != adjustedForIme || (adjustedForIme && mImeHeight != imeHeight) || mAdjustedForDivider != adjustedForDivider) { - if (animate) { + if (animate && !mAnimatingForMinimizedDockedStack) { startImeAdjustAnimation(adjustedForIme, adjustedForDivider, imeWin); } else { // Animation might be delayed, so only notify if we don't run an animation. @@ -547,8 +547,6 @@ public class DockedStackDividerController implements DimLayerUser { private void startImeAdjustAnimation( boolean adjustedForIme, boolean adjustedForDivider, WindowState imeWin) { - mAnimatingForIme = true; - mAnimationStarted = false; // If we're not in an animation, the starting point depends on whether we're adjusted // or not. If we're already in an animation, we start from where the current animation @@ -562,6 +560,8 @@ public class DockedStackDividerController implements DimLayerUser { mAnimationStart = mLastAnimationProgress; mDividerAnimationStart = mLastDividerProgress; } + mAnimatingForIme = true; + mAnimationStarted = false; mAnimationTarget = adjustedForIme ? 1 : 0; mDividerAnimationTarget = adjustedForDivider ? 1 : 0; @@ -606,12 +606,7 @@ public class DockedStackDividerController implements DimLayerUser { private void setMinimizedDockedStack(boolean minimized) { final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked(); notifyDockedStackMinimizedChanged(minimized, 0); - if (stack == null) { - return; - } - if (stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f)) { - mService.mWindowPlacerLocked.performSurfacePlacement(); - } + setMinimizeAmount(stack, minimized ? 1f : 0f); } private boolean isAnimationMaximizing() { @@ -695,11 +690,8 @@ public class DockedStackDividerController implements DimLayerUser { float t = Math.min(1f, (float) (now - mAnimationStartTime) / mAnimationDuration); t = (isAnimationMaximizing() ? TOUCH_RESPONSE_INTERPOLATOR : mMinimizedDockInterpolator) .getInterpolation(t); - if (stack != null) { - if (stack.setAdjustedForMinimizedDock(getMinimizeAmount(stack, t))) { - mService.mWindowPlacerLocked.performSurfacePlacement(); - } - } + setMinimizeAmount(stack, getMinimizeAmount(stack, t)); + if (t >= 1.0f) { mAnimatingForMinimizedDockedStack = false; return false; @@ -708,6 +700,42 @@ public class DockedStackDividerController implements DimLayerUser { } } + void setMinimizeAmount(TaskStack dockedStack, float minimizeAmount) { + final ArrayList<TaskStack> stacks = mDisplayContent.getStacks(); + + // If the docked stack is not visible, clear the complementary stack on all stacks. + if (dockedStack == null) { + for (int i = stacks.size() - 1; i >= 0; --i) { + final TaskStack stack = stacks.get(i); + stack.resetAdjustedForComplementDock(); + } + return; + } + + // Otherwise if the docked stack minimize amount has changed, update the adjusted bounds + // on the other stack that's currently visible, so that the stack's getDimBounds() + // occupies what's left by the docked stack. This is needed so that stuff like wallpaper + // gets cropped properly to the area left by the dock. + if (dockedStack.setAdjustedForMinimizedDock(minimizeAmount)) { + final boolean adjusted = + dockedStack.isVisibleForUserLocked() && minimizeAmount != 0.0f; + dockedStack.getDimBounds(mTmpRect2); + int dockSide = dockedStack.getDockSide(); + for (int i = stacks.size() - 1; i >= 0; --i) { + final TaskStack stack = stacks.get(i); + if (stack == dockedStack) { + continue; + } + if (stack.isVisibleLocked() && adjusted) { + stack.setAdjustedForComplementDock(mTmpRect2, dockSide); + } else { + stack.resetAdjustedForComplementDock(); + } + } + mService.mWindowPlacerLocked.performSurfacePlacement(); + } + } + private float getInterpolatedAnimationValue(float t) { return t * mAnimationTarget + (1 - t) * mAnimationStart; } diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index 0539b05fa846..c4eca08bb561 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -584,7 +584,7 @@ class DragState { void overridePointerIconLw(int touchSource) { mTouchSource = touchSource; if (isFromSource(InputDevice.SOURCE_MOUSE)) { - InputManager.getInstance().setPointerIconShape(PointerIcon.STYLE_GRABBING); + InputManager.getInstance().setPointerIconType(PointerIcon.TYPE_GRABBING); } } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 0d3535495aff..b4387b98e6d7 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; +import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.HOME_STACK_ID; import static android.content.pm.ActivityInfo.RESIZE_MODE_CROP_WINDOWS; @@ -630,8 +631,9 @@ class Task implements DimLayer.DimLayerUser { // Anyway we don't need to synchronize position and content updates for these // windows since they aren't at the base layer and could be moved around anyway. if (!win.computeDragResizing() && win.mAttrs.type == TYPE_BASE_APPLICATION && - !mStack.getBoundsAnimating() && !win.isGoneForLayoutLw()) { - win.mResizedWhileNotDragResizing = true; + !mStack.getBoundsAnimating() && !win.isGoneForLayoutLw() && + !inPinnedWorkspace()) { + win.setResizedWhileNotDragResizing(true); } } if (win.isGoneForLayoutLw()) { @@ -710,6 +712,10 @@ class Task implements DimLayer.DimLayerUser { return mStack != null && mStack.mStackId == DOCKED_STACK_ID; } + boolean inPinnedWorkspace() { + return mStack != null && mStack.mStackId == PINNED_STACK_ID; + } + boolean isResizeableByDockedStack() { final DisplayContent displayContent = getDisplayContent(); return displayContent != null && displayContent.getDockedStackLocked() != null diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 1852b4c9a23d..f51fd8aaf7eb 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -122,6 +122,7 @@ public class TaskStack implements DimLayer.DimLayerUser, private float mAdjustImeAmount; private float mAdjustDividerAmount; private final int mDockedStackMinimizeThickness; + private boolean mAdjustedForForComplementDock; // If this is true, we are in the bounds animating mode. // The task will be down or upscaled to perfectly fit the @@ -129,12 +130,6 @@ public class TaskStack implements DimLayer.DimLayerUser, // certain logic we would otherwise apply while resizing, // while resizing in the bounds animating mode. private boolean mBoundsAnimating = false; - // By default, movement animations are applied to all - // window movement. If this is true, animations will not - // be applied within this stack. This is useful for example - // if the windows are moving as the result of a stack animation, - // in which case a second window animation would cause jitter. - private boolean mFreezeMovementAnimations = false; // Temporary storage for the new bounds that should be used after the configuration change. // Will be cleared once the client retrieves the new bounds via getBoundsForNewConfiguration(). @@ -247,7 +242,9 @@ public class TaskStack implements DimLayer.DimLayerUser, insetBounds = mFullyAdjustedImeBounds; } } - alignTasksToAdjustedBounds(adjusted ? mAdjustedBounds : mBounds, insetBounds); + if (!mAdjustedForForComplementDock) { + alignTasksToAdjustedBounds(adjusted ? mAdjustedBounds : mBounds, insetBounds); + } mDisplayContent.layoutNeeded = true; } @@ -854,6 +851,7 @@ public class TaskStack implements DimLayer.DimLayerUser, mImeWin = imeWin; mImeGoingAway = false; if (!mAdjustedForIme || forceUpdate) { + mAdjustedForForComplementDock = false; mAdjustedForIme = true; mAdjustImeAmount = 0f; mAdjustDividerAmount = 0f; @@ -916,10 +914,12 @@ public class TaskStack implements DimLayer.DimLayerUser, * @return Whether the amount has changed and a layout is needed. */ boolean setAdjustedForMinimizedDock(float minimizeAmount) { + mAdjustedForForComplementDock = false; + if (minimizeAmount != mMinimizeAmount) { mMinimizeAmount = minimizeAmount; updateAdjustedBounds(); - return isVisibleForUserLocked(); + return true; } else { return false; } @@ -929,6 +929,33 @@ public class TaskStack implements DimLayer.DimLayerUser, return mMinimizeAmount != 0f; } + void setAdjustedForComplementDock(Rect dockBounds, int dockSide) { + if (mMinimizeAmount != 0f || mAdjustedForIme) { + return; + } + mTmpAdjustedBounds.set(mBounds); + if (dockSide == DOCKED_TOP) { + mTmpAdjustedBounds.top = dockBounds.bottom; + } else if (dockSide == DOCKED_LEFT) { + mTmpAdjustedBounds.left = dockBounds.right; + } else if (dockSide == DOCKED_RIGHT) { + mTmpAdjustedBounds.right = dockBounds.left; + } else { + Slog.w(TAG_WM, "setAdjustedForComplementDock: invalid dock side " + dockSide); + return; + } + mAdjustedForForComplementDock = true; + setAdjustedBounds(mTmpAdjustedBounds); + } + + void resetAdjustedForComplementDock() { + if (mAdjustedForForComplementDock) { + mAdjustedForForComplementDock = false; + mTmpAdjustedBounds.setEmpty(); + setAdjustedBounds(mTmpAdjustedBounds); + } + } + /** * Puts all visible tasks that are adjusted for IME into resizing mode and adds the windows * to the list of to be drawn windows the service is waiting for. @@ -1089,7 +1116,7 @@ public class TaskStack implements DimLayer.DimLayerUser, } setAdjustedBounds(mTmpAdjustedBounds); - final boolean isImeTarget = (mService.getImeTargetStackLocked() == this); + final boolean isImeTarget = (mService.getImeFocusStackLocked() == this); if (mAdjustedForIme && adjust && !isImeTarget) { final float alpha = Math.max(mAdjustImeAmount, mAdjustDividerAmount) * IME_ADJUST_DIM_AMOUNT; @@ -1328,7 +1355,6 @@ public class TaskStack implements DimLayer.DimLayerUser, @Override // AnimatesBounds public void onAnimationStart() { synchronized (mService.mWindowMap) { - mFreezeMovementAnimations = true; mBoundsAnimating = true; } } @@ -1336,7 +1362,6 @@ public class TaskStack implements DimLayer.DimLayerUser, @Override // AnimatesBounds public void onAnimationEnd() { synchronized (mService.mWindowMap) { - mFreezeMovementAnimations = false; mBoundsAnimating = false; mService.requestTraversal(); } @@ -1363,8 +1388,8 @@ public class TaskStack implements DimLayer.DimLayerUser, getDisplayContent().getContentRect(bounds); } - public boolean getFreezeMovementAnimations() { - return mFreezeMovementAnimations; + public boolean hasMovementAnimations() { + return StackId.hasMovementAnimations(mStackId); } public boolean getForceScaleToCrop() { diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java index 3dc512f44224..fb556d23cdd3 100644 --- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java +++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java @@ -26,12 +26,12 @@ import android.view.WindowManagerPolicy.PointerEventListener; import com.android.server.wm.WindowManagerService.H; -import static android.view.PointerIcon.STYLE_NOT_SPECIFIED; -import static android.view.PointerIcon.STYLE_DEFAULT; -import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW; -import static android.view.PointerIcon.STYLE_VERTICAL_DOUBLE_ARROW; -import static android.view.PointerIcon.STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; -import static android.view.PointerIcon.STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_NOT_SPECIFIED; +import static android.view.PointerIcon.TYPE_DEFAULT; +import static android.view.PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW; +import static android.view.PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW; public class TaskTapPointerEventListener implements PointerEventListener { @@ -43,7 +43,7 @@ public class TaskTapPointerEventListener implements PointerEventListener { private boolean mTwoFingerScrolling; private boolean mInGestureDetection; private GestureDetector mGestureDetector; - private int mPointerIconShape = STYLE_NOT_SPECIFIED; + private int mPointerIconType = TYPE_NOT_SPECIFIED; public TaskTapPointerEventListener(WindowManagerService service, DisplayContent displayContent) { @@ -91,39 +91,39 @@ public class TaskTapPointerEventListener implements PointerEventListener { final Task task = mDisplayContent.findTaskForControlPoint(x, y); InputDevice inputDevice = motionEvent.getDevice(); if (task == null || inputDevice == null) { - mPointerIconShape = STYLE_NOT_SPECIFIED; + mPointerIconType = TYPE_NOT_SPECIFIED; break; } task.getDimBounds(mTmpRect); if (!mTmpRect.isEmpty() && !mTmpRect.contains(x, y)) { - int iconShape = STYLE_DEFAULT; + int iconType = TYPE_DEFAULT; if (x < mTmpRect.left) { - iconShape = - (y < mTmpRect.top) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW : - (y > mTmpRect.bottom) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW : - STYLE_HORIZONTAL_DOUBLE_ARROW; + iconType = + (y < mTmpRect.top) ? TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW : + (y > mTmpRect.bottom) ? TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW : + TYPE_HORIZONTAL_DOUBLE_ARROW; } else if (x > mTmpRect.right) { - iconShape = - (y < mTmpRect.top) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW : - (y > mTmpRect.bottom) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW : - STYLE_HORIZONTAL_DOUBLE_ARROW; + iconType = + (y < mTmpRect.top) ? TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW : + (y > mTmpRect.bottom) ? TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW : + TYPE_HORIZONTAL_DOUBLE_ARROW; } else if (y < mTmpRect.top || y > mTmpRect.bottom) { - iconShape = STYLE_VERTICAL_DOUBLE_ARROW; + iconType = TYPE_VERTICAL_DOUBLE_ARROW; } - if (mPointerIconShape != iconShape) { - mPointerIconShape = iconShape; - inputDevice.setPointerShape(iconShape); + if (mPointerIconType != iconType) { + mPointerIconType = iconType; + inputDevice.setPointerType(iconType); } } else { - mPointerIconShape = STYLE_NOT_SPECIFIED; + mPointerIconType = TYPE_NOT_SPECIFIED; } } break; case MotionEvent.ACTION_HOVER_EXIT: - mPointerIconShape = STYLE_NOT_SPECIFIED; + mPointerIconType = TYPE_NOT_SPECIFIED; InputDevice inputDevice = motionEvent.getDevice(); if (inputDevice != null) { - inputDevice.setPointerShape(STYLE_DEFAULT); + inputDevice.setPointerType(TYPE_DEFAULT); } break; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 239cc8eaae8c..82cd0fa0c25d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2117,8 +2117,17 @@ public class WindowManagerService extends IWindowManager.Stub } if (displayContent.isDefaultDisplay) { - if (mPolicy.getInsetHintLw(win.mAttrs, mRotation, outContentInsets, outStableInsets, - outOutsets)) { + final DisplayInfo displayInfo = displayContent.getDisplayInfo(); + final Rect taskBounds; + if (atoken != null && atoken.mTask != null) { + taskBounds = mTmpRect; + atoken.mTask.getBounds(mTmpRect); + } else { + taskBounds = null; + } + if (mPolicy.getInsetHintLw(win.mAttrs, taskBounds, mRotation, + displayInfo.logicalWidth, displayInfo.logicalHeight, outContentInsets, + outStableInsets, outOutsets)) { res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_NAV_BAR; } } else { @@ -3057,9 +3066,9 @@ public class WindowManagerService extends IWindowManager.Stub // If we're starting a drag-resize, we'll be changing the surface size as well as // notifying the client to render to with an offset from the surface's top-left. - if (win.isDragResizeChanged() || win.mResizedWhileNotDragResizing) { + if (win.isDragResizeChanged() || win.isResizedWhileNotDragResizing()) { win.setDragResizing(); - win.mResizedWhileNotDragResizing = false; + win.setResizedWhileNotDragResizing(false); // We can only change top level windows to the full-screen surface when // resizing (as we only have one full-screen surface). So there is no need // to preserve and destroy windows which are attached to another, they @@ -4023,7 +4032,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void setAppStartingWindow(IBinder token, String pkg, + public boolean setAppStartingWindow(IBinder token, String pkg, int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded) { @@ -4040,18 +4049,18 @@ public class WindowManagerService extends IWindowManager.Stub AppWindowToken wtoken = findAppWindowToken(token); if (wtoken == null) { Slog.w(TAG_WM, "Attempted to set icon of non-existing app token: " + token); - return; + return false; } // If the display is frozen, we won't do anything until the // actual window is displayed so there is no reason to put in // the starting window. if (!okToDisplay()) { - return; + return false; } if (wtoken.startingData != null) { - return; + return false; } // If this is a translucent window, then don't @@ -4066,7 +4075,7 @@ public class WindowManagerService extends IWindowManager.Stub if (ent == null) { // Whoops! App doesn't exist. Um. Okay. We'll just // pretend like we didn't see that. - return; + return false; } final boolean windowIsTranslucent = ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsTranslucent, false); @@ -4080,33 +4089,33 @@ public class WindowManagerService extends IWindowManager.Stub + " Floating=" + windowIsFloating + " ShowWallpaper=" + windowShowWallpaper); if (windowIsTranslucent) { - return; + return false; } if (windowIsFloating || windowDisableStarting) { - return; + return false; } if (windowShowWallpaper) { if (mWallpaperControllerLocked.getWallpaperTarget() == null) { // If this theme is requesting a wallpaper, and the wallpaper - // is not curently visible, then this effectively serves as + // is not currently visible, then this effectively serves as // an opaque window and our starting window transition animation // can still work. We just need to make sure the starting window // is also showing the wallpaper. windowFlags |= FLAG_SHOW_WALLPAPER; } else { - return; + return false; } } } if (transferStartingWindow(transferFrom, wtoken)) { - return; + return true; } // There is no existing starting window, and the caller doesn't // want us to create one, so that's it! if (!createIfNeeded) { - return; + return false; } if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating StartingData"); @@ -4119,6 +4128,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING"); mH.sendMessageAtFrontOfQueue(m); } + return true; } private boolean transferStartingWindow(IBinder transferFrom, AppWindowToken wtoken) { @@ -7571,7 +7581,7 @@ public class WindowManagerService extends IWindowManager.Stub final WindowState imeWin = mInputMethodWindow; final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw(); final boolean dockVisible = isStackVisibleLocked(DOCKED_STACK_ID); - final TaskStack imeTargetStack = getImeTargetStackLocked(); + final TaskStack imeTargetStack = getImeFocusStackLocked(); final int imeDockSide = (dockVisible && imeTargetStack != null) ? imeTargetStack.getDockSide() : DOCKED_INVALID; final boolean imeOnTop = (imeDockSide == DOCKED_TOP); @@ -7740,10 +7750,13 @@ public class WindowManagerService extends IWindowManager.Stub return mCurrentFocus; } - TaskStack getImeTargetStackLocked() { - // Don't use WindowState.getStack() because it returns home stack for system windows. - Task imeTask = mInputMethodTarget != null ? mInputMethodTarget.getTask() : null; - return imeTask != null ? imeTask.mStack : null; + TaskStack getImeFocusStackLocked() { + // Don't use mCurrentFocus.getStack() because it returns home stack for system windows. + // Also don't use mInputMethodTarget's stack, because some window with FLAG_NOT_FOCUSABLE + // and FLAG_ALT_FOCUSABLE_IM flags both set might be set to IME target so they're moved + // to make room for IME, but the window is not the focused window that's taking input. + return (mFocusedApp != null && mFocusedApp.mTask != null) ? + mFocusedApp.mTask.mStack : null; } private void showAuditSafeModeNotification() { @@ -9259,7 +9272,7 @@ public class WindowManagerService extends IWindowManager.Stub || w.mOutsetsChanged || configChanged || dragResizingChanged - || w.mResizedWhileNotDragResizing) { + || !w.isResizedWhileNotDragResizingReported()) { if (DEBUG_RESIZE || DEBUG_ORIENTATION) { Slog.v(TAG_WM, "Resize reasons for w=" + w + ": " + " contentInsetsChanged=" + w.mContentInsetsChanged @@ -9273,7 +9286,8 @@ public class WindowManagerService extends IWindowManager.Stub + " surfaceResized=" + winAnimator.mSurfaceResized + " configChanged=" + configChanged + " dragResizingChanged=" + dragResizingChanged - + " resizedWhileNotDragResizing=" + w.mResizedWhileNotDragResizing); + + " resizedWhileNotDragResizingReported=" + + w.isResizedWhileNotDragResizingReported()); } // If it's a dead window left on screen, and the configuration changed, @@ -9295,7 +9309,7 @@ public class WindowManagerService extends IWindowManager.Stub // we need to go through the process of getting informed by the // application when it has finished drawing. if (w.mOrientationChanging || dragResizingChanged - || w.mResizedWhileNotDragResizing) { + || w.isResizedWhileNotDragResizing()) { if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || DEBUG_ORIENTATION || DEBUG_RESIZE) { Slog.v(TAG_WM, "Orientation or resize start waiting for draw" + ", mDrawState=DRAW_PENDING in " + w @@ -11085,7 +11099,7 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG_WM, "unable to restore pointer icon"); } } else { - InputManager.getInstance().setPointerIconShape(PointerIcon.STYLE_DEFAULT); + InputManager.getInstance().setPointerIconType(PointerIcon.TYPE_DEFAULT); } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c3f2367b53b7..e5e74a663eb0 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -486,12 +486,11 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ boolean mResizedWhileGone = false; - /** - * Indicates whether we got resized but drag resizing flag was false. In this case, we also - * need to recreate the surface and defer surface bound updates in order to make sure the - * buffer contents and the positioning/size stay in sync. - */ - boolean mResizedWhileNotDragResizing; + /** @see #isResizedWhileNotDragResizing(). */ + private boolean mResizedWhileNotDragResizing; + + /** @see #isResizedWhileNotDragResizingReported(). */ + private boolean mResizedWhileNotDragResizingReported; WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token, WindowState attachedWindow, int appOp, int seq, WindowManager.LayoutParams a, @@ -2115,14 +2114,16 @@ final class WindowState implements WindowManagerPolicy.WindowState { mWasVisibleBeforeClientHidden = false; } - void clearAnimatingWithSavedSurface() { + boolean clearAnimatingWithSavedSurface() { if (mAnimatingWithSavedSurface) { // App has drawn something to its windows, we're no longer animating with // the saved surfaces. if (DEBUG_ANIM) Slog.d(TAG, "clearAnimatingWithSavedSurface(): win=" + this); mAnimatingWithSavedSurface = false; + return true; } + return false; } @Override @@ -2324,6 +2325,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { mVisibleInsetsChanged = false; mStableInsetsChanged = false; mOutsetsChanged = false; + mResizedWhileNotDragResizingReported = true; mWinAnimator.mSurfaceResized = false; } catch (RemoteException e) { mOrientationChanging = false; @@ -2426,6 +2428,32 @@ final class WindowState implements WindowManagerPolicy.WindowState { mDragResizingChangeReported = false; } + /** + * Set whether we got resized but drag resizing flag was false. + * @see #isResizedWhileNotDragResizing(). + */ + void setResizedWhileNotDragResizing(boolean resizedWhileNotDragResizing) { + mResizedWhileNotDragResizing = resizedWhileNotDragResizing; + mResizedWhileNotDragResizingReported = !resizedWhileNotDragResizing; + } + + /** + * Indicates whether we got resized but drag resizing flag was false. In this case, we also + * need to recreate the surface and defer surface bound updates in order to make sure the + * buffer contents and the positioning/size stay in sync. + */ + boolean isResizedWhileNotDragResizing() { + return mResizedWhileNotDragResizing; + } + + /** + * @return Whether we reported "resize while not drag resizing" to the application. + * @see #isResizedWhileNotDragResizing() + */ + boolean isResizedWhileNotDragResizingReported() { + return mResizedWhileNotDragResizingReported; + } + int getResizeMode() { return mResizeMode; } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index acf16896a818..aea395de6c0f 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -229,6 +229,8 @@ class WindowStateAnimator { long mDeferTransactionUntilFrame = -1; long mDeferTransactionTime = -1; + boolean mForceScaleUntilResize; + private final Rect mTmpSize = new Rect(); WindowStateAnimator(final WindowState win) { @@ -585,7 +587,7 @@ class WindowStateAnimator { + drawStateToString()); } - mWin.clearAnimatingWithSavedSurface(); + boolean layoutNeeded = mWin.clearAnimatingWithSavedSurface(); if (mDrawState == DRAW_PENDING) { if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) @@ -595,10 +597,10 @@ class WindowStateAnimator { Slog.v(TAG, "Draw state now committed in " + mWin); } mDrawState = COMMIT_DRAW_PENDING; - return true; + layoutNeeded = true; } - return false; + return layoutNeeded; } // This must be called while inside a transaction. @@ -1298,6 +1300,9 @@ class WindowStateAnimator { if (!finalClipRect.equals(mLastFinalClipRect)) { mLastFinalClipRect.set(finalClipRect); mSurfaceController.setFinalCropInTransaction(finalClipRect); + if (mDestroyPreservedSurfaceUponRedraw && mPendingDestroySurface != null) { + mPendingDestroySurface.setFinalCropInTransaction(finalClipRect); + } } } @@ -1370,7 +1375,8 @@ class WindowStateAnimator { // If we are animating, we either apply the clip before applying all the animation // transformation or after all the transformation. - final boolean useFinalClipRect = isAnimationSet() && stackClip == STACK_CLIP_AFTER_ANIM; + final boolean useFinalClipRect = isAnimationSet() && stackClip == STACK_CLIP_AFTER_ANIM + || mDestroyPreservedSurfaceUponRedraw; // We need to do some acrobatics with surface position, because their clip region is // relative to the inside of the surface, but the stack bounds aren't. @@ -1402,7 +1408,7 @@ class WindowStateAnimator { final Task task = w.getTask(); // We got resized, so block all updates until we got the new surface. - if (w.mResizedWhileNotDragResizing && !w.isGoneForLayoutLw()) { + if (w.isResizedWhileNotDragResizing() && !w.isGoneForLayoutLw()) { return; } @@ -1412,18 +1418,35 @@ class WindowStateAnimator { float extraHScale = (float) 1.0; float extraVScale = (float) 1.0; + mSurfaceResized = mSurfaceController.setSizeInTransaction( + mTmpSize.width(), mTmpSize.height(), recoveringMemory); + mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized; + + calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect); - if (task != null && task.mStack.getForceScaleToCrop()) { - extraHScale = mTmpClipRect.width() / (float)mTmpSize.width(); - extraVScale = mTmpClipRect.height() / (float)mTmpSize.height(); + if ((task != null && task.mStack.getForceScaleToCrop()) || mForceScaleUntilResize) { + int hInsets = w.getAttrs().surfaceInsets.left + w.getAttrs().surfaceInsets.right; + int vInsets = w.getAttrs().surfaceInsets.top + w.getAttrs().surfaceInsets.bottom; + // We want to calculate the scaling based on the content area, not based on + // the entire surface, so that we scale in sync with windows that don't have insets. + extraHScale = (mTmpClipRect.width() - hInsets) / (float)(mTmpSize.width() - hInsets); + extraVScale = (mTmpClipRect.height() - vInsets) / (float)(mTmpSize.height() - vInsets); // In the case of ForceScaleToCrop we scale entire tasks together, // and so we need to scale our offsets relative to the task bounds // or parent and child windows would fall out of alignment. int posX = (int) (mTmpSize.left - w.mAttrs.x * (1 - extraHScale)); int posY = (int) (mTmpSize.top - w.mAttrs.y * (1 - extraVScale)); + // Imagine we are scaling down. As we scale the buffer down, we decrease the + // distance between the surface top left, and the start of the surface contents + // (previously it was surfaceInsets.left pixels in screen space but now it + // will be surfaceInsets.left*extraHScale). This means in order to keep the + // non inset content at the same position, we have to shift the whole window + // forward. Likewise for scaling up, we've increased this distance, and we need + // to shift by a negative number to compensate. posX += w.getAttrs().surfaceInsets.left * (1 - extraHScale); posY += w.getAttrs().surfaceInsets.top * (1 - extraVScale); + mSurfaceController.setPositionInTransaction(posX, posY, recoveringMemory); // Since we are scaled to fit in our previously desired crop, we can now @@ -1431,6 +1454,14 @@ class WindowStateAnimator { // past where the system would have cropped us mTmpClipRect.set(0, 0, mTmpSize.width(), mTmpSize.height()); mTmpFinalClipRect.setEmpty(); + + // Various surfaces in the scaled stack may resize at different times. + // We need to ensure for each surface, that we disable transformation matrix + // scaling in the same transaction which we resize the surface in. + // As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will + // then take over the scaling until the new buffer arrives, and things + // will be seamless. + mForceScaleUntilResize = true; } else { mSurfaceController.setPositionInTransaction(mTmpSize.left, mTmpSize.top, recoveringMemory); @@ -1442,8 +1473,6 @@ class WindowStateAnimator { mDtDx * w.mVScale * extraVScale, mDsDy * w.mHScale * extraHScale, mDtDy * w.mVScale * extraVScale, recoveringMemory); - mSurfaceResized = mSurfaceController.setSizeInTransaction( - mTmpSize.width(), mTmpSize.height(), recoveringMemory); if (mSurfaceResized) { mReportSurfaceResized = true; diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 7e9993db4cb4..308b24dd8dd6 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -719,7 +719,7 @@ class WindowSurfacePlacer { || task.mStack.isAdjustedForIme()); if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 && !w.isDragResizing() && !adjustedForMinimizedDockOrIme - && (task == null || !w.getTask().mStack.getFreezeMovementAnimations()) + && (task == null || w.getTask().mStack.hasMovementAnimations()) && !w.mWinAnimator.mLastHidden) { winAnimator.setMoveAnimation(left, top); } @@ -731,7 +731,9 @@ class WindowSurfacePlacer { } try { - w.mClient.moved(left, top); + if (task == null || task.mStack.getBoundsAnimating()) { + w.mClient.moved(left, top); + } } catch (RemoteException e) { } w.mMovedByResize = false; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index cd485c55c816..2e82cec7e9d9 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -204,7 +204,7 @@ public: void setShowTouches(bool enabled); void setInteractive(bool interactive); void reloadCalibration(); - void setPointerIconShape(int32_t iconId); + void setPointerIconType(int32_t iconId); void reloadPointerIcons(); void setCustomPointerIcon(const SpriteIcon& icon); void setPointerIconDetached(bool detached); @@ -785,11 +785,11 @@ void NativeInputManager::reloadCalibration() { InputReaderConfiguration::CHANGE_TOUCH_AFFINE_TRANSFORMATION); } -void NativeInputManager::setPointerIconShape(int32_t iconId) { +void NativeInputManager::setPointerIconType(int32_t iconId) { AutoMutex _l(mLock); sp<PointerController> controller = mLocked.pointerController.promote(); if (controller != NULL) { - controller->updatePointerShape(iconId); + controller->updatePointerIcon(iconId); } } @@ -1462,9 +1462,9 @@ static void nativeMonitor(JNIEnv* /* env */, jclass /* clazz */, jlong ptr) { im->getInputManager()->getDispatcher()->monitor(); } -static void nativeSetPointerIconShape(JNIEnv* /* env */, jclass /* clazz */, jlong ptr, jint iconId) { +static void nativeSetPointerIconType(JNIEnv* /* env */, jclass /* clazz */, jlong ptr, jint iconId) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); - im->setPointerIconShape(iconId); + im->setPointerIconType(iconId); } static void nativeReloadPointerIcons(JNIEnv* /* env */, jclass /* clazz */, jlong ptr) { @@ -1548,8 +1548,8 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*) nativeDump }, { "nativeMonitor", "(J)V", (void*) nativeMonitor }, - { "nativeSetPointerIconShape", "(JI)V", - (void*) nativeSetPointerIconShape }, + { "nativeSetPointerIconType", "(JI)V", + (void*) nativeSetPointerIconType }, { "nativeReloadPointerIcons", "(J)V", (void*) nativeReloadPointerIcons }, { "nativeSetCustomPointerIcon", "(JLandroid/view/PointerIcon;)V", diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index c5c90e02f200..e29452a17bd0 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -72,6 +72,18 @@ static const GnssConfigurationInterface* sGnssConfigurationInterface = NULL; #define GPS_MAX_SATELLITE_COUNT 32 #define GNSS_MAX_SATELLITE_COUNT 64 +// Let these through, with ID remapped by offset +#define GLONASS_SVID_OFFSET 64 +#define GLONASS_SVID_COUNT 24 +#define BEIDOU_SVID_OFFSET 200 +#define BEIDOU_SVID_COUNT 35 + +// Let these through, with no ID remapping +#define SBAS_SVID_MIN 120 +#define SBAS_SVID_MAX 151 +#define QZSS_SVID_MIN 193 +#define QZSS_SVID_MAX 200 + #define SVID_SHIFT_WIDTH 7 #define CONSTELLATION_TYPE_SHIFT_WIDTH 3 @@ -134,8 +146,21 @@ static void sv_status_callback(GpsSvStatus* sv_status) for (size_t i = 0; i < sGnssSvListSize; i++) { GnssSvInfo& info = sGnssSvList[i]; info.svid = sv_status->sv_list[i].prn; + // Defacto mapping from the overused API that was designed for GPS-only if (info.svid >=1 && info.svid <= 32) { info.constellation = GNSS_CONSTELLATION_GPS; + } else if (info.svid > GLONASS_SVID_OFFSET && + info.svid <= GLONASS_SVID_OFFSET + GLONASS_SVID_COUNT) { + info.constellation = GNSS_CONSTELLATION_GLONASS; + info.svid -= GLONASS_SVID_OFFSET; + } else if (info.svid > BEIDOU_SVID_OFFSET && + info.svid <= BEIDOU_SVID_OFFSET + BEIDOU_SVID_COUNT) { + info.constellation = GNSS_CONSTELLATION_BEIDOU; + info.svid -= BEIDOU_SVID_OFFSET; + } else if (info.svid >= SBAS_SVID_MIN && info.svid <= SBAS_SVID_MAX) { + info.constellation = GNSS_CONSTELLATION_SBAS; + } else if (info.svid >= QZSS_SVID_MIN && info.svid <= QZSS_SVID_MAX) { + info.constellation = GNSS_CONSTELLATION_QZSS; } else { ALOGD("Unknown constellation type with Svid = %d.", info.svid); info.constellation = GNSS_CONSTELLATION_UNKNOWN; @@ -144,7 +169,8 @@ static void sv_status_callback(GpsSvStatus* sv_status) info.elevation = sv_status->sv_list[i].elevation; info.azimuth = sv_status->sv_list[i].azimuth; info.flags = GNSS_SV_FLAGS_NONE; - if (info.svid > 0 && info.svid <= 32) { + // Only GPS info is valid for these fields, as these masks are just 32 bits, by GPS prn + if (info.constellation == GNSS_CONSTELLATION_GPS) { int32_t this_svid_mask = (1 << (info.svid - 1)); if ((ephemeris_mask & this_svid_mask) != 0) { info.flags |= GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 4dbead248ec6..a5eb0b217d1f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2658,7 +2658,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userHandle = params[0]; if (userHandle == UserHandle.USER_ALL) { - for (UserInfo userInfo : mUserManager.getUsers()) { + for (UserInfo userInfo : mUserManager.getUsers(true)) { manageNotification(userInfo.getUserHandle()); } } else { @@ -2668,7 +2668,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } private void manageNotification(UserHandle userHandle) { - if (!mUserManager.isUserRunning(userHandle)) { + if (!mUserManager.isUserUnlocked(userHandle)) { return; } @@ -7315,23 +7315,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @Override - public Bundle getUserRestrictionsForUser(ComponentName who, int userHandle) { - if (!mHasFeature) { - return null; - } - Preconditions.checkNotNull(who, "ComponentName is null"); - enforceFullCrossUsersPermission(userHandle); - enforceCanManageProfileAndDeviceOwners(); - synchronized (this) { - ActiveAdmin activeAdmin = getActiveAdminUncheckedLocked(who, userHandle); - if (activeAdmin == null) { - return null; - } - return activeAdmin.userRestrictions; - } - } - - @Override public boolean setApplicationHidden(ComponentName who, String packageName, boolean hidden) { Preconditions.checkNotNull(who, "ComponentName is null"); diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index db521e2d5179..505d15a061e9 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -135,6 +135,7 @@ public class DhcpClient extends StateMachine { private static final int CMD_RECEIVED_PACKET = PRIVATE_BASE + 2; private static final int CMD_TIMEOUT = PRIVATE_BASE + 3; private static final int CMD_RENEW_DHCP = PRIVATE_BASE + 4; + private static final int CMD_EXPIRE_DHCP = PRIVATE_BASE + 5; // For message logging. private static final Class[] sMessageClasses = { DhcpClient.class }; @@ -176,6 +177,7 @@ public class DhcpClient extends StateMachine { private final WakeupMessage mKickAlarm; private final WakeupMessage mTimeoutAlarm; private final WakeupMessage mRenewAlarm; + private final WakeupMessage mExpiryAlarm; private final String mIfaceName; private boolean mRegisteredForPreDhcpNotification; @@ -241,6 +243,7 @@ public class DhcpClient extends StateMachine { mTimeoutAlarm = makeWakeupMessage("TIMEOUT", CMD_TIMEOUT); // Used to schedule DHCP renews. mRenewAlarm = makeWakeupMessage("RENEW", CMD_RENEW_DHCP); + mExpiryAlarm = makeWakeupMessage("EXPIRY", CMD_EXPIRE_DHCP); } public void registerForPreDhcpNotification() { @@ -403,15 +406,21 @@ public class DhcpClient extends StateMachine { return transmitPacket(packet, description, to); } - private void scheduleRenew() { - if (mDhcpLeaseExpiry != 0) { - long now = SystemClock.elapsedRealtime(); - long alarmTime = (now + mDhcpLeaseExpiry) / 2; - mRenewAlarm.schedule(alarmTime); - Log.d(TAG, "Scheduling renewal in " + ((alarmTime - now) / 1000) + "s"); - } else { - Log.d(TAG, "Infinite lease, no renewal needed"); + private void scheduleLeaseTimers() { + if (mDhcpLeaseExpiry == 0) { + Log.d(TAG, "Infinite lease, no timer scheduling needed"); + return; } + + final long now = SystemClock.elapsedRealtime(); + long renewTime = (now + mDhcpLeaseExpiry) / 2; + mRenewAlarm.schedule(renewTime); + long secondsHence = (renewTime - now) / 1000; + Log.d(TAG, "Scheduling renewal in " + secondsHence + "s"); + + mExpiryAlarm.schedule(mDhcpLeaseExpiry); + secondsHence = (mDhcpLeaseExpiry - now) / 1000; + Log.d(TAG, "Scheduling expiry in " + secondsHence + "s"); } private void notifySuccess() { @@ -423,6 +432,13 @@ public class DhcpClient extends StateMachine { mController.sendMessage(CMD_POST_DHCP_ACTION, DHCP_FAILURE, 0, null); } + private void acceptDhcpResults(DhcpResults results, String msg) { + mDhcpLease = results; + mOffer = null; + Log.d(TAG, msg + " lease: " + mDhcpLease); + notifySuccess(); + } + private void clearDhcpState() { mDhcpLease = null; mDhcpLeaseExpiry = 0; @@ -720,11 +736,8 @@ public class DhcpClient extends StateMachine { if ((packet instanceof DhcpAckPacket)) { DhcpResults results = packet.toDhcpResults(); if (results != null) { - mDhcpLease = results; - mOffer = null; - Log.d(TAG, "Confirmed lease: " + mDhcpLease); setDhcpLeaseExpiry(packet); - notifySuccess(); + acceptDhcpResults(results, "Confirmed"); transitionTo(mConfiguringInterfaceState); } } else if (packet instanceof DhcpNakPacket) { @@ -749,7 +762,22 @@ public class DhcpClient extends StateMachine { } @Override + public boolean processMessage(Message message) { + super.processMessage(message); + switch (message.what) { + case CMD_EXPIRE_DHCP: + Log.d(TAG, "Lease expired!"); + notifyFailure(); + transitionTo(mDhcpInitState); + return HANDLED; + default: + return NOT_HANDLED; + } + } + + @Override public void exit() { + mExpiryAlarm.cancel(); // Tell IpManager to clear the IPv4 address. There is no need to // wait for confirmation since any subsequent packets are sent from // INADDR_ANY anyway (DISCOVER, REQUEST). @@ -797,7 +825,7 @@ public class DhcpClient extends StateMachine { super.enter(); // TODO: DhcpStateMachine only supported renewing at 50% of the lease time, // and did not support rebinding. Now that the legacy DHCP client is gone, fix this. - scheduleRenew(); + scheduleLeaseTimers(); } @Override @@ -849,22 +877,31 @@ public class DhcpClient extends StateMachine { protected void receivePacket(DhcpPacket packet) { if (!isValidPacket(packet)) return; if ((packet instanceof DhcpAckPacket)) { - setDhcpLeaseExpiry(packet); - notifySuccess(); - transitionTo(mDhcpBoundState); + final DhcpResults results = packet.toDhcpResults(); + if (results != null) { + if (!mDhcpLease.ipAddress.equals(results.ipAddress)) { + Log.d(TAG, "Renewed lease not for our current IP address!"); + notifyFailure(); + transitionTo(mDhcpInitState); + } + setDhcpLeaseExpiry(packet); + // Updating our notion of DhcpResults here only causes the + // DNS servers and routes to be updated in LinkProperties + // in IpManager and by any overridden relevant handlers of + // the registered IpManager.Callback. IP address changes + // are not supported here. + acceptDhcpResults(results, "Renewed"); + transitionTo(mDhcpBoundState); + } } else if (packet instanceof DhcpNakPacket) { + Log.d(TAG, "Received NAK, returning to INIT"); + notifyFailure(); transitionTo(mDhcpInitState); } } - - @Override - protected void timeout() { - transitionTo(mDhcpInitState); - notifyFailure(); - } } - // Not implemented. DhcpStateMachine did not implement it either. + // Not implemented--yet. DhcpStateMachine did not implement it either. class DhcpRebindingState extends LoggingState { } diff --git a/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java b/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java new file mode 100644 index 000000000000..5d8b843bbc17 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/connectivity/VpnTest.java @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.connectivity; + +import static android.content.pm.UserInfo.FLAG_ADMIN; +import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE; +import static android.content.pm.UserInfo.FLAG_PRIMARY; +import static android.content.pm.UserInfo.FLAG_RESTRICTED; +import static org.mockito.AdditionalMatchers.*; +import static org.mockito.Mockito.*; + +import android.annotation.UserIdInt; +import android.app.AppOpsManager; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.net.UidRange; +import android.os.INetworkManagementService; +import android.os.Looper; +import android.os.UserHandle; +import android.os.UserManager; +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; +import android.util.ArrayMap; +import android.util.ArraySet; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.Set; + +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * Tests for {@link Vpn}. + * + * Build, install and run with: + * runtest --path src/com/android/server/connectivity/VpnTest.java + */ +public class VpnTest extends AndroidTestCase { + private static final String TAG = "VpnTest"; + + // Mock users + static final UserInfo primaryUser = new UserInfo(27, "Primary", FLAG_ADMIN | FLAG_PRIMARY); + static final UserInfo secondaryUser = new UserInfo(15, "Secondary", FLAG_ADMIN); + static final UserInfo restrictedProfileA = new UserInfo(40, "RestrictedA", FLAG_RESTRICTED); + static final UserInfo restrictedProfileB = new UserInfo(42, "RestrictedB", FLAG_RESTRICTED); + static final UserInfo managedProfileA = new UserInfo(45, "ManagedA", FLAG_MANAGED_PROFILE); + static { + restrictedProfileA.restrictedProfileParentId = primaryUser.id; + restrictedProfileB.restrictedProfileParentId = secondaryUser.id; + managedProfileA.profileGroupId = primaryUser.id; + } + + /** + * Names and UIDs for some fake packages. Important points: + * - UID is ordered increasing. + * - One pair of packages have consecutive UIDs. + */ + static final String[] PKGS = {"com.example", "org.example", "net.example", "web.vpn"}; + static final int[] PKG_UIDS = {66, 77, 78, 400}; + + // Mock packages + static final Map<String, Integer> mPackages = new ArrayMap<>(); + static { + for (int i = 0; i < PKGS.length; i++) { + mPackages.put(PKGS[i], PKG_UIDS[i]); + } + } + + @Mock private Context mContext; + @Mock private UserManager mUserManager; + @Mock private PackageManager mPackageManager; + @Mock private INetworkManagementService mNetService; + @Mock private AppOpsManager mAppOps; + + @Override + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + setMockedPackages(mPackages); + when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); + when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOps); + doNothing().when(mNetService).registerObserver(any()); + } + + @SmallTest + public void testRestrictedProfilesAreAddedToVpn() { + setMockedUsers(primaryUser, secondaryUser, restrictedProfileA, restrictedProfileB); + + final Vpn vpn = new MockVpn(primaryUser.id); + final Set<UidRange> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + null, null); + + assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { + UidRange.createForUser(primaryUser.id), + UidRange.createForUser(restrictedProfileA.id) + })), ranges); + } + + @SmallTest + public void testManagedProfilesAreNotAddedToVpn() { + setMockedUsers(primaryUser, managedProfileA); + + final Vpn vpn = new MockVpn(primaryUser.id); + final Set<UidRange> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + null, null); + + assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { + UidRange.createForUser(primaryUser.id) + })), ranges); + } + + @SmallTest + public void testAddUserToVpnOnlyAddsOneUser() { + setMockedUsers(primaryUser, restrictedProfileA, managedProfileA); + + final Vpn vpn = new MockVpn(primaryUser.id); + final Set<UidRange> ranges = new ArraySet<>(); + vpn.addUserToRanges(ranges, primaryUser.id, null, null); + + assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { + UidRange.createForUser(primaryUser.id) + })), ranges); + } + + @SmallTest + public void testUidWhiteAndBlacklist() throws Exception { + final Vpn vpn = new MockVpn(primaryUser.id); + final UidRange user = UidRange.createForUser(primaryUser.id); + final String[] packages = {PKGS[0], PKGS[1], PKGS[2]}; + + // Whitelist + final Set<UidRange> allow = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + Arrays.asList(packages), null); + assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { + new UidRange(user.start + PKG_UIDS[0], user.start + PKG_UIDS[0]), + new UidRange(user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]) + })), allow); + + // Blacklist + final Set<UidRange> disallow = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + null, Arrays.asList(packages)); + assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { + new UidRange(user.start, user.start + PKG_UIDS[0] - 1), + new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1), + /* Empty range between UIDS[1] and UIDS[2], should be excluded, */ + new UidRange(user.start + PKG_UIDS[2] + 1, user.stop) + })), disallow); + } + + @SmallTest + public void testLockdownChangingPackage() throws Exception { + final MockVpn vpn = new MockVpn(primaryUser.id); + final UidRange user = UidRange.createForUser(primaryUser.id); + + // Default state. + vpn.assertUnblocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + + // Set always-on without lockdown. + assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false)); + vpn.assertUnblocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + + // Set always-on with lockdown. + assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true)); + verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] { + new UidRange(user.start, user.start + PKG_UIDS[1] - 1), + new UidRange(user.start + PKG_UIDS[1] + 1, user.stop) + })); + vpn.assertBlocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]); + vpn.assertUnblocked(user.start + PKG_UIDS[1]); + + // Switch to another app. + assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true)); + verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] { + new UidRange(user.start, user.start + PKG_UIDS[1] - 1), + new UidRange(user.start + PKG_UIDS[1] + 1, user.stop) + })); + verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] { + new UidRange(user.start, user.start + PKG_UIDS[3] - 1), + new UidRange(user.start + PKG_UIDS[3] + 1, user.stop) + })); + vpn.assertBlocked(user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]); + vpn.assertUnblocked(user.start + PKG_UIDS[3]); + } + + @SmallTest + public void testLockdownAddingAProfile() throws Exception { + final MockVpn vpn = new MockVpn(primaryUser.id); + setMockedUsers(primaryUser); + + // Make a copy of the restricted profile, as we're going to mark it deleted halfway through. + final UserInfo tempProfile = new UserInfo(restrictedProfileA.id, restrictedProfileA.name, + restrictedProfileA.flags); + tempProfile.restrictedProfileParentId = primaryUser.id; + + final UidRange user = UidRange.createForUser(primaryUser.id); + final UidRange profile = UidRange.createForUser(tempProfile.id); + + // Set lockdown. + assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true)); + verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] { + new UidRange(user.start, user.start + PKG_UIDS[3] - 1), + new UidRange(user.start + PKG_UIDS[3] + 1, user.stop) + })); + + // Verify restricted user isn't affected at first. + vpn.assertUnblocked(profile.start + PKG_UIDS[0]); + + // Add the restricted user. + setMockedUsers(primaryUser, tempProfile); + vpn.onUserAdded(tempProfile.id); + verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] { + new UidRange(profile.start, profile.start + PKG_UIDS[3] - 1), + new UidRange(profile.start + PKG_UIDS[3] + 1, profile.stop) + })); + + // Remove the restricted user. + tempProfile.partial = true; + vpn.onUserRemoved(tempProfile.id); + verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] { + new UidRange(profile.start, profile.start + PKG_UIDS[3] - 1), + new UidRange(profile.start + PKG_UIDS[3] + 1, profile.stop) + })); + } + + /** + * A subclass of {@link Vpn} with some of the fields pre-mocked. + */ + private class MockVpn extends Vpn { + public MockVpn(@UserIdInt int userId) { + super(Looper.myLooper(), mContext, mNetService, userId); + } + + public void assertBlocked(int... uids) { + for (int uid : uids) { + assertTrue("Uid " + uid + " should be blocked", isBlockingUid(uid)); + } + } + + public void assertUnblocked(int... uids) { + for (int uid : uids) { + assertFalse("Uid " + uid + " should not be blocked", isBlockingUid(uid)); + } + } + } + + /** + * Populate {@link #mUserManager} with a list of fake users. + */ + private void setMockedUsers(UserInfo... users) { + final Map<Integer, UserInfo> userMap = new ArrayMap<>(); + for (UserInfo user : users) { + userMap.put(user.id, user); + } + + /** + * @see UserManagerService#getUsers(boolean) + */ + doAnswer(invocation -> { + final boolean excludeDying = (boolean) invocation.getArguments()[0]; + final ArrayList<UserInfo> result = new ArrayList<>(users.length); + for (UserInfo ui : users) { + if (!excludeDying || (ui.isEnabled() && !ui.partial)) { + result.add(ui); + } + } + return result; + }).when(mUserManager).getUsers(anyBoolean()); + + doAnswer(invocation -> { + final int id = (int) invocation.getArguments()[0]; + return userMap.get(id); + }).when(mUserManager).getUserInfo(anyInt()); + + doAnswer(invocation -> { + final int id = (int) invocation.getArguments()[0]; + return (userMap.get(id).flags & UserInfo.FLAG_ADMIN) != 0; + }).when(mUserManager).canHaveRestrictedProfile(anyInt()); + } + + /** + * Populate {@link #mPackageManager} with a fake packageName-to-UID mapping. + */ + private void setMockedPackages(final Map<String, Integer> packages) { + try { + doAnswer(invocation -> { + final String appName = (String) invocation.getArguments()[0]; + final int userId = (int) invocation.getArguments()[1]; + return UserHandle.getUid(userId, packages.get(appName)); + }).when(mPackageManager).getPackageUidAsUser(anyString(), anyInt()); + } catch (Exception e) { + } + } +} diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 4cab7f06a0ff..fc7d7412d8b5 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -1367,12 +1367,14 @@ public abstract class ConnectionService extends Service { /** {@hide} */ protected void removeConnection(Connection connection) { - String id = mIdByConnection.get(connection); connection.unsetConnectionService(this); connection.removeConnectionListener(mConnectionListener); - mConnectionById.remove(mIdByConnection.get(connection)); - mIdByConnection.remove(connection); - mAdapter.removeCall(id); + String id = mIdByConnection.get(connection); + if (id != null) { + mConnectionById.remove(id); + mIdByConnection.remove(connection); + mAdapter.removeCall(id); + } } private String addConferenceInternal(Conference conference) { diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java index a07a5af1caef..46b0fbda859b 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java +++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java @@ -426,4 +426,10 @@ public class TelephonyIntents { */ public static final String ACTION_REQUEST_NETWORK_FAILED = "android.intent.action.REQUEST_NETWORK_FAILED"; + + /** + * Broadcast action to trigger CI OMA-DM Session. + */ + public static final String ACTION_REQUEST_OMADM_CONFIGURATION_UPDATE = + "com.android.omadm.service.CONFIGURATION_UPDATE"; } diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index f9e008e1cf92..ceebdd50021a 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -336,10 +336,11 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setAppStartingWindow(IBinder arg0, String arg1, int arg2, CompatibilityInfo arg3, + public boolean setAppStartingWindow(IBinder arg0, String arg1, int arg2, CompatibilityInfo arg3, CharSequence arg4, int arg5, int arg6, int arg7, int arg8, IBinder arg9, boolean arg10) throws RemoteException { // TODO Auto-generated method stub + return false; } @Override |