diff options
45 files changed, 435 insertions, 210 deletions
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 9a014766c206..f098f2a7c143 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -765,6 +765,16 @@ public class ActivityInfo extends ComponentInfo * constant starts at the high bits. */ public static final int CONFIG_FONT_SCALE = 0x40000000; + /** + * Bit in {@link #configChanges} that indicates that the activity + * can itself handle changes to the rotation. Set from the + * {@link android.R.attr#configChanges} attribute. This is + * not a core resource configuration, but a higher-level value, so its + * constant starts at the high bits. + * @hide We do not want apps to handle this. It will eventually be moved out of + * {@link Configuration}. + */ + public static final int CONFIG_ROTATION = 0x20000000; /** @hide * Unfortunately the constants for config changes in native code are diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index c67376c25885..b39f9a5816fe 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -200,6 +200,8 @@ public class PackageParser { // Temporary workaround; allow meta-data to expose components to instant apps private static final String META_DATA_INSTANT_APPS = "instantapps.clients.allowed"; + private static final String METADATA_MAX_ASPECT_RATIO = "android.max_aspect"; + /** * Bit mask of all the valid bits that can be set in recreateOnConfigChanges. * @hide @@ -3639,6 +3641,7 @@ public class PackageParser { final int innerDepth = parser.getDepth(); int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { @@ -3815,6 +3818,10 @@ public class PackageParser { } } + // Must be ran after the entire {@link ApplicationInfo} has been fully processed and after + // every activity info has had a chance to set it from its attributes. + setMaxAspectRatio(owner); + modifySharedLibrariesForBackwardCompatibility(owner); if (hasDomainURLs(owner)) { @@ -4258,7 +4265,12 @@ public class PackageParser { a.info.flags |= FLAG_ALWAYS_FOCUSABLE; } - setActivityMaxAspectRatio(a.info, sa, owner); + if (sa.hasValue(R.styleable.AndroidManifestActivity_maxAspectRatio) + && sa.getType(R.styleable.AndroidManifestActivity_maxAspectRatio) + == TypedValue.TYPE_FLOAT) { + a.setMaxAspectRatio(sa.getFloat(R.styleable.AndroidManifestActivity_maxAspectRatio, + 0 /*default*/)); + } a.info.lockTaskLaunchMode = sa.getInt(R.styleable.AndroidManifestActivity_lockTaskMode, 0); @@ -4496,28 +4508,40 @@ public class PackageParser { } } - private void setActivityMaxAspectRatio(ActivityInfo aInfo, TypedArray sa, Package owner) { - if (aInfo.resizeMode == RESIZE_MODE_RESIZEABLE - || aInfo.resizeMode == RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION) { - // Resizeable activities can be put in any aspect ratio. - aInfo.maxAspectRatio = 0; - return; - } - + /** + * Sets every the max aspect ratio of every child activity that doesn't already have an aspect + * ratio set. + */ + private void setMaxAspectRatio(Package owner) { // Default to (1.86) 16.7:9 aspect ratio for pre-O apps and unset for O and greater. // NOTE: 16.7:9 was the max aspect ratio Android devices can support pre-O per the CDD. - float defaultMaxAspectRatio = owner.applicationInfo.targetSdkVersion < O + float maxAspectRatio = owner.applicationInfo.targetSdkVersion < O ? DEFAULT_PRE_O_MAX_ASPECT_RATIO : 0; - if (owner.applicationInfo.maxAspectRatio != 0 ) { + + if (owner.applicationInfo.maxAspectRatio != 0) { // Use the application max aspect ration as default if set. - defaultMaxAspectRatio = owner.applicationInfo.maxAspectRatio; + maxAspectRatio = owner.applicationInfo.maxAspectRatio; + } else if (owner.mAppMetaData != null + && owner.mAppMetaData.containsKey(METADATA_MAX_ASPECT_RATIO)) { + maxAspectRatio = owner.mAppMetaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio); } - aInfo.maxAspectRatio = sa.getFloat( - R.styleable.AndroidManifestActivity_maxAspectRatio, defaultMaxAspectRatio); - if (aInfo.maxAspectRatio < 1.0f && aInfo.maxAspectRatio != 0) { - // Ignore any value lesser than 1.0. - aInfo.maxAspectRatio = 0; + for (Activity activity : owner.activities) { + // If the max aspect ratio for the activity has already been set, skip. + if (activity.hasMaxAspectRatio()) { + continue; + } + + // By default we prefer to use a values defined on the activity directly than values + // defined on the application. We do not check the styled attributes on the activity + // as it would have already been set when we processed the activity. We wait to process + // the meta data here since this method is called at the end of processing the + // application and all meta data is guaranteed. + final float activityAspectRatio = activity.metaData != null + ? activity.metaData.getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio) + : maxAspectRatio; + + activity.setMaxAspectRatio(activityAspectRatio); } } @@ -4658,6 +4682,7 @@ public class PackageParser { info.windowLayout = target.info.windowLayout; info.resizeMode = target.info.resizeMode; info.maxAspectRatio = target.info.maxAspectRatio; + info.encryptionAware = info.directBootAware = target.info.directBootAware; Activity a = new Activity(mParseActivityAliasArgs, info); @@ -6940,6 +6965,11 @@ public class PackageParser { public final static class Activity extends Component<ActivityIntentInfo> implements Parcelable { public final ActivityInfo info; + private boolean mHasMaxAspectRatio; + + private boolean hasMaxAspectRatio() { + return mHasMaxAspectRatio; + } public Activity(final ParseComponentArgs args, final ActivityInfo _info) { super(args, _info); @@ -6952,6 +6982,23 @@ public class PackageParser { info.packageName = packageName; } + + private void setMaxAspectRatio(float maxAspectRatio) { + if (info.resizeMode == RESIZE_MODE_RESIZEABLE + || info.resizeMode == RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION) { + // Resizeable activities can be put in any aspect ratio. + return; + } + + if (maxAspectRatio < 1.0f && maxAspectRatio != 0) { + // Ignore any value lesser than 1.0. + return; + } + + info.maxAspectRatio = maxAspectRatio; + mHasMaxAspectRatio = true; + } + public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("Activity{"); @@ -6971,11 +7018,13 @@ public class PackageParser { public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeParcelable(info, flags | Parcelable.PARCELABLE_ELIDE_DUPLICATES); + dest.writeBoolean(mHasMaxAspectRatio); } private Activity(Parcel in) { super(in); info = in.readParcelable(Object.class.getClassLoader()); + mHasMaxAspectRatio = in.readBoolean(); for (ActivityIntentInfo aii : intents) { aii.activity = this; diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index ef279b86662a..68d4cd8c5f7d 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -1395,7 +1395,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration } if ((compareUndefined || delta.mRotation != ROTATION_UNDEFINED) && mRotation != delta.mRotation) { - changed |= ActivityInfo.CONFIG_ORIENTATION; + changed |= ActivityInfo.CONFIG_ROTATION; } if ((compareUndefined || getScreenLayoutNoDirection(delta.screenLayout) != (SCREENLAYOUT_SIZE_UNDEFINED | SCREENLAYOUT_LONG_UNDEFINED)) diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 2c6c7f96c517..1f8de044b280 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -808,7 +808,8 @@ public class RecoverySystem { HandlerThread euiccHandlerThread = new HandlerThread("euiccWipeFinishReceiverThread"); euiccHandlerThread.start(); Handler euiccHandler = new Handler(euiccHandlerThread.getLooper()); - context.registerReceiver(euiccWipeFinishReceiver, filterConsent, null, euiccHandler); + context.getApplicationContext() + .registerReceiver(euiccWipeFinishReceiver, filterConsent, null, euiccHandler); if (isWipeEuicc) { euiccManager.eraseSubscriptions(callbackIntent); } else { @@ -831,7 +832,7 @@ public class RecoverySystem { Log.e(TAG, "Timeout retaining eUICC data."); } } - context.unregisterReceiver(euiccWipeFinishReceiver); + context.getApplicationContext().unregisterReceiver(euiccWipeFinishReceiver); } catch (InterruptedException e) { Thread.currentThread().interrupt(); if (isWipeEuicc) { diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index 2608698f5b63..04819a5999eb 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -43,10 +43,6 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener private static final String TAG = "ColorExtractor"; - public static final int FALLBACK_COLOR = 0xff83888d; - - private int mMainFallbackColor = FALLBACK_COLOR; - private int mSecondaryFallbackColor = FALLBACK_COLOR; private final SparseArray<GradientColors[]> mGradientColors; private final ArrayList<OnColorsChangedListener> mOnColorsChangedListeners; private final Context mContext; @@ -73,6 +69,9 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } mOnColorsChangedListeners = new ArrayList<>(); + GradientColors[] systemColors = mGradientColors.get(WallpaperManager.FLAG_SYSTEM); + GradientColors[] lockColors = mGradientColors.get(WallpaperManager.FLAG_LOCK); + WallpaperManager wallpaperManager = mContext.getSystemService(WallpaperManager.class); if (wallpaperManager == null) { Log.w(TAG, "Can't listen to color changes!"); @@ -83,23 +82,18 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener Trace.beginSection("ColorExtractor#getWallpaperColors"); mSystemColors = wallpaperManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM); mLockColors = wallpaperManager.getWallpaperColors(WallpaperManager.FLAG_LOCK); - - GradientColors[] systemColors = mGradientColors.get( - WallpaperManager.FLAG_SYSTEM); - extractInto(mSystemColors, - systemColors[TYPE_NORMAL], - systemColors[TYPE_DARK], - systemColors[TYPE_EXTRA_DARK]); - - GradientColors[] lockColors = mGradientColors.get(WallpaperManager.FLAG_LOCK); - extractInto(mLockColors, - lockColors[TYPE_NORMAL], - lockColors[TYPE_DARK], - lockColors[TYPE_EXTRA_DARK]); - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM - | WallpaperManager.FLAG_LOCK); Trace.endSection(); } + + // Initialize all gradients with the current colors + extractInto(mSystemColors, + systemColors[TYPE_NORMAL], + systemColors[TYPE_DARK], + systemColors[TYPE_EXTRA_DARK]); + extractInto(mLockColors, + lockColors[TYPE_NORMAL], + lockColors[TYPE_DARK], + lockColors[TYPE_EXTRA_DARK]); } /** @@ -181,25 +175,8 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener private void extractInto(WallpaperColors inWallpaperColors, GradientColors outGradientColorsNormal, GradientColors outGradientColorsDark, GradientColors outGradientColorsExtraDark) { - if (inWallpaperColors == null) { - applyFallback(outGradientColorsNormal); - applyFallback(outGradientColorsDark); - applyFallback(outGradientColorsExtraDark); - return; - } - boolean success = mExtractionType.extractInto(inWallpaperColors, outGradientColorsNormal, + mExtractionType.extractInto(inWallpaperColors, outGradientColorsNormal, outGradientColorsDark, outGradientColorsExtraDark); - if (!success) { - applyFallback(outGradientColorsNormal); - applyFallback(outGradientColorsDark); - applyFallback(outGradientColorsExtraDark); - } - } - - private void applyFallback(GradientColors outGradientColors) { - outGradientColors.setMainColor(mMainFallbackColor); - outGradientColors.setSecondaryColor(mSecondaryFallbackColor); - outGradientColors.setSupportsDarkText(false); } public void destroy() { @@ -218,8 +195,8 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } public static class GradientColors { - private int mMainColor = FALLBACK_COLOR; - private int mSecondaryColor = FALLBACK_COLOR; + private int mMainColor; + private int mSecondaryColor; private boolean mSupportsDarkText; public void setMainColor(int mainColor) { diff --git a/core/java/com/android/internal/colorextraction/types/ExtractionType.java b/core/java/com/android/internal/colorextraction/types/ExtractionType.java index 762b54fb1e6b..7000e798f87b 100644 --- a/core/java/com/android/internal/colorextraction/types/ExtractionType.java +++ b/core/java/com/android/internal/colorextraction/types/ExtractionType.java @@ -38,9 +38,8 @@ public interface ExtractionType { * @param outGradientColorsNormal object that should receive normal colors * @param outGradientColorsDark object that should receive dark colors * @param outGradientColorsExtraDark object that should receive extra dark colors - * @return true if successful. */ - boolean extractInto(WallpaperColors inWallpaperColors, + void extractInto(WallpaperColors inWallpaperColors, ColorExtractor.GradientColors outGradientColorsNormal, ColorExtractor.GradientColors outGradientColorsDark, ColorExtractor.GradientColors outGradientColorsExtraDark); diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java index b8ebe3000d8e..e78ca3844bed 100644 --- a/core/java/com/android/internal/colorextraction/types/Tonal.java +++ b/core/java/com/android/internal/colorextraction/types/Tonal.java @@ -44,24 +44,54 @@ public class Tonal implements ExtractionType { private static final boolean DEBUG = true; + public static final int MAIN_COLOR_LIGHT = 0xffe0e0e0; + public static final int SECONDARY_COLOR_LIGHT = 0xff9e9e9e; + public static final int MAIN_COLOR_DARK = 0xff212121; + public static final int SECONDARY_COLOR_DARK = 0xff000000; + // Temporary variable to avoid allocations private float[] mTmpHSL = new float[3]; /** - * Grab colors from WallpaperColors as set them into GradientColors + * Grab colors from WallpaperColors and set them into GradientColors. + * Also applies the default gradient in case extraction fails. + * + * @param inWallpaperColors Input. + * @param outColorsNormal Colors for normal theme. + * @param outColorsDark Colors for dar theme. + * @param outColorsExtraDark Colors for extra dark theme. + */ + public void extractInto(@Nullable WallpaperColors inWallpaperColors, + @NonNull GradientColors outColorsNormal, @NonNull GradientColors outColorsDark, + @NonNull GradientColors outColorsExtraDark) { + boolean success = runTonalExtraction(inWallpaperColors, outColorsNormal, outColorsDark, + outColorsExtraDark); + if (!success) { + applyFallback(inWallpaperColors, outColorsNormal, outColorsDark, outColorsExtraDark); + } + } + + /** + * Grab colors from WallpaperColors and set them into GradientColors. * - * @param inWallpaperColors input - * @param outColorsNormal colors for normal theme - * @param outColorsDark colors for dar theme - * @param outColorsExtraDark colors for extra dark theme - * @return true if successful + * @param inWallpaperColors Input. + * @param outColorsNormal Colors for normal theme. + * @param outColorsDark Colors for dar theme. + * @param outColorsExtraDark Colors for extra dark theme. + * @return True if succeeded or false if failed. */ - public boolean extractInto(@NonNull WallpaperColors inWallpaperColors, + private boolean runTonalExtraction(@Nullable WallpaperColors inWallpaperColors, @NonNull GradientColors outColorsNormal, @NonNull GradientColors outColorsDark, @NonNull GradientColors outColorsExtraDark) { + if (inWallpaperColors == null) { + return false; + } + final List<Color> mainColors = inWallpaperColors.getMainColors(); final int mainColorsSize = mainColors.size(); + final boolean supportsDarkText = (inWallpaperColors.getColorHints() & + WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; if (mainColorsSize == 0) { return false; @@ -120,7 +150,6 @@ public class Tonal implements ExtractionType { float[] s = fit(palette.s, hsl[1], fitIndex, 0.0f, 1.0f); float[] l = fit(palette.l, hsl[2], fitIndex, 0.0f, 1.0f); - final int textInversionIndex = h.length - 3; if (DEBUG) { StringBuilder builder = new StringBuilder("Tonal Palette - index: " + fitIndex + ". Main color: " + Integer.toHexString(getColorInt(fitIndex, h, s, l)) + @@ -135,21 +164,38 @@ public class Tonal implements ExtractionType { Log.d(TAG, builder.toString()); } + int primaryIndex = fitIndex; + int mainColor = getColorInt(primaryIndex, h, s, l); + + // We might want use the fallback in case the extracted color is brighter than our + // light fallback or darker than our dark fallback. + ColorUtils.colorToHSL(mainColor, mTmpHSL); + final float mainLuminosity = mTmpHSL[2]; + ColorUtils.colorToHSL(MAIN_COLOR_LIGHT, mTmpHSL); + final float lightLuminosity = mTmpHSL[2]; + if (mainLuminosity > lightLuminosity) { + return false; + } + ColorUtils.colorToHSL(MAIN_COLOR_DARK, mTmpHSL); + final float darkLuminosity = mTmpHSL[2]; + if (mainLuminosity < darkLuminosity) { + return false; + } + // Normal colors: // best fit + a 2 colors offset - int primaryIndex = fitIndex; + outColorsNormal.setMainColor(mainColor); int secondaryIndex = primaryIndex + (primaryIndex >= 2 ? -2 : 2); - outColorsNormal.setMainColor(getColorInt(primaryIndex, h, s, l)); outColorsNormal.setSecondaryColor(getColorInt(secondaryIndex, h, s, l)); // Dark colors: // Stops at 4th color, only lighter if dark text is supported - if (fitIndex < 2) { + if (supportsDarkText) { + primaryIndex = h.length - 1; + } else if (fitIndex < 2) { primaryIndex = 0; - } else if (fitIndex < textInversionIndex) { - primaryIndex = Math.min(fitIndex, 3); } else { - primaryIndex = h.length - 1; + primaryIndex = Math.min(fitIndex, 3); } secondaryIndex = primaryIndex + (primaryIndex >= 2 ? -2 : 2); outColorsDark.setMainColor(getColorInt(primaryIndex, h, s, l)); @@ -157,18 +203,17 @@ public class Tonal implements ExtractionType { // Extra Dark: // Stay close to dark colors until dark text is supported - if (fitIndex < 2) { + if (supportsDarkText) { + primaryIndex = h.length - 1; + } else if (fitIndex < 2) { primaryIndex = 0; - } else if (fitIndex < textInversionIndex) { - primaryIndex = 2; } else { - primaryIndex = h.length - 1; + primaryIndex = 2; } secondaryIndex = primaryIndex + (primaryIndex >= 2 ? -2 : 2); outColorsExtraDark.setMainColor(getColorInt(primaryIndex, h, s, l)); outColorsExtraDark.setSecondaryColor(getColorInt(secondaryIndex, h, s, l)); - final boolean supportsDarkText = fitIndex >= textInversionIndex; outColorsNormal.setSupportsDarkText(supportsDarkText); outColorsDark.setSupportsDarkText(supportsDarkText); outColorsExtraDark.setSupportsDarkText(supportsDarkText); @@ -181,6 +226,33 @@ public class Tonal implements ExtractionType { return true; } + private void applyFallback(@Nullable WallpaperColors inWallpaperColors, + GradientColors outColorsNormal, GradientColors outColorsDark, + GradientColors outColorsExtraDark) { + applyFallback(inWallpaperColors, outColorsNormal); + applyFallback(inWallpaperColors, outColorsDark); + applyFallback(inWallpaperColors, outColorsExtraDark); + } + + /** + * Sets the gradient to the light or dark fallbacks based on the current wallpaper colors. + * + * @param inWallpaperColors Colors to read. + * @param outGradientColors Destination. + */ + public static void applyFallback(@Nullable WallpaperColors inWallpaperColors, + @NonNull GradientColors outGradientColors) { + boolean light = inWallpaperColors != null + && (inWallpaperColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) + != 0; + int innerColor = light ? MAIN_COLOR_LIGHT : MAIN_COLOR_DARK; + int outerColor = light ? SECONDARY_COLOR_LIGHT : SECONDARY_COLOR_DARK; + + outGradientColors.setMainColor(innerColor); + outGradientColors.setSecondaryColor(outerColor); + outGradientColors.setSupportsDarkText(light); + } + private int getColorInt(int fitIndex, float[] h, float[] s, float[] l) { mTmpHSL[0] = fract(h[fitIndex]) * 360.0f; mTmpHSL[1] = s[fitIndex]; diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 425fd951570c..797335ff6f1e 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1521,7 +1521,7 @@ <string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"Koristi prečicu"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> + <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> <string name="user_switched" msgid="3768006783166984410">"Trenutni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> @@ -1748,7 +1748,7 @@ <string name="user_creation_adding" msgid="4482658054622099197">"Da li dozvoljavate da <xliff:g id="APP">%1$s</xliff:g> kreira novog korisnika za <xliff:g id="ACCOUNT">%2$s</xliff:g> (Korisnik sa ovim nalogom već postoji)?"</string> <string name="language_selection_title" msgid="2680677278159281088">"Dodaj jezik"</string> <string name="country_selection_title" msgid="2954859441620215513">"Izbor regije"</string> - <string name="search_language_hint" msgid="7042102592055108574">"Ukucajte ime jezika"</string> + <string name="search_language_hint" msgid="7042102592055108574">"Upišite ime jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index faaa6a2c49a3..db531b5dac61 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1308,7 +1308,7 @@ <string name="submit" msgid="1602335572089911941">"Enviar"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string> <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para salir del modo coche."</string> - <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir Internet/Zona Wi-Fi activado"</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string> <string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string> <string name="back_button_label" msgid="2300470004503343439">"Atrás"</string> <string name="next_button_label" msgid="1080555104677992408">"Siguiente"</string> @@ -1395,7 +1395,7 @@ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móviles superado"</string> <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string> <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Límite superado en <xliff:g id="SIZE">%s</xliff:g>"</string> - <string name="data_usage_restricted_title" msgid="5965157361036321914">"Conexiones automáticas restringidas"</string> + <string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos en segundo plano restringidos"</string> <string name="data_usage_restricted_body" msgid="469866376337242726">"Toca para quitar la restricción."</string> <string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguridad"</string> <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado es válido."</string> @@ -1630,7 +1630,7 @@ <string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string> <string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string> <string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el administrador"</string> - <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string> + <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string> <string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 951933c7ad35..686bdf16d4b1 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1782,8 +1782,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Ebakuatu kostaldeak eta ibaialdeak berehala eta joan toki seguru batera, adibidez, toki garai batera."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ez larritu eta bilatu babesleku bat inguruan."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Larrialdi-mezuen proba"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Erantzun"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Ez da onartzen SIM txartela"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Ez dago SIM txartelik"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index cbd23b2cfb38..e26ca990ca78 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1781,8 +1781,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Évacuez immédiatement les zones côtières et les rives des fleuves, et réfugiez-vous dans un endroit plus sécuritaire, comme un terrain surélevé."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Restez calme et cherchez un abri à proximité."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Test de messages d\'urgence"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Répondre"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Carte SIM non autorisée"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Carte SIM non configurée"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index f9a7673e34ce..660eb025431b 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1432,7 +1432,7 @@ <string name="media_route_button_content_description" msgid="591703006349356016">"Caster"</string> <string name="media_route_chooser_title" msgid="1751618554539087622">"Connexion à l\'appareil"</string> <string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Caster l\'écran sur l\'appareil"</string> - <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils en cours…"</string> + <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils…"</string> <string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Paramètres"</string> <string name="media_route_controller_disconnect" msgid="8966120286374158649">"Déconnecter"</string> <string name="media_route_status_scanning" msgid="7279908761758293783">"Analyse en cours..."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index f4135659d179..a36903a3126f 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -849,7 +849,7 @@ <string name="save_password_remember" msgid="6491879678996749466">"याद रखें"</string> <string name="save_password_never" msgid="8274330296785855105">"कभी नहीं"</string> <string name="open_permission_deny" msgid="7374036708316629800">"आपके पास इस पेज को खोलने की अनुमति नहीं है."</string> - <string name="text_copied" msgid="4985729524670131385">"लेख की क्लिपबोर्ड पर प्रतिलिपि बनाई गई."</string> + <string name="text_copied" msgid="4985729524670131385">"लेख को क्लिपबोर्ड पर कॉपी किया गया."</string> <string name="more_item_label" msgid="4650918923083320495">"अधिक"</string> <string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनू+"</string> <string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string> @@ -966,12 +966,12 @@ <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll" msgid="6876518925844129331">"सभी को चुनें"</string> <string name="cut" msgid="3092569408438626261">"काटें"</string> - <string name="copy" msgid="2681946229533511987">"प्रतिलिपि बनाएं"</string> + <string name="copy" msgid="2681946229533511987">"कॉपी करें"</string> <string name="paste" msgid="5629880836805036433">"चिपकाएं"</string> <string name="paste_as_plain_text" msgid="5427792741908010675">"सादे पाठ के रूप में चिपकाएं"</string> <string name="replace" msgid="5781686059063148930">"बदलें•"</string> <string name="delete" msgid="6098684844021697789">"हटाएं"</string> - <string name="copyUrl" msgid="2538211579596067402">"URL की प्रतिलिपि बनाएं"</string> + <string name="copyUrl" msgid="2538211579596067402">"URL को कॉपी करें"</string> <string name="selectTextMode" msgid="1018691815143165326">"लेख को चुनें"</string> <string name="undo" msgid="7905788502491742328">"वापस लाएं"</string> <string name="redo" msgid="7759464876566803888">"फिर से करें"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 5e68adef2aad..7f35c2884a44 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -579,8 +579,8 @@ <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Կարգավորել, որ սարքի համընդհանուր պրոքսի-սերվերն օգտագործվի, երբ քաղաքականությունը միացված է: Միայն սարքի սեփականատերը կարող է կարգավորել համընդհանուր պրոքսի-սերվերը:"</string> <string name="policylab_expirePassword" msgid="5610055012328825874">"Նշել էկր կողպ գաղտնաբ սպառումը"</string> <string name="policydesc_expirePassword" msgid="5367525762204416046">"Փոխել էկրանի կողպման գաղտնաբառի, PIN-ի կամ նախշի փոփոխման հաճախականությունը:"</string> - <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի կոդավորումը"</string> - <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն կոդավորված:"</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի գաղտնագրումը"</string> + <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն գաղտնագրված:"</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"Կասեցնել տեսախցիկները"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Կանխել բոլոր սարքերի ֆոտոխցիկների օգտագործումը:"</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Անջատել կողպման գործառույթները"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 8e813ab910e6..445ff9442cde 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1849,8 +1849,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"הישאר רגוע וחפש מחסה בקרבת מקום."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"בדיקה של הודעות חירום"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"השב"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"כרטיס ה-SIM לא מורשה"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"כרטיס ה-SIM לא מזוהה"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 9356169eb026..34ca6b166fc2 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1781,8 +1781,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"ອົບພະຍົບອອກຈາກເຂດຊາຍຝັ່ງທະເລ ແລະ ບໍລິເວນແມ່ນ້ຳໄປບ່ອນທີ່ປອດໄພກວ່າ ເຊັ່ນ: ບ່ອນສູງ ໂດຍທັນທີ."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"ໃຈເຢັນໆ ແລະ ຊອກຫາບ່ອນພັກຢູ່ໃກ້ໆ."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"ທົດສອບຂໍ້ຄວາມສຸກເສີນ"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"ຕອບກັບ"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ SIM"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ບໍ່ມີການນຳໃຊ້ SIM"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 0a5804f4dcbb..45ae315791fe 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1849,8 +1849,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Takoj se umaknite z obalnih območij in bregov rek na varnejše mesto, na primer na višje ležeča mesta."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ostanite mirni in poiščite zavetje v bližini."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Preskus sporočil v sili"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Odgovor"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Kartica SIM ni dovoljena"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Kartica SIM ni omogočena za uporabo"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index ab0353e19ac5..9ef46a7bdefa 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1781,8 +1781,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Kıyı kesimlerini ve nehir kenarlarını hemen boşaltarak yüksek yerler gibi daha güvenli bölgelere gidin."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Sakin olun ve yakınlarda sığınabileceğiniz bir yer bulun."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Acil durum mesajları testi"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Yanıtla"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"SIM\'e izin verilmiyor"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM için temel hazırlık yapılmadı"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 0560330ca3ab..c2ee71f2720a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1011,7 +1011,7 @@ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"使用%1$s分享"</string> <string name="whichSendApplicationLabel" msgid="4579076294675975354">"分享"</string> <string name="whichSendToApplication" msgid="8272422260066642057">"通过以下应用发送"</string> - <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过1$s发送"</string> + <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过%1$s发送"</string> <string name="whichSendToApplicationLabel" msgid="8878962419005813500">"发送"</string> <string name="whichHomeApplication" msgid="4307587691506919691">"选择主屏幕应用"</string> <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"将“%1$s”设为主屏幕应用"</string> @@ -1781,8 +1781,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"请立即从沿海和河滨区域撤离到高地等较安全的地方。"</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"请保持冷静,并寻找附近的避难地点。"</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"紧急消息测试"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"回复"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"不受允许的 SIM 卡"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"未配置的 SIM 卡"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 56627031286b..00bb4a98a5ef 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -36,7 +36,7 @@ <string name="wifi_no_internet" msgid="3880396223819116454">"No hi ha accés a Internet"</string> <string name="saved_network" msgid="4352716707126620811">"Desat per <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"Connectada automàticament a través de: %1$s"</string> - <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de la xarxa"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connectada, sense Internet"</string> @@ -186,7 +186,7 @@ <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferència agressiva de Wi-Fi a mòbil"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Dades mòbils sempre actives"</string> - <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per a la compartició de xarxa"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per compartir la xarxa"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactiva el volum absolut"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activa el so al mateix canal"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versió AVRCP de Bluetooth"</string> @@ -218,7 +218,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Permet les ubicacions simulades"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Inspecció d\'atributs de visualització"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén les dades mòbils sempre actives, fins i tot quan la Wi‑Fi està activada (per canviar de xarxa ràpidament)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per a la compartició de xarxa, si està disponible"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per compartir la xarxa, si està disponible"</string> <string name="adb_warning_title" msgid="6234463310896563253">"Voleu permetre la depuració USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"La depuració USB només està indicada per a activitats de desenvolupament. Fes-la servir intercanviar dades entre l\'ordinador i el dispositiu, per instal·lar aplicacions al dispositiu sense rebre notificacions i per llegir dades de registre."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"Vols revocar l\'accés a la depuració d\'USB dels ordinadors que has autoritzat anteriorment?"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index e2e0e6212499..4a6f12d75f73 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -104,11 +104,11 @@ <string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string> <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicaciones eliminadas"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Usuarios y aplicaciones eliminados"</string> - <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir por USB"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir conexión por USB"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona Wi-Fi portátil"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir por Bluetooth"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir Internet"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir Internet y zona Wi-Fi"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir conexión por Bluetooth"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir conexión"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir conexión y zona Wi-Fi"</string> <string name="managed_user_title" msgid="8109605045406748842">"Todas las aplicaciones de trabajo"</string> <string name="user_guest" msgid="8475274842845401871">"Invitado"</string> <string name="unknown" msgid="1592123443519355854">"Desconocido"</string> @@ -162,7 +162,7 @@ <string name="development_settings_summary" msgid="1815795401632854041">"Establecer opciones de desarrollo de aplicaciones"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Las opciones de desarrollador no están disponibles para este usuario"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Los ajustes de VPN no están disponibles para este usuario"</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir Internet no están disponibles para este usuario"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir conexión no están disponibles para este usuario"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Los ajustes del nombre de punto de acceso no están disponibles para este usuario"</string> <string name="enable_adb" msgid="7982306934419797485">"Depuración por USB"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Activar el modo de depuración cuando el dispositivo esté conectado por USB"</string> @@ -186,7 +186,7 @@ <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferencia agresiva de Wi-Fi a móvil"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activos"</string> - <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión mediante dispositivo portátil"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión compartida"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar tono de llamada por Bluetooth"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string> @@ -218,7 +218,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Permitir ubicaciones simuladas"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Inspección de atributos de vista"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén los datos móviles siempre activos, aunque la conexión Wi‑Fi esté activada (para cambiar de red rápidamente)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la aceleración por hardware para conexión mediante dispositivo portátil si está disponible"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la conexión compartida con aceleración por hardware si está disponible"</string> <string name="adb_warning_title" msgid="6234463310896563253">"¿Permitir depuración por USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"La depuración por USB solo está indicada para actividades de desarrollo. Puedes utilizarla para intercambiar datos entre el ordenador y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"¿Quieres revocar el acceso a la depuración por USB de todos los ordenadores que has autorizado?"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8af0ab59cb36..9a6595e860c3 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -97,7 +97,7 @@ <string name="phone_label" msgid="2320074140205331708">"otvori telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otvori glasovnu pomoć"</string> <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> - <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberite novi raspored zadataka"</string> + <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Uvećani prikaz manjeg ekrana na većem ekranu."</string> @@ -355,8 +355,8 @@ <string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string> <string name="description_direction_up" msgid="7169032478259485180">"Povucite gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Povucite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> - <string name="zen_priority_introduction" msgid="7577965386868311310">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste izabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> - <string name="zen_alarms_introduction" msgid="7034415210361973827">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što ste izabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> + <string name="zen_priority_introduction" msgid="7577965386868311310">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> + <string name="zen_alarms_introduction" msgid="7034415210361973827">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string> <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string> <string name="zen_silence_introduction" msgid="3137882381093271568">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, video zapise i igre."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 7911cab938b7..869bca7a8323 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -314,7 +314,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Weitere Einstellungen"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Fertig"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Verbunden"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 78457bdb7b8a..bb44d9904eab 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -310,7 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Περισσότερες ρυθμίσεις"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Τέλος"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Συνδέθηκε"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Σύνδεση, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 434b0488dc7b..f8bd8ff3af62 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -155,7 +155,7 @@ <string name="accessibility_cell_data" msgid="5326139158682385073">"Datos móviles"</string> <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Datos móviles activados"</string> <string name="accessibility_cell_data_off" msgid="443267573897409704">"Datos móviles desactivados"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir por Bluetooth"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir conexión por Bluetooth"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string> <string name="accessibility_vpn_on" msgid="5993385083262856059">"La red VPN está activada."</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"No hay tarjeta SIM."</string> @@ -314,7 +314,7 @@ <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> - <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir Internet"</string> + <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir conexión"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string> @@ -407,7 +407,7 @@ <string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y todos los datos de este usuario."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> - <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el envío de datos en segundo plano"</string> + <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar ahorro de batería"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string> @@ -589,7 +589,7 @@ <string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string> <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ahorro de batería no disponible mientras se carga el dispositivo"</string> <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ahorro de batería"</string> - <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y las conexiones automáticas"</string> + <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Inicio"</string> <string name="keyboard_key_back" msgid="2337450286042721351">"Atrás"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1e817ddcec7a..0d5e58f576db 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -312,8 +312,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Ezarpen gehiago"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Eginda"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Konektatuta"</string> - <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> - <skip /> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Konektatzen…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Konexioa partekatzea"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Sare publikoa"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 3fe787d20fe8..616667163910 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -310,7 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Setelan lainnya"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Tersambung"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, daya baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 2d4dd17e485d..f424a30dae2c 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -534,7 +534,7 @@ <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner מספק לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> <string name="got_it" msgid="2239653834387972602">"הבנתי"</string> - <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! System UI Tuner נוסף ל\'הגדרות\'"</string> + <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! ה-System UI Tuner נוסף ל\'הגדרות\'"</string> <string name="remove_from_settings" msgid="8389591916603406378">"הסר מההגדרות"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string> <string name="activity_not_found" msgid="348423244327799974">"האפליקציה אינה מותקנת במכשיר"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index cb9c77b7a263..906b40f0d316 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -310,8 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"更多设置"</string> <string name="quick_settings_done" msgid="3402999958839153376">"完成"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"已连接"</string> - <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> - <skip /> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string> diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index ccb81172c75c..3c895abd5e88 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -16,6 +16,7 @@ package com.android.systemui.colorextraction; +import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; import android.os.Handler; @@ -47,10 +48,10 @@ public class SysuiColorExtractor extends ColorExtractor { @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, boolean registerVisibility) { super(context, type); - mWpHiddenColors = new GradientColors(); - mWpHiddenColors.setMainColor(FALLBACK_COLOR); - mWpHiddenColors.setSecondaryColor(FALLBACK_COLOR); + + WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); + updateDefaultGradients(systemColors); if (registerVisibility) { try { @@ -71,6 +72,24 @@ public class SysuiColorExtractor extends ColorExtractor { } } + private void updateDefaultGradients(WallpaperColors colors) { + Tonal.applyFallback(colors, mWpHiddenColors); + } + + @Override + public void onColorsChanged(WallpaperColors colors, int which) { + super.onColorsChanged(colors, which); + + if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { + updateDefaultGradients(colors); + } + } + + @VisibleForTesting + GradientColors getFallbackColors() { + return mWpHiddenColors; + } + /** * Get TYPE_NORMAL colors when wallpaper is visible, or fallback otherwise. * diff --git a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java index a10aa5413ca9..b8535a3f5a40 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java @@ -61,6 +61,7 @@ public class SlashDrawable extends Drawable { private boolean mSlashed; private Mode mTintMode; private ColorStateList mTintList; + private boolean mAnimationEnabled = true; public SlashDrawable(Drawable d) { mDrawable = d; @@ -97,6 +98,10 @@ public class SlashDrawable extends Drawable { invalidateSelf(); } + public void setAnimationEnabled(boolean enabled) { + mAnimationEnabled = enabled; + } + // Animate this value on change private float mCurrentSlashLength; private final FloatProperty mSlashLengthProp = new FloatProperty<SlashDrawable>("slashLength") { @@ -119,12 +124,15 @@ public class SlashDrawable extends Drawable { final float end = mSlashed ? SLASH_HEIGHT / SCALE : 0f; final float start = mSlashed ? 0f : SLASH_HEIGHT / SCALE; - ObjectAnimator anim = ObjectAnimator.ofFloat(this, mSlashLengthProp, start, end); - anim.addUpdateListener((ValueAnimator valueAnimator) -> { + if (mAnimationEnabled) { + ObjectAnimator anim = ObjectAnimator.ofFloat(this, mSlashLengthProp, start, end); + anim.addUpdateListener((ValueAnimator valueAnimator) -> invalidateSelf()); + anim.setDuration(QS_ANIM_LENGTH); + anim.start(); + } else { + mCurrentSlashLength = end; invalidateSelf(); - }); - anim.setDuration(QS_ANIM_LENGTH); - anim.start(); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java index 5ab3927ff098..8074cb9b0443 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java @@ -98,10 +98,14 @@ public class QSIconViewImpl extends QSIconView { d.setAutoMirrored(false); d.setLayoutDirection(getLayoutDirection()); } - iv.setImageDrawable(d); - if (state.slash != null && iv instanceof SlashImageView) { - ((SlashImageView) iv).setState(state.slash); + + if (iv instanceof SlashImageView) { + ((SlashImageView) iv).setAnimationEnabled(shouldAnimate); + ((SlashImageView) iv).setState(state.slash, d); + } else { + iv.setImageDrawable(d); } + iv.setTag(R.id.qs_icon_tag, state.icon); iv.setTag(R.id.qs_slash_tag, state.slash); iv.setPadding(0, padding, 0, padding); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java index 315a815af100..13912fe0c16d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java @@ -14,8 +14,10 @@ package com.android.systemui.qs.tileimpl; +import android.annotation.Nullable; import android.content.Context; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; @@ -26,6 +28,7 @@ public class SlashImageView extends ImageView { @VisibleForTesting protected SlashDrawable mSlash; + private boolean mAnimationEnabled = true; public SlashImageView(Context context) { super(context); @@ -34,6 +37,7 @@ public class SlashImageView extends ImageView { private void ensureSlashDrawable() { if (mSlash == null) { mSlash = new SlashDrawable(getDrawable()); + mSlash.setAnimationEnabled(mAnimationEnabled); super.setImageDrawable(mSlash); } } @@ -46,13 +50,28 @@ public class SlashImageView extends ImageView { } else if (mSlash == null) { super.setImageDrawable(drawable); } else { + mSlash.setAnimationEnabled(mAnimationEnabled); mSlash.setDrawable(drawable); } } - public void setState(SlashState slashState) { + public void setAnimationEnabled(boolean enabled) { + mAnimationEnabled = enabled; + } + + private void setSlashState(@NonNull SlashState slashState) { ensureSlashDrawable(); mSlash.setRotation(slashState.rotation); mSlash.setSlashed(slashState.isSlashed); } + + public void setState(@Nullable SlashState state, @Nullable Drawable drawable) { + if (state != null) { + setImageDrawable(drawable); + setSlashState(state); + } else { + mSlash = null; + setImageDrawable(drawable); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java index e5aad0336061..ba92c451f764 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java @@ -32,7 +32,7 @@ public class AnimatedImageView extends ImageView { private final boolean mHasOverlappingRendering; AnimationDrawable mAnim; boolean mAttached; - private boolean mAllowAnimation; + private boolean mAllowAnimation = true; // Tracks the last image that was set, so that we don't refresh the image if it is exactly // the same as the previous one. If this is a resid, we track that. If it's a drawable, we diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index a60102854618..e5f68ad60089 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -298,7 +298,8 @@ public class NotificationShelf extends ActivatableNotificationView implements private void updateNotificationClipHeight(ExpandableNotificationRow row, float notificationClipEnd) { float viewEnd = row.getTranslationY() + row.getActualHeight(); - boolean isPinned = row.isPinned() || row.isHeadsUpAnimatingAway(); + boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway()) + && !mAmbientState.isDozingAndNotPulsing(row); if (viewEnd > notificationClipEnd && (mAmbientState.isShadeExpanded() || !isPinned)) { int clipBottomAmount = (int) (viewEnd - notificationClipEnd); @@ -450,7 +451,7 @@ public class NotificationShelf extends ActivatableNotificationView implements ? fullTransitionAmount : transitionAmount; iconState.clampedAppearAmount = clampedAmount; - float contentTransformationAmount = !row.isAboveShelf() + float contentTransformationAmount = !mAmbientState.isAboveShelf(row) && (isLastChild || iconState.translateContent) ? iconTransitionAmount : 0.0f; @@ -519,7 +520,7 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.scaleY = 1.0f; iconState.hidden = false; } - if (row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed() + if (mAmbientState.isAboveShelf(row) || (!row.isInShelf() && (isLastChild && row.areGutsExposed() || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) { iconState.hidden = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e6a7982fc233..805185d5b840 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -7240,6 +7240,9 @@ public class StatusBar extends SystemUI implements DemoMode, if (mAccessibilityManager.isTouchExplorationEnabled()) { if (DEBUG) Log.d(TAG, "No peeking: accessible fullscreen: " + sbn.getKey()); return false; + } else if (mDozing) { + // We never want heads up when we are dozing. + return false; } else { // we only allow head-up on the lockscreen if it doesn't have a fullscreen intent return !mStatusBarKeyguardViewManager.isShowing() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java index ba1e7c2d86c5..4d8da441c039 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java @@ -21,11 +21,15 @@ import android.view.View; import com.android.systemui.R; import com.android.systemui.statusbar.ActivatableNotificationView; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.ExpandableView; +import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; +import java.util.Collection; /** * A global state to track all input states for the algorithm. @@ -59,7 +63,7 @@ public class AmbientState { private boolean mPanelTracking; private boolean mExpansionChanging; private boolean mPanelFullWidth; - private boolean mHasPulsingNotifications; + private Collection<HeadsUpManager.HeadsUpEntry> mPulsing; private boolean mUnlockHintRunning; private boolean mQsCustomizerShowing; private int mIntrinsicPadding; @@ -290,11 +294,23 @@ public class AmbientState { } public boolean hasPulsingNotifications() { - return mHasPulsingNotifications; + return mPulsing != null; } - public void setHasPulsingNotifications(boolean hasPulsing) { - mHasPulsingNotifications = hasPulsing; + public void setPulsing(Collection<HeadsUpManager.HeadsUpEntry> hasPulsing) { + mPulsing = hasPulsing; + } + + public boolean isPulsing(NotificationData.Entry entry) { + if (mPulsing == null) { + return false; + } + for (HeadsUpManager.HeadsUpEntry e : mPulsing) { + if (e.entry == entry) { + return true; + } + } + return false; } public boolean isPanelTracking() { @@ -332,4 +348,34 @@ public class AmbientState { public int getIntrinsicPadding() { return mIntrinsicPadding; } + + /** + * Similar to the normal is above shelf logic but doesn't allow it to be above in AOD1. + * + * @param expandableView the view to check + */ + public boolean isAboveShelf(ExpandableView expandableView) { + if (!(expandableView instanceof ExpandableNotificationRow)) { + return expandableView.isAboveShelf(); + } + ExpandableNotificationRow row = (ExpandableNotificationRow) expandableView; + return row.isAboveShelf() && !isDozingAndNotPulsing(row); + } + + /** + * @return whether a view is dozing and not pulsing right now + */ + public boolean isDozingAndNotPulsing(ExpandableView view) { + if (view instanceof ExpandableNotificationRow) { + return isDozingAndNotPulsing((ExpandableNotificationRow) view); + } + return false; + } + + /** + * @return whether a row is dozing and not pulsing right now + */ + public boolean isDozingAndNotPulsing(ExpandableNotificationRow row) { + return isDark() && !isPulsing(row.getEntry()); + } } 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 74523e28c460..00973911ac0d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -805,7 +805,7 @@ public class NotificationStackScrollLayout extends ViewGroup */ private float getAppearStartPosition() { if (mTrackingHeadsUp && mFirstVisibleBackgroundChild != null) { - if (mFirstVisibleBackgroundChild.isAboveShelf()) { + if (mAmbientState.isAboveShelf(mFirstVisibleBackgroundChild)) { // If we ever expanded beyond the first notification, it's allowed to merge into // the shelf return mFirstVisibleBackgroundChild.getPinnedHeadsUpHeight(); @@ -823,7 +823,8 @@ public class NotificationStackScrollLayout extends ViewGroup int notGoneChildCount = getNotGoneChildCount(); if (mEmptyShadeView.getVisibility() == GONE && notGoneChildCount != 0) { int minNotificationsForShelf = 1; - if (mTrackingHeadsUp || mHeadsUpManager.hasPinnedHeadsUp()) { + if (mTrackingHeadsUp + || (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDark())) { appearPosition = mHeadsUpManager.getTopHeadsUpPinnedHeight(); minNotificationsForShelf = 2; } else { @@ -2008,12 +2009,7 @@ public class NotificationStackScrollLayout extends ViewGroup } private boolean isPulsing(NotificationData.Entry entry) { - for (HeadsUpManager.HeadsUpEntry e : mPulsing) { - if (e.entry == entry) { - return true; - } - } - return false; + return mAmbientState.isPulsing(entry); } public boolean hasPulsingNotifications() { @@ -4148,7 +4144,7 @@ public class NotificationStackScrollLayout extends ViewGroup return; } mPulsing = pulsing; - mAmbientState.setHasPulsingNotifications(hasPulsingNotifications()); + mAmbientState.setPulsing(pulsing); updateNotificationAnimationStates(); updateContentHeight(); notifyHeightChangeListener(mShelf); 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 8235bc7dde07..f4197a3496ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -413,7 +413,7 @@ public class StackScrollAlgorithm { if (mIsExpanded) { // Ensure that the heads up is always visible even when scrolled off clampHunToTop(ambientState, row, childState); - if (i == 0 && row.isAboveShelf()) { + if (i == 0 && ambientState.isAboveShelf(row)) { // the first hun can't get off screen. clampHunToMaxTranslation(ambientState, row, childState); childState.hidden = false; @@ -515,7 +515,7 @@ public class StackScrollAlgorithm { ExpandableViewState childViewState = resultState.getViewStateForView(child); int zDistanceBetweenElements = ambientState.getZDistanceBetweenElements(); float baseZ = ambientState.getBaseZHeight(); - if (child.mustStayOnScreen() + if (child.mustStayOnScreen() && !ambientState.isDozingAndNotPulsing(child) && childViewState.yTranslation < ambientState.getTopPadding() + ambientState.getStackTranslation()) { if (childrenOnTop != 0.0f) { @@ -527,7 +527,7 @@ public class StackScrollAlgorithm { } childViewState.zTranslation = baseZ + childrenOnTop * zDistanceBetweenElements; - } else if (i == 0 && child.isAboveShelf()) { + } else if (i == 0 && ambientState.isAboveShelf(child)) { // In case this is a new view that has never been measured before, we don't want to // elevate if we are currently expanded more then the notification int shelfHeight = ambientState.getShelf().getIntrinsicHeight(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index a81188af85ef..690186e91f55 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -48,14 +48,12 @@ public class SysuiColorExtractorTests extends SysuiTestCase { @Test public void getColors_usesGreyIfWallpaperNotVisible() { - ColorExtractor.GradientColors fallbackColors = new ColorExtractor.GradientColors(); - fallbackColors.setMainColor(ColorExtractor.FALLBACK_COLOR); - fallbackColors.setSecondaryColor(ColorExtractor.FALLBACK_COLOR); - SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), new Tonal(), false); simulateEvent(extractor); extractor.setWallpaperVisible(false); + ColorExtractor.GradientColors fallbackColors = extractor.getFallbackColors(); + for (int which : sWhich) { for (int type : sTypes) { assertEquals("Not using fallback!", extractor.getColors(which, type), @@ -76,7 +74,6 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(colors); outGradientColorsDark.set(colors); outGradientColorsExtraDark.set(colors); - return true; }, false); simulateEvent(extractor); extractor.setWallpaperVisible(true); @@ -91,7 +88,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { private void simulateEvent(SysuiColorExtractor extractor) { // Let's fake a color event - extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.BLACK), null, null, 0), + extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.GREEN), null, null, 0), WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK); } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java index aef584f8d986..9fe3e10b752e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java @@ -38,16 +38,29 @@ public class SlashImageViewTest extends SysuiTestCase { private TestableSlashImageView mSlashView; @Test - public void testSetSlashStateCreatesSlashDrawable() { + public void testSetNonNullSlashStateCreatesSlashDrawable() { SlashState mockState = mock(SlashState.class); Drawable mockDrawable = mock(Drawable.class); mSlashView = new TestableSlashImageView(mContext); assertTrue(mSlashView.getSlashDrawable() == null); - mSlashView.setImageDrawable(mockDrawable); - mSlashView.setState(mockState); + mSlashView.setState(mockState, mockDrawable); + + assertTrue(mSlashView.getSlashDrawable() != null); + } + + @Test + public void testSetNullSlashStateRemovesSlashDrawable() { + SlashState mockState = mock(SlashState.class); + Drawable mockDrawable = mock(Drawable.class); + mSlashView = new TestableSlashImageView(mContext); + mSlashView.setState(mockState, mockDrawable); assertTrue(mSlashView.getSlashDrawable() != null); + + mSlashView.setState(null, mockDrawable); + + assertTrue(mSlashView.getSlashDrawable() == null); } @Test @@ -57,7 +70,7 @@ public class SlashImageViewTest extends SysuiTestCase { mSlashView = new TestableSlashImageView(mContext); mSlashView.setImageDrawable(mockDrawable); - mSlashView.setState(mockState); + mSlashView.setState(mockState, mockDrawable); mSlashView.setImageDrawable(null); assertTrue(mSlashView.getSlashDrawable() == null); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 1a7bba05c898..7a00a549a293 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -42,6 +42,7 @@ import static android.content.Intent.CATEGORY_LAUNCHER; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NO_HISTORY; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; +import static android.content.pm.ActivityInfo.CONFIG_ROTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; import static android.content.pm.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; @@ -2596,6 +2597,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo changes &= ~CONFIG_SMALLEST_SCREEN_SIZE; } } + // We don't want rotation to cause relaunches. + if ((changes & CONFIG_ROTATION) != 0) { + changes &= ~CONFIG_ROTATION; + } return changes; } diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java index 7c074dadadf9..303a577767ad 100644 --- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java +++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java @@ -118,27 +118,28 @@ public class UsbDescriptorParser { /** * @hide */ - public boolean parseDescriptors(byte[] descriptors) { - try { - mDescriptors.clear(); - - ByteStream stream = new ByteStream(descriptors); - while (stream.available() > 0) { - UsbDescriptor descriptor = allocDescriptor(stream); - if (descriptor != null) { - // Parse + public void parseDescriptors(byte[] descriptors) { + mDescriptors.clear(); + + ByteStream stream = new ByteStream(descriptors); + while (stream.available() > 0) { + UsbDescriptor descriptor = allocDescriptor(stream); + if (descriptor != null) { + // Parse + try { descriptor.parseRawDescriptors(stream); - mDescriptors.add(descriptor); - - // Clean up - descriptor.postParse(stream); + } catch (Exception ex) { + Log.e(TAG, "Exception parsing USB descriptors.", ex); } + + // Its OK to add the invalid descriptor as the postParse() + // routine will mark it as invalid. + mDescriptors.add(descriptor); + + // Clean up + descriptor.postParse(stream); } - return true; - } catch (Exception ex) { - Log.e(TAG, "Exception parsing USB descriptors.", ex); } - return false; } /** @@ -146,7 +147,11 @@ public class UsbDescriptorParser { */ public boolean parseDevice(String deviceAddr) { byte[] rawDescriptors = getRawDescriptors(deviceAddr); - return rawDescriptors != null && parseDescriptors(rawDescriptors); + if (rawDescriptors != null) { + parseDescriptors(rawDescriptors); + return true; + } + return false; } private native byte[] getRawDescriptors(String deviceAddr); diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java index 71821472f55e..0060901578cd 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java @@ -62,21 +62,6 @@ public class ColorExtractorTest { } @Test - public void getColors_usesFallbackIfFails() { - ExtractionType alwaysFail = - (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark, - outGradientColorsExtraDark) -> false; - ColorExtractor extractor = new ColorExtractor(mContext, alwaysFail); - GradientColors colors = extractor.getColors(WallpaperManager.FLAG_SYSTEM); - - assertEquals("Should be using the fallback color.", - colors.getMainColor(), ColorExtractor.FALLBACK_COLOR); - assertEquals("Should be using the fallback color.", - colors.getSecondaryColor(), ColorExtractor.FALLBACK_COLOR); - assertFalse("Dark text support should be false.", colors.supportsDarkText()); - } - - @Test public void getColors_usesExtractedColors() { GradientColors colorsExpectedNormal = new GradientColors(); colorsExpectedNormal.setMainColor(Color.RED); @@ -96,8 +81,6 @@ public class ColorExtractorTest { outGradientColorsNormal.set(colorsExpectedNormal); outGradientColorsDark.set(colorsExpectedDark); outGradientColorsExtraDark.set(colorsExpectedExtraDark); - // Successful extraction - return true; }; ColorExtractor extractor = new ColorExtractor(mContext, type); diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java index 1e3e8e91d9ef..d408b84109bc 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java @@ -40,6 +40,31 @@ import java.util.Arrays; public class TonalTest { @Test + public void extractInto_usesFallback() { + GradientColors normal = new GradientColors(); + Tonal tonal = new Tonal(); + tonal.extractInto(null, normal, new GradientColors(), + new GradientColors()); + assertFalse("Should use fallback color if WallpaperColors is null.", + normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT); + } + + @Test + public void extractInto_usesFallbackWhenTooLightOrDark() { + GradientColors normal = new GradientColors(); + Tonal tonal = new Tonal(); + tonal.extractInto(new WallpaperColors(Color.valueOf(0xff000000), null, null, 0), + normal, new GradientColors(), new GradientColors()); + assertTrue("Should use fallback color if WallpaperColors is too dark.", + normal.getMainColor() == Tonal.MAIN_COLOR_DARK); + + tonal.extractInto(new WallpaperColors(Color.valueOf(0xffffffff), null, null, 0), + normal, new GradientColors(), new GradientColors()); + assertTrue("Should use fallback color if WallpaperColors is too light.", + normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT); + } + + @Test public void colorRange_containsColor() { Tonal.ColorRange colorRange = new Tonal.ColorRange(new Range<>(0f, 50f), new Range<>(0f, 1f), new Range<>(0f, 1f)); @@ -72,8 +97,10 @@ public class TonalTest { // Make sure that palette generation will fail Tonal tonal = new Tonal(); - boolean success = tonal.extractInto(colors, new GradientColors(), new GradientColors(), + GradientColors normal = new GradientColors(); + tonal.extractInto(colors, normal, new GradientColors(), new GradientColors()); - assertFalse("Cannot generate a tonal palette from blacklisted colors ", success); + assertFalse("Cannot generate a tonal palette from blacklisted colors.", + normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT); } } |