diff options
705 files changed, 12416 insertions, 9166 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index c451049cf591..487e57d114c9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -30978,7 +30978,6 @@ package android.os { field public static final int S = 31; // 0x1f field public static final int S_V2 = 32; // 0x20 field public static final int TIRAMISU = 33; // 0x21 - field public static final int UPSIDE_DOWN_CAKE = 10000; // 0x2710 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index c17fbf19516b..dd955406e690 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -2523,6 +2523,10 @@ public abstract class AccessibilityService extends Service { IAccessibilityServiceConnection connection = AccessibilityInteractionClient.getInstance(this).getConnection(mConnectionId); if (mInfo != null && connection != null) { + if (!mInfo.isWithinParcelableSize()) { + throw new IllegalStateException( + "Cannot update service info: size is larger than safe parcelable limits."); + } try { connection.setServiceInfo(mInfo); mInfo = null; diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index 530de0f3af6b..0cbcdb5a2b62 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -40,6 +40,7 @@ import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; +import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; @@ -1128,6 +1129,15 @@ public class AccessibilityServiceInfo implements Parcelable { return 0; } + /** @hide */ + public final boolean isWithinParcelableSize() { + final Parcel parcel = Parcel.obtain(); + writeToParcel(parcel, 0); + final boolean result = parcel.dataSize() <= IBinder.MAX_IPC_SIZE; + parcel.recycle(); + return result; + } + public void writeToParcel(Parcel parcel, int flagz) { parcel.writeInt(eventTypes); parcel.writeStringArray(packageNames); diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 14d0a563f2ca..9d624b6c0ed8 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -3517,7 +3517,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>An array of mandatory stream combinations which are applicable when device support the * 10-bit output capability * {@link android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT } - * This is an app-readable conversion of the maximum resolution mandatory stream combination + * This is an app-readable conversion of the 10 bit output mandatory stream combination * {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.</p> * <p>The array of * {@link android.hardware.camera2.params.MandatoryStreamCombination combinations} is @@ -3542,8 +3542,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>An array of mandatory stream combinations which are applicable when device lists * {@code PREVIEW_STABILIZATION} in {@link CameraCharacteristics#CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES android.control.availableVideoStabilizationModes}. - * This is an app-readable conversion of the maximum resolution mandatory stream combination - * {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.</p> + * This is an app-readable conversion of the preview stabilization mandatory stream + * combination {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.</p> * <p>The array of * {@link android.hardware.camera2.params.MandatoryStreamCombination combinations} is * generated according to the documented diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index c67a560b5885..7055c9c6aa4d 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1000,24 +1000,25 @@ public abstract class CameraMetadata<TKey> { * camera's crop region is set to maximum size, the FOV of the physical streams for the * ultrawide lens will be the same as the logical stream, by making the crop region * smaller than its active array size to compensate for the smaller focal length.</p> - * <p>There are two ways for the application to capture RAW images from a logical camera - * with RAW capability:</p> + * <p>For a logical camera, typically the underlying physical cameras have different RAW + * capabilities (such as resolution or CFA pattern). There are two ways for the + * application to capture RAW images from the logical camera:</p> * <ul> - * <li>Because the underlying physical cameras may have different RAW capabilities (such - * as resolution or CFA pattern), to maintain backward compatibility, when a RAW stream - * is configured, the camera device makes sure the default active physical camera remains - * active and does not switch to other physical cameras. (One exception is that, if the - * logical camera consists of identical image sensors and advertises multiple focalLength - * due to different lenses, the camera device may generate RAW images from different - * physical cameras based on the focalLength being set by the application.) This - * backward-compatible approach usually results in loss of optical zoom, to telephoto - * lens or to ultrawide lens.</li> - * <li>Alternatively, to take advantage of the full zoomRatio range of the logical camera, - * the application should use {@link android.hardware.camera2.MultiResolutionImageReader } - * to capture RAW images from the currently active physical camera. Because different - * physical camera may have different RAW characteristics, the application needs to use - * the characteristics and result metadata of the active physical camera for the - * relevant RAW metadata.</li> + * <li>If the logical camera has RAW capability, the application can create and use RAW + * streams in the same way as before. In case a RAW stream is configured, to maintain + * backward compatibility, the camera device makes sure the default active physical + * camera remains active and does not switch to other physical cameras. (One exception + * is that, if the logical camera consists of identical image sensors and advertises + * multiple focalLength due to different lenses, the camera device may generate RAW + * images from different physical cameras based on the focalLength being set by the + * application.) This backward-compatible approach usually results in loss of optical + * zoom, to telephoto lens or to ultrawide lens.</li> + * <li>Alternatively, if supported by the device, + * {@link android.hardware.camera2.MultiResolutionImageReader } + * can be used to capture RAW images from one of the underlying physical cameras ( + * depending on current zoom level). Because different physical cameras may have + * different RAW characteristics, the application needs to use the characteristics + * and result metadata of the active physical camera for the relevant RAW metadata.</li> * </ul> * <p>The capture request and result metadata tags required for backward compatible camera * functionalities will be solely based on the logical camera capability. On the other diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index dbd602f27c11..0b956f8bf9e0 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -1167,11 +1167,6 @@ public class Build { * Tiramisu. */ public static final int TIRAMISU = 33; - - /** - * Upside Down Cake. - */ - public static final int UPSIDE_DOWN_CAKE = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/service/dreams/DreamActivity.java b/core/java/android/service/dreams/DreamActivity.java index a2fa1392b079..a3892238f1e6 100644 --- a/core/java/android/service/dreams/DreamActivity.java +++ b/core/java/android/service/dreams/DreamActivity.java @@ -58,11 +58,13 @@ public class DreamActivity extends Activity { setTitle(title); } - final Bundle extras = getIntent().getExtras(); - mCallback = (DreamService.DreamActivityCallbacks) extras.getBinder(EXTRA_CALLBACK); - - if (mCallback != null) { + final Object callback = getIntent().getExtras().getBinder(EXTRA_CALLBACK); + if (callback instanceof DreamService.DreamActivityCallbacks) { + mCallback = (DreamService.DreamActivityCallbacks) callback; mCallback.onActivityCreated(this); + } else { + mCallback = null; + finishAndRemoveTask(); } } diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index e285b1c77122..9d8c963e2f8b 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -953,7 +953,7 @@ public class ZenModeConfig implements Parcelable { private static Uri safeUri(TypedXmlPullParser parser, String att) { final String val = parser.getAttributeValue(null, att); - if (TextUtils.isEmpty(val)) return null; + if (val == null) return null; return Uri.parse(val); } diff --git a/core/java/android/service/quickaccesswallet/OWNERS b/core/java/android/service/quickaccesswallet/OWNERS new file mode 100644 index 000000000000..232ee02d3b04 --- /dev/null +++ b/core/java/android/service/quickaccesswallet/OWNERS @@ -0,0 +1,4 @@ +# Bug component: 802986 +asc@google.com +juliacr@google.com +steell@google.com diff --git a/core/java/android/service/quickaccesswallet/WalletCard.java b/core/java/android/service/quickaccesswallet/WalletCard.java index 7aacb9b4d11a..e234755b2b13 100644 --- a/core/java/android/service/quickaccesswallet/WalletCard.java +++ b/core/java/android/service/quickaccesswallet/WalletCard.java @@ -36,7 +36,7 @@ import java.lang.annotation.RetentionPolicy; * card, library card, transit pass, etc. Cards are identified by a String identifier and contain a * card type, card image, card image content description, and a {@link PendingIntent} to be used if * the user clicks on the card. Cards may be displayed with an icon and label, though these are - * optional. Valuable cards will also have a second image that will be displayed when the card is + * optional. Non-payment cards will also have a second image that will be displayed when the card is * tapped. */ @@ -56,11 +56,11 @@ public final class WalletCard implements Parcelable { public static final int CARD_TYPE_PAYMENT = 1; /** - * Valuable cards refer to any cards that are not used for cash-equivalent payment. - * This includes event tickets, flights, offers, loyalty cards, gift cards and transit tickets. + * Non-payment cards refer to any cards that are not used for cash-equivalent payment, including + * event tickets, flights, offers, loyalty cards, gift cards and transit tickets. * @hide */ - public static final int CARD_TYPE_VALUABLE = 2; + public static final int CARD_TYPE_NON_PAYMENT = 2; private final String mCardId; private final int mCardType; @@ -69,7 +69,7 @@ public final class WalletCard implements Parcelable { private final PendingIntent mPendingIntent; private final Icon mCardIcon; private final CharSequence mCardLabel; - private final Icon mValuableCardSecondaryImage; + private final Icon mNonPaymentCardSecondaryImage; private WalletCard(Builder builder) { this.mCardId = builder.mCardId; @@ -79,7 +79,7 @@ public final class WalletCard implements Parcelable { this.mPendingIntent = builder.mPendingIntent; this.mCardIcon = builder.mCardIcon; this.mCardLabel = builder.mCardLabel; - this.mValuableCardSecondaryImage = builder.mValuableCardSecondaryImage; + this.mNonPaymentCardSecondaryImage = builder.mNonPaymentCardSecondaryImage; } /** @@ -89,7 +89,7 @@ public final class WalletCard implements Parcelable { @IntDef(prefix = {"CARD_TYPE_"}, value = { CARD_TYPE_UNKNOWN, CARD_TYPE_PAYMENT, - CARD_TYPE_VALUABLE + CARD_TYPE_NON_PAYMENT }) public @interface CardType { } @@ -108,7 +108,7 @@ public final class WalletCard implements Parcelable { PendingIntent.writePendingIntentOrNullToParcel(mPendingIntent, dest); writeIconIfNonNull(mCardIcon, dest, flags); TextUtils.writeToParcel(mCardLabel, dest, flags); - writeIconIfNonNull(mValuableCardSecondaryImage, dest, flags); + writeIconIfNonNull(mNonPaymentCardSecondaryImage, dest, flags); } @@ -131,14 +131,14 @@ public final class WalletCard implements Parcelable { PendingIntent pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(source); Icon cardIcon = source.readByte() == 0 ? null : Icon.CREATOR.createFromParcel(source); CharSequence cardLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); - Icon valuableCardSecondaryImage = source.readByte() == 0 ? null : + Icon nonPaymentCardSecondaryImage = source.readByte() == 0 ? null : Icon.CREATOR.createFromParcel(source); Builder builder = new Builder(cardId, cardType, cardImage, contentDesc, pendingIntent) .setCardIcon(cardIcon) .setCardLabel(cardLabel); - return cardType == CARD_TYPE_VALUABLE - ? builder.setValuableCardSecondaryImage(valuableCardSecondaryImage).build() : + return cardType == CARD_TYPE_NON_PAYMENT + ? builder.setNonPaymentCardSecondaryImage(nonPaymentCardSecondaryImage).build() : builder.build(); } @@ -229,13 +229,13 @@ public final class WalletCard implements Parcelable { } /** - * Visual representation of the card when it is tapped. Includes a barcode to scan the card in - * addition to the information in the primary image. + * Visual representation of the card when it is tapped. May include additional information + * unique to the card, such as a barcode or number. Only valid for CARD_TYPE_NON_PAYMENT. * @hide - */ + */ @Nullable - public Icon getValuableCardSecondaryImage() { - return mValuableCardSecondaryImage; + public Icon getNonPaymentCardSecondaryImage() { + return mNonPaymentCardSecondaryImage; } /** @@ -251,7 +251,7 @@ public final class WalletCard implements Parcelable { private PendingIntent mPendingIntent; private Icon mCardIcon; private CharSequence mCardLabel; - private Icon mValuableCardSecondaryImage; + private Icon mNonPaymentCardSecondaryImage; /** * @param cardId The card id must be non-null and unique within the list of @@ -259,7 +259,7 @@ public final class WalletCard implements Parcelable { * </b> this card ID should <b>not</b> contain PII (Personally * Identifiable Information, such as username or email address). * @param cardType Integer representing the card type. The card type must be - * non-null. If not provided, it defaults to unknown. + * non-null. * @param cardImage The visual representation of the card. If the card image Icon * is a bitmap, it should have a width of {@link * GetWalletCardsRequest#getCardWidthPx()} and a height of {@link @@ -294,7 +294,7 @@ public final class WalletCard implements Parcelable { } /** - * Called when a card type is not provided. + * Called when a card type is not provided, in which case it defaults to CARD_TYPE_UNKNOWN. */ public Builder(@NonNull String cardId, @NonNull Icon cardImage, @@ -336,15 +336,16 @@ public final class WalletCard implements Parcelable { } /** - * Visual representation of the card when it is tapped. Includes a barcode to scan the card - * in addition to the information in the primary image. + * Visual representation of the card when it is tapped. May include additional information + * unique to the card, such as a barcode or number. Only valid for CARD_TYPE_NON_PAYMENT. * @hide */ @NonNull - public Builder setValuableCardSecondaryImage(@Nullable Icon valuableCardSecondaryImage) { - Preconditions.checkState(mCardType == CARD_TYPE_VALUABLE, - "This field can only be set on valuable cards"); - mValuableCardSecondaryImage = valuableCardSecondaryImage; + public Builder + setNonPaymentCardSecondaryImage(@Nullable Icon nonPaymentCardSecondaryImage) { + Preconditions.checkState(mCardType == CARD_TYPE_NON_PAYMENT, + "This field can only be set on non-payment cards"); + mNonPaymentCardSecondaryImage = nonPaymentCardSecondaryImage; return this; } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 6fed26c4a81d..3a0e09d1fc77 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -81,6 +81,7 @@ import android.telephony.ServiceState.RegState; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; @@ -201,6 +202,7 @@ public class BatteryStatsImpl extends BatteryStats { public static final int RESET_REASON_ADB_COMMAND = 2; public static final int RESET_REASON_FULL_CHARGE = 3; public static final int RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE = 4; + public static final int RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION = 5; protected Clock mClock; @@ -387,6 +389,89 @@ public class BatteryStatsImpl extends BatteryStats { } } + /** Provide BatteryStatsImpl configuration choices */ + public static class BatteryStatsConfig { + static final int RESET_ON_UNPLUG_HIGH_BATTERY_LEVEL_FLAG = 1 << 0; + static final int RESET_ON_UNPLUG_AFTER_SIGNIFICANT_CHARGE_FLAG = 1 << 1; + + private final int mFlags; + + private BatteryStatsConfig(Builder builder) { + int flags = 0; + if (builder.mResetOnUnplugHighBatteryLevel) { + flags |= RESET_ON_UNPLUG_HIGH_BATTERY_LEVEL_FLAG; + } + if (builder.mResetOnUnplugAfterSignificantCharge) { + flags |= RESET_ON_UNPLUG_AFTER_SIGNIFICANT_CHARGE_FLAG; + } + mFlags = flags; + } + + /** + * Returns whether a BatteryStats reset should occur on unplug when the battery level is + * high. + */ + boolean shouldResetOnUnplugHighBatteryLevel() { + return (mFlags & RESET_ON_UNPLUG_HIGH_BATTERY_LEVEL_FLAG) + == RESET_ON_UNPLUG_HIGH_BATTERY_LEVEL_FLAG; + } + + /** + * Returns whether a BatteryStats reset should occur on unplug if the battery charge a + * significant amount since it has been plugged in. + */ + boolean shouldResetOnUnplugAfterSignificantCharge() { + return (mFlags & RESET_ON_UNPLUG_AFTER_SIGNIFICANT_CHARGE_FLAG) + == RESET_ON_UNPLUG_AFTER_SIGNIFICANT_CHARGE_FLAG; + } + + /** + * Builder for BatteryStatsConfig + */ + public static class Builder { + private boolean mResetOnUnplugHighBatteryLevel; + private boolean mResetOnUnplugAfterSignificantCharge; + public Builder() { + mResetOnUnplugHighBatteryLevel = true; + mResetOnUnplugAfterSignificantCharge = true; + } + + /** + * Build the BatteryStatsConfig. + */ + public BatteryStatsConfig build() { + return new BatteryStatsConfig(this); + } + + /** + * Set whether a BatteryStats reset should occur on unplug when the battery level is + * high. + */ + public Builder setResetOnUnplugHighBatteryLevel(boolean reset) { + mResetOnUnplugHighBatteryLevel = reset; + return this; + } + + /** + * Set whether a BatteryStats reset should occur on unplug if the battery charge a + * significant amount since it has been plugged in. + */ + public Builder setResetOnUnplugAfterSignificantCharge(boolean reset) { + mResetOnUnplugAfterSignificantCharge = reset; + return this; + } + } + + } + + /** Handles calls to AlarmManager */ + public interface AlarmInterface { + /** Schedule an RTC alarm */ + void schedule(long rtcTimeMs, long windowLengthMs); + /** Cancel the previously scheduled alarm */ + void cancel(); + } + private final PlatformIdleStateCallback mPlatformIdleStateCallback; private final Runnable mDeferSetCharging = new Runnable() { @@ -717,6 +802,7 @@ public class BatteryStatsImpl extends BatteryStats { protected boolean mHaveBatteryLevel = false; protected boolean mRecordingHistory = false; int mNumHistoryItems; + private long mBatteryPluggedInRealTimeMs = 0; private static final int HISTORY_TAG_INDEX_LIMIT = 0x7ffe; private static final int MAX_HISTORY_TAG_STRING_LENGTH = 1024; @@ -1459,6 +1545,13 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") protected final Constants mConstants; + @VisibleForTesting + @GuardedBy("this") + protected BatteryStatsConfig mBatteryStatsConfig = new BatteryStatsConfig.Builder().build(); + + @VisibleForTesting + protected AlarmInterface mLongPlugInAlarmInterface = null; + /* * Holds a SamplingTimer associated with each Resource Power Manager state and voter, * recording their times when on-battery (regardless of screen state). @@ -1625,12 +1718,13 @@ public class BatteryStatsImpl extends BatteryStats { public BatteryStatsImpl(Clock clock, File historyDirectory) { init(clock); mStartClockTimeMs = clock.currentTimeMillis(); - mCheckinFile = null; mDailyFile = null; if (historyDirectory == null) { + mCheckinFile = null; mStatsFile = null; mBatteryStatsHistory = new BatteryStatsHistory(mHistoryBuffer); } else { + mCheckinFile = new AtomicFile(new File(historyDirectory, "batterystats-checkin.bin")); mStatsFile = new AtomicFile(new File(historyDirectory, "batterystats.bin")); mBatteryStatsHistory = new BatteryStatsHistory(this, historyDirectory, mHistoryBuffer); } @@ -12548,6 +12642,27 @@ public class BatteryStatsImpl extends BatteryStats { } /** + * Injects BatteryStatsConfig + */ + public void setBatteryStatsConfig(BatteryStatsConfig config) { + synchronized (this) { + mBatteryStatsConfig = config; + } + } + + /** + * Injects a LongPlugInAlarmHandler + */ + public void setLongPlugInAlarmInterface(AlarmInterface longPlugInAlarmInterface) { + synchronized (this) { + mLongPlugInAlarmInterface = longPlugInAlarmInterface; + if (!mOnBattery) { + scheduleNextResetWhilePluggedInCheck(); + } + } + } + + /** * Starts tracking CPU time-in-state for threads of the system server process, * keeping a separate account of threads receiving incoming binder calls. */ @@ -13019,12 +13134,12 @@ public class BatteryStatsImpl extends BatteryStats { } @GuardedBy("this") - public void resetAllStatsCmdLocked() { + public void resetAllStatsAndHistoryLocked(int reason) { final long mSecUptime = mClock.uptimeMillis(); long uptimeUs = mSecUptime * 1000; long mSecRealtime = mClock.elapsedRealtime(); long realtimeUs = mSecRealtime * 1000; - resetAllStatsLocked(mSecUptime, mSecRealtime, RESET_REASON_ADB_COMMAND); + resetAllStatsLocked(mSecUptime, mSecRealtime, reason); mDischargeStartLevel = mHistoryCur.batteryLevel; pullPendingStateUpdatesLocked(); addHistoryRecordLocked(mSecRealtime, mSecUptime); @@ -15498,6 +15613,73 @@ public class BatteryStatsImpl extends BatteryStats { } /** + * Might reset battery stats if conditions are met. Assumed the device is currently plugged in. + */ + @GuardedBy("this") + public void maybeResetWhilePluggedInLocked() { + final long elapsedRealtimeMs = mClock.elapsedRealtime(); + if (shouldResetWhilePluggedInLocked(elapsedRealtimeMs)) { + Slog.i(TAG, + "Resetting due to long plug in duration. elapsed time = " + elapsedRealtimeMs + + " ms, last plug in time = " + mBatteryPluggedInRealTimeMs + + " ms, last reset time = " + mRealtimeStartUs / 1000); + resetAllStatsAndHistoryLocked(RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION); + } + + scheduleNextResetWhilePluggedInCheck(); + } + + @GuardedBy("this") + private void scheduleNextResetWhilePluggedInCheck() { + if (mLongPlugInAlarmInterface != null) { + final long timeoutMs = mClock.currentTimeMillis() + + mConstants.RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS + * DateUtils.HOUR_IN_MILLIS; + Calendar nextAlarm = Calendar.getInstance(); + nextAlarm.setTimeInMillis(timeoutMs); + + // Find the 2 AM the same day as the end of the minimum duration. + // This logic does not handle a Daylight Savings transition, or a timezone change + // while the alarm has been set. The need to reset after a long period while plugged + // in is not strict enough to warrant a well architected out solution. + nextAlarm.set(Calendar.MILLISECOND, 0); + nextAlarm.set(Calendar.SECOND, 0); + nextAlarm.set(Calendar.MINUTE, 0); + nextAlarm.set(Calendar.HOUR_OF_DAY, 2); + long nextTimeMs = nextAlarm.getTimeInMillis(); + if (nextTimeMs < timeoutMs) { + // The 2AM on the day of the timeout, move on the next day. + nextTimeMs += DateUtils.DAY_IN_MILLIS; + } + mLongPlugInAlarmInterface.schedule(nextTimeMs, DateUtils.HOUR_IN_MILLIS); + } + } + + + @GuardedBy("this") + private boolean shouldResetWhilePluggedInLocked(long elapsedRealtimeMs) { + if (mNoAutoReset) return false; + if (!mSystemReady) return false; + + final long pluggedInThresholdMs = mBatteryPluggedInRealTimeMs + + mConstants.RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS + * DateUtils.HOUR_IN_MILLIS; + if (elapsedRealtimeMs >= pluggedInThresholdMs) { + // The device has been plugged in for a long time. + final long resetThresholdMs = mRealtimeStartUs / 1000 + + mConstants.RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS + * DateUtils.HOUR_IN_MILLIS; + if (elapsedRealtimeMs >= resetThresholdMs) { + // And it has been a long time since the last reset. + return true; + } + } + + return false; + } + + + /** * Notifies BatteryStatsImpl that the system server is ready. */ public void onSystemReady() { @@ -15505,6 +15687,32 @@ public class BatteryStatsImpl extends BatteryStats { } @GuardedBy("this") + private boolean shouldResetOnUnplugLocked(int batteryStatus, int batteryLevel) { + if (mNoAutoReset) return false; + if (!mSystemReady) return false; + if (mBatteryStatsConfig.shouldResetOnUnplugHighBatteryLevel()) { + // Allow resetting due to currently being at high battery level + if (batteryStatus == BatteryManager.BATTERY_STATUS_FULL) return true; + if (batteryLevel >= 90) return true; + } + if (mBatteryStatsConfig.shouldResetOnUnplugAfterSignificantCharge()) { + // Allow resetting after a significant charge (from a very low level to a now very + // high level). + if (mDischargePlugLevel < 20 && batteryLevel >= 80) return true; + } + if (getHighDischargeAmountSinceCharge() >= 200) { + // Reset the stats if battery got partially charged and discharged repeatedly without + // ever reaching the full charge. + // This reset is done in order to prevent stats sessions from going on forever. + // Exceedingly long battery sessions would lead to an overflow of + // data structures such as mWakeupReasonStats. + return true; + } + + return false; + } + + @GuardedBy("this") protected void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery, final int oldStatus, final int level, final int chargeUah) { boolean doWrite = false; @@ -15516,23 +15724,10 @@ public class BatteryStatsImpl extends BatteryStats { final long realtimeUs = mSecRealtime * 1000; final int screenState = mScreenState; if (onBattery) { - // We will reset our status if we are unplugging after the - // battery was last full, or the level is at 100, or - // we have gone through a significant charge (from a very low - // level to a now very high level). - // Also, we will reset the stats if battery got partially charged - // and discharged repeatedly without ever reaching the full charge. - // This reset is done in order to prevent stats sessions from going on forever. - // Exceedingly long battery sessions would lead to an overflow of - // data structures such as mWakeupReasonStats. boolean reset = false; - if (!mNoAutoReset && mSystemReady - && (oldStatus == BatteryManager.BATTERY_STATUS_FULL - || level >= 90 - || (mDischargeCurrentLevel < 20 && level >= 80) - || getHighDischargeAmountSinceCharge() >= 200)) { + if (shouldResetOnUnplugLocked(oldStatus, level)) { Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus - + " dischargeLevel=" + mDischargeCurrentLevel + + " dischargeLevel=" + mDischargePlugLevel + " lowAmount=" + getLowDischargeAmountSinceCharge() + " highAmount=" + getHighDischargeAmountSinceCharge()); // Before we write, collect a snapshot of the final aggregated @@ -15589,6 +15784,9 @@ public class BatteryStatsImpl extends BatteryStats { mInitStepMode = mCurStepMode; mModStepMode = 0; pullPendingStateUpdatesLocked(); + if (mLongPlugInAlarmInterface != null) { + mLongPlugInAlarmInterface.cancel(); + } mHistoryCur.batteryLevel = (byte)level; mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " @@ -15620,6 +15818,7 @@ public class BatteryStatsImpl extends BatteryStats { mLastChargingStateLevel = level; mOnBattery = mOnBatteryInternal = false; pullPendingStateUpdatesLocked(); + mBatteryPluggedInRealTimeMs = mSecRealtime; mHistoryCur.batteryLevel = (byte)level; mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " @@ -15637,6 +15836,7 @@ public class BatteryStatsImpl extends BatteryStats { mMaxChargeStepLevel = level; mInitStepMode = mCurStepMode; mModStepMode = 0; + scheduleNextResetWhilePluggedInCheck(); } if (doWrite || (mLastWriteTimeMs + (60 * 1000)) < mSecRealtime) { if (mStatsFile != null && mBatteryStatsHistory.getActiveFile() != null) { @@ -16651,6 +16851,8 @@ public class BatteryStatsImpl extends BatteryStats { public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb"; public static final String KEY_BATTERY_CHARGED_DELAY_MS = "battery_charged_delay_ms"; + public static final String KEY_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS = + "reset_while_plugged_in_minimum_duration_hours"; private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true; private static final long DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME = 1_000; @@ -16663,6 +16865,8 @@ public class BatteryStatsImpl extends BatteryStats { private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64; private static final int DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB = 64; /*Kilo Bytes*/ private static final int DEFAULT_BATTERY_CHARGED_DELAY_MS = 900000; /* 15 min */ + // Little less than 2 days + private static final int DEFAULT_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS = 47; public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME; /* Do not set default value for KERNEL_UID_READERS_THROTTLE_TIME. Need to trigger an @@ -16678,6 +16882,8 @@ public class BatteryStatsImpl extends BatteryStats { public int MAX_HISTORY_FILES; public int MAX_HISTORY_BUFFER; /*Bytes*/ public int BATTERY_CHARGED_DELAY_MS = DEFAULT_BATTERY_CHARGED_DELAY_MS; + public int RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS = + DEFAULT_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS; private ContentResolver mResolver; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -16754,6 +16960,11 @@ public class BatteryStatsImpl extends BatteryStats { DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB : DEFAULT_MAX_HISTORY_BUFFER_KB) * 1024; + + RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS = mParser.getInt( + KEY_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS, + DEFAULT_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS); + updateBatteryChargedDelayMsLocked(); } } @@ -16808,6 +17019,8 @@ public class BatteryStatsImpl extends BatteryStats { pw.println(MAX_HISTORY_BUFFER/1024); pw.print(KEY_BATTERY_CHARGED_DELAY_MS); pw.print("="); pw.println(BATTERY_CHARGED_DELAY_MS); + pw.print(KEY_RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS); pw.print("="); + pw.println(RESET_WHILE_PLUGGED_IN_MINIMUM_DURATION_HOURS); } } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 7372a7ecfef7..04e71721c64b 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Kan gebare vasvang wat op die toestel se vingerafdruksensor uitgevoer word."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Neem skermkiekie"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan \'n skermkiekie neem."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Voorskou, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"deaktiveer of verander statusbalk"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die program toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"wees die statusbalk"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 3310cec48579..65ce60910c73 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"በመሣሪያው የጣት አሻራ ዳሳሽ ላይ የተከናወኑ የጣት ምልክቶችን መያዝ ይችላል።"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ቅጽበታዊ ገጽ እይታን ያነሳል"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"የማሳያው ቅጽበታዊ ገጽ እይታን ማንሳት ይችላል።"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ቅድመ ዕይታ፣ <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"የሁኔቴ አሞሌ አቦዝን ወይም ቀይር"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"የስርዓት አዶዎችን ወደ ሁኔታ አሞሌ ላለማስቻል ወይም ለማከል እና ለማስወገድ ለመተግበሪያው ይፈቅዳሉ፡፡"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"የሁኔታ አሞሌ መሆን"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 980986e976ba..d46d3306d9f1 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -346,8 +346,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"يمكن أن تلتقط الإيماءات من أداة استشعار بصمة الإصبع في الجهاز."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"أخذ لقطة شاشة"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"يمكن أخذ لقطة شاشة."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"نسخة حصرية، \"<xliff:g id="DREAM_NAME">%1$s</xliff:g>\""</string> <string name="permlab_statusBar" msgid="8798267849526214017">"إيقاف شريط الحالة أو تعديله"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"للسماح للتطبيق بإيقاف شريط الحالة أو إضافة رموز نظام وإزالتها."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"العمل كشريط للحالة"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 77f230505552..e2213d76c9e2 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ডিভাইচটোৰ ফিংগাৰপ্ৰিণ্ট ছেন্সৰত দিয়া নিৰ্দেশ বুজিব পাৰে।"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"স্ক্ৰীনশ্বট লওক"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ডিছপ্লে’খনৰ এটা স্ক্ৰীনশ্বট ল\'ব পাৰে।"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"পূৰ্বদৰ্শন কৰক, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"স্থিতি দণ্ড অক্ষম কৰক বা সলনি কৰক"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"স্থিতি দণ্ড অক্ষম কৰিবলৈ বা ছিষ্টেম আইকন আঁতৰাবলৈ এপ্টোক অনুমতি দিয়ে।"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"স্থিতি দণ্ড হ\'ব পাৰে"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 534f1a0e9feb..ea8addecceac 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Cihazların barmaq izi sensorunda olan işarələri əldə edə bilər."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekran şəkli çəkin"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekran şəkli çəkilə bilər."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Önizləmə, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"status panelini deaktivləşdir və ya dəyişdir"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"status paneli edin"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index ae8c663fecd6..940b09195f07 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Može da registruje pokrete na senzoru za otisak prsta na uređaju."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Napravi snimak ekrana"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Može da napravi snimak ekrana."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Pregled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"onemogućavanje ili izmena statusne trake"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Dozvoljava aplikaciji da onemogući statusnu traku ili da dodaje i uklanja sistemske ikone."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"funkcionisanje kao statusna traka"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 85bd8f9c871f..58e72a72f9ae 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Можа распазнаваць жэсты на сканеры адбіткаў пальцаў прылады."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Зрабіць здымак экрана"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Можна зрабіць здымак экрана."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Перадпрагляд, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"адключаць ці змяняць радок стану"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Дазваляе прыкладанням адключаць радок стану або дадаваць і выдаляць сістэмныя значкі."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"быць панэллю стану"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 424f2cfafe2b..523c8b536695 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Може да улавя жестовете, извършени върху сензора за отпечатъци на устройството."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Създаване на екранна снимка"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да създава екранни снимки."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Визуализация на „<xliff:g id="DREAM_NAME">%1$s</xliff:g>“"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"деактивиране или промяна на лентата на състоянието"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Разрешава на приложението да деактивира лентата на състоянието или да добавя и премахва системни икони."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"изпълняване на ролята на лента на състоянието"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index cc1e61618458..731000984cf2 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ডিভাইসের আঙ্গুলের ছাপের সেন্সরের উপরে ইঙ্গিত করলে বুঝতে পারে।"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"স্ক্রিনশট নিন"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ডিসপ্লের একটি স্ক্রিনশট নিতে পারেন।"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"প্রিভিউ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"স্ট্যাটাস বার নিষ্ক্রিয় অথবা সংশোধন করে"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"অ্যাপ্লিকেশনকে স্ট্যাটাস বার অক্ষম করতে এবং সিস্টেম আইকনগুলি সরাতে দেয়৷"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"স্থিতি দন্ডে থাকুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 34b20468383a..92195111b13e 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2053,9 +2053,9 @@ <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string> <string name="log_access_confirmation_title" msgid="2343578467290592708">"Dozvoliti aplikaciji <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> da pristupa svim zapisnicima uređaja?"</string> - <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Dozvoli jednokratan pristup"</string> + <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Dozvoli jednokratni pristup"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Nemoj dozvoliti"</string> - <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Zapisnici uređaja bilježe šta se dešava na uređaju. Aplikacije mogu koristiti te zapisnike da pronađu i isprave probleme.\n\nNeki zapisnici mogu sadržavati osjetljive podatke, zato pristup svim zapisnicima uređaja dozvolite samo aplikacijama kojima vjerujete. \n\nAko ne dozvolite ovoj aplikaciji da pristupa svim zapisnicima uređaja, ona i dalje može pristupati svojim zapisnicima. Proizvođač uređaja će možda i dalje biti u stanju pristupiti nekim zapisnicima ili podacima na uređaju."</string> + <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Zapisnici uređaja bilježe šta se dešava na uređaju. Aplikacije mogu koristiti te zapisnike pronađu i riješe probleme.\n\nNeki zapisnici mogu sadržavati osjetljive podatke, zato pristup svim zapisnicima uređaja dozvolite samo aplikacijama kojima vjerujete. \n\nAko ne dozvolite ovoj aplikaciji da pristupa svim zapisnicima uređaja, ona i dalje može pristupati svojim zapisnicima. Proizvođač uređaja će možda i dalje biti u stanju pristupiti nekim zapisnicima ili podacima na uređaju."</string> <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Zapisnici uređaja bilježe šta se dešava na uređaju. Aplikacije mogu koristiti te zapisnike da pronađu i riješe probleme.\n\nNeki zapisnici mogu sadržavati osjetljive podatke. Zbog toga pristup svim zapisnicima uređaja dozvolite samo aplikacijama koje smatrate pouzdanima. \n\nAko ne dozvolite ovoj aplikaciji da pristupa svim zapisnicima uređaja, ona i dalje može pristupati svojim zapisnicima. Proizvođač uređaja će možda i dalje moći pristupiti nekim zapisnicima ili podacima na uređaju.\n\nSaznajte više na g.co/android/devicelogs."</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Ne prikazuj ponovo"</string> <string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 4744f440ebb4..7a9fcb3d3c10 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Pot capturar els gestos fets en el sensor d\'empremtes digitals del dispositiu."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fer una captura de pantalla"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pot fer una captura de la pantalla."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Previsualitza, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra d\'estat"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permet que l\'aplicació desactivi la barra d\'estat o afegeixi i elimini icones del sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"aparèixer a la barra d\'estat"</string> @@ -2056,8 +2055,8 @@ <string name="log_access_confirmation_title" msgid="2343578467290592708">"Vols permetre que <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> accedeixi a tots els registres del dispositiu?"</string> <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Permet l\'accés únic"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"No permetis"</string> - <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Els registres del dispositiu inclouen informació sobre tot allò que passa al teu dispositiu. Les aplicacions poden utilitzar aquests registres per detectar i corregir problemes.\n\nÉs possible que alguns registres continguin informació sensible; per això només has de donar-hi accés a les aplicacions de confiança. \n\nEncara que no permetis que aquesta aplicació pugui accedir a tots els registres del dispositiu, podrà accedir als seus propis registres. És possible que el fabricant del dispositiu també tingui accés a alguns registres o a informació del teu dispositiu."</string> - <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Els registres del dispositiu inclouen informació sobre tot allò que passa al teu dispositiu. Les aplicacions poden utilitzar aquests registres per detectar i corregir problemes.\n\nÉs possible que alguns registres continguin informació sensible; per això només has de donar-hi accés a les aplicacions de confiança. \n\nEncara que no permetis que aquesta aplicació accedeixi a tots els registres del dispositiu, podrà accedir als seus propis registres. És possible que el fabricant del dispositiu també tingui accés a alguns registres o a informació del teu dispositiu.\n\nObtén més informació a g.co/android/devicelogs."</string> + <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Els registres del dispositiu inclouen informació sobre tot allò que passa al teu dispositiu. Les aplicacions poden utilitzar aquests registres per detectar i corregir problemes.\n\nCom que és possible que alguns registres continguin informació sensible, et recomanem que només hi permetis l\'accés a les aplicacions de confiança. \n\nEncara que no permetis que aquesta aplicació accedeixi a tots els registres del dispositiu, podrà accedir als seus propis registres. És possible que el fabricant del dispositiu també tingui accés a alguns registres o a informació del teu dispositiu."</string> + <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Els registres del dispositiu inclouen informació sobre tot allò que passa al teu dispositiu. Les aplicacions poden utilitzar aquests registres per detectar i corregir problemes.\n\nCom que és possible que alguns registres continguin informació sensible, et recomanem que només hi permetis l\'accés a les aplicacions de confiança. \n\nEncara que no permetis que aquesta aplicació accedeixi a tots els registres del dispositiu, podrà accedir als seus propis registres. És possible que el fabricant del dispositiu també tingui accés a alguns registres o a informació del teu dispositiu.\n\nObtén més informació a g.co/android/devicelogs."</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"No tornis a mostrar"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vol mostrar porcions de l\'aplicació <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7408934887203689207">"Edita"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 99686911539b..9f67d084cc7f 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Dokáže rozpoznat gesta zadaná na snímači otisků prstů."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Pořídit snímek obrazovky"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Může pořídit snímek obrazovky."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Náhled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"zakázání či změny stavového řádku"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"vydávání se za stavový řádek"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 7b04bc98120a..fd169f5d3dec 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Kan registrere bevægelser, der foretages på enhedens fingeraftrykssensor."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tag screenshot"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan tage et screenshot af skærmen."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"deaktivere eller redigere statuslinje"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Tillader, at appen kan deaktivere statusbjælken eller tilføje og fjerne systemikoner."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"vær statusbjælken"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 7b78645fd4c1..42fb58f82058 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -296,7 +296,7 @@ <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="8974401416068943888">"Abgesicherter Modus"</string> <string name="android_system_label" msgid="5974767339591067210">"Android-System"</string> - <string name="user_owner_label" msgid="8628726904184471211">"Zum persönlichen Profil wechseln"</string> + <string name="user_owner_label" msgid="8628726904184471211">"Zum privaten Profil wechseln"</string> <string name="managed_profile_label" msgid="7316778766973512382">"Zum Arbeitsprofil wechseln"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"Kontakte"</string> <string name="permgroupdesc_contacts" msgid="9163927941244182567">"auf deine Kontakte zugreifen"</string> @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Erfasst Touch-Gesten auf dem Fingerabdrucksensor des Geräts."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Screenshot erstellen"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Es kann ein Screenshot des Displays erstellt werden."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Vorschau – <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"Statusleiste deaktivieren oder ändern"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"Statusleiste darstellen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 93128aa9ad7c..e83314cae495 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Μπορεί να αναγνωρίσει κινήσεις που εκτελούνται στον αισθητήρα δακτυλικού αποτυπώματος της συσκευής."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Λήψη στιγμιότυπου οθόνης"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Μπορεί να τραβήξει στιγμιότυπο της οθόνης."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Προεπισκόπηση, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"απενεργοποιεί ή να τροποποιεί την γραμμή κατάστασης"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ορίζεται ως γραμμή κατάστασης"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 817f00ea41ec..03534d04ba7d 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Capturará los gestos que se hacen en el sensor de huellas dactilares del dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tomar captura de pantalla"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede tomar capturas de pantalla."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra de estado"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que la aplicación inhabilite la barra de estado o que agregue y elimine íconos del sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"aparecer en la barra de estado"</string> @@ -2057,7 +2056,7 @@ <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Permitir acceso por única vez"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"No permitir"</string> <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Los registros del dispositivo permiten documentar lo que sucede en él. Las apps pueden usar estos registros para encontrar y solucionar problemas.\n\nEs posible que algunos registros del dispositivo contengan información sensible, por lo que solo debes permitir que accedan a todos ellos las apps que sean de tu confianza. \n\nSi no permites que esta app acceda a todos los registros del dispositivo, aún puede acceder a sus propios registros. Además, es posible que el fabricante del dispositivo acceda a algunos registros o información en tu dispositivo."</string> - <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Los registros del dispositivo permiten documentar lo que sucede en él. Las apps pueden usar estos registros para encontrar y solucionar problemas.\n\nEs posible que algunos registros del dispositivo contengan información sensible, por lo que solo debes permitir que accedan a todos los registros las apps que sean de tu confianza. \n\nTen en cuenta que la app puede acceder a sus propios registros incluso si no permites que acceda a todos los registros del dispositivo. También es posible que el fabricante del dispositivo acceda a algunos registros o información en tu dispositivo.\n\nObtén más información en g.co/android/devicelogs."</string> + <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Los registros del dispositivo permiten documentar lo que sucede en él. Las apps pueden usar estos registros para encontrar y solucionar problemas.\n\nEs posible que algunos registros del dispositivo contengan información sensible, por lo que solo debes permitir que accedan a ellos las apps que sean de tu confianza. \n\nTen en cuenta que la app puede acceder a sus propios registros incluso si no permites que acceda a todos los registros del dispositivo. También es posible que el fabricante del dispositivo acceda a algunos registros o información en tu dispositivo.\n\nObtén más información en g.co/android/devicelogs."</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"No volver a mostrar"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index ba30d42619e8..136187027cff 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Puede capturar los gestos realizados en el sensor de huellas digitales del dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Hacer captura"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede hacer capturas de la pantalla."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"inhabilitar o modificar la barra de estado"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que la aplicación inhabilite la barra de estado o añada y elimine iconos del sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"aparecer en la barra de estado"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 18539dfd2eb1..22796f27ef56 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Teil on võimalik jäädvustada seadme sõrmejäljeanduril tehtud liigutused."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Jäädvusta ekraanipilt"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Saab jäädvustada ekraanipildi."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Eelvaade, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"keela või muuda olekuriba"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Võimaldab rakendusel keelata olekuriba või lisada ja eemaldada süsteemiikoone."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"olekuribana kuvamine"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 858b656d930c..21ed746c327d 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Gailuaren hatz-marken sentsorean egindako keinuak atzeman ditzake."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Pantaila-argazkiak atera."</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pantaila-argazkiak atera ditzake."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Aurrebista, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desgaitu edo aldatu egoera-barra"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Egoera-barra desgaitzea edo sistema-ikonoak gehitzea edo kentzea baimentzen die aplikazioei."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"bihurtu egoera-barra"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5b5d5e4b57b1..9491f22e5953 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"میتواند اشارههای اجراشده روی حسگر اثرانگشت دستگاه را ثبت کند."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"گرفتن نماگرفت"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"میتواند از نمایشگر نماگرفت بگیرد."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"پیشنما، <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"غیرفعال کردن یا تغییر نوار وضعیت"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"به برنامه اجازه میدهد تا نوار وضعیت را غیرفعال کند یا نمادهای سیستم را اضافه یا حذف کند."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"نوار وضعیت باشد"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index e2b8fcc8dde7..207f397499b1 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Voi tallentaa laitteen sormenjälkitunnistimelle tehtyjä eleitä."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ota kuvakaappaus"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Voi ottaa kuvakaappauksen näytöstä."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Esikatselu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"poista tilapalkki käytöstä tai muokkaa tilapalkkia"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Antaa sovelluksen poistaa tilapalkin käytöstä ja lisätä tai poistaa järjestelmäkuvakkeita."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"sijaita tilapalkissa"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 3e29326d91eb..257db1c25514 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Peut capturer des gestes effectués sur le capteur d\'empreintes digitales de l\'appareil."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Prendre une capture d\'écran"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Peut prendre une capture de l\'écran."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Aperçu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"désactiver ou modifier la barre d\'état"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"servir de barre d\'état"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c5bf6a945775..01f8f08d9740 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Peut enregistrer des gestes effectués sur le lecteur d\'empreinte digitale de l\'appareil."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Prendre une capture d\'écran"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Peut prendre des captures d\'écran."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Aperçu, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"Désactivation ou modification de la barre d\'état"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"remplacer la barre d\'état"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index b89bd3f0c40e..64e91add1788 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Pode rexistrar os xestos realizados no sensor de impresión dixital do dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Facer captura de pantalla"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode facer capturas de pantalla."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Vista previa, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desactivar ou modificar a barra de estado"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite á aplicación desactivar a barra de estado ou engadir e quitar as iconas do sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"actuar como a barra de estado"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index c77502178ac7..3c96016970b1 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ડિવાઇસના ફિંગરપ્રિન્ટ સેન્સર પર કરવામાં આવેલા સંકેતો કૅપ્ચર કરી શકે છે."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"સ્ક્રીનશૉટ લો"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ડિસ્પ્લેનો સ્ક્રીનશૉટ લઈ શકે છે."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"પ્રીવ્યૂ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"સ્ટેટસ બારને અક્ષમ કરો અથવા તેમાં ફેરફાર કરો"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ઍપ્લિકેશનને સ્ટેટસ બાર અક્ષમ કરવાની અથવા સિસ્ટમ આયકન્સ ઉમેરવા અને દૂર કરવાની મંજૂરી આપે છે."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"સ્ટેટસ બારમાં બતાવો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 1951a38804e9..a20714d528be 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"डिवाइस के फ़िंगरप्रिंट सेंसर पर किए गए हाथ के जेस्चर कैप्चर किए जा सकते हैं."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रीनशॉट लें"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिसप्ले का स्क्रीनशॉट लिया जा सकता है."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> की झलक"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"स्टेटस बार को अक्षम करें या बदलें"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ऐप को, स्टेटस बार को बंद करने या सिस्टम आइकॉन को जोड़ने और निकालने की अनुमति देता है."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"स्टेटस बार को रहने दें"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 3d98bb4d79f0..d3c252a2e0c5 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Érzékeli az eszköz ujjlenyomat-érzékelőjén végzett kézmozdulatokat."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Képernyőkép készítése"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Készíthet képernyőképet a kijelzőről."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Előnézet, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"állapotsor kikapcsolása vagy módosítása"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Lehetővé teszi az alkalmazás számára az állapotsor kikapcsolását, illetve rendszerikonok hozzáadását és eltávolítását."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"az állapotsor szerepének átvétele"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 5d60c5dd1d35..1226661b1896 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Կարող է արձանագրել մատնահետքերի սկաների վրա կատարվող ժեստերը"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Սքրինշոթի ստեղծում"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Կարող է ստեղծել էկրանի սքրինշոթ։"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Նախադիտում, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"անջատել կամ փոփոխել կարգավիճակի գոտին"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Թույլ է տալիս հավելվածին անջատել կարգավիճակի գոտին կամ ավելացնել ու հեռացնել համակարգի պատկերակները:"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"լինել կարգավիճակի գոտի"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 2173eb9364e0..9257ed4cd375 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Dapat merekam gestur yang dilakukan di sensor sidik jari perangkat."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ambil screenshot"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Dapat mengambil screenshot tampilan."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Pratinjau, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"nonaktifkan atau ubah bilah status"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Mengizinkan apl menonaktifkan bilah status atau menambah dan menghapus ikon sistem."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"jadikan bilah status"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index d9df6203143c..30eefdf8ee59 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Getur fangað bendingar sem eru gerðar á fingrafaralesara tækisins."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Taka skjámynd"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Getur tekið skjámynd af skjánum."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Forskoðun, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"slökkva á eða breyta stöðustiku"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Leyfir forriti að slökkva á stöðustikunni eða bæta við og fjarlægja kerfistákn."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"vera stöðustikan"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index dd1b8defba37..7060eeff4671 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"È in grado di rilevare i gesti compiuti con il sensore di impronte dei dispositivi."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Acquisire screenshot"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Può acquisire uno screenshot del display."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> in anteprima"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"disattivazione o modifica della barra di stato"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ruolo di barra di stato"</string> @@ -2056,8 +2055,8 @@ <string name="log_access_confirmation_title" msgid="2343578467290592708">"Consentire all\'app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> di accedere a tutti i log del dispositivo?"</string> <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Consenti accesso una tantum"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Non consentire"</string> - <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe le neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo."</string> - <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe le neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo.\n\nScopri di più all\'indirizzo g.co/android/devicelogs."</string> + <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo."</string> + <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"I log del dispositivo registrano tutto ciò che succede sul tuo dispositivo. Le app possono usare questi log per individuare problemi e correggerli.\n\nAlcuni log potrebbero contenere informazioni sensibili, quindi concedi l\'accesso a tutti i log del dispositivo soltanto alle app attendibili. \n\nSe neghi l\'accesso a tutti i log del dispositivo, questa app può comunque accedere ai propri log. Il produttore del tuo dispositivo potrebbe essere comunque in grado di accedere ad alcuni log o informazioni sul dispositivo.\n\nScopri di più all\'indirizzo g.co/android/devicelogs."</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"Non mostrare più"</string> <string name="slices_permission_request" msgid="3677129866636153406">"L\'app <xliff:g id="APP_0">%1$s</xliff:g> vuole mostrare porzioni dell\'app <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7408934887203689207">"Modifica"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index a6c46a21f585..628adec67e2a 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"אפשרות לזהות תנועות בזמן נגיעה בחיישן טביעות האצבע של המכשיר."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"צילום המסך"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ניתן לצלם צילום מסך של התצוגה."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"תצוגה מקדימה, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"השבתה או שינוי של שורת הסטטוס"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"מאפשרת לאפליקציה להשבית את שורת הסטטוס או להוסיף ולהסיר סמלי מערכת."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"להיות שורת הסטטוס"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 1879cc62088b..5a3deed68609 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"デバイスの指紋認証センサーで行われた操作をキャプチャできます。"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"スクリーンショットの撮影"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ディスプレイのスクリーンショットを撮影できます。"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"プレビュー - <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ステータスバーの無効化や変更"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ステータスバーの無効化、システムアイコンの追加や削除をアプリに許可します。"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ステータスバーへの表示"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 8343198bc157..67c82033d3e1 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"შეუძლია აღბეჭდოს მოწყობილობის თითის ანაბეჭდის სენსორზე განხორციელებული ჟესტები."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ეკრანის ანაბეჭდის გადაღება"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"შეუძლია ეკრანის ანაბეჭდის გადაღება."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"გადახედვა, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"სტატუსის ზოლის გათიშვა ან ცვლილება"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"აპს შეეძლება სტატუსების ზოლის გათიშვა და სისტემის ხატულების დამატება/წაშლა."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"სტატუსის ზოლის ჩანაცვლება"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index c863cd8d2cae..6bfce9e07f9d 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Құрылғының саусақ ізі сенсорында орындалған қимылдарды сақтайды."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Скриншот жасау"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дисплейдің скриншотын жасай аласыз."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Алғы көрініс, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"күйін көрсету тақтасын өшіру немесе өзгерту"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Қолданбаға күй жолағын өшіруге немесе жүйелік белгішелерді қосуға және жоюға рұқсат береді."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"күй жолағы болу"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 35b59bef94a3..445020d7d785 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"អាចចាប់យកចលនាដែលធ្វើនៅលើនៅលើឧបករណ៍ចាប់ស្នាមម្រាមដៃរបស់ឧបករណ៍បាន។"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ថតអេក្រង់"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"អាចថតអេក្រង់នៃផ្ទាំងអេក្រង់បាន។"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"មើលសាកល្បង <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"បិទ ឬកែរបារស្ថានភាព"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ឲ្យកម្មវិធីបិទរបារស្ថានភាព ឬបន្ថែម និងលុបរូបតំណាងប្រព័ន្ធ។"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ធ្វើជារបារស្ថានភាព"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index d0decdf7d983..ee76ca3d0c40 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ಸಾಧನದ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ನಲ್ಲಿ ನಡೆಸಿದ ಗೆಶ್ಚರ್ಗಳನ್ನು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ಪ್ರದರ್ಶನದ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಲ್ಲದು."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ಪೂರ್ವವೀಕ್ಷಣೆ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇಲ್ಲವೇ ಮಾರ್ಪಡಿಸಿ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಮತ್ತು ಸಿಸ್ಟಂ ಐಕಾನ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 04dc86a6c9a7..bbfe13488f39 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"기기 지문 센서에서 동작을 캡처합니다."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"스크린샷 촬영"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"디스플레이 스크린샷을 촬영할 수 있습니다."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"미리보기, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"상태 표시줄 사용 중지 또는 수정"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"앱이 상태 표시줄을 사용중지하거나 시스템 아이콘을 추가 및 제거할 수 있도록 허용합니다."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"상태 표시줄에 위치"</string> @@ -2052,10 +2051,10 @@ <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"제거"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"열기"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"유해한 앱 감지됨"</string> - <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>에서 모든 기기 로그에 액세스하도록 허용하시겠습니까?"</string> + <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>에서 전체 기기 로그에 액세스하도록 허용하시겠습니까?"</string> <string name="log_access_confirmation_allow" msgid="5302517782599389507">"일회성 액세스 허용"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"허용 안함"</string> - <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"기기 로그에 기기에서 발생한 상황이 기록됩니다. 앱은 문제를 찾고 해결하는 데 이 로그를 사용할 수 있습니다.\n\n일부 로그는 민감한 정보를 포함할 수 있으므로 신뢰할 수 있는 앱만 모든 기기 로그에 액세스하도록 허용하세요. \n\n앱에 전체 기기 로그에 대한 액세스 권한을 부여하지 않아도 앱이 자체 로그에는 액세스할 수 있습니다. 기기 제조업체에서 일부 로그 또는 기기 내 정보에 액세스할 수도 있습니다."</string> + <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"기기 로그에는 기기에서 발생한 상황이 기록됩니다. 앱은 문제를 찾고 해결하는 데 이 로그를 사용할 수 있습니다.\n\n일부 로그는 민감한 정보를 포함할 수 있으므로 신뢰할 수 있는 앱만 전체 기기 로그에 액세스하도록 허용하세요. \n\n앱에 전체 기기 로그에 대한 액세스 권한을 부여하지 않아도 앱이 자체 로그에는 액세스할 수 있습니다. 기기 제조업체에서 일부 로그 또는 기기 내 정보에 액세스할 수도 있습니다."</string> <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"기기 로그에는 기기에서 발생한 상황이 기록됩니다. 앱은 문제를 찾고 해결하는 데 이 로그를 사용할 수 있습니다.\n\n일부 로그에 민감한 정보가 포함될 수 있으므로 신뢰할 수 있는 앱만 모든 기기 로그에 액세스하도록 허용하세요. \n\n앱에 전체 기기 로그에 대한 액세스 권한을 부여하지 않아도, 앱이 자체 로그에는 액세스할 수 있습니다. 기기 제조업체에서 기기 내 일부 로그 또는 정보에 액세스할 수도 있습니다.\n\ng.co/android/devicelogs에서 자세히 알아보세요."</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"다시 표시 안함"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하려고 합니다"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index bdb8fe1576a1..fdf22a96b6a0 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Түзмөктөгү манжа изинин сенсорунда жасалган жаңсоолорду жаздырып алат."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Скриншот тартып алуу"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дисплейдин скриншотун тартып алсаңыз болот."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Алдын ала көрүү, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"абал тилкесин өчүрүү же өзгөртүү"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Колдонмого абал тилкесин өчүрүү же тутум сүрөтчөлөрүн кошуу же алып салуу мүмкүнчүлүгүн берет."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"абал тилкесинин милдетин аткаруу"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index b7a4c05a2f61..f06b2cf2ab2f 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ສາມາດບັນທຶກທ່າທາງທີ່ເກີດຂຶ້ນໃນອຸປະກອນເຊັນເຊີລາຍນິ້ວມືໄດ້."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ຖ່າຍຮູບໜ້າຈໍ"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ສາມາດຖ່າຍຮູບໜ້າຈໍໄດ້."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ຕົວຢ່າງ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ປິດການນນຳໃຊ້ ຫຼື ແກ້ໄຂແຖບສະຖານະ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງແຖບສະຖານະ ຫຼືເພີ່ມ ແລະລຶບໄອຄອນລະບົບອອກໄດ້."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ເປັນແຖບສະຖານະ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index cdfa1ac3cc5e..fcc0918ea9d2 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Gali užfiksuoti gestus, atliktus naudojant įrenginio piršto antspaudo jutiklį."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekrano kopijos kūrimas"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Galima sukurti vaizdo ekrano kopiją."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Peržiūra, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"išjungti ar keisti būsenos juostą"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Leidžiama programai neleisti būsenos juostos arba pridėti ir pašalinti sistemos piktogramas."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"būti būsenos juosta"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 66826c9fa605..e1baffd39bca 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Var uztvert žestus ierīces pirksta nospieduma sensorā."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekrānuzņēmuma izveide"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Var izveidot displeja ekrānuzņēmumu."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> (priekšskatījums)"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"atspējot vai pārveidot statusa joslu"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Ļauj lietotnei atspējot statusa joslu vai pievienot un noņemt sistēmas ikonas."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"Būt par statusa joslu"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index dd5e44ed3709..605b7bba643a 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Може да сними движења што се направени на сензорот за отпечатоци на уредот."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Зачувување слика од екранот"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да зачува слика од екранот."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Преглед, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"оневозможи или измени статусна лента"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Дозволува апликацијата да ја оневозможи статусната лента или да додава или отстранува системски икони."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"да стане статусна лента"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 4ed058dfb073..7a9d4dab7c54 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ഉപകരണത്തിന്റെ ഫിംഗർപ്രിന്റ് സെൻസറിൽ ചെയ്ത ജെസ്റ്ററുകൾ ക്യാപ്ചർ ചെയ്യാനാകും."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"സ്ക്രീന്ഷോട്ട് എടുക്കുക"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ഡിസ്പ്ലേയുടെ സ്ക്രീൻഷോട്ട് എടുക്കാൻ കഴിയും."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"പ്രിവ്യൂ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"സ്റ്റാറ്റസ് ബാർ പ്രവർത്തനരഹിതമാക്കുക അല്ലെങ്കിൽ പരിഷ്ക്കരിക്കുക"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"നില ബാർ പ്രവർത്തരഹിതമാക്കുന്നതിന് അല്ലെങ്കിൽ സിസ്റ്റം ഐക്കണുകൾ ചേർക്കുന്നതിനും നീക്കംചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"സ്റ്റാറ്റസ് ബാർ ആയിരിക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 5b8209ba92f2..e4c68e2f41ed 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Төхөөрөмжийн хурууны хээ мэдрэгчид зангасан зангааг танина."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Дэлгэцийн зургийг дарах"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Дэлгэцийн зургийг дарах боломжтой."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Урьдчилан үзэх, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"статус самбарыг идэвхгүй болгох болон өөрчлөх"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Апп нь статус самбарыг идэвхгүй болгох эсвэл систем дүрсийг нэмэх, хасах боломжтой."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"статусын хэсэг болох"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index ee6e2eedffd5..1e08228b4fac 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"डिव्हाइसच्या फिंगरप्रिंट सेंन्सरवरील जेश्चर कॅप्चर करू शकते."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रीनशॉट घ्या"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेचा स्क्रीनशॉट घेऊ शकतो."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"पूर्वावलोकन, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"स्टेटस बार अक्षम करा किंवा सुधारित करा"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"स्टेटस बार अक्षम करण्यासाठी किंवा सिस्टम चिन्हे जोडण्यासाठी आणि काढण्यासाठी अॅप ला अनुमती देते."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"स्टेटस बार होऊ द्या"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 8f5476281f09..dca9de618071 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Boleh menangkap gerak isyarat yang dilakukan pada penderia cap jari peranti."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ambil tangkapan skrin"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Boleh mengambil tangkapan skrin paparan."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Pratonton, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"lumpuhkan atau ubah suai bar status"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Membenarkan apl melumpuhkan bar status atau menambah dan mengalih keluar ikon sistem."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"jadi bar status"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 939df8038677..70d352f3a832 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"စက်ပစ္စည်း၏ လက်ဗွေအာရုံခံကိရိယာတွင် လုပ်ဆောင်ထားသည့် လက်ဟန်များကို မှတ်သားထားနိုင်သည်။"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်ရန်"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ဖန်သားပြင်ပြသမှုကို ဓာတ်ပုံရိုက်နိုင်ပါသည်။"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> အစမ်းကြည့်ခြင်း"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"အခြေအနေပြဘားအား အလုပ်မလုပ်ခိုင်းရန်သို့မဟုတ် မွမ်းမံရန်"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"အက်ပ်အား အခြေအနေပြ ဘားကို ပိတ်ခွင့် သို့မဟတ် စနစ် အိုင်ကွန်များကို ထည့်ခြင်း ဖယ်ရှားခြင်း ပြုလုပ်ခွင့် ပြုသည်။"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"အခြေအနေပြ ဘားဖြစ်ပါစေ"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index f0f4439c57aa..c9c277cf6a12 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Kan fange inn bevegelser som utføres på enhetens fingeravtrykkssensor."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ta skjermdump"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan ikke ta en skjermdump av skjermen."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Forhåndsvisning, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"deaktivere eller endre statusfeltet"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Lar appen deaktivere statusfeltet eller legge til og fjerne systemikoner."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"vise appen i statusfeltet"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 94551e5daad4..6e738671e1ba 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"यसले यन्त्रको फिंगरप्रिन्टसम्बन्धी सेन्सरमा गरिएका इसाराहरूलाई खिच्न सक्छ।"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रिनसट लिनुहोस्"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेको स्क्रिनसट लिन सकिन्छ।"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"प्रिभ्यू, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"स्थिति पट्टिलाई अक्षम वा संशोधित गर्नुहोस्"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन एपलाई अनुमति दिन्छ।"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"स्टाटस बार हुन दिनुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 0f7d35f3fb48..ba43d799f371 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Kan gebaren registreren die op de vingerafdruksensor van het apparaat worden getekend."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Screenshot maken"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan een screenshot van het scherm maken."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Voorbeeld, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"statusbalk uitzetten of wijzigen"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Hiermee kan de app de statusbalk uitzetten of systeemiconen toevoegen en verwijderen."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"de statusbalk zijn"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 26821da497b7..b37d01c007d3 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ଡିଭାଇସ୍ର ଟିପଚିହ୍ନ ସେନସର୍ ଉପରେ ଜେଶ୍ଚର୍ କ୍ୟାପଚର୍ କାର୍ଯ୍ୟ କରାଯାଇପାରିବ।"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ସ୍କ୍ରିନସଟ୍ ନିଅନ୍ତୁ"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ଡିସପ୍ଲେର ଏକ ସ୍କ୍ରିନସଟ୍ ନିଆଯାଇପାରେ।"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ପ୍ରିଭ୍ୟୁ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ଷ୍ଟାଟସ୍ ବାର୍କୁ ଅକ୍ଷମ କିମ୍ୱା ସଂଶୋଧନ କରନ୍ତୁ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ଆପ୍କୁ, ସ୍ଥିତି ବାର୍ ଅକ୍ଷମ କରିବାକୁ କିମ୍ବା ସିଷ୍ଟମ୍ ଆଇକନ୍ ଯୋଡ଼ିବା କିମ୍ବା ବାହାର କରିବାକୁ ଦେଇଥାଏ।"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ଷ୍ଟାଟସ୍ ବାର୍ ରହିବାକୁ ଦିଅନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index c8c382b1a289..660d395babc8 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ਡੀਵਾਈਸਾਂ ਦੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ \'ਤੇ ਕੀਤੇ ਗਏ ਸੰਕੇਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੇ ਹਨ।"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ਡਿਸਪਲੇ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈ ਸਕਦੀ ਹੈ।"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ਪੂਰਵ-ਝਲਕ ਦੇਖੋ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ਸਥਿਤੀ ਪੱਟੀ ਬੰਦ ਕਰੋ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਪੱਟੀ ਨੂੰ ਚਾਲੂ ਕਰਨ ਜਾਂ ਸਿਸਟਮ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਜੋੜਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ਸਥਿਤੀ ਪੱਟੀ ਬਣਨ ਦਿਓ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 8425a7a8a816..524f0448b262 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Może przechwytywać gesty wykonywane na czytniku linii papilarnych w urządzeniu."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Robienie zrzutu ekranu"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Może robić zrzuty ekranu wyświetlacza."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Podgląd, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"wyłączanie lub zmienianie paska stanu"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Pozwala aplikacji na wyłączanie paska stanu oraz dodawanie i usuwanie ikon systemowych."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"działanie jako pasek stanu"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4fe36de666b9..f22499ad5d7f 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Pode captar gestos realizados no sensor de impressão digital do dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer uma captura de tela"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode fazer uma captura de tela."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Visualização, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar a barra de status"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ser a barra de status"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4fe36de666b9..f22499ad5d7f 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Pode captar gestos realizados no sensor de impressão digital do dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer uma captura de tela"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Pode fazer uma captura de tela."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Visualização, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar a barra de status"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"ser a barra de status"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index a3be67382471..295187b13a57 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Poate reda gesturile făcute pe senzorul de amprentă al dispozitivului."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fă o captură de ecran"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Poate face o captură de ecran."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Previzualizare, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"dezactivare sau modificare bare de stare"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite aplicației să dezactiveze bara de stare sau să adauge și să elimine pictograme de sistem."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"să fie bara de stare"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d5067ae4e035..b3bfebbb59c2 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Использовать сканер отпечатков пальцев для дополнительных жестов."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Создавать скриншоты"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Создавать снимки экрана."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g>: предпросмотр"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"Отключение/изменение строки состояния"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Приложение сможет отключать строку состояния, а также добавлять и удалять системные значки."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"Замена строки состояния"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 66b0cd6fff3b..5896d91e8f72 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"උපාංගයෙහි ඇඟිලි සලකුණු සංවේදකය මත සිදු කරන ඉංගිත ග්රහණය කළ හැකිය."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"තිර රුව ගන්න"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"සංදර්ශකයේ තිර රුවක් ගැනීමට හැකිය."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"පෙරදසුන, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"තත්ව තීරුව අබල කරන්න හෝ වෙනස් කරන්න"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"තත්ව තීරුව අක්රිය කිරීමට හෝ පද්ධති නිරූපක එකතු හෝ ඉවත් කිරීමට යෙදුමට අවසර දේ."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"තත්ත්ව තීරුව බවට පත්වීම"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 816feefb8b7a..d84a7515fbaa 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Dokáže zaznamenať gestá na senzore odtlačkov prstov zariadenia."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Vytvoriť snímku obrazovky"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Je možné vytvoriť snímku obrazovky."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Ukážka, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"zakázanie alebo zmeny stavového riadka"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Umožňuje aplikácii vypnúť stavový riadok alebo pridať a odstrániť systémové ikony."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"vydávanie sa za stavový riadok"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 61f2b51f3d85..9279cd67fc4d 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Prepoznava poteze, narejene po tipalu prstnih odtisov naprave."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ustvarjanje posnetka zaslona"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Lahko naredi posnetek zaslona."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Predogled, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"onemogočanje ali spreminjanje vrstice stanja"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Aplikacijam omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"postane vrstica stanja"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 1708904e40e5..b42d2edb8c2d 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Mund të regjistrojë gjestet e kryera në sensorin e gjurmës së gishtit të pajisjes."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Nxirr një pamje të ekranit"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Mund të nxjerrë një pamje e ekranit."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Versioni paraprak, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"çaktivizo ose modifiko shiritin e statusit"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Lejon aplikacionin të çaktivizojë shiritin e statusit dhe të heqë ikonat e sistemit."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"të bëhet shiriti i statusit"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index fb36169d3e33..986b4058370f 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -343,8 +343,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Може да региструје покрете на сензору за отисак прста на уређају."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Направи снимак екрана"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може да направи снимак екрана."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Преглед, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"онемогућавање или измена статусне траке"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Дозвољава апликацији да онемогући статусну траку или да додаје и уклања системске иконе."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"функционисање као статусна трака"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 6c593df1ff34..c822b5c30ab6 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Kan registrera rörelser som utförs med hjälp av enhetens fingeravtryckssensor."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ta skärmbild"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan ta en skärmbild av skärmen."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Förhandsgranskar <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"inaktivera eller ändra statusfält"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"visas i statusfältet"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 715c1c4f1b34..304534b38584 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Inaweza kurekodi ishara zinazotekelezwa kwenye kitambua alama ya kidole."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Piga picha ya skrini"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Inaweza kupiga picha ya skrini ya onyesho."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Onyesho la kukagua, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"zima au rekebisha mwambaa hali"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Inaruhusu programu kulemaza upau wa hali au kuongeza na kutoa aikoni za mfumo."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"kuwa sehemu ya arifa"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 2c8c532fefeb..a3f14204ba06 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"சாதனத்தின் கைரேகை சென்சார்மேல் செய்யப்படும் சைகைகளைக் கேப்ட்சர் செய்ய முடியும்."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ஸ்கிரீன்ஷாட்டை எடுக்கும்"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"டிஸ்ப்ளேவை ஸ்கிரீன்ஷாட் எடுக்க முடியும்."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"மாதிரிக்காட்சி, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"நிலைப் பட்டியை முடக்குதல் அல்லது மாற்றுதல்"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற ஆப்ஸை அனுமதிக்கிறது."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"நிலைப் பட்டியில் இருக்கும்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index bc5380279ca3..f9880dbd946b 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"పరికర వేలిముద్ర సెన్సార్లో ఉపయోగించిన సంజ్ఞలను క్యాప్చర్ చేయవచ్చు."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"స్క్రీన్షాట్ను తీయండి"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"డిస్ప్లే యొక్క స్క్రీన్షాట్ తీసుకోవచ్చు."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ప్రివ్యూ, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"స్టేటస్ బార్ను డిజేబుల్ చేయడం లేదా మార్చడం"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"స్టేటస్ బార్ను డిజేబుల్ చేయడానికి లేదా సిస్టమ్ చిహ్నాలను జోడించడానికి మరియు తీసివేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"స్టేటస్ పట్టీగా ఉండటం"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d12b209e3d5e..93fe817bb65e 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"สามารถจับท่าทางสัมผัสที่เกิดขึ้นบนเซ็นเซอร์ลายนิ้วมือของอุปกรณ์"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"ถ่ายภาพหน้าจอ"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ถ่ายภาพหน้าจอได้"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"ตัวอย่าง <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"ปิดการใช้งานหรือแก้ไขแถบสถานะ"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"อนุญาตให้แอปพลิเคชันปิดใช้งานแถบสถานะหรือเพิ่มและนำไอคอนระบบออก"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"เป็นแถบสถานะ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 4c9e38847f1f..a56df48a9a2a 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Makukunan ang mga galaw na ginawa sa sensor para sa fingerprint ng device."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Kumuha ng screenshot"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puwedeng kumuha ng screenshot ng display."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Preview, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"i-disable o baguhin ang status bar"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Pinapayagan ang app na i-disable ang status bar o magdagdag at mag-alis ng mga icon ng system."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"maging status bar"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 4e6c6c78234f..270023d6e68c 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Cihazın parmak izi sensörlerinde gerçekleştirilen hareketleri yakalayabilir."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Ekran görüntüsü al"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekran görüntüsü alınabilir."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Önizleme, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"durum çubuğunu devre dışı bırak veya değiştir"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Uygulamaya, durum çubuğunu devre dışı bırakma ve sistem simgelerini ekleyip kaldırma izni verir."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"durum çubuğunda olma"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 28828e713be4..8eddb31b54f7 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -344,8 +344,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Може фіксувати жести на сканері відбитків пальців."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Робити знімки екрана"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Може робити знімки екрана."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"<xliff:g id="DREAM_NAME">%1$s</xliff:g> (попередній перегляд)"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"вимикати чи змін. рядок стану"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Дозволяє програмі вимикати рядок стану чи додавати та видаляти піктограми системи."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"відображатися як рядок стану"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index d94ccc133442..f98fc6c10a6c 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"آلہ کے فنگر پرنٹ سینسر پر کیے گئے اشاروں کو کیپچر کر سکتا ہے۔"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"اسکرین شاٹ لیں"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ڈسپلے کا اسکرین شاٹ لیا جا سکتا ہے۔"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"پیش منظر، <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"اسٹیٹس بار کو غیر فعال یا اس میں ترمیم کریں"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"ایپ کو اسٹیٹس بار غیر فعال کرنے یا سسٹم آئیکنز شامل کرنے اور ہٹانے کی اجازت دیتا ہے۔"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"بطور اسٹیٹس بار کام لیں"</string> @@ -2052,11 +2051,11 @@ <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"اَن انسٹال کریں"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"بہر صورت کھولیں"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"ضرر رساں ایپ کا پتہ چلا"</string> - <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> کو آلے کے تمام لاگز تک رسائی کی اجازت دیں؟"</string> + <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> کو آلے کے تمام لاگز تک رسائی کی اجازت دیں؟"</string> <string name="log_access_confirmation_allow" msgid="5302517782599389507">"یک وقتی رسائی کی اجازت دیں"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"اجازت نہ دیں"</string> <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"آپ کے آلے پر جو ہوتا ہے آلے کے لاگز اسے ریکارڈ کر لیتے ہیں۔ ایپس ان لاگز کا استعمال مسائل کو تلاش کرنے اور ان کو حل کرنے کے لیے کر سکتی ہیں۔\n\nکچھ لاگز میں حساس معلومات شامل ہو سکتی ہیں، اس لیے صرف اپنے بھروسے مند ایپس کو ہی آلے کے تمام لاگز تک رسائی کی اجازت دیں۔ \n\nاگر آپ اس ایپ کو آلے کے تمام لاگز تک رسائی کی اجازت نہیں دیتے ہیں تب بھی یہ اپنے لاگز تک رسائی حاصل کر سکتی ہے۔ آپ کے آلے کا مینوفیکچرر اب بھی آپ کے آلے پر کچھ لاگز یا معلومات تک رسائی حاصل کر سکتا ہے۔"</string> - <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"آپ کے آلے پر جو ہوتا ہے آلے کے لاگز اسے ریکارڈ کر لیتے ہیں۔ ایپس ان لاگز کا استعمال مسائل کو تلاش کرنے اور ان کو حل کرنے کے لیے کر سکتی ہیں۔\n\nکچھ لاگز میں حساس معلومات شامل ہو سکتی ہیں، اس لیے صرف اپنی بھروسے مند ایپس کو ہی آلے کے تمام لاگز تک رسائی کی اجازت دیں۔ \n\nاگر آپ اس ایپ کو آلے کے تمام لاگز تک رسائی کی اجازت نہیں دیتے ہیں تب بھی یہ اپنے لاگز تک رسائی حاصل کر سکتی ہے۔ آپ کے آلے کا مینوفیکچرر اب بھی آپ کے آلے پر کچھ لاگز یا معلومات تک رسائی حاصل کر سکتا ہے۔\n\ng.co/android/devicelogs پر مزید جانیں۔"</string> + <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"آپ کے آلے پر جو ہوتا ہے آلے کے لاگز اسے ریکارڈ کر لیتے ہیں۔ ایپس ان لاگز کا استعمال مسائل کو تلاش کرنے اور ان کو حل کرنے کے لیے کر سکتی ہیں۔\n\nکچھ لاگز میں حساس معلومات شامل ہو سکتی ہیں، اس لیے صرف اپنی بھروسے مند ایپس کو ہی آلے کے تمام لاگز تک رسائی کی اجازت دیں۔ \n\nاگر آپ اس ایپ کو آلے کے تمام لاگز تک رسائی کی اجازت نہیں دیتے ہیں تب بھی یہ اپنے لاگز تک رسائی حاصل کر سکتی ہے۔ آپ کے آلے کا مینوفیکچرر اب بھی آپ کے آلے پر کچھ لاگز یا معلومات تک رسائی حاصل کر سکتا ہے۔\n\nمزید جاننے کیلئے g.co/android/devicelogs ملاحظہ کریں۔"</string> <string name="log_access_do_not_show_again" msgid="1058690599083091552">"دوبارہ نہ دکھائیں"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string> <string name="screenshot_edit" msgid="7408934887203689207">"ترمیم کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 8db468bb8181..c328e6f846db 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Barmoq izi skanerida kiritilgan ishoralarni taniy oladi."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Skrinshot olish"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ekrandan skrinshot olishi mumkin."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Razm solish, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"holat panelini o‘zgartirish yoki o‘chirish"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Ilova holat panelini o‘chirib qo‘yishi hamda tizim ikonkalarini qo‘shishi yoki olib tashlashi mumkin."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"holat qatorida ko‘rinishi"</string> @@ -2052,8 +2051,8 @@ <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"O‘CHIRIB TASHLASH"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BARIBIR OCHILSIN"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"Zararli ilova aniqlandi"</string> - <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ilovasining qurilmadagi barcha jurnallarga kirishiga ruxsat berilsinmi?"</string> - <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Bir matalik foydalanishga ruxsat berish"</string> + <string name="log_access_confirmation_title" msgid="2343578467290592708">"<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> uchun qurilmadagi barcha jurnallarga kirish ruxsati berilsinmi?"</string> + <string name="log_access_confirmation_allow" msgid="5302517782599389507">"Bir martalik ruxsat berish"</string> <string name="log_access_confirmation_deny" msgid="7685790957455099845">"Rad etish"</string> <string name="log_access_confirmation_body" product="default" msgid="1806692062668620735">"Qurilma jurnaliga qurilma bilan yuz bergan hodisalar qaydlari yoziladi. Ilovalar bu jurnal qaydlari yordamida muammolarni topishi va bartaraf qilishi mumkin.\n\nAyrim jurnal qaydlarida maxfiy axborotlar yozilishi mumkin, shu sababli qurilmadagi barcha jurnal qaydlariga ruxsatni faqat ishonchli ilovalarga bering. \n\nBu ilovaga qurilmadagi barcha jurnal qaydlariga ruxsat berilmasa ham, u oʻzining jurnalini ocha oladi. Qurilma ishlab chiqaruvchisi ham ayrim jurnallar yoki qurilma haqidagi axborotlarni ocha oladi."</string> <string name="log_access_confirmation_body" product="tv" msgid="7379536536425265262">"Qurilma jurnaliga qurilma bilan yuz bergan hodisalar qaydlari yoziladi. Ilovalar bu jurnal qaydlari yordamida muammolarni topishi va bartaraf qilishi mumkin.\n\nAyrim jurnal qaydlarida maxfiy axborotlar yozilishi mumkin, shu sababli qurilmadagi barcha jurnal qaydlariga ruxsatni faqat ishonchli ilovalarga bering. \n\nBu ilovaga qurilmadagi barcha jurnal qaydlariga ruxsat berilmasa ham, u oʻzining jurnalini ocha oladi. Qurilma ishlab chiqaruvchisi ham ayrim jurnallar yoki qurilma haqidagi axborotlarni ocha oladi.\n\nBatafsil: g.co/android/devicelogs."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 30cab1ae2c11..c71a33d44b4a 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Có thể ghi lại các cử chỉ được thực hiện trên cảm biến vân tay của thiết bị."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Chụp ảnh màn hình"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Có thể chụp ảnh màn hình."</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Bản xem trước, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"vô hiệu hóa hoặc sửa đổi thanh trạng thái"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Cho phép ứng dụng vô hiệu hóa thanh trạng thái hoặc thêm và xóa biểu tượng hệ thống."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"trở thành thanh trạng thái"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 3a8ab3cab7fa..5e11f1934b5a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"可以捕捉在设备指纹传感器上执行的手势。"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"截取屏幕截图"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可截取显示画面的屏幕截图。"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"预览,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"停用或修改状态栏"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"允许应用停用状态栏或者增删系统图标。"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"用作状态栏"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 0e65d66f7dd7..3b3018a89785 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"可以擷取在裝置指紋感應器上執行的手勢。"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"擷取螢幕擷圖"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可以擷取螢幕截圖。"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"預覽,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"停用或修改狀態列"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"成為狀態列"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index bd37579fb6f1..65967bd8ca83 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"可以擷取使用者對裝置的指紋感應器執行的手勢。"</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"擷取螢幕畫面"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"可以擷取螢幕畫面。"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"預覽,<xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"停用或變更狀態列"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"以狀態列顯示"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index abc673bfb3b9..524ccb1c12ba 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -342,8 +342,7 @@ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Ingathatha ukuthinta okwenziwe kunzwa yezigxivizo zeminwe zedivayisi."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Thatha isithombe-skrini"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Ingathatha isithombe-skrini sesiboniso"</string> - <!-- no translation found for dream_preview_title (5570751491996100804) --> - <skip /> + <string name="dream_preview_title" msgid="5570751491996100804">"Hlola kuqala, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"khubaza noma guqula ibha yomumo"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Ivumela uhlelo lokusebenza ukuthi yenze umudwa ochaza ngesimo ukuthi ungasebenzi noma ukufaka noma ukukhipha izithonjana zohlelo."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"yiba yibha yesimo"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index dafa0ad7989f..58c8b29dfad6 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -6092,4 +6092,9 @@ <!-- Whether to show weather on the lock screen by default. --> <bool name="config_lockscreenWeatherEnabledByDefault">false</bool> + + <!-- Whether to reset Battery Stats on unplug when the battery level is high. --> + <bool name="config_batteryStatsResetOnUnplugHighBatteryLevel">true</bool> + <!-- Whether to reset Battery Stats on unplug if the battery was significantly charged --> + <bool name="config_batteryStatsResetOnUnplugAfterSignificantCharge">true</bool> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 591ba5feeee9..8addca27a7bb 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4903,4 +4903,7 @@ <!-- Whether to show weather on the lockscreen by default. --> <java-symbol type="bool" name="config_lockscreenWeatherEnabledByDefault" /> + + <java-symbol type="bool" name="config_batteryStatsResetOnUnplugHighBatteryLevel" /> + <java-symbol type="bool" name="config_batteryStatsResetOnUnplugAfterSignificantCharge" /> </resources> diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsResetTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsResetTest.java new file mode 100644 index 000000000000..9c2d332a7c70 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsResetTest.java @@ -0,0 +1,362 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.os.BatteryManager; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BatteryStatsResetTest { + + private static final int BATTERY_NOMINAL_VOLTAGE_MV = 3700; + private static final int BATTERY_CAPACITY_UAH = 4_000_000; + private static final int BATTERY_CHARGE_RATE_SECONDS_PER_LEVEL = 100; + + private MockClock mMockClock; + private MockBatteryStatsImpl mBatteryStatsImpl; + + + /** + * Battery status. Must be one of the following: + * {@link BatteryManager#BATTERY_STATUS_UNKNOWN} + * {@link BatteryManager#BATTERY_STATUS_CHARGING} + * {@link BatteryManager#BATTERY_STATUS_DISCHARGING} + * {@link BatteryManager#BATTERY_STATUS_NOT_CHARGING} + * {@link BatteryManager#BATTERY_STATUS_FULL} + */ + private int mBatteryStatus; + /** + * Battery health. Must be one of the following: + * {@link BatteryManager#BATTERY_HEALTH_UNKNOWN} + * {@link BatteryManager#BATTERY_HEALTH_GOOD} + * {@link BatteryManager#BATTERY_HEALTH_OVERHEAT} + * {@link BatteryManager#BATTERY_HEALTH_DEAD} + * {@link BatteryManager#BATTERY_HEALTH_OVER_VOLTAGE} + * {@link BatteryManager#BATTERY_HEALTH_UNSPECIFIED_FAILURE} + * {@link BatteryManager#BATTERY_HEALTH_COLD} + */ + private int mBatteryHealth; + /** + * Battery plug type. Can be the union of any number of the following flags: + * {@link BatteryManager#BATTERY_PLUGGED_AC} + * {@link BatteryManager#BATTERY_PLUGGED_USB} + * {@link BatteryManager#BATTERY_PLUGGED_WIRELESS} + * {@link BatteryManager#BATTERY_PLUGGED_DOCK} + * + * Zero means the device is unplugged. + */ + private int mBatteryPlugType; + private int mBatteryLevel; + private int mBatteryTemp; + private int mBatteryVoltageMv; + private int mBatteryChargeUah; + private int mBatteryChargeFullUah; + private long mBatteryChargeTimeToFullSeconds; + + @Before + public void setUp() { + final Context context = InstrumentationRegistry.getContext(); + + mMockClock = new MockClock(); + mBatteryStatsImpl = new MockBatteryStatsImpl(mMockClock, context.getFilesDir()); + mBatteryStatsImpl.onSystemReady(); + + + // Set up the battery state. Start off with a fully charged plugged in battery. + mBatteryStatus = BatteryManager.BATTERY_STATUS_FULL; + mBatteryHealth = BatteryManager.BATTERY_HEALTH_GOOD; + mBatteryPlugType = BatteryManager.BATTERY_PLUGGED_USB; + mBatteryLevel = 100; + mBatteryTemp = 70; // Arbitrary reasonable temperature. + mBatteryVoltageMv = BATTERY_NOMINAL_VOLTAGE_MV; + mBatteryChargeUah = BATTERY_CAPACITY_UAH; + mBatteryChargeFullUah = BATTERY_CAPACITY_UAH; + mBatteryChargeTimeToFullSeconds = 0; + } + + @Test + public void testResetOnUnplug_highBatteryLevel() { + mBatteryStatsImpl.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugHighBatteryLevel(true) + .build()); + + long expectedResetTimeUs = 0; + + unplugBattery(); + dischargeToLevel(60); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Reset should not occur until battery level above 90. + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(95); + // Reset should not occur until unplug. + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + unplugBattery(); + // Reset should occur on unplug now that battery level is high (>=90) + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // disable high battery level reset on unplug. + mBatteryStatsImpl.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugHighBatteryLevel(false) + .build()); + + dischargeToLevel(60); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(95); + unplugBattery(); + // Reset should not occur since the high battery level logic has been disabled. + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + } + + @Test + public void testResetOnUnplug_significantCharge() { + mBatteryStatsImpl.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugAfterSignificantCharge(true) + .build()); + long expectedResetTimeUs = 0; + + unplugBattery(); + // Battery level dropped below 20%. + dischargeToLevel(15); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(50); + unplugBattery(); + // Reset should not occur until battery level above 80 + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(85); + unplugBattery(); + // Reset should not occur because the charge session did not go from 20% to 80% + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Battery level dropped below 20%. + dischargeToLevel(15); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(85); + unplugBattery(); + // Reset should occur after significant charge amount. + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // disable reset on unplug after significant charge. + mBatteryStatsImpl.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugAfterSignificantCharge(false) + .build()); + + // Battery level dropped below 20%. + dischargeToLevel(15); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(85); + unplugBattery(); + // Reset should not occur after significant charge amount. + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + } + + @Test + public void testResetOnUnplug_manyPartialCharges() { + long expectedResetTimeUs = 0; + + unplugBattery(); + // Cumulative battery discharged: 60%. + dischargeToLevel(40); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Cumulative battery discharged: 100%. + dischargeToLevel(40); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Cumulative battery discharged: 140%. + dischargeToLevel(40); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Cumulative battery discharged: 180%. + dischargeToLevel(40); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Cumulative battery discharged: 220%. + dischargeToLevel(40); + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + chargeToLevel(80); + unplugBattery(); + // Should reset after >200% of cumulative battery discharge + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + } + + @Test + public void testResetWhilePluggedIn_longPlugIn() { + // disable high battery level reset on unplug. + mBatteryStatsImpl.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugHighBatteryLevel(false) + .setResetOnUnplugAfterSignificantCharge(false) + .build()); + long expectedResetTimeUs = 0; + + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset should still not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset 47 hour threshold crossed, reset should occur. + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset another 47 hour threshold crossed, reset should occur. + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset should not occur + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + unplugBattery(); + plugBattery(BatteryManager.BATTERY_PLUGGED_USB); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset should not occur, since unplug occurred recently. + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + + // Increment time a day + incTimeMs(24L * 60L * 60L * 1000L); + mBatteryStatsImpl.maybeResetWhilePluggedInLocked(); + // Reset another 47 hour threshold crossed, reset should occur. + expectedResetTimeUs = mMockClock.elapsedRealtime() * 1000; + assertThat(mBatteryStatsImpl.getStatsStartRealtime()).isEqualTo(expectedResetTimeUs); + } + + private void dischargeToLevel(int targetLevel) { + mBatteryStatus = BatteryManager.BATTERY_STATUS_DISCHARGING; + for (int level = mBatteryLevel - 1; level >= targetLevel; level--) { + prepareBatteryLevel(level); + incTimeMs(5000); // Arbitrary discharge rate. + updateBatteryState(); + } + } + + private void chargeToLevel(int targetLevel) { + mBatteryStatus = BatteryManager.BATTERY_STATUS_CHARGING; + for (int level = mBatteryLevel + 1; level <= targetLevel; level++) { + if (level >= 100) mBatteryStatus = BatteryManager.BATTERY_STATUS_FULL; + prepareBatteryLevel(level); + incTimeMs(BATTERY_CHARGE_RATE_SECONDS_PER_LEVEL * 1000); + updateBatteryState(); + } + } + + private void unplugBattery() { + mBatteryPlugType = 0; + updateBatteryState(); + } + + private void plugBattery(int type) { + mBatteryPlugType |= type; + updateBatteryState(); + } + + private void prepareBatteryLevel(int level) { + mBatteryLevel = level; + mBatteryChargeUah = mBatteryLevel * mBatteryChargeFullUah / 100; + mBatteryChargeTimeToFullSeconds = + (100 - mBatteryLevel) * BATTERY_CHARGE_RATE_SECONDS_PER_LEVEL; + } + + private void incTimeMs(long milliseconds) { + mMockClock.realtime += milliseconds; + mMockClock.uptime += milliseconds / 2; // Arbitrary slower uptime accumulation + mMockClock.currentTime += milliseconds; + } + + private void updateBatteryState() { + mBatteryStatsImpl.setBatteryStateLocked(mBatteryStatus, mBatteryHealth, mBatteryPlugType, + mBatteryLevel, mBatteryTemp, mBatteryVoltageMv, mBatteryChargeUah, + mBatteryChargeFullUah, mBatteryChargeTimeToFullSeconds, + mMockClock.elapsedRealtime(), mMockClock.uptimeMillis(), + mMockClock.currentTimeMillis()); + } +} + diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java index 274286135174..ae2d1afe0320 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java @@ -342,7 +342,7 @@ public class BatteryUsageStatsProviderTest { Context context = InstrumentationRegistry.getContext(); BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); mStatsRule.setCurrentTime(5 * MINUTE_IN_MS); - batteryStats.resetAllStatsCmdLocked(); + batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); BatteryUsageStatsStore batteryUsageStatsStore = new BatteryUsageStatsStore(context, batteryStats, new File(context.getCacheDir(), "BatteryUsageStatsProviderTest"), @@ -357,14 +357,14 @@ public class BatteryUsageStatsProviderTest { batteryStats.noteFlashlightOffLocked(APP_UID, 20 * MINUTE_IN_MS, 20 * MINUTE_IN_MS); mStatsRule.setCurrentTime(25 * MINUTE_IN_MS); - batteryStats.resetAllStatsCmdLocked(); + batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); batteryStats.noteFlashlightOnLocked(APP_UID, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); batteryStats.noteFlashlightOffLocked(APP_UID, 50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS); mStatsRule.setCurrentTime(55 * MINUTE_IN_MS); - batteryStats.resetAllStatsCmdLocked(); + batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); // This section should be ignored because the timestamp is out or range batteryStats.noteFlashlightOnLocked(APP_UID, @@ -372,7 +372,7 @@ public class BatteryUsageStatsProviderTest { batteryStats.noteFlashlightOffLocked(APP_UID, 70 * MINUTE_IN_MS, 70 * MINUTE_IN_MS); mStatsRule.setCurrentTime(75 * MINUTE_IN_MS); - batteryStats.resetAllStatsCmdLocked(); + batteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); // This section should be ignored because it represents the current stats session batteryStats.noteFlashlightOnLocked(APP_UID, diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java index c9729fab3b5e..11b9047fab7f 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java @@ -84,7 +84,7 @@ public class BatteryUsageStatsStoreTest { mMockClock.realtime = 1_000_000; mMockClock.uptime = 1_000_000; - mBatteryStats.resetAllStatsCmdLocked(); + mBatteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); final long[] timestamps = mBatteryUsageStatsStore.listBatteryUsageStatsTimestamps(); assertThat(timestamps).hasLength(1); @@ -114,7 +114,7 @@ public class BatteryUsageStatsStoreTest { final int numberOfSnapshots = (int) (MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES / snapshotFileSize); for (int i = 0; i < numberOfSnapshots + 2; i++) { - mBatteryStats.resetAllStatsCmdLocked(); + mBatteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); mMockClock.realtime += 10_000_000; mMockClock.uptime += 10_000_000; @@ -141,7 +141,7 @@ public class BatteryUsageStatsStoreTest { mMockClock.currentTime += 10_000_000; prepareBatteryStats(); - mBatteryStats.resetAllStatsCmdLocked(); + mBatteryStats.resetAllStatsAndHistoryLocked(BatteryStatsImpl.RESET_REASON_ADB_COMMAND); } assertThat(getDirectorySize(mStoreDirectory)).isNotEqualTo(0); diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index 0f4521951e3d..c7c94246b96a 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -49,6 +49,7 @@ filegroup { "src/com/android/wm/shell/animation/Interpolators.java", "src/com/android/wm/shell/pip/PipContentOverlay.java", "src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java", + "src/com/android/wm/shell/draganddrop/DragAndDropConstants.java", ], path: "src", } diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml deleted file mode 100644 index 0d8811357c05..000000000000 --- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2022 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. - --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="@color/letterbox_education_accent_primary"/> - <corners android:radius="12dp"/> -</shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml index 42572d64b96f..a2699681e656 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml @@ -14,7 +14,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/letterbox_education_dismiss_button_background_ripple"> - <item android:drawable="@drawable/letterbox_education_dismiss_button_background"/> -</ripple>
\ No newline at end of file +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetTop="@dimen/letterbox_education_dialog_vertical_inset" + android:insetBottom="@dimen/letterbox_education_dialog_vertical_inset"> + <ripple android:color="@color/letterbox_education_dismiss_button_background_ripple"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/letterbox_education_dialog_button_radius"/> + <solid android:color="@android:color/white"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="@android:color/transparent"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="@color/letterbox_education_accent_primary"/> + <corners android:radius="@dimen/letterbox_education_dialog_button_radius"/> + <padding android:left="@dimen/letterbox_education_dialog_horizontal_padding" + android:top="@dimen/letterbox_education_dialog_vertical_padding" + android:right="@dimen/letterbox_education_dialog_horizontal_padding" + android:bottom="@dimen/letterbox_education_dialog_vertical_padding"/> + </shape> + </item> + </ripple> +</inset> diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background.xml deleted file mode 100644 index 60f3cfe6dde6..000000000000 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2023 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. - --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - android:shape="rectangle"> - <solid android:color="?androidprv:attr/colorAccentPrimaryVariant"/> - <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> -</shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml index ef97ea19e993..1f125148775d 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_button_background_ripple.xml @@ -14,7 +14,31 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/letterbox_restart_button_background_ripple"> - <item android:drawable="@drawable/letterbox_restart_button_background"/> -</ripple>
\ No newline at end of file +<inset xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" + android:insetTop="@dimen/letterbox_restart_dialog_vertical_inset" + android:insetBottom="@dimen/letterbox_restart_dialog_vertical_inset"> + <ripple android:color="@color/letterbox_restart_dismiss_button_background_ripple"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> + <solid android:color="@android:color/white"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="@android:color/transparent"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="?androidprv:attr/colorAccentPrimaryVariant"/> + <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> + <padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding" + android:top="@dimen/letterbox_restart_dialog_vertical_padding" + android:right="@dimen/letterbox_restart_dialog_horizontal_padding" + android:bottom="@dimen/letterbox_restart_dialog_vertical_padding"/> + </shape> + </item> + </ripple> +</inset>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background.xml deleted file mode 100644 index af89d41ee6b5..000000000000 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2023 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. - --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - android:shape="rectangle"> - <stroke android:color="?androidprv:attr/colorAccentPrimaryVariant" android:width="1dp"/> - <solid android:color="?androidprv:attr/colorSurface" /> - <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> -</shape>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml index e32aefca78ac..3aa0981e45aa 100644 --- a/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml +++ b/libs/WindowManager/Shell/res/drawable/letterbox_restart_dismiss_button_background_ripple.xml @@ -14,7 +14,33 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/letterbox_restart_dismiss_button_background_ripple"> - <item android:drawable="@drawable/letterbox_restart_dismiss_button_background"/> -</ripple>
\ No newline at end of file +<inset xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" + android:insetTop="@dimen/letterbox_restart_dialog_vertical_inset" + android:insetBottom="@dimen/letterbox_restart_dialog_vertical_inset"> + <ripple android:color="@color/letterbox_restart_dismiss_button_background_ripple"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> + <solid android:color="@android:color/white"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="@android:color/transparent"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <stroke android:color="?androidprv:attr/colorAccentPrimaryVariant" + android:width="1dp"/> + <solid android:color="?androidprv:attr/colorSurface"/> + <corners android:radius="@dimen/letterbox_restart_dialog_button_radius"/> + <padding android:left="@dimen/letterbox_restart_dialog_horizontal_padding" + android:top="@dimen/letterbox_restart_dialog_vertical_padding" + android:right="@dimen/letterbox_restart_dialog_horizontal_padding" + android:bottom="@dimen/letterbox_restart_dialog_vertical_padding"/> + </shape> + </item> + </ripple> +</inset>
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml index 44b2f45052ba..3d3c00381164 100644 --- a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml +++ b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml @@ -29,11 +29,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:lineSpacingExtra="4sp" + android:letterSpacing="0.02" android:background="@drawable/compat_hint_bubble" android:padding="16dp" android:textAlignment="viewStart" android:textColor="@color/compat_controls_text" - android:textSize="14sp"/> + android:textSize="14sp" + android:fontFamily="@*android:string/config_bodyFontFamily" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" + /> <ImageView android:layout_width="wrap_content" diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml index c65f24d84e37..095576b581df 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_action_layout.xml @@ -29,6 +29,8 @@ android:layout_marginBottom="20dp"/> <TextView + android:fontFamily="@*android:string/config_bodyFontFamily" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2" android:id="@+id/letterbox_education_dialog_action_text" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml index 3a44eb9089dd..e8edad15dfc3 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml @@ -69,6 +69,8 @@ android:text="@string/letterbox_education_dialog_title" android:textAlignment="center" android:textColor="@color/compat_controls_text" + android:fontFamily="@*android:string/config_bodyFontFamilyMedium" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Headline" android:textSize="24sp"/> <LinearLayout @@ -95,10 +97,16 @@ </LinearLayout> <Button + android:fontFamily="@*android:string/config_bodyFontFamily" + android:fontWeight="500" + android:lineHeight="20dp" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Small" android:id="@+id/letterbox_education_dialog_dismiss_button" + android:textStyle="bold" android:layout_width="match_parent" android:layout_height="56dp" android:layout_marginTop="40dp" + android:textSize="14sp" android:background= "@drawable/letterbox_education_dismiss_button_background_ripple" android:text="@string/letterbox_education_got_it" diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index 22d921960174..0a5134ed2e59 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Maak toe"</string> <string name="back_button_text" msgid="1469718707134137085">"Terug"</string> <string name="handle_text" msgid="1766582106752184456">"Handvatsel"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Appikoon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Volskerm"</string> <string name="desktop_text" msgid="1077633567027630454">"Rekenaarmodus"</string> <string name="split_screen_text" msgid="1396336058129570886">"Verdeelde skerm"</string> <string name="more_button_text" msgid="3655388105592893530">"Meer"</string> <string name="float_button_text" msgid="9221657008391364581">"Sweef"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Kies"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skermskoot"</string> + <string name="close_text" msgid="4986518933445178928">"Maak toe"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Maak kieslys toe"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index 17ea0530de52..6734195b74fe 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ዝጋ"</string> <string name="back_button_text" msgid="1469718707134137085">"ተመለስ"</string> <string name="handle_text" msgid="1766582106752184456">"መያዣ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"የመተግበሪያ አዶ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ሙሉ ማያ"</string> <string name="desktop_text" msgid="1077633567027630454">"የዴስክቶፕ ሁነታ"</string> <string name="split_screen_text" msgid="1396336058129570886">"የተከፈለ ማያ ገጽ"</string> <string name="more_button_text" msgid="3655388105592893530">"ተጨማሪ"</string> <string name="float_button_text" msgid="9221657008391364581">"ተንሳፋፊ"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ምረጥ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገጽ እይታ"</string> + <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 2e4c8ef29862..6bef71a11ad9 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -47,14 +47,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ضبط حجم النافذة العلوية ليكون ٥٠%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ضبط حجم النافذة العلوية ليكون ٣٠%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"عرض النافذة السفلية بملء الشاشة"</string> - <!-- no translation found for accessibility_split_left (1713683765575562458) --> - <skip /> - <!-- no translation found for accessibility_split_right (8441001008181296837) --> - <skip /> - <!-- no translation found for accessibility_split_top (2789329702027147146) --> - <skip /> - <!-- no translation found for accessibility_split_bottom (8694551025220868191) --> - <skip /> + <string name="accessibility_split_left" msgid="1713683765575562458">"تقسيم لليسار"</string> + <string name="accessibility_split_right" msgid="8441001008181296837">"تقسيم لليمين"</string> + <string name="accessibility_split_top" msgid="2789329702027147146">"تقسيم للأعلى"</string> + <string name="accessibility_split_bottom" msgid="8694551025220868191">"تقسيم للأسفل"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"استخدام وضع \"التصفح بيد واحدة\""</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"للخروج، مرِّر سريعًا من أسفل الشاشة إلى أعلاها أو انقر في أي مكان فوق التطبيق."</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"بدء وضع \"التصفح بيد واحدة\""</string> @@ -100,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"إغلاق"</string> <string name="back_button_text" msgid="1469718707134137085">"رجوع"</string> <string name="handle_text" msgid="1766582106752184456">"مقبض"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"رمز التطبيق"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ملء الشاشة"</string> <string name="desktop_text" msgid="1077633567027630454">"وضع سطح المكتب"</string> <string name="split_screen_text" msgid="1396336058129570886">"تقسيم الشاشة"</string> <string name="more_button_text" msgid="3655388105592893530">"المزيد"</string> <string name="float_button_text" msgid="9221657008391364581">"نافذة عائمة"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"اختيار"</string> + <string name="screenshot_text" msgid="1477704010087786671">"لقطة شاشة"</string> + <string name="close_text" msgid="4986518933445178928">"إغلاق"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index c88519736ad6..48b93ceac087 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"বন্ধ কৰক"</string> <string name="back_button_text" msgid="1469718707134137085">"উভতি যাওক"</string> <string name="handle_text" msgid="1766582106752184456">"হেণ্ডেল"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"এপৰ চিহ্ন"</string> <string name="fullscreen_text" msgid="1162316685217676079">"সম্পূৰ্ণ স্ক্ৰীন"</string> <string name="desktop_text" msgid="1077633567027630454">"ডেস্কটপ ম’ড"</string> <string name="split_screen_text" msgid="1396336058129570886">"বিভাজিত স্ক্ৰীন"</string> <string name="more_button_text" msgid="3655388105592893530">"অধিক"</string> <string name="float_button_text" msgid="9221657008391364581">"ওপঙা"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"বাছনি কৰক"</string> + <string name="screenshot_text" msgid="1477704010087786671">"স্ক্ৰীনশ্বট"</string> + <string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 4427fa94c8fc..8233dd3a1605 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Bağlayın"</string> <string name="back_button_text" msgid="1469718707134137085">"Geriyə"</string> <string name="handle_text" msgid="1766582106752184456">"Hər kəsə açıq istifadəçi adı"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Tətbiq ikonası"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Tam Ekran"</string> <string name="desktop_text" msgid="1077633567027630454">"Masaüstü Rejimi"</string> <string name="split_screen_text" msgid="1396336058129570886">"Bölünmüş Ekran"</string> <string name="more_button_text" msgid="3655388105592893530">"Ardı"</string> <string name="float_button_text" msgid="9221657008391364581">"Üzən pəncərə"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seçin"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skrinşot"</string> + <string name="close_text" msgid="4986518933445178928">"Bağlayın"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menyunu bağlayın"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index a67ba393180e..34c42a98564f 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Zatvorite"</string> <string name="back_button_text" msgid="1469718707134137085">"Nazad"</string> <string name="handle_text" msgid="1766582106752184456">"Identifikator"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona aplikacije"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Preko celog ekrana"</string> <string name="desktop_text" msgid="1077633567027630454">"Režim za računare"</string> <string name="split_screen_text" msgid="1396336058129570886">"Podeljeni ekran"</string> <string name="more_button_text" msgid="3655388105592893530">"Još"</string> <string name="float_button_text" msgid="9221657008391364581">"Plutajuće"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Izaberite"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string> + <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index 5adb2ecec112..4f21e7319f48 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Закрыць"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Маркер"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Значок праграмы"</string> <string name="fullscreen_text" msgid="1162316685217676079">"На ўвесь экран"</string> <string name="desktop_text" msgid="1077633567027630454">"Рэжым працоўнага стала"</string> <string name="split_screen_text" msgid="1396336058129570886">"Падзяліць экран"</string> <string name="more_button_text" msgid="3655388105592893530">"Яшчэ"</string> <string name="float_button_text" msgid="9221657008391364581">"Зрабіць рухомым акном"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Выбраць"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Здымак экрана"</string> + <string name="close_text" msgid="4986518933445178928">"Закрыць"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index 8c82d1a7c94f..94146494ba0b 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Затваряне"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Манипулатор"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Икона на приложението"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Цял екран"</string> <string name="desktop_text" msgid="1077633567027630454">"Режим за настолни компютри"</string> <string name="split_screen_text" msgid="1396336058129570886">"Разделяне на екрана"</string> <string name="more_button_text" msgid="3655388105592893530">"Още"</string> <string name="float_button_text" msgid="9221657008391364581">"Плаващо"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Избиране"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Екранна снимка"</string> + <string name="close_text" msgid="4986518933445178928">"Затваряне"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 11a4175c0bb0..1718b51bb058 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -47,14 +47,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ ৫০%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ ৩০%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"নীচের অংশ নিয়ে পূর্ণ স্ক্রিন"</string> - <!-- no translation found for accessibility_split_left (1713683765575562458) --> - <skip /> - <!-- no translation found for accessibility_split_right (8441001008181296837) --> - <skip /> - <!-- no translation found for accessibility_split_top (2789329702027147146) --> - <skip /> - <!-- no translation found for accessibility_split_bottom (8694551025220868191) --> - <skip /> + <string name="accessibility_split_left" msgid="1713683765575562458">"স্ক্রিনের বাঁদিকে স্প্লিট করুন"</string> + <string name="accessibility_split_right" msgid="8441001008181296837">"স্ক্রিনের ডানদিকে স্প্লিট করুন"</string> + <string name="accessibility_split_top" msgid="2789329702027147146">"স্ক্রিনের উপরের দিকে স্প্লিট করুন"</string> + <string name="accessibility_split_bottom" msgid="8694551025220868191">"স্প্লিট করার বোতাম"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"\'এক হাতে ব্যবহার করার মোড\'-এর ব্যবহার"</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"বেরিয়ে আসার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন অথবা অ্যাপ আইকনের উপরে যেকোনও জায়গায় ট্যাপ করুন"</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"\'এক হাতে ব্যবহার করার মোড\' শুরু করুন"</string> @@ -100,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"বন্ধ করুন"</string> <string name="back_button_text" msgid="1469718707134137085">"ফিরে যান"</string> <string name="handle_text" msgid="1766582106752184456">"হাতল"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"অ্যাপ আইকন"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ফুলস্ক্রিন"</string> <string name="desktop_text" msgid="1077633567027630454">"ডেস্কটপ মোড"</string> <string name="split_screen_text" msgid="1396336058129570886">"স্প্লিট স্ক্রিন"</string> <string name="more_button_text" msgid="3655388105592893530">"আরও"</string> <string name="float_button_text" msgid="9221657008391364581">"ফ্লোট"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"বেছে নিন"</string> + <string name="screenshot_text" msgid="1477704010087786671">"স্ক্রিনশট"</string> + <string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index c65ce0842db7..440cfad9f988 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -102,8 +102,8 @@ <string name="split_screen_text" msgid="1396336058129570886">"Podijeljeni ekran"</string> <string name="more_button_text" msgid="3655388105592893530">"Više"</string> <string name="float_button_text" msgid="9221657008391364581">"Lebdeći"</string> - <string name="select_text" msgid="5139083974039906583">"Odaberite"</string> - <string name="screenshot_text" msgid="1477704010087786671">"Snimka zaslona"</string> - <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string> - <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite izbornik"</string> + <string name="select_text" msgid="5139083974039906583">"Odabir"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string> + <string name="close_text" msgid="4986518933445178928">"Zatvaranje"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvaranje menija"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index f50b8f295a32..a19706a61108 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Tanca"</string> <string name="back_button_text" msgid="1469718707134137085">"Enrere"</string> <string name="handle_text" msgid="1766582106752184456">"Ansa"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icona de l\'aplicació"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pantalla completa"</string> <string name="desktop_text" msgid="1077633567027630454">"Mode d\'escriptori"</string> <string name="split_screen_text" msgid="1396336058129570886">"Pantalla dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Més"</string> <string name="float_button_text" msgid="9221657008391364581">"Flotant"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Selecciona"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> + <string name="close_text" msgid="4986518933445178928">"Tanca"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Tanca el menú"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index ac36edbb2f6e..684a6ff2b078 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Zavřít"</string> <string name="back_button_text" msgid="1469718707134137085">"Zpět"</string> <string name="handle_text" msgid="1766582106752184456">"Úchyt"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona aplikace"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Celá obrazovka"</string> <string name="desktop_text" msgid="1077633567027630454">"Režim počítače"</string> <string name="split_screen_text" msgid="1396336058129570886">"Rozdělená obrazovka"</string> <string name="more_button_text" msgid="3655388105592893530">"Více"</string> <string name="float_button_text" msgid="9221657008391364581">"Plovoucí"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Vybrat"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Snímek obrazovky"</string> + <string name="close_text" msgid="4986518933445178928">"Zavřít"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index 8635cc5d4632..140610db8c2f 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Luk"</string> <string name="back_button_text" msgid="1469718707134137085">"Tilbage"</string> <string name="handle_text" msgid="1766582106752184456">"Håndtag"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Appikon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Fuld skærm"</string> <string name="desktop_text" msgid="1077633567027630454">"Computertilstand"</string> <string name="split_screen_text" msgid="1396336058129570886">"Opdelt skærm"</string> <string name="more_button_text" msgid="3655388105592893530">"Mere"</string> <string name="float_button_text" msgid="9221657008391364581">"Svævende"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Vælg"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Luk"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Luk menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index 059a4da313fe..cd1213d25e4e 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Schließen"</string> <string name="back_button_text" msgid="1469718707134137085">"Zurück"</string> <string name="handle_text" msgid="1766582106752184456">"Ziehpunkt"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"App-Symbol"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Vollbild"</string> <string name="desktop_text" msgid="1077633567027630454">"Desktopmodus"</string> <string name="split_screen_text" msgid="1396336058129570886">"Geteilter Bildschirm"</string> <string name="more_button_text" msgid="3655388105592893530">"Mehr"</string> <string name="float_button_text" msgid="9221657008391364581">"Frei schwebend"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Auswählen"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Schließen"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menü schließen"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index 5800cc826ef2..2e6b912e1ab1 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Κλείσιμο"</string> <string name="back_button_text" msgid="1469718707134137085">"Πίσω"</string> <string name="handle_text" msgid="1766582106752184456">"Λαβή"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Εικονίδιο εφαρμογής"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Πλήρης οθόνη"</string> <string name="desktop_text" msgid="1077633567027630454">"Λειτουργία επιφάνειας εργασίας"</string> <string name="split_screen_text" msgid="1396336058129570886">"Διαχωρισμός οθόνης"</string> <string name="more_button_text" msgid="3655388105592893530">"Περισσότερα"</string> <string name="float_button_text" msgid="9221657008391364581">"Κινούμενο"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Επιλογή"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Στιγμιότυπο οθόνης"</string> + <string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index d30653759f2f..f1357d8c066d 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Cerrar"</string> <string name="back_button_text" msgid="1469718707134137085">"Atrás"</string> <string name="handle_text" msgid="1766582106752184456">"Controlador"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ícono de la app"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pantalla completa"</string> <string name="desktop_text" msgid="1077633567027630454">"Modo de escritorio"</string> <string name="split_screen_text" msgid="1396336058129570886">"Pantalla dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Más"</string> <string name="float_button_text" msgid="9221657008391364581">"Flotante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seleccionar"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> + <string name="close_text" msgid="4986518933445178928">"Cerrar"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index ab1ced4f6d1e..9aa3d60db440 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Cerrar"</string> <string name="back_button_text" msgid="1469718707134137085">"Atrás"</string> <string name="handle_text" msgid="1766582106752184456">"Controlador"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icono de la aplicación"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pantalla completa"</string> <string name="desktop_text" msgid="1077633567027630454">"Modo Escritorio"</string> <string name="split_screen_text" msgid="1396336058129570886">"Pantalla dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Más"</string> <string name="float_button_text" msgid="9221657008391364581">"Flotante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seleccionar"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> + <string name="close_text" msgid="4986518933445178928">"Cerrar"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 4c4d87ebf574..1e13283132d3 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Sule"</string> <string name="back_button_text" msgid="1469718707134137085">"Tagasi"</string> <string name="handle_text" msgid="1766582106752184456">"Käepide"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Rakenduse ikoon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Täisekraan"</string> <string name="desktop_text" msgid="1077633567027630454">"Lauaarvuti režiim"</string> <string name="split_screen_text" msgid="1396336058129570886">"Jagatud ekraanikuva"</string> <string name="more_button_text" msgid="3655388105592893530">"Rohkem"</string> <string name="float_button_text" msgid="9221657008391364581">"Hõljuv"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Vali"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Ekraanipilt"</string> + <string name="close_text" msgid="4986518933445178928">"Sule"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Sule menüü"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 5642a5f33115..72e94dc2dc6e 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Itxi"</string> <string name="back_button_text" msgid="1469718707134137085">"Atzera"</string> <string name="handle_text" msgid="1766582106752184456">"Kontu-izena"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Aplikazioaren ikonoa"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pantaila osoa"</string> <string name="desktop_text" msgid="1077633567027630454">"Ordenagailuetarako modua"</string> <string name="split_screen_text" msgid="1396336058129570886">"Pantaila zatitua"</string> <string name="more_button_text" msgid="3655388105592893530">"Gehiago"</string> <string name="float_button_text" msgid="9221657008391364581">"Leiho gainerakorra"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Hautatu"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Pantaila-argazkia"</string> + <string name="close_text" msgid="4986518933445178928">"Itxi"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Itxi menua"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index a15d7a4e1c1f..1cc5faaedb0e 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"بستن"</string> <string name="back_button_text" msgid="1469718707134137085">"برگشتن"</string> <string name="handle_text" msgid="1766582106752184456">"دستگیره"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"نماد برنامه"</string> <string name="fullscreen_text" msgid="1162316685217676079">"تمامصفحه"</string> <string name="desktop_text" msgid="1077633567027630454">"حالت رایانه"</string> <string name="split_screen_text" msgid="1396336058129570886">"صفحهٔ دونیمه"</string> <string name="more_button_text" msgid="3655388105592893530">"بیشتر"</string> <string name="float_button_text" msgid="9221657008391364581">"شناور"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"انتخاب"</string> + <string name="screenshot_text" msgid="1477704010087786671">"نماگرفت"</string> + <string name="close_text" msgid="4986518933445178928">"بستن"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 8c679b6b6ff7..ee6f995dd19a 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Sulje"</string> <string name="back_button_text" msgid="1469718707134137085">"Takaisin"</string> <string name="handle_text" msgid="1766582106752184456">"Kahva"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Sovelluskuvake"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Koko näyttö"</string> <string name="desktop_text" msgid="1077633567027630454">"Työpöytätila"</string> <string name="split_screen_text" msgid="1396336058129570886">"Jaettu näyttö"</string> <string name="more_button_text" msgid="3655388105592893530">"Lisää"</string> <string name="float_button_text" msgid="9221657008391364581">"Kelluva ikkuna"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Valitse"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Kuvakaappaus"</string> + <string name="close_text" msgid="4986518933445178928">"Sulje"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Sulje valikko"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index d43aea5849d1..283876c0e55b 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Fermer"</string> <string name="back_button_text" msgid="1469718707134137085">"Retour"</string> <string name="handle_text" msgid="1766582106752184456">"Identifiant"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icône de l\'application"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Plein écran"</string> <string name="desktop_text" msgid="1077633567027630454">"Mode Bureau"</string> <string name="split_screen_text" msgid="1396336058129570886">"Écran partagé"</string> <string name="more_button_text" msgid="3655388105592893530">"Plus"</string> <string name="float_button_text" msgid="9221657008391364581">"Flottant"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Sélectionner"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string> + <string name="close_text" msgid="4986518933445178928">"Fermer"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index 15e89f81682e..4e80360a1e34 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Fermer"</string> <string name="back_button_text" msgid="1469718707134137085">"Retour"</string> <string name="handle_text" msgid="1766582106752184456">"Poignée"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icône d\'application"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Plein écran"</string> <string name="desktop_text" msgid="1077633567027630454">"Mode ordinateur"</string> <string name="split_screen_text" msgid="1396336058129570886">"Écran partagé"</string> <string name="more_button_text" msgid="3655388105592893530">"Plus"</string> <string name="float_button_text" msgid="9221657008391364581">"Flottante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Sélectionner"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string> + <string name="close_text" msgid="4986518933445178928">"Fermer"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index f83564d05f44..974a687717d7 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Pechar"</string> <string name="back_button_text" msgid="1469718707134137085">"Atrás"</string> <string name="handle_text" msgid="1766582106752184456">"Controlador"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icona de aplicación"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pantalla completa"</string> <string name="desktop_text" msgid="1077633567027630454">"Modo de escritorio"</string> <string name="split_screen_text" msgid="1396336058129570886">"Pantalla dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Máis"</string> <string name="float_button_text" msgid="9221657008391364581">"Flotante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seleccionar"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> + <string name="close_text" msgid="4986518933445178928">"Pechar"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Pechar o menú"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index bd3620591cf7..be8a9ff9b4ec 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"બંધ કરો"</string> <string name="back_button_text" msgid="1469718707134137085">"પાછળ"</string> <string name="handle_text" msgid="1766582106752184456">"હૅન્ડલ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ઍપનું આઇકન"</string> <string name="fullscreen_text" msgid="1162316685217676079">"પૂર્ણસ્ક્રીન"</string> <string name="desktop_text" msgid="1077633567027630454">"ડેસ્કટૉપ મોડ"</string> <string name="split_screen_text" msgid="1396336058129570886">"સ્ક્રીનને વિભાજિત કરો"</string> <string name="more_button_text" msgid="3655388105592893530">"વધુ"</string> <string name="float_button_text" msgid="9221657008391364581">"ફ્લોટિંગ વિન્ડો"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"પસંદ કરો"</string> + <string name="screenshot_text" msgid="1477704010087786671">"સ્ક્રીનશૉટ"</string> + <string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index e56ad17d2680..120ecc92e777 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"बंद करें"</string> <string name="back_button_text" msgid="1469718707134137085">"वापस जाएं"</string> <string name="handle_text" msgid="1766582106752184456">"हैंडल"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ऐप्लिकेशन आइकॉन"</string> <string name="fullscreen_text" msgid="1162316685217676079">"फ़ुलस्क्रीन"</string> <string name="desktop_text" msgid="1077633567027630454">"डेस्कटॉप मोड"</string> <string name="split_screen_text" msgid="1396336058129570886">"स्प्लिट स्क्रीन मोड"</string> <string name="more_button_text" msgid="3655388105592893530">"ज़्यादा देखें"</string> <string name="float_button_text" msgid="9221657008391364581">"फ़्लोट"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"चुनें"</string> + <string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string> + <string name="close_text" msgid="4986518933445178928">"बंद करें"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index 28536e67952f..7edd9151f660 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Bezárás"</string> <string name="back_button_text" msgid="1469718707134137085">"Vissza"</string> <string name="handle_text" msgid="1766582106752184456">"Fogópont"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Alkalmazásikon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Teljes képernyő"</string> <string name="desktop_text" msgid="1077633567027630454">"Asztali üzemmód"</string> <string name="split_screen_text" msgid="1396336058129570886">"Osztott képernyő"</string> <string name="more_button_text" msgid="3655388105592893530">"Továbbiak"</string> <string name="float_button_text" msgid="9221657008391364581">"Lebegő"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Kiválasztás"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Képernyőkép"</string> + <string name="close_text" msgid="4986518933445178928">"Bezárás"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index bd3508482f7c..94950a0d3e74 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Փակել"</string> <string name="back_button_text" msgid="1469718707134137085">"Հետ"</string> <string name="handle_text" msgid="1766582106752184456">"Նշիչ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Հավելվածի պատկերակ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Լիաէկրան"</string> <string name="desktop_text" msgid="1077633567027630454">"Համակարգչի ռեժիմ"</string> <string name="split_screen_text" msgid="1396336058129570886">"Տրոհված էկրան"</string> <string name="more_button_text" msgid="3655388105592893530">"Ավելին"</string> <string name="float_button_text" msgid="9221657008391364581">"Լողացող պատուհան"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Ընտրել"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Սքրինշոթ"</string> + <string name="close_text" msgid="4986518933445178928">"Փակել"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index 6f859ed8ef29..890b86ac71e1 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Tutup"</string> <string name="back_button_text" msgid="1469718707134137085">"Kembali"</string> <string name="handle_text" msgid="1766582106752184456">"Tuas"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikon Aplikasi"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Layar Penuh"</string> <string name="desktop_text" msgid="1077633567027630454">"Mode Desktop"</string> <string name="split_screen_text" msgid="1396336058129570886">"Layar Terpisah"</string> <string name="more_button_text" msgid="3655388105592893530">"Lainnya"</string> <string name="float_button_text" msgid="9221657008391364581">"Mengambang"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Pilih"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Tutup"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index b17abf593cd7..f4a9a57b293e 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Loka"</string> <string name="back_button_text" msgid="1469718707134137085">"Til baka"</string> <string name="handle_text" msgid="1766582106752184456">"Handfang"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Tákn forrits"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Allur skjárinn"</string> <string name="desktop_text" msgid="1077633567027630454">"Skjáborðsstilling"</string> <string name="split_screen_text" msgid="1396336058129570886">"Skjáskipting"</string> <string name="more_button_text" msgid="3655388105592893530">"Meira"</string> <string name="float_button_text" msgid="9221657008391364581">"Reikult"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Velja"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skjámynd"</string> + <string name="close_text" msgid="4986518933445178928">"Loka"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Loka valmynd"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 28e274bce7d6..4647e9a48630 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Chiudi"</string> <string name="back_button_text" msgid="1469718707134137085">"Indietro"</string> <string name="handle_text" msgid="1766582106752184456">"Handle"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icona dell\'app"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Schermo intero"</string> <string name="desktop_text" msgid="1077633567027630454">"Modalità desktop"</string> <string name="split_screen_text" msgid="1396336058129570886">"Schermo diviso"</string> <string name="more_button_text" msgid="3655388105592893530">"Altro"</string> <string name="float_button_text" msgid="9221657008391364581">"Mobile"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seleziona"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Chiudi"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Chiudi il menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index 497e0b0c7884..5dd99d087551 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"סגירה"</string> <string name="back_button_text" msgid="1469718707134137085">"חזרה"</string> <string name="handle_text" msgid="1766582106752184456">"נקודת אחיזה"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"סמל האפליקציה"</string> <string name="fullscreen_text" msgid="1162316685217676079">"מסך מלא"</string> <string name="desktop_text" msgid="1077633567027630454">"ממשק המחשב"</string> <string name="split_screen_text" msgid="1396336058129570886">"מסך מפוצל"</string> <string name="more_button_text" msgid="3655388105592893530">"עוד"</string> <string name="float_button_text" msgid="9221657008391364581">"בלונים"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"בחירה"</string> + <string name="screenshot_text" msgid="1477704010087786671">"צילום מסך"</string> + <string name="close_text" msgid="4986518933445178928">"סגירה"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 7f7cd940619d..bde3eb1c8d44 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"閉じる"</string> <string name="back_button_text" msgid="1469718707134137085">"戻る"</string> <string name="handle_text" msgid="1766582106752184456">"ハンドル"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"アプリのアイコン"</string> <string name="fullscreen_text" msgid="1162316685217676079">"全画面表示"</string> <string name="desktop_text" msgid="1077633567027630454">"デスクトップ モード"</string> <string name="split_screen_text" msgid="1396336058129570886">"分割画面"</string> <string name="more_button_text" msgid="3655388105592893530">"その他"</string> <string name="float_button_text" msgid="9221657008391364581">"フローティング"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"選択"</string> + <string name="screenshot_text" msgid="1477704010087786671">"スクリーンショット"</string> + <string name="close_text" msgid="4986518933445178928">"閉じる"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index deec26db2a8d..a455c74cbae0 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"დახურვა"</string> <string name="back_button_text" msgid="1469718707134137085">"უკან"</string> <string name="handle_text" msgid="1766582106752184456">"იდენტიფიკატორი"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"აპის ხატულა"</string> <string name="fullscreen_text" msgid="1162316685217676079">"სრულ ეკრანზე"</string> <string name="desktop_text" msgid="1077633567027630454">"დესკტოპის რეჟიმი"</string> <string name="split_screen_text" msgid="1396336058129570886">"ეკრანის გაყოფა"</string> <string name="more_button_text" msgid="3655388105592893530">"სხვა"</string> <string name="float_button_text" msgid="9221657008391364581">"ფარფატი"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"არჩევა"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ეკრანის ანაბეჭდი"</string> + <string name="close_text" msgid="4986518933445178928">"დახურვა"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index d429ba95df18..16189e0a76f9 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Жабу"</string> <string name="back_button_text" msgid="1469718707134137085">"Артқа"</string> <string name="handle_text" msgid="1766582106752184456">"Идентификатор"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Қолданба белгішесі"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Толық экран"</string> <string name="desktop_text" msgid="1077633567027630454">"Компьютер режимі"</string> <string name="split_screen_text" msgid="1396336058129570886">"Экранды бөлу"</string> <string name="more_button_text" msgid="3655388105592893530">"Қосымша"</string> <string name="float_button_text" msgid="9221657008391364581">"Қалқыма"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Таңдау"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string> + <string name="close_text" msgid="4986518933445178928">"Жабу"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index bfcf40bad5ef..70bcdbf07533 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"បិទ"</string> <string name="back_button_text" msgid="1469718707134137085">"ថយក្រោយ"</string> <string name="handle_text" msgid="1766582106752184456">"ឈ្មោះអ្នកប្រើប្រាស់"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"រូបកម្មវិធី"</string> <string name="fullscreen_text" msgid="1162316685217676079">"អេក្រង់ពេញ"</string> <string name="desktop_text" msgid="1077633567027630454">"មុខងារកុំព្យូទ័រ"</string> <string name="split_screen_text" msgid="1396336058129570886">"មុខងារបំបែកអេក្រង់"</string> <string name="more_button_text" msgid="3655388105592893530">"ច្រើនទៀត"</string> <string name="float_button_text" msgid="9221657008391364581">"អណ្ដែត"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ជ្រើសរើស"</string> + <string name="screenshot_text" msgid="1477704010087786671">"រូបថតអេក្រង់"</string> + <string name="close_text" msgid="4986518933445178928">"បិទ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"បិទម៉ឺនុយ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 9d2515c396eb..86cc71c1b41e 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ಮುಚ್ಚಿರಿ"</string> <string name="back_button_text" msgid="1469718707134137085">"ಹಿಂದಕ್ಕೆ"</string> <string name="handle_text" msgid="1766582106752184456">"ಹ್ಯಾಂಡಲ್"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ಆ್ಯಪ್ ಐಕಾನ್"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ಫುಲ್ಸ್ಕ್ರೀನ್"</string> <string name="desktop_text" msgid="1077633567027630454">"ಡೆಸ್ಕ್ಟಾಪ್ ಮೋಡ್"</string> <string name="split_screen_text" msgid="1396336058129570886">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್"</string> <string name="more_button_text" msgid="3655388105592893530">"ಇನ್ನಷ್ಟು"</string> <string name="float_button_text" msgid="9221657008391364581">"ಫ್ಲೋಟ್"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> + <string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index 55007fc3de0a..d9711e512774 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"닫기"</string> <string name="back_button_text" msgid="1469718707134137085">"뒤로"</string> <string name="handle_text" msgid="1766582106752184456">"핸들"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"앱 아이콘"</string> <string name="fullscreen_text" msgid="1162316685217676079">"전체 화면"</string> <string name="desktop_text" msgid="1077633567027630454">"데스크톱 모드"</string> <string name="split_screen_text" msgid="1396336058129570886">"화면 분할"</string> <string name="more_button_text" msgid="3655388105592893530">"더보기"</string> <string name="float_button_text" msgid="9221657008391364581">"플로팅"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"선택"</string> + <string name="screenshot_text" msgid="1477704010087786671">"스크린샷"</string> + <string name="close_text" msgid="4986518933445178928">"닫기"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index 9691dbae4bbc..391c3afe57e4 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Жабуу"</string> <string name="back_button_text" msgid="1469718707134137085">"Артка"</string> <string name="handle_text" msgid="1766582106752184456">"Маркер"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Колдонмонун сүрөтчөсү"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Толук экран"</string> <string name="desktop_text" msgid="1077633567027630454">"Компьютер режими"</string> <string name="split_screen_text" msgid="1396336058129570886">"Экранды бөлүү"</string> <string name="more_button_text" msgid="3655388105592893530">"Дагы"</string> <string name="float_button_text" msgid="9221657008391364581">"Калкыма"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Тандоо"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string> + <string name="close_text" msgid="4986518933445178928">"Жабуу"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 678e0859272a..bc1ac739c99a 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ປິດ"</string> <string name="back_button_text" msgid="1469718707134137085">"ກັບຄືນ"</string> <string name="handle_text" msgid="1766582106752184456">"ມືບັງຄັບ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ໄອຄອນແອັບ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ເຕັມຈໍ"</string> <string name="desktop_text" msgid="1077633567027630454">"ໂໝດເດັສທັອບ"</string> <string name="split_screen_text" msgid="1396336058129570886">"ແບ່ງໜ້າຈໍ"</string> <string name="more_button_text" msgid="3655388105592893530">"ເພີ່ມເຕີມ"</string> <string name="float_button_text" msgid="9221657008391364581">"ລອຍ"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ເລືອກ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ຮູບໜ້າຈໍ"</string> + <string name="close_text" msgid="4986518933445178928">"ປິດ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index f8a2a0fc0671..6dc5b444437a 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Uždaryti"</string> <string name="back_button_text" msgid="1469718707134137085">"Atgal"</string> <string name="handle_text" msgid="1766582106752184456">"Rankenėlė"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Programos piktograma"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Visas ekranas"</string> <string name="desktop_text" msgid="1077633567027630454">"Stalinio kompiuterio režimas"</string> <string name="split_screen_text" msgid="1396336058129570886">"Išskaidyto ekrano režimas"</string> <string name="more_button_text" msgid="3655388105592893530">"Daugiau"</string> <string name="float_button_text" msgid="9221657008391364581">"Slankusis langas"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Pasirinkti"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Ekrano kopija"</string> + <string name="close_text" msgid="4986518933445178928">"Uždaryti"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index d14bb67936d3..76d8db39947d 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Aizvērt"</string> <string name="back_button_text" msgid="1469718707134137085">"Atpakaļ"</string> <string name="handle_text" msgid="1766582106752184456">"Turis"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Lietotnes ikona"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pilnekrāna režīms"</string> <string name="desktop_text" msgid="1077633567027630454">"Darbvirsmas režīms"</string> <string name="split_screen_text" msgid="1396336058129570886">"Sadalīt ekrānu"</string> <string name="more_button_text" msgid="3655388105592893530">"Vairāk"</string> <string name="float_button_text" msgid="9221657008391364581">"Peldošs"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Atlasīt"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Ekrānuzņēmums"</string> + <string name="close_text" msgid="4986518933445178928">"Aizvērt"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Aizvērt izvēlni"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 45aeb7f332b0..190f7293228c 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -47,14 +47,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горниот 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Горниот 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Долниот на цел екран"</string> - <!-- no translation found for accessibility_split_left (1713683765575562458) --> - <skip /> - <!-- no translation found for accessibility_split_right (8441001008181296837) --> - <skip /> - <!-- no translation found for accessibility_split_top (2789329702027147146) --> - <skip /> - <!-- no translation found for accessibility_split_bottom (8694551025220868191) --> - <skip /> + <string name="accessibility_split_left" msgid="1713683765575562458">"Подели налево"</string> + <string name="accessibility_split_right" msgid="8441001008181296837">"Подели надесно"</string> + <string name="accessibility_split_top" msgid="2789329702027147146">"Подели нагоре"</string> + <string name="accessibility_split_bottom" msgid="8694551025220868191">"Подели долу"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Користење на режимот со една рака"</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"За да излезете, повлечете нагоре од дното на екранот или допрете каде било над апликацијата"</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Започни го режимот со една рака"</string> @@ -100,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Затвори"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Прекар"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Икона на апликацијата"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Цел екран"</string> <string name="desktop_text" msgid="1077633567027630454">"Режим за компјутер"</string> <string name="split_screen_text" msgid="1396336058129570886">"Поделен екран"</string> <string name="more_button_text" msgid="3655388105592893530">"Повеќе"</string> <string name="float_button_text" msgid="9221657008391364581">"Лебдечко"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Изберете"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Слика од екранот"</string> + <string name="close_text" msgid="4986518933445178928">"Затворете"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index ca5f0f7c4941..7307f20f8dc3 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"അടയ്ക്കുക"</string> <string name="back_button_text" msgid="1469718707134137085">"മടങ്ങുക"</string> <string name="handle_text" msgid="1766582106752184456">"ഹാൻഡിൽ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ആപ്പ് ഐക്കൺ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"പൂർണ്ണസ്ക്രീൻ"</string> <string name="desktop_text" msgid="1077633567027630454">"ഡെസ്ക്ടോപ്പ് മോഡ്"</string> <string name="split_screen_text" msgid="1396336058129570886">"സ്ക്രീൻ വിഭജനം"</string> <string name="more_button_text" msgid="3655388105592893530">"കൂടുതൽ"</string> <string name="float_button_text" msgid="9221657008391364581">"ഫ്ലോട്ട്"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"തിരഞ്ഞെടുക്കുക"</string> + <string name="screenshot_text" msgid="1477704010087786671">"സ്ക്രീൻഷോട്ട്"</string> + <string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index 9678c5c7190e..bc43b7037b91 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Хаах"</string> <string name="back_button_text" msgid="1469718707134137085">"Буцах"</string> <string name="handle_text" msgid="1766582106752184456">"Бариул"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Aппын дүрс тэмдэг"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Бүтэн дэлгэц"</string> <string name="desktop_text" msgid="1077633567027630454">"Дэлгэцийн горим"</string> <string name="split_screen_text" msgid="1396336058129570886">"Дэлгэцийг хуваах"</string> <string name="more_button_text" msgid="3655388105592893530">"Бусад"</string> <string name="float_button_text" msgid="9221657008391364581">"Хөвөгч"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Сонгох"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Дэлгэцийн агшин"</string> + <string name="close_text" msgid="4986518933445178928">"Хаах"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index ea728e844cb7..a31056dec589 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"बंद करा"</string> <string name="back_button_text" msgid="1469718707134137085">"मागे जा"</string> <string name="handle_text" msgid="1766582106752184456">"हँडल"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"अॅप आयकन"</string> <string name="fullscreen_text" msgid="1162316685217676079">"फुलस्क्रीन"</string> <string name="desktop_text" msgid="1077633567027630454">"डेस्कटॉप मोड"</string> <string name="split_screen_text" msgid="1396336058129570886">"स्प्लिट स्क्रीन"</string> <string name="more_button_text" msgid="3655388105592893530">"आणखी"</string> <string name="float_button_text" msgid="9221657008391364581">"फ्लोट"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"निवडा"</string> + <string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string> + <string name="close_text" msgid="4986518933445178928">"बंद करा"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 8a9b81c9e333..8435ccf10a95 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Tutup"</string> <string name="back_button_text" msgid="1469718707134137085">"Kembali"</string> <string name="handle_text" msgid="1766582106752184456">"Pemegang"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikon Apl"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Skrin penuh"</string> <string name="desktop_text" msgid="1077633567027630454">"Mod Desktop"</string> <string name="split_screen_text" msgid="1396336058129570886">"Skrin Pisah"</string> <string name="more_button_text" msgid="3655388105592893530">"Lagi"</string> <string name="float_button_text" msgid="9221657008391364581">"Terapung"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Pilih"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Tangkapan skrin"</string> + <string name="close_text" msgid="4986518933445178928">"Tutup"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index b37bfa7fcaf6..acc9130a5091 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ပိတ်ရန်"</string> <string name="back_button_text" msgid="1469718707134137085">"နောက်သို့"</string> <string name="handle_text" msgid="1766582106752184456">"သုံးသူအမည်"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"အက်ပ်သင်္ကေတ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ဖန်သားပြင်အပြည့်"</string> <string name="desktop_text" msgid="1077633567027630454">"ဒက်စ်တော့မုဒ်"</string> <string name="split_screen_text" msgid="1396336058129570886">"မျက်နှာပြင် ခွဲ၍ပြသရန်"</string> <string name="more_button_text" msgid="3655388105592893530">"ပိုပြပါ"</string> <string name="float_button_text" msgid="9221657008391364581">"မျှောရန်"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ရွေးရန်"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ဖန်သားပြင်ဓာတ်ပုံ"</string> + <string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 7c96f0d681a8..6511567ce89d 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Lukk"</string> <string name="back_button_text" msgid="1469718707134137085">"Tilbake"</string> <string name="handle_text" msgid="1766582106752184456">"Håndtak"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Appikon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Fullskjerm"</string> <string name="desktop_text" msgid="1077633567027630454">"Skrivebordmodus"</string> <string name="split_screen_text" msgid="1396336058129570886">"Delt skjerm"</string> <string name="more_button_text" msgid="3655388105592893530">"Mer"</string> <string name="float_button_text" msgid="9221657008391364581">"Svevende"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Velg"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skjermdump"</string> + <string name="close_text" msgid="4986518933445178928">"Lukk"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Lukk menyen"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 8a89d4c2c05f..56bde827b112 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"बन्द गर्नुहोस्"</string> <string name="back_button_text" msgid="1469718707134137085">"पछाडि"</string> <string name="handle_text" msgid="1766582106752184456">"ह्यान्डल"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"एपको आइकन"</string> <string name="fullscreen_text" msgid="1162316685217676079">"फुल स्क्रिन"</string> <string name="desktop_text" msgid="1077633567027630454">"डेस्कटप मोड"</string> <string name="split_screen_text" msgid="1396336058129570886">"स्प्लिट स्क्रिन"</string> <string name="more_button_text" msgid="3655388105592893530">"थप"</string> <string name="float_button_text" msgid="9221657008391364581">"फ्लोट"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"चयन गर्नुहोस्"</string> + <string name="screenshot_text" msgid="1477704010087786671">"स्क्रिनसट"</string> + <string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 1f0b6d233dcd..364774bb70b7 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Sluiten"</string> <string name="back_button_text" msgid="1469718707134137085">"Terug"</string> <string name="handle_text" msgid="1766582106752184456">"Gebruikersnaam"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"App-icoon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Volledig scherm"</string> <string name="desktop_text" msgid="1077633567027630454">"Desktopmodus"</string> <string name="split_screen_text" msgid="1396336058129570886">"Gesplitst scherm"</string> <string name="more_button_text" msgid="3655388105592893530">"Meer"</string> <string name="float_button_text" msgid="9221657008391364581">"Zwevend"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Selecteren"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Sluiten"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menu sluiten"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index edfe3f01e6bc..59af0d975e2b 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="back_button_text" msgid="1469718707134137085">"ପଛକୁ ଫେରନ୍ତୁ"</string> <string name="handle_text" msgid="1766582106752184456">"ହେଣ୍ଡେଲ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ଆପ ଆଇକନ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ପୂର୍ଣ୍ଣସ୍କ୍ରିନ"</string> <string name="desktop_text" msgid="1077633567027630454">"ଡେସ୍କଟପ ମୋଡ"</string> <string name="split_screen_text" msgid="1396336058129570886">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ"</string> <string name="more_button_text" msgid="3655388105592893530">"ଅଧିକ"</string> <string name="float_button_text" msgid="9221657008391364581">"ଫ୍ଲୋଟ"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ଚୟନ କରନ୍ତୁ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ସ୍କ୍ରିନସଟ"</string> + <string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 8c2ad2231d19..a40c7e524755 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ਬੰਦ ਕਰੋ"</string> <string name="back_button_text" msgid="1469718707134137085">"ਪਿੱਛੇ"</string> <string name="handle_text" msgid="1766582106752184456">"ਹੈਂਡਲ"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ਐਪ ਪ੍ਰਤੀਕ"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ਪੂਰੀ-ਸਕ੍ਰੀਨ"</string> <string name="desktop_text" msgid="1077633567027630454">"ਡੈਸਕਟਾਪ ਮੋਡ"</string> <string name="split_screen_text" msgid="1396336058129570886">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ"</string> <string name="more_button_text" msgid="3655388105592893530">"ਹੋਰ"</string> <string name="float_button_text" msgid="9221657008391364581">"ਫ਼ਲੋਟ"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ਚੁਣੋ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> + <string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index 191f6decebad..82ce6c9ab4bc 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Zamknij"</string> <string name="back_button_text" msgid="1469718707134137085">"Wstecz"</string> <string name="handle_text" msgid="1766582106752184456">"Uchwyt"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona aplikacji"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Pełny ekran"</string> <string name="desktop_text" msgid="1077633567027630454">"Tryb pulpitu"</string> <string name="split_screen_text" msgid="1396336058129570886">"Podzielony ekran"</string> <string name="more_button_text" msgid="3655388105592893530">"Więcej"</string> <string name="float_button_text" msgid="9221657008391364581">"Pływające"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Wybierz"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Zrzut ekranu"</string> + <string name="close_text" msgid="4986518933445178928">"Zamknij"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index 82409f40f8cf..ee9000b1fe17 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Fechar"</string> <string name="back_button_text" msgid="1469718707134137085">"Voltar"</string> <string name="handle_text" msgid="1766582106752184456">"Alça"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ícone do app"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Tela cheia"</string> <string name="desktop_text" msgid="1077633567027630454">"Modo área de trabalho"</string> <string name="split_screen_text" msgid="1396336058129570886">"Tela dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Mais"</string> <string name="float_button_text" msgid="9221657008391364581">"Ponto flutuante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Selecionar"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string> + <string name="close_text" msgid="4986518933445178928">"Fechar"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index 82409f40f8cf..ee9000b1fe17 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Fechar"</string> <string name="back_button_text" msgid="1469718707134137085">"Voltar"</string> <string name="handle_text" msgid="1766582106752184456">"Alça"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ícone do app"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Tela cheia"</string> <string name="desktop_text" msgid="1077633567027630454">"Modo área de trabalho"</string> <string name="split_screen_text" msgid="1396336058129570886">"Tela dividida"</string> <string name="more_button_text" msgid="3655388105592893530">"Mais"</string> <string name="float_button_text" msgid="9221657008391364581">"Ponto flutuante"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Selecionar"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string> + <string name="close_text" msgid="4986518933445178928">"Fechar"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 29297f4b55bd..afd3fe8f1696 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Închide"</string> <string name="back_button_text" msgid="1469718707134137085">"Înapoi"</string> <string name="handle_text" msgid="1766582106752184456">"Ghidaj"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Pictograma aplicației"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Ecran complet"</string> <string name="desktop_text" msgid="1077633567027630454">"Modul desktop"</string> <string name="split_screen_text" msgid="1396336058129570886">"Ecran împărțit"</string> <string name="more_button_text" msgid="3655388105592893530">"Mai multe"</string> <string name="float_button_text" msgid="9221657008391364581">"Flotantă"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Selectează"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Captură de ecran"</string> + <string name="close_text" msgid="4986518933445178928">"Închide"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Închide meniul"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index de0bcf4da82a..12481031ec83 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Закрыть"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Маркер"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Значок приложения"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Полноэкранный режим"</string> <string name="desktop_text" msgid="1077633567027630454">"Режим компьютера"</string> <string name="split_screen_text" msgid="1396336058129570886">"Разделить экран"</string> <string name="more_button_text" msgid="3655388105592893530">"Ещё"</string> <string name="float_button_text" msgid="9221657008391364581">"Плавающее окно"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Выбрать"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string> + <string name="close_text" msgid="4986518933445178928">"Закрыть"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index 849dbac4c485..15d2c366cced 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"වසන්න"</string> <string name="back_button_text" msgid="1469718707134137085">"ආපසු"</string> <string name="handle_text" msgid="1766582106752184456">"හැඬලය"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"යෙදුම් නිරූපකය"</string> <string name="fullscreen_text" msgid="1162316685217676079">"පූර්ණ තිරය"</string> <string name="desktop_text" msgid="1077633567027630454">"ඩෙස්ක්ටොප් ප්රකාරය"</string> <string name="split_screen_text" msgid="1396336058129570886">"බෙදුම් තිරය"</string> <string name="more_button_text" msgid="3655388105592893530">"තව"</string> <string name="float_button_text" msgid="9221657008391364581">"පාවෙන"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"තෝරන්න"</string> + <string name="screenshot_text" msgid="1477704010087786671">"තිර රුව"</string> + <string name="close_text" msgid="4986518933445178928">"වසන්න"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index e86ecded8502..422c25def1f7 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Zavrieť"</string> <string name="back_button_text" msgid="1469718707134137085">"Späť"</string> <string name="handle_text" msgid="1766582106752184456">"Rukoväť"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona aplikácie"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Celá obrazovka"</string> <string name="desktop_text" msgid="1077633567027630454">"Režim počítača"</string> <string name="split_screen_text" msgid="1396336058129570886">"Rozdelená obrazovka"</string> <string name="more_button_text" msgid="3655388105592893530">"Viac"</string> <string name="float_button_text" msgid="9221657008391364581">"Plávajúce"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Vybrať"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Snímka obrazovky"</string> + <string name="close_text" msgid="4986518933445178928">"Zavrieť"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zavrieť ponuku"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 954e7290163b..7096998769f4 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Zapri"</string> <string name="back_button_text" msgid="1469718707134137085">"Nazaj"</string> <string name="handle_text" msgid="1766582106752184456">"Ročica"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona aplikacije"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Celozaslonsko"</string> <string name="desktop_text" msgid="1077633567027630454">"Namizni način"</string> <string name="split_screen_text" msgid="1396336058129570886">"Razdeljen zaslon"</string> <string name="more_button_text" msgid="3655388105592893530">"Več"</string> <string name="float_button_text" msgid="9221657008391364581">"Lebdeče"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Izberi"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Posnetek zaslona"</string> + <string name="close_text" msgid="4986518933445178928">"Zapri"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index 6209ff912cde..3ef8b182b173 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Mbyll"</string> <string name="back_button_text" msgid="1469718707134137085">"Pas"</string> <string name="handle_text" msgid="1766582106752184456">"Emërtimi"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ikona e aplikacionit"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Ekrani i plotë"</string> <string name="desktop_text" msgid="1077633567027630454">"Modaliteti i desktopit"</string> <string name="split_screen_text" msgid="1396336058129570886">"Ekrani i ndarë"</string> <string name="more_button_text" msgid="3655388105592893530">"Më shumë"</string> <string name="float_button_text" msgid="9221657008391364581">"Pluskuese"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Zgjidh"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Pamja e ekranit"</string> + <string name="close_text" msgid="4986518933445178928">"Mbyll"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Mbyll menynë"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index f810d3d9890e..09c5ad1f22de 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Затворите"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Идентификатор"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Икона апликације"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Преко целог екрана"</string> <string name="desktop_text" msgid="1077633567027630454">"Режим за рачунаре"</string> <string name="split_screen_text" msgid="1396336058129570886">"Подељени екран"</string> <string name="more_button_text" msgid="3655388105592893530">"Још"</string> <string name="float_button_text" msgid="9221657008391364581">"Плутајуће"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Изаберите"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Снимак екрана"</string> + <string name="close_text" msgid="4986518933445178928">"Затворите"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index 0e4487102f68..5bfa238f12be 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Stäng"</string> <string name="back_button_text" msgid="1469718707134137085">"Tillbaka"</string> <string name="handle_text" msgid="1766582106752184456">"Handtag"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Appikon"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Helskärm"</string> <string name="desktop_text" msgid="1077633567027630454">"Datorläge"</string> <string name="split_screen_text" msgid="1396336058129570886">"Delad skärm"</string> <string name="more_button_text" msgid="3655388105592893530">"Mer"</string> <string name="float_button_text" msgid="9221657008391364581">"Svävande"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Välj"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skärmbild"</string> + <string name="close_text" msgid="4986518933445178928">"Stäng"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index e167bcab1cdb..489d56e50a6c 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Funga"</string> <string name="back_button_text" msgid="1469718707134137085">"Rudi nyuma"</string> <string name="handle_text" msgid="1766582106752184456">"Ncha"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Aikoni ya Programu"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Skrini nzima"</string> <string name="desktop_text" msgid="1077633567027630454">"Hali ya Kompyuta ya mezani"</string> <string name="split_screen_text" msgid="1396336058129570886">"Gawa Skrini"</string> <string name="more_button_text" msgid="3655388105592893530">"Zaidi"</string> <string name="float_button_text" msgid="9221657008391364581">"Inayoelea"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Chagua"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Picha ya skrini"</string> + <string name="close_text" msgid="4986518933445178928">"Funga"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Funga Menyu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 286d60832db1..8a75b2140b65 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"மூடும்"</string> <string name="back_button_text" msgid="1469718707134137085">"பின்செல்லும்"</string> <string name="handle_text" msgid="1766582106752184456">"ஹேண்டில்"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ஆப்ஸ் ஐகான்"</string> <string name="fullscreen_text" msgid="1162316685217676079">"முழுத்திரை"</string> <string name="desktop_text" msgid="1077633567027630454">"டெஸ்க்டாப் பயன்முறை"</string> <string name="split_screen_text" msgid="1396336058129570886">"திரையைப் பிரிக்கும்"</string> <string name="more_button_text" msgid="3655388105592893530">"கூடுதல் விருப்பத்தேர்வுகள்"</string> <string name="float_button_text" msgid="9221657008391364581">"மிதக்கும் சாளரம்"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"தேர்ந்தெடுக்கும்"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string> + <string name="close_text" msgid="4986518933445178928">"மூடும்"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index ec3ca78cf747..d0e459ac622b 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"మూసివేయండి"</string> <string name="back_button_text" msgid="1469718707134137085">"వెనుకకు"</string> <string name="handle_text" msgid="1766582106752184456">"హ్యాండిల్"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"యాప్ చిహ్నం"</string> <string name="fullscreen_text" msgid="1162316685217676079">"ఫుల్-స్క్రీన్"</string> <string name="desktop_text" msgid="1077633567027630454">"డెస్క్టాప్ మోడ్"</string> <string name="split_screen_text" msgid="1396336058129570886">"స్ప్లిట్ స్క్రీన్"</string> <string name="more_button_text" msgid="3655388105592893530">"మరిన్ని"</string> <string name="float_button_text" msgid="9221657008391364581">"ఫ్లోట్"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"ఎంచుకోండి"</string> + <string name="screenshot_text" msgid="1477704010087786671">"స్క్రీన్షాట్"</string> + <string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 1a9fa1828cf5..2e926c42d07c 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"ปิด"</string> <string name="back_button_text" msgid="1469718707134137085">"กลับ"</string> <string name="handle_text" msgid="1766582106752184456">"แฮนเดิล"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ไอคอนแอป"</string> <string name="fullscreen_text" msgid="1162316685217676079">"เต็มหน้าจอ"</string> <string name="desktop_text" msgid="1077633567027630454">"โหมดเดสก์ท็อป"</string> <string name="split_screen_text" msgid="1396336058129570886">"แยกหน้าจอ"</string> <string name="more_button_text" msgid="3655388105592893530">"เพิ่มเติม"</string> <string name="float_button_text" msgid="9221657008391364581">"ล่องลอย"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"เลือก"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ภาพหน้าจอ"</string> + <string name="close_text" msgid="4986518933445178928">"ปิด"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index 27c4363eb630..3db2507433c2 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Isara"</string> <string name="back_button_text" msgid="1469718707134137085">"Bumalik"</string> <string name="handle_text" msgid="1766582106752184456">"Handle"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Icon ng App"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Fullscreen"</string> <string name="desktop_text" msgid="1077633567027630454">"Desktop Mode"</string> <string name="split_screen_text" msgid="1396336058129570886">"Split Screen"</string> <string name="more_button_text" msgid="3655388105592893530">"Higit pa"</string> <string name="float_button_text" msgid="9221657008391364581">"Float"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Piliin"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> + <string name="close_text" msgid="4986518933445178928">"Isara"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Isara ang Menu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index a9ad92d39ec9..e43e4249b3b3 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Kapat"</string> <string name="back_button_text" msgid="1469718707134137085">"Geri"</string> <string name="handle_text" msgid="1766582106752184456">"Herkese açık kullanıcı adı"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Uygulama Simgesi"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Tam Ekran"</string> <string name="desktop_text" msgid="1077633567027630454">"Masaüstü Modu"</string> <string name="split_screen_text" msgid="1396336058129570886">"Bölünmüş Ekran"</string> <string name="more_button_text" msgid="3655388105592893530">"Daha Fazla"</string> <string name="float_button_text" msgid="9221657008391364581">"Havada Süzülen"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Seç"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Ekran görüntüsü"</string> + <string name="close_text" msgid="4986518933445178928">"Kapat"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menüyü kapat"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index a9b05d513ec8..99f7e3027381 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Закрити"</string> <string name="back_button_text" msgid="1469718707134137085">"Назад"</string> <string name="handle_text" msgid="1766582106752184456">"Маркер"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Значок додатка"</string> <string name="fullscreen_text" msgid="1162316685217676079">"На весь екран"</string> <string name="desktop_text" msgid="1077633567027630454">"Режим комп’ютера"</string> <string name="split_screen_text" msgid="1396336058129570886">"Розділити екран"</string> <string name="more_button_text" msgid="3655388105592893530">"Більше"</string> <string name="float_button_text" msgid="9221657008391364581">"Плаваюче вікно"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Вибрати"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Знімок екрана"</string> + <string name="close_text" msgid="4986518933445178928">"Закрити"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 1c31a3dbbbe3..abab3e703306 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"بند کریں"</string> <string name="back_button_text" msgid="1469718707134137085">"پیچھے"</string> <string name="handle_text" msgid="1766582106752184456">"ہینڈل"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"ایپ کا آئیکن"</string> <string name="fullscreen_text" msgid="1162316685217676079">"مکمل اسکرین"</string> <string name="desktop_text" msgid="1077633567027630454">"ڈیسک ٹاپ موڈ"</string> <string name="split_screen_text" msgid="1396336058129570886">"اسپلٹ اسکرین"</string> <string name="more_button_text" msgid="3655388105592893530">"مزید"</string> <string name="float_button_text" msgid="9221657008391364581">"فلوٹ"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"منتخب کریں"</string> + <string name="screenshot_text" msgid="1477704010087786671">"اسکرین شاٹ"</string> + <string name="close_text" msgid="4986518933445178928">"بند کریں"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"مینو بند کریں"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 3ce167293d39..90f3c6062529 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Yopish"</string> <string name="back_button_text" msgid="1469718707134137085">"Orqaga"</string> <string name="handle_text" msgid="1766582106752184456">"Identifikator"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Ilova belgisi"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Butun ekran"</string> <string name="desktop_text" msgid="1077633567027630454">"Desktop rejimi"</string> <string name="split_screen_text" msgid="1396336058129570886">"Ekranni ikkiga ajratish"</string> <string name="more_button_text" msgid="3655388105592893530">"Yana"</string> <string name="float_button_text" msgid="9221657008391364581">"Pufakli"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Tanlash"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Skrinshot"</string> + <string name="close_text" msgid="4986518933445178928">"Yopish"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index 1bf967a69eae..535fee33fccb 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Đóng"</string> <string name="back_button_text" msgid="1469718707134137085">"Quay lại"</string> <string name="handle_text" msgid="1766582106752184456">"Xử lý"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Biểu tượng ứng dụng"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Toàn màn hình"</string> <string name="desktop_text" msgid="1077633567027630454">"Chế độ máy tính"</string> <string name="split_screen_text" msgid="1396336058129570886">"Chia đôi màn hình"</string> <string name="more_button_text" msgid="3655388105592893530">"Tuỳ chọn khác"</string> <string name="float_button_text" msgid="9221657008391364581">"Nổi"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Chọn"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Ảnh chụp màn hình"</string> + <string name="close_text" msgid="4986518933445178928">"Đóng"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Đóng trình đơn"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index 3a8dd242246b..83f703d4a3b4 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"关闭"</string> <string name="back_button_text" msgid="1469718707134137085">"返回"</string> <string name="handle_text" msgid="1766582106752184456">"处理"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"应用图标"</string> <string name="fullscreen_text" msgid="1162316685217676079">"全屏"</string> <string name="desktop_text" msgid="1077633567027630454">"桌面模式"</string> <string name="split_screen_text" msgid="1396336058129570886">"分屏"</string> <string name="more_button_text" msgid="3655388105592893530">"更多"</string> <string name="float_button_text" msgid="9221657008391364581">"悬浮"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"选择"</string> + <string name="screenshot_text" msgid="1477704010087786671">"屏幕截图"</string> + <string name="close_text" msgid="4986518933445178928">"关闭"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index 112bd41c4f15..c83f65dfcd72 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"關閉"</string> <string name="back_button_text" msgid="1469718707134137085">"返去"</string> <string name="handle_text" msgid="1766582106752184456">"控點"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"應用程式圖示"</string> <string name="fullscreen_text" msgid="1162316685217676079">"全螢幕"</string> <string name="desktop_text" msgid="1077633567027630454">"桌面模式"</string> <string name="split_screen_text" msgid="1396336058129570886">"分割螢幕"</string> <string name="more_button_text" msgid="3655388105592893530">"更多"</string> <string name="float_button_text" msgid="9221657008391364581">"浮動"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"選取"</string> + <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string> + <string name="close_text" msgid="4986518933445178928">"關閉"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index edb0c7e8aa88..08df469186aa 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"關閉"</string> <string name="back_button_text" msgid="1469718707134137085">"返回"</string> <string name="handle_text" msgid="1766582106752184456">"控點"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"應用程式圖示"</string> <string name="fullscreen_text" msgid="1162316685217676079">"全螢幕"</string> <string name="desktop_text" msgid="1077633567027630454">"電腦模式"</string> <string name="split_screen_text" msgid="1396336058129570886">"分割畫面"</string> <string name="more_button_text" msgid="3655388105592893530">"更多"</string> <string name="float_button_text" msgid="9221657008391364581">"浮動"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"選取"</string> + <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string> + <string name="close_text" msgid="4986518933445178928">"關閉"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index 749b223993db..9232b729b964 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -96,19 +96,14 @@ <string name="close_button_text" msgid="2913281996024033299">"Vala"</string> <string name="back_button_text" msgid="1469718707134137085">"Emuva"</string> <string name="handle_text" msgid="1766582106752184456">"Isibambo"</string> - <!-- no translation found for app_icon_text (2823268023931811747) --> - <skip /> + <string name="app_icon_text" msgid="2823268023931811747">"Isithonjana Se-app"</string> <string name="fullscreen_text" msgid="1162316685217676079">"Isikrini esigcwele"</string> <string name="desktop_text" msgid="1077633567027630454">"Imodi Yedeskithophu"</string> <string name="split_screen_text" msgid="1396336058129570886">"Hlukanisa isikrini"</string> <string name="more_button_text" msgid="3655388105592893530">"Okwengeziwe"</string> <string name="float_button_text" msgid="9221657008391364581">"Iflowuthi"</string> - <!-- no translation found for select_text (5139083974039906583) --> - <skip /> - <!-- no translation found for screenshot_text (1477704010087786671) --> - <skip /> - <!-- no translation found for close_text (4986518933445178928) --> - <skip /> - <!-- no translation found for collapse_menu_text (7515008122450342029) --> - <skip /> + <string name="select_text" msgid="5139083974039906583">"Khetha"</string> + <string name="screenshot_text" msgid="1477704010087786671">"Isithombe-skrini"</string> + <string name="close_text" msgid="4986518933445178928">"Vala"</string> + <string name="collapse_menu_text" msgid="7515008122450342029">"Vala Imenyu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index 1f9b6cf6c64f..336c156e831a 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -273,6 +273,18 @@ <!-- The space between two actions in the letterbox education dialog --> <dimen name="letterbox_education_dialog_space_between_actions">24dp</dimen> + <!-- The corner radius of the buttons in the letterbox education dialog --> + <dimen name="letterbox_education_dialog_button_radius">12dp</dimen> + + <!-- The horizontal padding for the buttons in the letterbox education dialog --> + <dimen name="letterbox_education_dialog_horizontal_padding">16dp</dimen> + + <!-- The vertical padding for the buttons in the letterbox education dialog --> + <dimen name="letterbox_education_dialog_vertical_padding">8dp</dimen> + + <!-- The insets for the buttons in the letterbox education dialog --> + <dimen name="letterbox_education_dialog_vertical_inset">6dp</dimen> + <!-- The margin between the dialog container and its parent. --> <dimen name="letterbox_restart_dialog_margin">24dp</dimen> @@ -306,6 +318,15 @@ <!-- The corner radius of the buttons in the restart dialog --> <dimen name="letterbox_restart_dialog_button_radius">18dp</dimen> + <!-- The insets for the buttons in the letterbox restart dialog --> + <dimen name="letterbox_restart_dialog_vertical_inset">6dp</dimen> + + <!-- The horizontal padding for the buttons in the letterbox restart dialog --> + <dimen name="letterbox_restart_dialog_horizontal_padding">16dp</dimen> + + <!-- The vertical padding for the buttons in the letterbox restart dialog --> + <dimen name="letterbox_restart_dialog_vertical_padding">8dp</dimen> + <!-- The width of the brand image on staring surface. --> <dimen name="starting_surface_brand_image_width">200dp</dimen> diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml index bae009a0526f..0a0c49f2d93f 100644 --- a/libs/WindowManager/Shell/res/values/styles.xml +++ b/libs/WindowManager/Shell/res/values/styles.xml @@ -87,6 +87,9 @@ <item name="android:textAppearance"> @*android:style/TextAppearance.DeviceDefault.Headline </item> + <item name="android:fontFamily"> + @*android:string/config_bodyFontFamilyMedium + </item> </style> <style name="RestartDialogBodyText"> @@ -97,24 +100,44 @@ <item name="android:textAppearance"> @*android:style/TextAppearance.DeviceDefault.Body2 </item> + <item name="android:fontFamily"> + @*android:string/config_bodyFontFamily + </item> </style> <style name="RestartDialogCheckboxText"> <item name="android:textSize">16sp</item> <item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:lineSpacingExtra">4sp</item> - <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault</item> + <item name="android:textAppearance"> + @*android:style/TextAppearance.DeviceDefault.Headline + </item> + <item name="android:fontFamily"> + @*android:string/config_bodyFontFamilyMedium + </item> </style> <style name="RestartDialogDismissButton"> <item name="android:lineSpacingExtra">2sp</item> <item name="android:textSize">14sp</item> <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textAppearance"> + @*android:style/TextAppearance.DeviceDefault.Body2 + </item> + <item name="android:fontFamily"> + @*android:string/config_bodyFontFamily + </item> </style> <style name="RestartDialogConfirmButton"> <item name="android:lineSpacingExtra">2sp</item> <item name="android:textSize">14sp</item> <item name="android:textColor">?android:attr/textColorPrimaryInverse</item> + <item name="android:textAppearance"> + @*android:style/TextAppearance.DeviceDefault.Body2 + </item> + <item name="android:fontFamily"> + @*android:string/config_bodyFontFamily + </item> </style> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java index e2012b4e36dc..88525aabe53b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java @@ -16,8 +16,6 @@ package com.android.wm.shell; -import android.os.Build; - import com.android.wm.shell.protolog.ShellProtoLogImpl; import com.android.wm.shell.sysui.ShellCommandHandler; import com.android.wm.shell.sysui.ShellInit; @@ -43,9 +41,6 @@ public class ProtoLogController implements ShellCommandHandler.ShellCommandActio void onInit() { mShellCommandHandler.addCommandCallback("protolog", this, this); - if (Build.IS_DEBUGGABLE) { - mShellProtoLog.startProtoLog(null /* PrintWriter */); - } } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index fce013837f01..73a740381090 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -85,7 +85,7 @@ class DesktopTasksController( fun showDesktopApps() { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "showDesktopApps") val wct = WindowContainerTransaction() - bringDesktopAppsToFront(wct, force = true) + bringDesktopAppsToFront(wct) // Execute transaction if there are pending operations if (!wct.isEmpty) { @@ -156,19 +156,9 @@ class DesktopTasksController( ?: WINDOWING_MODE_UNDEFINED } - private fun bringDesktopAppsToFront(wct: WindowContainerTransaction, force: Boolean = false) { - val activeTasks = desktopModeTaskRepository.getActiveTasks() - - // Skip if all tasks are already visible - if (!force && activeTasks.all(desktopModeTaskRepository::isVisibleTask)) { - ProtoLog.d( - WM_SHELL_DESKTOP_MODE, - "bringDesktopAppsToFront: active tasks are already in front, skipping." - ) - return - } - + private fun bringDesktopAppsToFront(wct: WindowContainerTransaction) { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "bringDesktopAppsToFront") + val activeTasks = desktopModeTaskRepository.getActiveTasks() // First move home to front and then other tasks on top of it moveHomeTaskToFront(wct) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropConstants.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropConstants.java new file mode 100644 index 000000000000..20da54efd286 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropConstants.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 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.wm.shell.draganddrop; + +/** Constants that can be used by both Shell and other users of the library, e.g. Launcher */ +public class DragAndDropConstants { + + /** + * An Intent extra that Launcher can use to specify a region of the screen where Shell should + * ignore drag events. + */ + public static final String EXTRA_DISALLOW_HIT_REGION = "DISALLOW_HIT_REGION"; +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java index b59fe1818780..4cfaae6e51c7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java @@ -36,6 +36,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_U import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import android.content.ClipDescription; +import android.content.ComponentCallbacks2; import android.content.Context; import android.content.res.Configuration; import android.graphics.PixelFormat; @@ -58,9 +59,9 @@ import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.R; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.common.annotations.ExternalMainThread; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.splitscreen.SplitScreenController; -import com.android.wm.shell.sysui.ConfigurationChangeListener; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; @@ -70,7 +71,7 @@ import java.util.ArrayList; * Handles the global drag and drop handling for the Shell. */ public class DragAndDropController implements DisplayController.OnDisplaysChangedListener, - View.OnDragListener, ConfigurationChangeListener { + View.OnDragListener, ComponentCallbacks2 { private static final String TAG = DragAndDropController.class.getSimpleName(); @@ -119,7 +120,6 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange mMainExecutor.executeDelayed(() -> { mDisplayController.addDisplayWindowListener(this); }, 0); - mShellController.addConfigurationChangeListener(this); } /** @@ -180,6 +180,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange try { wm.addView(rootView, layoutParams); addDisplayDropTarget(displayId, context, wm, rootView, dragLayout); + context.registerComponentCallbacks(this); } catch (WindowManager.InvalidDisplayException e) { Slog.w(TAG, "Unable to add view for display id: " + displayId); } @@ -209,6 +210,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange if (pd == null) { return; } + pd.context.unregisterComponentCallbacks(this); pd.wm.removeViewImmediate(pd.rootView); mDisplayDropTargets.remove(displayId); } @@ -328,18 +330,29 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange return mimeTypes; } + // Note: Component callbacks are always called on the main thread of the process + @ExternalMainThread @Override - public void onThemeChanged() { - for (int i = 0; i < mDisplayDropTargets.size(); i++) { - mDisplayDropTargets.get(i).dragLayout.onThemeChange(); - } + public void onConfigurationChanged(Configuration newConfig) { + mMainExecutor.execute(() -> { + for (int i = 0; i < mDisplayDropTargets.size(); i++) { + mDisplayDropTargets.get(i).dragLayout.onConfigChanged(newConfig); + } + }); } + // Note: Component callbacks are always called on the main thread of the process + @ExternalMainThread @Override - public void onConfigurationChanged(Configuration newConfig) { - for (int i = 0; i < mDisplayDropTargets.size(); i++) { - mDisplayDropTargets.get(i).dragLayout.onConfigChanged(newConfig); - } + public void onTrimMemory(int level) { + // Do nothing + } + + // Note: Component callbacks are always called on the main thread of the process + @ExternalMainThread + @Override + public void onLowMemory() { + // Do nothing } private static class PerDisplay { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java index d93a9012c8f1..df94b414c092 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java @@ -34,6 +34,7 @@ import static android.content.Intent.EXTRA_USER; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; +import static com.android.wm.shell.draganddrop.DragAndDropConstants.EXTRA_DISALLOW_HIT_REGION; import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_FULLSCREEN; import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_BOTTOM; import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_LEFT; @@ -53,6 +54,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.LauncherApps; import android.graphics.Insets; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; @@ -86,6 +88,7 @@ public class DragAndDropPolicy { private final Starter mStarter; private final SplitScreenController mSplitScreen; private final ArrayList<DragAndDropPolicy.Target> mTargets = new ArrayList<>(); + private final RectF mDisallowHitRegion = new RectF(); private InstanceId mLoggerSessionId; private DragSession mSession; @@ -111,6 +114,12 @@ public class DragAndDropPolicy { mSession = new DragSession(mActivityTaskManager, displayLayout, data); // TODO(b/169894807): Also update the session data with task stack changes mSession.update(); + RectF disallowHitRegion = (RectF) mSession.dragData.getExtra(EXTRA_DISALLOW_HIT_REGION); + if (disallowHitRegion == null) { + mDisallowHitRegion.setEmpty(); + } else { + mDisallowHitRegion.set(disallowHitRegion); + } } /** @@ -218,6 +227,9 @@ public class DragAndDropPolicy { */ @Nullable Target getTargetAtLocation(int x, int y) { + if (mDisallowHitRegion.contains(x, y)) { + return null; + } for (int i = mTargets.size() - 1; i >= 0; i--) { DragAndDropPolicy.Target t = mTargets.get(i); if (t.hitRegion.contains(x, y)) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java index bb6e3917ff3c..fe42822ab6a1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java @@ -18,6 +18,8 @@ package com.android.wm.shell.draganddrop; import static android.app.StatusBarManager.DISABLE_NONE; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS; +import static android.content.pm.ActivityInfo.CONFIG_UI_MODE; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; @@ -72,6 +74,7 @@ public class DragLayout extends LinearLayout { private final SplitScreenController mSplitScreenController; private final IconProvider mIconProvider; private final StatusBarManager mStatusBarManager; + private final Configuration mLastConfiguration = new Configuration(); private DragAndDropPolicy.Target mCurrentTarget = null; private DropZoneView mDropZoneView1; @@ -92,6 +95,7 @@ public class DragLayout extends LinearLayout { mIconProvider = iconProvider; mPolicy = new DragAndDropPolicy(context, splitScreenController); mStatusBarManager = context.getSystemService(StatusBarManager.class); + mLastConfiguration.setTo(context.getResources().getConfiguration()); mDisplayMargin = context.getResources().getDimensionPixelSize( R.dimen.drop_layout_display_margin); @@ -118,7 +122,7 @@ public class DragLayout extends LinearLayout { @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { - mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout()); + mInsets = insets.getInsets(Type.tappableElement() | Type.displayCutout()); recomputeDropTargets(); final int orientation = getResources().getConfiguration().orientation; @@ -132,11 +136,6 @@ public class DragLayout extends LinearLayout { return super.onApplyWindowInsets(insets); } - public void onThemeChange() { - mDropZoneView1.onThemeChange(); - mDropZoneView2.onThemeChange(); - } - public void onConfigChanged(Configuration newConfig) { if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE && getOrientation() != HORIZONTAL) { @@ -147,6 +146,15 @@ public class DragLayout extends LinearLayout { setOrientation(LinearLayout.VERTICAL); updateContainerMargins(newConfig.orientation); } + + final int diff = newConfig.diff(mLastConfiguration); + final boolean themeChanged = (diff & CONFIG_ASSETS_PATHS) != 0 + || (diff & CONFIG_UI_MODE) != 0; + if (themeChanged) { + mDropZoneView1.onThemeChange(); + mDropZoneView2.onThemeChange(); + } + mLastConfiguration.setTo(newConfig); } private void updateContainerMarginsForSingleTask() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java index 26f47fcdaa44..d094c229e0f8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java @@ -108,6 +108,10 @@ public class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { } if (!createdWindowDecor) { mSyncQueue.runInSync(t -> { + if (!leash.isValid()) { + // Task vanished before sync completion + return; + } // Reset several properties back to fullscreen (PiP, for example, leaves all these // properties in a bad state). t.setWindowCrop(leash, null); @@ -136,6 +140,10 @@ public class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { final Point positionInParent = state.mTaskInfo.positionInParent; if (!oldPositionInParent.equals(state.mTaskInfo.positionInParent)) { mSyncQueue.runInSync(t -> { + if (!state.mLeash.isValid()) { + // Task vanished before sync completion + return; + } t.setPosition(state.mLeash, positionInParent.x, positionInParent.y); }); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java index 7619646804ad..9729a4007bac 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java @@ -235,21 +235,14 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen /** Adds the magnetic target view to the WindowManager so it's ready to be animated in. */ public void createOrUpdateDismissTarget() { - if (!mTargetViewContainer.isAttachedToWindow()) { + if (mTargetViewContainer.getParent() == null) { mTargetViewContainer.cancelAnimators(); mTargetViewContainer.setVisibility(View.INVISIBLE); mTargetViewContainer.getViewTreeObserver().removeOnPreDrawListener(this); mHasDismissTargetSurface = false; - try { - mWindowManager.addView(mTargetViewContainer, getDismissTargetLayoutParams()); - } catch (IllegalStateException e) { - // This shouldn't happen, but if the target is already added, just update its layout - // params. - mWindowManager.updateViewLayout( - mTargetViewContainer, getDismissTargetLayoutParams()); - } + mWindowManager.addView(mTargetViewContainer, getDismissTargetLayoutParams()); } else { mWindowManager.updateViewLayout(mTargetViewContainer, getDismissTargetLayoutParams()); } @@ -306,7 +299,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen * Removes the dismiss target and cancels any pending callbacks to show it. */ public void cleanUpDismissTarget() { - if (mTargetViewContainer.isAttachedToWindow()) { + if (mTargetViewContainer.getParent() != null) { mWindowManager.removeViewImmediate(mTargetViewContainer); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java index c59c42dadb9d..93ffb3dc8115 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java @@ -31,7 +31,8 @@ import java.io.PrintWriter; */ public class ShellProtoLogImpl extends BaseProtoLogImpl { private static final String TAG = "ProtoLogImpl"; - private static final int BUFFER_CAPACITY = 128 * 1024; + private static final int BUFFER_CAPACITY = 1024 * 1024; + // TODO: find a proper location to save the protolog message file private static final String LOG_FILENAME = "/data/misc/wmtrace/shell_log.winscope"; private static final String VIEWER_CONFIG_FILENAME = "/system_ext/etc/wmshell.protolog.json.gz"; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 2a6fbd2cee8c..f102f8e2f5df 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -936,7 +936,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, new IRemoteAnimationFinishedCallback.Stub() { @Override public void onAnimationFinished() throws RemoteException { - onRemoteAnimationFinishedOrCancelled(false /* cancel */, evictWct); + onRemoteAnimationFinishedOrCancelled(evictWct); finishedCallback.onAnimationFinished(); } }; @@ -952,7 +952,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled(boolean isKeyguardOccluded) { - onRemoteAnimationFinishedOrCancelled(true /* cancel */, evictWct); + onRemoteAnimationFinishedOrCancelled(evictWct); try { adapter.getRunner().onAnimationCancelled(isKeyguardOccluded); } catch (RemoteException e) { @@ -973,15 +973,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - private void onRemoteAnimationFinishedOrCancelled(boolean cancel, - WindowContainerTransaction evictWct) { + private void onRemoteAnimationFinishedOrCancelled(WindowContainerTransaction evictWct) { mIsSplitEntering = false; mShouldUpdateRecents = true; mSplitRequest = null; // If any stage has no child after animation finished, it means that split will display // nothing, such status will happen if task and intent is same app but not support // multi-instance, we should exit split and expand that app as full screen. - if (!cancel && (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0)) { + if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) { mMainExecutor.execute(() -> exitSplitScreen(mMainStage.getChildCount() == 0 ? mSideStage : mMainStage, EXIT_REASON_UNKNOWN)); @@ -1236,8 +1235,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Notify recents if we are exiting in a way that breaks the pair, and disable further // updates to splits in the recents until we enter split again if (shouldBreakPairedTaskInRecents(exitReason) && mShouldUpdateRecents) { - recentTasks.removeSplitPair(mMainStage.getLastVisibleTaskId()); - recentTasks.removeSplitPair(mSideStage.getLastVisibleTaskId()); + recentTasks.removeSplitPair(mMainStage.getTopVisibleChildTaskId()); + recentTasks.removeSplitPair(mSideStage.getTopVisibleChildTaskId()); } }); mShouldUpdateRecents = false; @@ -1695,9 +1694,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSyncQueue.queue(wct); - mSyncQueue.runInSync(t -> { - setDividerVisibility(mainStageVisible, t); - }); + setDividerVisibility(mainStageVisible, null); } private void setDividerVisibility(boolean visible, @Nullable SurfaceControl.Transaction t) { @@ -1779,6 +1776,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationEnd(Animator animation) { + if (dividerLeash != null && dividerLeash.isValid()) { + transaction.setAlpha(dividerLeash, 1); + transaction.apply(); + } mTransactionPool.release(transaction); mDividerFadeInAnimator = null; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index 0359761388dc..a841b7f96d3c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -92,7 +92,6 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { protected SurfaceControl mDimLayer; protected SparseArray<ActivityManager.RunningTaskInfo> mChildrenTaskInfo = new SparseArray<>(); private final SparseArray<SurfaceControl> mChildrenLeashes = new SparseArray<>(); - private int mLastVisibleTaskId = INVALID_TASK_ID; // TODO(b/204308910): Extracts SplitDecorManager related code to common package. private SplitDecorManager mSplitDecorManager; @@ -124,13 +123,6 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } /** - * Returns the last visible task's id. - */ - int getLastVisibleTaskId() { - return mLastVisibleTaskId; - } - - /** * Returns the top visible child task's id. */ int getTopVisibleChildTaskId() { @@ -229,9 +221,6 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return; } mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); - if (taskInfo.isVisible && taskInfo.taskId != mLastVisibleTaskId) { - mLastVisibleTaskId = taskInfo.taskId; - } mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */, taskInfo.isVisible); if (!ENABLE_SHELL_TRANSITIONS) { @@ -264,9 +253,6 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } else if (mChildrenTaskInfo.contains(taskId)) { mChildrenTaskInfo.remove(taskId); mChildrenLeashes.remove(taskId); - if (taskId == mLastVisibleTaskId) { - mLastVisibleTaskId = INVALID_TASK_ID; - } mCallbacks.onChildTaskStatusChanged(taskId, false /* present */, taskInfo.isVisible); if (ENABLE_SHELL_TRANSITIONS) { // Status is managed/synchronized by the transition lifecycle. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java index 2981f5e160f6..9224b3cbd798 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java @@ -174,7 +174,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration); final TaskPositioner taskPositioner = - new TaskPositioner(mTaskOrganizer, windowDecoration); + new TaskPositioner(mTaskOrganizer, windowDecoration, mDisplayController); final CaptionTouchEventListener touchEventListener = new CaptionTouchEventListener(taskInfo, taskPositioner); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index de5f2f467e99..8dfa18ca2891 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -558,7 +558,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration); final TaskPositioner taskPositioner = - new TaskPositioner(mTaskOrganizer, windowDecoration, mDragStartListener); + new TaskPositioner(mTaskOrganizer, windowDecoration, mDisplayController, + mDragStartListener); final DesktopModeTouchEventListener touchEventListener = new DesktopModeTouchEventListener(taskInfo, taskPositioner); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java index d3f92277bf03..a3d364a0068e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java @@ -19,9 +19,11 @@ package com.android.wm.shell.windowdecor; import android.annotation.IntDef; import android.graphics.PointF; import android.graphics.Rect; +import android.util.DisplayMetrics; import android.window.WindowContainerTransaction; import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.common.DisplayController; class TaskPositioner implements DragPositioningCallback { @@ -35,6 +37,7 @@ class TaskPositioner implements DragPositioningCallback { static final int CTRL_TYPE_BOTTOM = 8; private final ShellTaskOrganizer mTaskOrganizer; + private final DisplayController mDisplayController; private final WindowDecoration mWindowDecoration; private final Rect mTaskBoundsAtDragStart = new Rect(); @@ -45,14 +48,16 @@ class TaskPositioner implements DragPositioningCallback { private int mCtrlType; private DragStartListener mDragStartListener; - TaskPositioner(ShellTaskOrganizer taskOrganizer, WindowDecoration windowDecoration) { - this(taskOrganizer, windowDecoration, dragStartListener -> {}); + TaskPositioner(ShellTaskOrganizer taskOrganizer, WindowDecoration windowDecoration, + DisplayController displayController) { + this(taskOrganizer, windowDecoration, displayController, dragStartListener -> {}); } TaskPositioner(ShellTaskOrganizer taskOrganizer, WindowDecoration windowDecoration, - DragStartListener dragStartListener) { + DisplayController displayController, DragStartListener dragStartListener) { mTaskOrganizer = taskOrganizer; mWindowDecoration = windowDecoration; + mDisplayController = displayController; mDragStartListener = dragStartListener; } @@ -128,15 +133,44 @@ class TaskPositioner implements DragPositioningCallback { mRepositionTaskBounds.offset((int) deltaX, (int) deltaY); } + // If width or height are negative or less than the minimum width or height, revert the + // respective bounds to use previous bound dimensions. + if (mRepositionTaskBounds.width() < getMinWidth()) { + mRepositionTaskBounds.right = oldRight; + mRepositionTaskBounds.left = oldLeft; + } + if (mRepositionTaskBounds.height() < getMinHeight()) { + mRepositionTaskBounds.top = oldTop; + mRepositionTaskBounds.bottom = oldBottom; + } + // If there are no changes to the bounds after checking new bounds against minimum width + // and height, do not set bounds and return false if (oldLeft == mRepositionTaskBounds.left && oldTop == mRepositionTaskBounds.top && oldRight == mRepositionTaskBounds.right && oldBottom == mRepositionTaskBounds.bottom) { return false; } + wct.setBounds(mWindowDecoration.mTaskInfo.token, mRepositionTaskBounds); return true; } + private float getMinWidth() { + return mWindowDecoration.mTaskInfo.minWidth < 0 ? getDefaultMinSize() + : mWindowDecoration.mTaskInfo.minWidth; + } + + private float getMinHeight() { + return mWindowDecoration.mTaskInfo.minHeight < 0 ? getDefaultMinSize() + : mWindowDecoration.mTaskInfo.minHeight; + } + + private float getDefaultMinSize() { + float density = mDisplayController.getDisplayLayout(mWindowDecoration.mTaskInfo.displayId) + .densityDpi() * DisplayMetrics.DENSITY_DEFAULT_SCALE; + return mWindowDecoration.mTaskInfo.defaultMinSize * density; + } + interface DragStartListener { /** * Inform the implementing class that a drag resize has started diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java index b6dbcf204364..523cb6629d9a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java @@ -48,7 +48,6 @@ import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; -import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; @@ -82,7 +81,7 @@ public class DragAndDropControllerTest extends ShellTestCase { @Mock private ShellExecutor mMainExecutor; @Mock - private SplitScreenController mSplitScreenController; + private WindowManager mWindowManager; private DragAndDropController mController; @@ -100,11 +99,6 @@ public class DragAndDropControllerTest extends ShellTestCase { } @Test - public void instantiateController_registerConfigChangeListener() { - verify(mShellController, times(1)).addConfigurationChangeListener(any()); - } - - @Test public void testIgnoreNonDefaultDisplays() { final int nonDefaultDisplayId = 12345; final View dragLayout = mock(View.class); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/TaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/TaskPositionerTest.kt index f185a8a80719..8f66f4e7e47b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/TaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/TaskPositionerTest.kt @@ -8,6 +8,8 @@ import android.testing.AndroidTestingRunner import android.window.WindowContainerToken import android.window.WindowContainerTransaction.Change.CHANGE_DRAG_RESIZING import androidx.test.filters.SmallTest +import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase import com.android.wm.shell.windowdecor.TaskPositioner.CTRL_TYPE_RIGHT @@ -45,6 +47,11 @@ class TaskPositionerTest : ShellTestCase() { @Mock private lateinit var taskBinder: IBinder + @Mock + private lateinit var mockDisplayController: DisplayController + @Mock + private lateinit var mockDisplayLayout: DisplayLayout + private lateinit var taskPositioner: TaskPositioner @Before @@ -54,12 +61,21 @@ class TaskPositionerTest : ShellTestCase() { taskPositioner = TaskPositioner( mockShellTaskOrganizer, mockWindowDecoration, + mockDisplayController, mockDragStartListener ) + `when`(taskToken.asBinder()).thenReturn(taskBinder) + `when`(mockDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mockDisplayLayout) + `when`(mockDisplayLayout.densityDpi()).thenReturn(DENSITY_DPI) + mockWindowDecoration.mTaskInfo = ActivityManager.RunningTaskInfo().apply { taskId = TASK_ID token = taskToken + minWidth = MIN_WIDTH + minHeight = MIN_HEIGHT + defaultMinSize = DEFAULT_MIN + displayId = DISPLAY_ID configuration.windowConfiguration.bounds = STARTING_BOUNDS } } @@ -209,8 +225,239 @@ class TaskPositionerTest : ShellTestCase() { }) } + @Test + fun testDragResize_resize_setBoundsDoesNotChangeHeightWhenLessThanMin() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Resize to width of 95px and height of 5px with min width of 10px + val newX = STARTING_BOUNDS.right.toFloat() - 5 + val newY = STARTING_BOUNDS.top.toFloat() + 95 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) + != 0) && change.configuration.windowConfiguration.bounds.top == + STARTING_BOUNDS.top && + change.configuration.windowConfiguration.bounds.bottom == + STARTING_BOUNDS.bottom + } + }) + } + + @Test + fun testDragResize_resize_setBoundsDoesNotChangeWidthWhenLessThanMin() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Resize to height of 95px and width of 5px with min width of 10px + val newX = STARTING_BOUNDS.right.toFloat() - 95 + val newY = STARTING_BOUNDS.top.toFloat() + 5 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) + != 0) && change.configuration.windowConfiguration.bounds.right == + STARTING_BOUNDS.right && + change.configuration.windowConfiguration.bounds.left == + STARTING_BOUNDS.left + } + }) + } + + @Test + fun testDragResize_resize_setBoundsDoesNotChangeHeightWhenNegative() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Resize to height of -5px and width of 95px + val newX = STARTING_BOUNDS.right.toFloat() - 5 + val newY = STARTING_BOUNDS.top.toFloat() + 105 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) + != 0) && change.configuration.windowConfiguration.bounds.top == + STARTING_BOUNDS.top && + change.configuration.windowConfiguration.bounds.bottom == + STARTING_BOUNDS.bottom + } + }) + } + + @Test + fun testDragResize_resize_setBoundsDoesNotChangeWidthWhenNegative() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Resize to width of -5px and height of 95px + val newX = STARTING_BOUNDS.right.toFloat() - 105 + val newY = STARTING_BOUNDS.top.toFloat() + 5 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) + != 0) && change.configuration.windowConfiguration.bounds.right == + STARTING_BOUNDS.right && + change.configuration.windowConfiguration.bounds.left == + STARTING_BOUNDS.left + } + }) + } + + @Test + fun testDragResize_resize_setBoundsRunsWhenResizeBoundsValid() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Shrink to height 20px and width 20px with both min height/width equal to 10px + val newX = STARTING_BOUNDS.right.toFloat() - 80 + val newY = STARTING_BOUNDS.top.toFloat() + 80 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0) + } + }) + } + + @Test + fun testDragResize_resize_setBoundsDoesNotRunWithNegativeHeightAndWidth() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Shrink to height 5px and width 5px with both min height/width equal to 10px + val newX = STARTING_BOUNDS.right.toFloat() - 95 + val newY = STARTING_BOUNDS.top.toFloat() + 95 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0) + } + }) + } + + @Test + fun testDragResize_resize_useDefaultMinWhenMinWidthInvalid() { + mockWindowDecoration.mTaskInfo.minWidth = -1 + + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Shrink to width and height of 3px with invalid minWidth = -1 and defaultMinSize = 5px + val newX = STARTING_BOUNDS.right.toFloat() - 97 + val newY = STARTING_BOUNDS.top.toFloat() + 97 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0) + } + }) + } + + @Test + fun testDragResize_resize_useMinWidthWhenValid() { + taskPositioner.onDragPositioningStart( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, // Resize right and top + STARTING_BOUNDS.right.toFloat(), + STARTING_BOUNDS.top.toFloat() + ) + + // Shrink to width and height of 7px with valid minWidth = 10px and defaultMinSize = 5px + val newX = STARTING_BOUNDS.right.toFloat() - 93 + val newY = STARTING_BOUNDS.top.toFloat() + 93 + taskPositioner.onDragPositioningMove( + newX, + newY + ) + + taskPositioner.onDragPositioningEnd(newX, newY) + + verify(mockShellTaskOrganizer, never()).applyTransaction(argThat { wct -> + return@argThat wct.changes.any { (token, change) -> + token == taskBinder && + ((change.windowSetMask and WindowConfiguration.WINDOW_CONFIG_BOUNDS) != 0) + } + }) + } + companion object { private const val TASK_ID = 5 + private const val MIN_WIDTH = 10 + private const val MIN_HEIGHT = 10 + private const val DENSITY_DPI = 20 + private const val DEFAULT_MIN = 40 + private const val DISPLAY_ID = 1 private val STARTING_BOUNDS = Rect(0, 0, 100, 100) } } diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 87e61b527477..d253dda61e5b 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -65,7 +65,7 @@ android_library { "src/**/*.kt", ], - min_sdk_version: "29", + min_sdk_version: "30", } diff --git a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java index 3b902757c43e..37ae2d45e614 100644 --- a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java +++ b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java @@ -55,6 +55,7 @@ public class IllustrationPreference extends Preference { private int mMaxHeight = SIZE_UNSPECIFIED; private int mImageResId; + private boolean mCacheComposition = true; private boolean mIsAutoScale; private Uri mImageUri; private Drawable mImageDrawable; @@ -133,6 +134,7 @@ public class IllustrationPreference extends Preference { lp.width = screenWidth < screenHeight ? screenWidth : screenHeight; illustrationFrame.setLayoutParams(lp); + illustrationView.setCacheComposition(mCacheComposition); handleImageWithAnimation(illustrationView); handleImageFrameMaxHeight(backgroundView, illustrationView); @@ -427,6 +429,8 @@ public class IllustrationPreference extends Preference { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LottieAnimationView, 0 /*defStyleAttr*/, 0 /*defStyleRes*/); mImageResId = a.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0); + mCacheComposition = a.getBoolean( + R.styleable.LottieAnimationView_lottie_cacheComposition, true); a = context.obtainStyledAttributes(attrs, R.styleable.IllustrationPreference, 0 /*defStyleAttr*/, 0 /*defStyleRes*/); diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index a28340e168fc..bcc2b67289f3 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Klein"</item> + <item msgid="1484561228522634915">"Verstek"</item> + <item msgid="4014311587094503943">"Groot"</item> + <item msgid="2904569270831156685">"Grootste"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index a201ab093ebe..4e97d478bc41 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ትንሽ"</item> + <item msgid="1484561228522634915">"ነባሪ"</item> + <item msgid="4014311587094503943">"ትልቅ"</item> + <item msgid="2904569270831156685">"በጣም ትልቅ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml index 7852b0429775..27a236b42cc6 100644 --- a/packages/SettingsLib/res/values-ar/arrays.xml +++ b/packages/SettingsLib/res/values-ar/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"صغير"</item> + <item msgid="1484561228522634915">"تلقائي"</item> + <item msgid="4014311587094503943">"كبير"</item> + <item msgid="2904569270831156685">"أكبر حجمًا"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index b273d8ea8276..1a35e7ad4407 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"সৰু"</item> + <item msgid="1484561228522634915">"ডিফ’ল্ট"</item> + <item msgid="4014311587094503943">"ডাঙৰ"</item> + <item msgid="2904569270831156685">"আটাইতকৈ ডাঙৰ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml index dc8be1d550b1..105cc2cd1a98 100644 --- a/packages/SettingsLib/res/values-az/arrays.xml +++ b/packages/SettingsLib/res/values-az/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Kiçik"</item> + <item msgid="1484561228522634915">"Defolt"</item> + <item msgid="4014311587094503943">"Böyük"</item> + <item msgid="2904569270831156685">"Ən böyük"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index 2fc7afbb3e2f..0a2235a81739 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Malo"</item> + <item msgid="1484561228522634915">"Podrazumevano"</item> + <item msgid="4014311587094503943">"Veliko"</item> + <item msgid="2904569270831156685">"Najveće"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index e180b44c5c53..8dcf2b5fbc9f 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Дробны"</item> + <item msgid="1484561228522634915">"Стандартны"</item> + <item msgid="4014311587094503943">"Вялікі"</item> + <item msgid="2904569270831156685">"Найвялікшы"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index cdad4ace231c..4e22cd3842e1 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Малък"</item> + <item msgid="1484561228522634915">"По подразбиране"</item> + <item msgid="4014311587094503943">"Голям"</item> + <item msgid="2904569270831156685">"Най-голям"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index 0d79aa7dc52a..5a2333b2829d 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"কম"</item> + <item msgid="1484561228522634915">"ডিফল্ট"</item> + <item msgid="4014311587094503943">"বেশি"</item> + <item msgid="2904569270831156685">"সবচেয়ে বড়"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index e0bfec50d1c3..d4cccbf8062b 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Petit"</item> + <item msgid="1484561228522634915">"Predeterminat"</item> + <item msgid="4014311587094503943">"Gran"</item> + <item msgid="2904569270831156685">"Més gran possible"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index f8cdb6817ec4..f6aae2b30dba 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Malé"</item> + <item msgid="1484561228522634915">"Výchozí"</item> + <item msgid="4014311587094503943">"Velké"</item> + <item msgid="2904569270831156685">"Největší"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 4d656cadefd3..fac21c722233 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Lille"</item> + <item msgid="1484561228522634915">"Standard"</item> + <item msgid="4014311587094503943">"Stor"</item> + <item msgid="2904569270831156685">"Størst"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index 250f0e4e6ad7..ce759c886524 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Klein"</item> + <item msgid="1484561228522634915">"Normal"</item> + <item msgid="4014311587094503943">"Groß"</item> + <item msgid="2904569270831156685">"Extragroß"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index cb6e2e9e011f..80219e422787 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Μικρό"</item> + <item msgid="1484561228522634915">"Προεπιλογή"</item> + <item msgid="4014311587094503943">"Μεγάλο"</item> + <item msgid="2904569270831156685">"Μεγαλύτερο"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index 5769c8dc98dd..96bca9d644df 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pequeño"</item> + <item msgid="1484561228522634915">"Predeterminado"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"Máxima"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index e2d9d331a15b..2788a3f23445 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pequeño"</item> + <item msgid="1484561228522634915">"Predeterminado"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"El más grande"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index fe97f345229f..753ce734a1c3 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -182,7 +182,7 @@ <string name="unknown" msgid="3544487229740637809">"Desconocido"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"Usuario: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"Se han establecido algunos valores predeterminados"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"No se han establecido valores predeterminados"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"No hay valores predeterminados"</string> <string name="tts_settings" msgid="8130616705989351312">"Ajustes de conversión de texto a voz"</string> <string name="tts_settings_title" msgid="7602210956640483039">"Salida de conversión de texto a voz"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"Velocidad de la voz"</string> diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml index cd07db1980fb..9e494c98c2ec 100644 --- a/packages/SettingsLib/res/values-et/arrays.xml +++ b/packages/SettingsLib/res/values-et/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Väike"</item> + <item msgid="1484561228522634915">"Vaikeseade"</item> + <item msgid="4014311587094503943">"Suur"</item> + <item msgid="2904569270831156685">"Suurim"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 35424c042507..8d23acad31ce 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Txikia"</item> + <item msgid="1484561228522634915">"Lehenetsia"</item> + <item msgid="4014311587094503943">"Handia"</item> + <item msgid="2904569270831156685">"Handiena"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index a3a6e48e0c97..ca4d1c9ee386 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"کوچک"</item> + <item msgid="1484561228522634915">"پیشفرض"</item> + <item msgid="4014311587094503943">"بزرگ"</item> + <item msgid="2904569270831156685">"بزرگترین"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index c7862e3ef961..cd4e16a07ed9 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pieni"</item> + <item msgid="1484561228522634915">"Oletus"</item> + <item msgid="4014311587094503943">"Suuri"</item> + <item msgid="2904569270831156685">"Suurin"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 70481476bb5b..69669ddbb388 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Petite"</item> + <item msgid="1484561228522634915">"Par défaut"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"La plus grande"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index 43274bb9fa86..411150880a78 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Petit"</item> + <item msgid="1484561228522634915">"Par défaut"</item> + <item msgid="4014311587094503943">"Grand"</item> + <item msgid="2904569270831156685">"Très grand"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index e8c5463b20be..2744a7014a10 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pequeno"</item> + <item msgid="1484561228522634915">"Predeterminado"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"O máis grande"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index ac485e11573a..e1cd0567be47 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"નાનું"</item> + <item msgid="1484561228522634915">"ડિફૉલ્ટ"</item> + <item msgid="4014311587094503943">"મોટું"</item> + <item msgid="2904569270831156685">"સૌથી મોટું"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index e7f68d99d509..be92797e2de8 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"छोटा"</item> + <item msgid="1484561228522634915">"डिफ़ॉल्ट"</item> + <item msgid="4014311587094503943">"बड़ा"</item> + <item msgid="2904569270831156685">"सबसे बड़ा"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index 28ae1b681010..58b65d1a1504 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Kicsi"</item> + <item msgid="1484561228522634915">"Alapértelmezett"</item> + <item msgid="4014311587094503943">"Nagy"</item> + <item msgid="2904569270831156685">"Legnagyobb"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml index 5787215418dc..9fa4a10f6590 100644 --- a/packages/SettingsLib/res/values-hy/arrays.xml +++ b/packages/SettingsLib/res/values-hy/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Փոքր"</item> + <item msgid="1484561228522634915">"Կանխադրված"</item> + <item msgid="4014311587094503943">"Մեծ"</item> + <item msgid="2904569270831156685">"Շատ մեծ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 6bb7e5d243b9..eadba8efe708 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Kecil"</item> + <item msgid="1484561228522634915">"Default"</item> + <item msgid="4014311587094503943">"Besar"</item> + <item msgid="2904569270831156685">"Terbesar"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml index 87433b712e7d..dc08b1f0f7d1 100644 --- a/packages/SettingsLib/res/values-is/arrays.xml +++ b/packages/SettingsLib/res/values-is/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Lítið"</item> + <item msgid="1484561228522634915">"Sjálfgefið"</item> + <item msgid="4014311587094503943">"Stórt"</item> + <item msgid="2904569270831156685">"Stærst"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index e68adb9e79d1..e91a7bf03642 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Piccolo"</item> + <item msgid="1484561228522634915">"Predefinito"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"Più grande"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index 6dd176574b79..c19b8213ec98 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"קטן"</item> + <item msgid="1484561228522634915">"ברירת מחדל"</item> + <item msgid="4014311587094503943">"גדול"</item> + <item msgid="2904569270831156685">"הכי גדול"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 385cfc904daf..41ec7ab647bf 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"小"</item> + <item msgid="1484561228522634915">"デフォルト"</item> + <item msgid="4014311587094503943">"大"</item> + <item msgid="2904569270831156685">"最大"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml index e800d458b228..54066790e247 100644 --- a/packages/SettingsLib/res/values-ka/arrays.xml +++ b/packages/SettingsLib/res/values-ka/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"პატარა"</item> + <item msgid="1484561228522634915">"ნაგულისხმევი"</item> + <item msgid="4014311587094503943">"დიდი"</item> + <item msgid="2904569270831156685">"უდიდესი"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml index fa828525276b..68caf967167c 100644 --- a/packages/SettingsLib/res/values-kk/arrays.xml +++ b/packages/SettingsLib/res/values-kk/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Кіші"</item> + <item msgid="1484561228522634915">"Әдепкі"</item> + <item msgid="4014311587094503943">"Үлкен"</item> + <item msgid="2904569270831156685">"Ең үлкен"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml index 52d82072d132..2f2208427595 100644 --- a/packages/SettingsLib/res/values-km/arrays.xml +++ b/packages/SettingsLib/res/values-km/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"តូច"</item> + <item msgid="1484561228522634915">"លំនាំដើម"</item> + <item msgid="4014311587094503943">"ធំ"</item> + <item msgid="2904569270831156685">"ធំបំផុត"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml index 1ad0948924c0..b4fbb3918a5d 100644 --- a/packages/SettingsLib/res/values-kn/arrays.xml +++ b/packages/SettingsLib/res/values-kn/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ಚಿಕ್ಕದು"</item> + <item msgid="1484561228522634915">"ಡೀಫಾಲ್ಟ್"</item> + <item msgid="4014311587094503943">"ದೊಡ್ಡದು"</item> + <item msgid="2904569270831156685">"ಅತಿ ದೊಡ್ಡದು"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 6e00b10820a4..02b3e805dc54 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"작게"</item> + <item msgid="1484561228522634915">"기본"</item> + <item msgid="4014311587094503943">"크게"</item> + <item msgid="2904569270831156685">"가장 크게"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index ec37e64758c6..08781dba0d7b 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Кичине"</item> + <item msgid="1484561228522634915">"Демейки"</item> + <item msgid="4014311587094503943">"Чоң"</item> + <item msgid="2904569270831156685">"Эң чоң"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index 3fe8330e05a6..4468b37eb328 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ນ້ອຍ"</item> + <item msgid="1484561228522634915">"ຄ່າເລີ່ມຕົ້ນ"</item> + <item msgid="4014311587094503943">"ໃຫຍ່"</item> + <item msgid="2904569270831156685">"ໃຫຍ່ທີ່ສຸດ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index 6b34af34866f..75f97d01dd3b 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Mažas"</item> + <item msgid="1484561228522634915">"Numatytasis"</item> + <item msgid="4014311587094503943">"Didelis"</item> + <item msgid="2904569270831156685">"Didžiausias"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index 16f107081f7a..2758dd641e10 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Mazs"</item> + <item msgid="1484561228522634915">"Noklusējuma"</item> + <item msgid="4014311587094503943">"Liels"</item> + <item msgid="2904569270831156685">"Vislielākais"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index d8b86be11b73..3c7b350a096a 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Мал"</item> + <item msgid="1484561228522634915">"Стандарден"</item> + <item msgid="4014311587094503943">"Голем"</item> + <item msgid="2904569270831156685">"Најголем"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml index bf6c67a8eb0d..865939316404 100644 --- a/packages/SettingsLib/res/values-ml/arrays.xml +++ b/packages/SettingsLib/res/values-ml/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ചെറുത്"</item> + <item msgid="1484561228522634915">"ഡിഫോൾട്ട്"</item> + <item msgid="4014311587094503943">"വലുത്"</item> + <item msgid="2904569270831156685">"ഏറ്റവും വലുത്"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index 776c5c3f111e..e37636767fde 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Жижиг"</item> + <item msgid="1484561228522634915">"Өгөгдмөл"</item> + <item msgid="4014311587094503943">"Том"</item> + <item msgid="2904569270831156685">"Хамгийн том"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 8b36c73f4f81..f3e78ce92947 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"लहान"</item> + <item msgid="1484561228522634915">"डीफॉल्ट"</item> + <item msgid="4014311587094503943">"मोठा"</item> + <item msgid="2904569270831156685">"सर्वात मोठा"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml index 2a1303bf5b6f..825ace769cbb 100644 --- a/packages/SettingsLib/res/values-ms/arrays.xml +++ b/packages/SettingsLib/res/values-ms/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Kecil"</item> + <item msgid="1484561228522634915">"Lalai"</item> + <item msgid="4014311587094503943">"Besar"</item> + <item msgid="2904569270831156685">"Terbesar"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml index 332dba045a43..fdf64e1675e4 100644 --- a/packages/SettingsLib/res/values-my/arrays.xml +++ b/packages/SettingsLib/res/values-my/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"သေး"</item> + <item msgid="1484561228522634915">"မူရင်း"</item> + <item msgid="4014311587094503943">"ကြီး"</item> + <item msgid="2904569270831156685">"အကြီးဆုံး"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index 80916e373acd..a76307447130 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Liten"</item> + <item msgid="1484561228522634915">"Standard"</item> + <item msgid="4014311587094503943">"Stor"</item> + <item msgid="2904569270831156685">"Størst"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index decf4f5b8212..b079227af256 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"सानो"</item> + <item msgid="1484561228522634915">"डिफल्ट"</item> + <item msgid="4014311587094503943">"ठुलो"</item> + <item msgid="2904569270831156685">"सबैभन्दा ठुलो"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index e827be16bcd4..2dc107545615 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Klein"</item> + <item msgid="1484561228522634915">"Standaard"</item> + <item msgid="4014311587094503943">"Groot"</item> + <item msgid="2904569270831156685">"Grootst"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml index fc783f037b71..b86d4f290b79 100644 --- a/packages/SettingsLib/res/values-or/arrays.xml +++ b/packages/SettingsLib/res/values-or/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ଛୋଟ"</item> + <item msgid="1484561228522634915">"ଡିଫଲ୍ଟ"</item> + <item msgid="4014311587094503943">"ବଡ଼"</item> + <item msgid="2904569270831156685">"ସବୁଠାରୁ ବଡ଼"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml index f0e839683054..4135a3078e2d 100644 --- a/packages/SettingsLib/res/values-pa/arrays.xml +++ b/packages/SettingsLib/res/values-pa/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"ਛੋਟਾ"</item> + <item msgid="1484561228522634915">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"</item> + <item msgid="4014311587094503943">"ਵੱਡਾ"</item> + <item msgid="2904569270831156685">"ਸਭ ਤੋਂ ਵੱਡਾ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index c2be21d93e64..830c7323570a 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Mały"</item> + <item msgid="1484561228522634915">"Domyślny"</item> + <item msgid="4014311587094503943">"Duży"</item> + <item msgid="2904569270831156685">"Największy"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml index 658b15307f47..5cbca900c8bb 100644 --- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pequeno"</item> + <item msgid="1484561228522634915">"Padrão"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"Maior"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 758bc327d09a..d9116fe49ada 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -151,7 +151,7 @@ <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Cancelar"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"A sincronização concede acesso aos seus contactos e ao histórico de chamadas quando tem uma ligação estabelecida."</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Não foi possível sincronizar com <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> - <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Não foi possível sincronizar com <xliff:g id="DEVICE_NAME">%1$s</xliff:g> devido a PIN ou chave de acesso incorreto."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Não foi possível sincronizar com <xliff:g id="DEVICE_NAME">%1$s</xliff:g> devido a PIN ou token de acesso incorreto."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"Não é possível comunicar com <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"Emparelhamento rejeitado por <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"Computador"</string> @@ -349,7 +349,7 @@ <string name="debug_app" msgid="8903350241392391766">"Selecionar a aplicação a depurar"</string> <string name="debug_app_not_set" msgid="1934083001283807188">"Nenhuma aplicação a depurar definida"</string> <string name="debug_app_set" msgid="6599535090477753651">"A depurar aplicação: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="select_application" msgid="2543228890535466325">"Selecionar aplicação"</string> + <string name="select_application" msgid="2543228890535466325">"Selecionar app"</string> <string name="no_application" msgid="9038334538870247690">"Nenhuma"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"Aguarde pelo depurador"</string> <string name="wait_for_debugger_summary" msgid="6846330006113363286">"A aplicação depurada aguarda a anexação do depurador antes da execução"</string> diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml index 658b15307f47..5cbca900c8bb 100644 --- a/packages/SettingsLib/res/values-pt/arrays.xml +++ b/packages/SettingsLib/res/values-pt/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Pequeno"</item> + <item msgid="1484561228522634915">"Padrão"</item> + <item msgid="4014311587094503943">"Grande"</item> + <item msgid="2904569270831156685">"Maior"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index b839c12a3825..743fae201a1b 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Mic"</item> + <item msgid="1484561228522634915">"Prestabilit"</item> + <item msgid="4014311587094503943">"Mare"</item> + <item msgid="2904569270831156685">"Cel mai mare"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index 707a34a27d50..53194f6bb551 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Мелкий"</item> + <item msgid="1484561228522634915">"По умолчанию"</item> + <item msgid="4014311587094503943">"Крупный"</item> + <item msgid="2904569270831156685">"Самый крупный"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml index 7a8e9ee8e3da..62b0e4c69c11 100644 --- a/packages/SettingsLib/res/values-si/arrays.xml +++ b/packages/SettingsLib/res/values-si/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"කුඩා"</item> + <item msgid="1484561228522634915">"පෙරනිමි"</item> + <item msgid="4014311587094503943">"විශාල"</item> + <item msgid="2904569270831156685">"විශාලතම"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml index 5ff15e7c1e1f..6c76469e4c44 100644 --- a/packages/SettingsLib/res/values-sk/arrays.xml +++ b/packages/SettingsLib/res/values-sk/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Malé"</item> + <item msgid="1484561228522634915">"Predvolené"</item> + <item msgid="4014311587094503943">"Veľké"</item> + <item msgid="2904569270831156685">"Najväčšie"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index f1e59e725cf5..ea96c2fc6b2b 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Majhna"</item> + <item msgid="1484561228522634915">"Privzeta"</item> + <item msgid="4014311587094503943">"Velika"</item> + <item msgid="2904569270831156685">"Največja"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml index 7bceea714e82..e818fb5840db 100644 --- a/packages/SettingsLib/res/values-sq/arrays.xml +++ b/packages/SettingsLib/res/values-sq/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"I vogël"</item> + <item msgid="1484561228522634915">"Parazgjedhja"</item> + <item msgid="4014311587094503943">"I madh"</item> + <item msgid="2904569270831156685">"Më i madhi"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index 36882c2fe2aa..b0506a10a4fe 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Мало"</item> + <item msgid="1484561228522634915">"Подразумевано"</item> + <item msgid="4014311587094503943">"Велико"</item> + <item msgid="2904569270831156685">"Највеће"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index 8061e9cb6237..5d1fa21c4e62 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Liten"</item> + <item msgid="1484561228522634915">"Standard"</item> + <item msgid="4014311587094503943">"Stor"</item> + <item msgid="2904569270831156685">"Störst"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index 862fe38f468d..49e3a24e97d2 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Ndogo"</item> + <item msgid="1484561228522634915">"Chaguomsingi"</item> + <item msgid="4014311587094503943">"Kubwa"</item> + <item msgid="2904569270831156685">"Kubwa zaidi"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml index 2f18e0765276..aa80661090ba 100644 --- a/packages/SettingsLib/res/values-ta/arrays.xml +++ b/packages/SettingsLib/res/values-ta/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"சிறியது"</item> + <item msgid="1484561228522634915">"இயல்பு"</item> + <item msgid="4014311587094503943">"பெரியது"</item> + <item msgid="2904569270831156685">"மிகப் பெரியது"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index ed5a6a6537b2..0fceab525e8d 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"చిన్నది"</item> + <item msgid="1484561228522634915">"ఆటోమేటిక్ సెట్టింగ్"</item> + <item msgid="4014311587094503943">"పెద్దది"</item> + <item msgid="2904569270831156685">"అతి పెద్దది"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index e0046fc074e1..8c23e6b72b7b 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"เล็ก"</item> + <item msgid="1484561228522634915">"ค่าเริ่มต้น"</item> + <item msgid="4014311587094503943">"ใหญ่"</item> + <item msgid="2904569270831156685">"ใหญ่ที่สุด"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 622587d7f83f..2b5f59519625 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Maliit"</item> + <item msgid="1484561228522634915">"Default"</item> + <item msgid="4014311587094503943">"Malaki"</item> + <item msgid="2904569270831156685">"Pinakamalaki"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index 99dca9e027fc..8ce7fa790698 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Küçük"</item> + <item msgid="1484561228522634915">"Varsayılan"</item> + <item msgid="4014311587094503943">"Büyük"</item> + <item msgid="2904569270831156685">"En büyük"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index 976a48757a32..9fc3536dc9d8 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Малий"</item> + <item msgid="1484561228522634915">"За умовчанням"</item> + <item msgid="4014311587094503943">"Великий"</item> + <item msgid="2904569270831156685">"Найбільший"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml index 39b7394b8ff3..c837c3c86f93 100644 --- a/packages/SettingsLib/res/values-ur/arrays.xml +++ b/packages/SettingsLib/res/values-ur/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"چھوٹا"</item> + <item msgid="1484561228522634915">"ڈیفالٹ"</item> + <item msgid="4014311587094503943">"بڑا"</item> + <item msgid="2904569270831156685">"سب سے بڑا"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml index 7605bdcb094b..27259f7894ec 100644 --- a/packages/SettingsLib/res/values-uz/arrays.xml +++ b/packages/SettingsLib/res/values-uz/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Kichik"</item> + <item msgid="1484561228522634915">"Birlamchi"</item> + <item msgid="4014311587094503943">"Yirik"</item> + <item msgid="2904569270831156685">"Eng katta"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml index 5306574d6406..22065ea4ab5b 100644 --- a/packages/SettingsLib/res/values-vi/arrays.xml +++ b/packages/SettingsLib/res/values-vi/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Nhỏ"</item> + <item msgid="1484561228522634915">"Mặc định"</item> + <item msgid="4014311587094503943">"Lớn"</item> + <item msgid="2904569270831156685">"Lớn nhất"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index ff3bac668bd6..c1fcda2df28a 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"小"</item> + <item msgid="1484561228522634915">"默认"</item> + <item msgid="4014311587094503943">"大"</item> + <item msgid="2904569270831156685">"最大"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml index baf6662b2f93..932011cde975 100644 --- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"小"</item> + <item msgid="1484561228522634915">"預設"</item> + <item msgid="4014311587094503943">"大"</item> + <item msgid="2904569270831156685">"最大"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index 1669e806a341..e8c530d208db 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"小"</item> + <item msgid="1484561228522634915">"預設"</item> + <item msgid="4014311587094503943">"大"</item> + <item msgid="2904569270831156685">"最大"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index d62e519c2225..bcc0da08c5da 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -273,12 +273,10 @@ </string-array> <string-array name="avatar_image_descriptions"> </string-array> - <!-- no translation found for entries_font_size:0 (9181293769180886675) --> - <!-- no translation found for entries_font_size:0 (6490061470416867723) --> - <!-- no translation found for entries_font_size:1 (1484561228522634915) --> - <!-- no translation found for entries_font_size:1 (3579015730662088893) --> - <!-- no translation found for entries_font_size:2 (4014311587094503943) --> - <!-- no translation found for entries_font_size:2 (1678068858001018666) --> - <!-- no translation found for entries_font_size:3 (2904569270831156685) --> - <!-- no translation found for entries_font_size:3 (490158884605093126) --> + <string-array name="entries_font_size"> + <item msgid="9181293769180886675">"Esincane"</item> + <item msgid="1484561228522634915">"Okuzenzakalelayo"</item> + <item msgid="4014311587094503943">"kobukhulu"</item> + <item msgid="2904569270831156685">"Obukhulukazi"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java index 2614644feb20..688fc720d058 100644 --- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java @@ -55,6 +55,7 @@ public class DreamBackend { public ComponentName settingsComponentName; public CharSequence description; public Drawable previewImage; + public boolean supportsComplications = false; @Override public String toString() { @@ -175,6 +176,7 @@ public class DreamBackend { if (dreamMetadata != null) { dreamInfo.settingsComponentName = dreamMetadata.settingsActivity; dreamInfo.previewImage = dreamMetadata.previewImage; + dreamInfo.supportsComplications = dreamMetadata.showComplications; } dreamInfos.add(dreamInfo); } diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java index 6a1cee3146a2..562d20d05429 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java +++ b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java @@ -224,6 +224,9 @@ public class EnableZenModeDialog { mMetricsLogger.logOnConditionSelected(); updateAlarmWarningText(tag.condition); } + tag.line1.setStateDescription( + isChecked ? buttonView.getContext().getString( + com.android.internal.R.string.selected) : null); } }); diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java b/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java index 87e97b17b914..abbdaa73c18e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java +++ b/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java @@ -196,6 +196,9 @@ public class ZenDurationDialog { if (isChecked) { tag.rb.setChecked(true); } + tag.line1.setStateDescription( + isChecked ? buttonView.getContext().getString( + com.android.internal.R.string.selected) : null); } }); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/EnableZenModeDialogTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/EnableZenModeDialogTest.java index 59d56747ec5d..6b81c1a6f794 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/EnableZenModeDialogTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/EnableZenModeDialogTest.java @@ -16,6 +16,8 @@ package com.android.settingslib.notification; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -78,6 +80,8 @@ public class EnableZenModeDialogTest { mController.mForeverId = Condition.newId(mContext).appendPath("forever").build(); when(mContext.getString(com.android.internal.R.string.zen_mode_forever)) .thenReturn("testSummary"); + when(mContext.getString(com.android.internal.R.string.selected)) + .thenReturn("selected"); NotificationManager.Policy alarmsEnabledPolicy = new NotificationManager.Policy( NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS, 0, 0, 0); doReturn(alarmsEnabledPolicy).when(mNotificationManager).getNotificationPolicy(); @@ -190,4 +194,25 @@ public class EnableZenModeDialogTest { // alarm warning should NOT be null assertNotNull(mController.computeAlarmWarningText(null)); } + + @Test + public void testAccessibility() { + mController.bindConditions(null); + EnableZenModeDialog.ConditionTag forever = mController.getConditionTagAt( + ZenDurationDialog.FOREVER_CONDITION_INDEX); + EnableZenModeDialog.ConditionTag countdown = mController.getConditionTagAt( + ZenDurationDialog.COUNTDOWN_CONDITION_INDEX); + EnableZenModeDialog.ConditionTag alwaysAsk = mController.getConditionTagAt( + ZenDurationDialog.ALWAYS_ASK_CONDITION_INDEX); + + forever.rb.setChecked(true); + assertThat(forever.line1.getStateDescription().toString()).isEqualTo("selected"); + assertThat(countdown.line1.getStateDescription()).isNull(); + assertThat(alwaysAsk.line1.getStateDescription()).isNull(); + + alwaysAsk.rb.setChecked(true); + assertThat(forever.line1.getStateDescription()).isNull(); + assertThat(countdown.line1.getStateDescription()).isNull(); + assertThat(alwaysAsk.line1.getStateDescription().toString()).isEqualTo("selected"); + } }
\ No newline at end of file diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/ZenDurationDialogTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/ZenDurationDialogTest.java index 437c0d4f4469..fc45e89a6dd5 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/ZenDurationDialogTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/ZenDurationDialogTest.java @@ -16,6 +16,8 @@ package com.android.settingslib.notification; +import static com.google.common.truth.Truth.assertThat; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; @@ -205,4 +207,27 @@ public class ZenDurationDialogTest { ZenDurationDialog.COUNTDOWN_CONDITION_INDEX); assertEquals(120, tag.countdownZenDuration); } + + @Test + public void testAccessibility() { + Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_DURATION, + Settings.Secure.ZEN_DURATION_FOREVER); + mController.setupDialog(mBuilder); + ZenDurationDialog.ConditionTag forever = mController.getConditionTagAt( + ZenDurationDialog.FOREVER_CONDITION_INDEX); + ZenDurationDialog.ConditionTag countdown = mController.getConditionTagAt( + ZenDurationDialog.COUNTDOWN_CONDITION_INDEX); + ZenDurationDialog.ConditionTag alwaysAsk = mController.getConditionTagAt( + ZenDurationDialog.ALWAYS_ASK_CONDITION_INDEX); + + forever.rb.setChecked(true); + assertThat(forever.line1.getStateDescription().toString()).isEqualTo("selected"); + assertThat(countdown.line1.getStateDescription()).isNull(); + assertThat(alwaysAsk.line1.getStateDescription()).isNull(); + + alwaysAsk.rb.setChecked(true); + assertThat(forever.line1.getStateDescription()).isNull(); + assertThat(countdown.line1.getStateDescription()).isNull(); + assertThat(alwaysAsk.line1.getStateDescription().toString()).isEqualTo("selected"); + } }
\ No newline at end of file diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableImageView.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableImageView.kt index a1d9d90523eb..e42b589f05cf 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableImageView.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableImageView.kt @@ -24,7 +24,7 @@ import com.android.systemui.animation.LaunchableView import com.android.systemui.animation.LaunchableViewDelegate /** An [ImageView] that also implements [LaunchableView]. */ -class LaunchableImageView : ImageView, LaunchableView { +open class LaunchableImageView : ImageView, LaunchableView { private val delegate = LaunchableViewDelegate( this, diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableTextView.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableTextView.kt index 286996dcaeaa..147669528c5e 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableTextView.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/view/LaunchableTextView.kt @@ -24,7 +24,7 @@ import com.android.systemui.animation.LaunchableView import com.android.systemui.animation.LaunchableViewDelegate /** A [TextView] that also implements [LaunchableView]. */ -class LaunchableTextView : TextView, LaunchableView { +open class LaunchableTextView : TextView, LaunchableView { private val delegate = LaunchableViewDelegate( this, diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/DumpableNotRegisteredDetector.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/DumpableNotRegisteredDetector.kt new file mode 100644 index 000000000000..30e2a2527a93 --- /dev/null +++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/DumpableNotRegisteredDetector.kt @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.systemui.lint + +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.Context +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Location +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import com.android.tools.lint.detector.api.SourceCodeScanner +import com.intellij.psi.PsiMethod +import org.jetbrains.uast.UCallExpression +import org.jetbrains.uast.UClass + +/** + * Checks if any class has implemented the `Dumpable` interface but has not registered itself with + * the `DumpManager`. + */ +@Suppress("UnstableApiUsage") +class DumpableNotRegisteredDetector : Detector(), SourceCodeScanner { + + private var isDumpable: Boolean = false + private var isCoreStartable: Boolean = false + private var hasRegisterCall: Boolean = false + private var classLocation: Location? = null + + override fun beforeCheckFile(context: Context) { + isDumpable = false + isCoreStartable = false + hasRegisterCall = false + classLocation = null + } + + override fun applicableSuperClasses(): List<String> { + return listOf(DUMPABLE_CLASS_NAME) + } + + override fun getApplicableMethodNames(): List<String> { + return listOf("registerDumpable", "registerNormalDumpable", "registerCriticalDumpable") + } + + override fun visitClass(context: JavaContext, declaration: UClass) { + if (declaration.isInterface || context.evaluator.isAbstract(declaration)) { + // Don't require interfaces or abstract classes to call `register` (assume the full + // implementations will call it). This also means that we correctly don't warn for the + // `Dumpable` interface itself. + return + } + + classLocation = context.getNameLocation(declaration) + + val superTypeClassNames = declaration.superTypes.mapNotNull { it.resolve()?.qualifiedName } + isDumpable = superTypeClassNames.contains(DUMPABLE_CLASS_NAME) + isCoreStartable = superTypeClassNames.contains(CORE_STARTABLE_CLASS_NAME) + } + + override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) { + if (context.evaluator.isMemberInSubClassOf(method, DUMP_MANAGER_CLASS_NAME)) { + hasRegisterCall = true + } + } + + override fun afterCheckFile(context: Context) { + if (!isDumpable) { + return + } + if (isDumpable && isCoreStartable) { + // CoreStartables will be automatically registered, so classes that implement + // CoreStartable do not need a `register` call. + return + } + + if (!hasRegisterCall) { + context.report( + issue = ISSUE, + location = classLocation!!, + message = + "Any class implementing `Dumpable` must call " + + "`DumpManager.registerNormalDumpable` or " + + "`DumpManager.registerCriticalDumpable`", + ) + } + } + + companion object { + @JvmField + val ISSUE: Issue = + Issue.create( + id = "DumpableNotRegistered", + briefDescription = "Dumpable not registered with DumpManager.", + explanation = + """ + This class has implemented the `Dumpable` interface, but it has not registered \ + itself with the `DumpManager`. This means that the class will never actually \ + be dumped. Please call `DumpManager.registerNormalDumpable` or \ + `DumpManager.registerCriticalDumpable` in the class's constructor or \ + initialization method.""", + category = Category.CORRECTNESS, + priority = 8, + severity = Severity.WARNING, + implementation = + Implementation(DumpableNotRegisteredDetector::class.java, Scope.JAVA_FILE_SCOPE) + ) + + private const val DUMPABLE_CLASS_NAME = "com.android.systemui.Dumpable" + private const val CORE_STARTABLE_CLASS_NAME = "com.android.systemui.CoreStartable" + private const val DUMP_MANAGER_CLASS_NAME = "com.android.systemui.dump.DumpManager" + } +} diff --git a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt index 254a6fb4714f..84f70502fa45 100644 --- a/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt +++ b/packages/SystemUI/checks/src/com/android/internal/systemui/lint/SystemUIIssueRegistry.kt @@ -32,6 +32,7 @@ class SystemUIIssueRegistry : IssueRegistry() { BindServiceOnMainThreadDetector.ISSUE, BroadcastSentViaContextDetector.ISSUE, CleanArchitectureDependencyViolationDetector.ISSUE, + DumpableNotRegisteredDetector.ISSUE, SlowUserQueryDetector.ISSUE_SLOW_USER_ID_QUERY, SlowUserQueryDetector.ISSUE_SLOW_USER_INFO_QUERY, NonInjectedMainThreadDetector.ISSUE, diff --git a/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/DumpableNotRegisteredDetectorTest.kt b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/DumpableNotRegisteredDetectorTest.kt new file mode 100644 index 000000000000..3d6cbc749569 --- /dev/null +++ b/packages/SystemUI/checks/tests/com/android/internal/systemui/lint/DumpableNotRegisteredDetectorTest.kt @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.systemui.lint + +import com.android.tools.lint.checks.infrastructure.TestFiles +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Issue +import org.junit.Test + +@Suppress("UnstableApiUsage") +class DumpableNotRegisteredDetectorTest : SystemUILintDetectorTest() { + override fun getDetector(): Detector = DumpableNotRegisteredDetector() + + override fun getIssues(): List<Issue> = listOf(DumpableNotRegisteredDetector.ISSUE) + + @Test + fun classIsNotDumpable_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + class SomeClass() { + } + """.trimIndent() + ), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + @Test + fun classIsDumpable_andRegisterIsCalled_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + import com.android.systemui.dump.DumpManager; + + public class SomeClass implements Dumpable { + SomeClass(DumpManager dumpManager) { + dumpManager.registerDumpable(this); + } + + @Override + void dump(PrintWriter pw, String[] args) { + pw.println("testDump"); + } + } + """.trimIndent() + ), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + @Test + fun classIsDumpable_andRegisterNormalIsCalled_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + import com.android.systemui.dump.DumpManager; + + public class SomeClass implements Dumpable { + SomeClass(DumpManager dumpManager) { + dumpManager.registerNormalDumpable(this); + } + + @Override + void dump(PrintWriter pw, String[] args) { + pw.println("testDump"); + } + } + """.trimIndent() + ), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + @Test + fun classIsDumpable_andRegisterCriticalIsCalled_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + import com.android.systemui.dump.DumpManager; + + public class SomeClass implements Dumpable { + SomeClass(DumpManager dumpManager) { + dumpManager.registerCriticalDumpable(this); + } + + @Override + void dump(PrintWriter pw, String[] args) { + pw.println("testDump"); + } + } + """.trimIndent() + ), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + @Test + fun classIsDumpable_noRegister_violation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + + public class SomeClass implements Dumpable { + @Override + public void dump() { + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expect( + (""" + src/test/pkg/SomeClass.java:5: Warning: Any class implementing Dumpable must call DumpManager.registerNormalDumpable or DumpManager.registerCriticalDumpable [DumpableNotRegistered] + public class SomeClass implements Dumpable { + ~~~~~~~~~ + 0 errors, 1 warnings + """) + .trimIndent() + ) + } + + @Test + fun classIsDumpable_usesNotDumpManagerMethod_violation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + import com.android.systemui.OtherRegistrationObject; + + public class SomeClass implements Dumpable { + public SomeClass(OtherRegistrationObject otherRegistrationObject) { + otherRegistrationObject.registerDumpable(this); + } + @Override + public void dump() { + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expect( + (""" + src/test/pkg/SomeClass.java:6: Warning: Any class implementing Dumpable must call DumpManager.registerNormalDumpable or DumpManager.registerCriticalDumpable [DumpableNotRegistered] + public class SomeClass implements Dumpable { + ~~~~~~~~~ + 0 errors, 1 warnings + """) + .trimIndent() + ) + } + + @Test + fun classIsDumpableAndCoreStartable_noRegister_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + import com.android.systemui.CoreStartable; + + public class SomeClass implements Dumpable, CoreStartable { + @Override + public void start() { + } + + @Override + public void dump() { + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + @Test + fun classIsAbstract_noRegister_noViolation() { + lint() + .files( + TestFiles.java( + """ + package test.pkg; + + import com.android.systemui.Dumpable; + + public abstract class SomeClass implements Dumpable { + void abstractMethodHere(); + + @Override + public void dump() { + } + } + """ + ) + .indented(), + *stubs, + ) + .issues(DumpableNotRegisteredDetector.ISSUE) + .run() + .expectClean() + } + + companion object { + private val DUMPABLE_STUB = + TestFiles.java( + """ + package com.android.systemui; + + import com.android.systemui.dump.DumpManager; + import java.io.PrintWriter; + + public interface Dumpable { + void dump(); + } + """ + ) + .indented() + + private val DUMP_MANAGER_STUB = + TestFiles.java( + """ + package com.android.systemui.dump; + + public interface DumpManager { + void registerDumpable(Dumpable module); + void registerNormalDumpable(Dumpable module); + void registerCriticalDumpable(Dumpable module); + } + """ + ) + .indented() + + private val OTHER_REGISTRATION_OBJECT_STUB = + TestFiles.java( + """ + package com.android.systemui; + + public interface OtherRegistrationObject { + void registerDumpable(Dumpable module); + } + """ + ) + .indented() + + private val CORE_STARTABLE_STUB = + TestFiles.java( + """ + package com.android.systemui; + + public interface CoreStartable { + void start(); + } + """ + ) + .indented() + + private val stubs = + arrayOf( + DUMPABLE_STUB, + DUMP_MANAGER_STUB, + OTHER_REGISTRATION_OBJECT_STUB, + CORE_STARTABLE_STUB, + ) + } +} diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index ab36d5899739..00c0a0b3e7b3 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -38,6 +38,7 @@ import kotlinx.coroutines.launch private val TAG = ClockRegistry::class.simpleName!! private const val DEBUG = true +private val KEY_TIMESTAMP = "appliedTimestamp" /** ClockRegistry aggregates providers and plugins */ open class ClockRegistry( @@ -134,9 +135,9 @@ open class ClockRegistry( assertNotMainThread() try { - value?._applied_timestamp = System.currentTimeMillis() - val json = ClockSettings.serialize(value) + value?.metadata?.put(KEY_TIMESTAMP, System.currentTimeMillis()) + val json = ClockSettings.serialize(value) if (handleAllUsers) { Settings.Secure.putStringForUser( context.contentResolver, @@ -172,7 +173,7 @@ open class ClockRegistry( clockChangeListeners.forEach(func) } - private fun mutateSetting(mutator: (ClockSettings) -> ClockSettings) { + public fun mutateSetting(mutator: (ClockSettings) -> ClockSettings) { scope.launch(bgDispatcher) { applySettings(mutator(settings ?: ClockSettings())) } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt index 2a40f5c70420..4df7a44d3e1d 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt @@ -95,7 +95,7 @@ class DefaultClockController( open inner class DefaultClockFaceController( override val view: AnimatableClockView, - val seedColor: Int?, + var seedColor: Int?, ) : ClockFaceController { // MAGENTA is a placeholder, and will be assigned correctly in initialize @@ -111,9 +111,9 @@ class DefaultClockController( init { if (seedColor != null) { - currentColor = seedColor + currentColor = seedColor!! } - view.setColors(currentColor, currentColor) + view.setColors(DOZE_COLOR, currentColor) } override val events = @@ -141,7 +141,7 @@ class DefaultClockController( fun updateColor() { val color = if (seedColor != null) { - seedColor + seedColor!! } else if (isRegionDark) { resources.getColor(android.R.color.system_accent1_100) } else { @@ -194,6 +194,14 @@ class DefaultClockController( smallClock.updateColor() } + override fun onSeedColorChanged(seedColor: Int?) { + largeClock.seedColor = seedColor + smallClock.seedColor = seedColor + + largeClock.updateColor() + smallClock.updateColor() + } + override fun onLocaleChanged(locale: Locale) { val nf = NumberFormat.getInstance(locale) if (nf.format(FORMAT_NUMBER.toLong()) == burmeseNumerals) { diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt index 1c2f38beb867..babe5700a01c 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt @@ -112,8 +112,11 @@ interface ClockEvents { /** Call whenever the color palette should update */ fun onColorPaletteChanged(resources: Resources) {} + /** Call if the seed color has changed and should be updated */ + fun onSeedColorChanged(seedColor: Int?) {} + /** Call whenever the weather data should update */ - fun onWeatherDataChanged(data: Weather) {} + fun onWeatherDataChanged(data: WeatherData) {} } /** Methods which trigger various clock animations */ @@ -189,12 +192,13 @@ data class ClockSettings( val clockId: ClockId? = null, val seedColor: Int? = null, ) { - var _applied_timestamp: Long? = null + // Exclude metadata from equality checks + var metadata: JSONObject = JSONObject() companion object { private val KEY_CLOCK_ID = "clockId" private val KEY_SEED_COLOR = "seedColor" - private val KEY_TIMESTAMP = "_applied_timestamp" + private val KEY_METADATA = "metadata" fun serialize(setting: ClockSettings?): String { if (setting == null) { @@ -204,7 +208,7 @@ data class ClockSettings( return JSONObject() .put(KEY_CLOCK_ID, setting.clockId) .put(KEY_SEED_COLOR, setting.seedColor) - .put(KEY_TIMESTAMP, setting._applied_timestamp) + .put(KEY_METADATA, setting.metadata) .toString() } @@ -216,11 +220,11 @@ data class ClockSettings( val json = JSONObject(jsonStr) val result = ClockSettings( - json.getString(KEY_CLOCK_ID), + if (!json.isNull(KEY_CLOCK_ID)) json.getString(KEY_CLOCK_ID) else null, if (!json.isNull(KEY_SEED_COLOR)) json.getInt(KEY_SEED_COLOR) else null ) - if (!json.isNull(KEY_TIMESTAMP)) { - result._applied_timestamp = json.getLong(KEY_TIMESTAMP) + if (!json.isNull(KEY_METADATA)) { + result.metadata = json.getJSONObject(KEY_METADATA) } return result } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt deleted file mode 100644 index 302f17556bc7..000000000000 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.android.systemui.plugins - -import android.os.Bundle - -class Weather(val conditions: WeatherStateIcon, val temperature: Int, val isCelsius: Boolean) { - companion object { - private const val TAG = "Weather" - private const val WEATHER_STATE_ICON_KEY = "weather_state_icon_extra_key" - private const val TEMPERATURE_VALUE_KEY = "temperature_value_extra_key" - private const val TEMPERATURE_UNIT_KEY = "temperature_unit_extra_key" - private const val INVALID_TEMPERATURE = Int.MIN_VALUE - - fun fromBundle(extras: Bundle): Weather? { - val icon = - WeatherStateIcon.fromInt( - extras.getInt(WEATHER_STATE_ICON_KEY, WeatherStateIcon.UNKNOWN_ICON.id) - ) - if (icon == null || icon == WeatherStateIcon.UNKNOWN_ICON) { - return null - } - val temperature = extras.getInt(TEMPERATURE_VALUE_KEY, INVALID_TEMPERATURE) - if (temperature == INVALID_TEMPERATURE) { - return null - } - return Weather(icon, temperature, extras.getBoolean(TEMPERATURE_UNIT_KEY)) - } - } - - enum class WeatherStateIcon(val id: Int) { - UNKNOWN_ICON(0), - - // Clear, day & night. - SUNNY(1), - CLEAR_NIGHT(2), - - // Mostly clear, day & night. - MOSTLY_SUNNY(3), - MOSTLY_CLEAR_NIGHT(4), - - // Partly cloudy, day & night. - PARTLY_CLOUDY(5), - PARTLY_CLOUDY_NIGHT(6), - - // Mostly cloudy, day & night. - MOSTLY_CLOUDY_DAY(7), - MOSTLY_CLOUDY_NIGHT(8), - CLOUDY(9), - HAZE_FOG_DUST_SMOKE(10), - DRIZZLE(11), - HEAVY_RAIN(12), - SHOWERS_RAIN(13), - - // Scattered showers, day & night. - SCATTERED_SHOWERS_DAY(14), - SCATTERED_SHOWERS_NIGHT(15), - - // Isolated scattered thunderstorms, day & night. - ISOLATED_SCATTERED_TSTORMS_DAY(16), - ISOLATED_SCATTERED_TSTORMS_NIGHT(17), - STRONG_TSTORMS(18), - BLIZZARD(19), - BLOWING_SNOW(20), - FLURRIES(21), - HEAVY_SNOW(22), - - // Scattered snow showers, day & night. - SCATTERED_SNOW_SHOWERS_DAY(23), - SCATTERED_SNOW_SHOWERS_NIGHT(24), - SNOW_SHOWERS_SNOW(25), - MIXED_RAIN_HAIL_RAIN_SLEET(26), - SLEET_HAIL(27), - TORNADO(28), - TROPICAL_STORM_HURRICANE(29), - WINDY_BREEZY(30), - WINTRY_MIX_RAIN_SNOW(31); - - companion object { - fun fromInt(value: Int) = values().firstOrNull { it.id == value } - } - } - - override fun toString(): String { - return "$conditions $temperature${if (isCelsius) "C" else "F"}" - } -} diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt new file mode 100644 index 000000000000..52dfc55c105d --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt @@ -0,0 +1,107 @@ +package com.android.systemui.plugins + +import android.os.Bundle +import androidx.annotation.VisibleForTesting + +class WeatherData +private constructor( + val description: String, + val state: WeatherStateIcon, + val useCelsius: Boolean, + val temperature: Int, +) { + companion object { + private const val TAG = "WeatherData" + @VisibleForTesting const val DESCRIPTION_KEY = "description" + @VisibleForTesting const val STATE_KEY = "state" + @VisibleForTesting const val USE_CELSIUS_KEY = "use_celsius" + @VisibleForTesting const val TEMPERATURE_KEY = "temperature" + private const val INVALID_WEATHER_ICON_STATE = -1 + + fun fromBundle(extras: Bundle): WeatherData? { + val description = extras.getString(DESCRIPTION_KEY) + val state = + WeatherStateIcon.fromInt(extras.getInt(STATE_KEY, INVALID_WEATHER_ICON_STATE)) + val temperature = readIntFromBundle(extras, TEMPERATURE_KEY) + return if ( + description == null || + state == null || + !extras.containsKey(USE_CELSIUS_KEY) || + temperature == null + ) + null + else + WeatherData( + description = description, + state = state, + useCelsius = extras.getBoolean(USE_CELSIUS_KEY), + temperature = temperature + ) + } + + private fun readIntFromBundle(extras: Bundle, key: String): Int? = + try { + extras.getString(key).toInt() + } catch (e: Exception) { + null + } + } + + enum class WeatherStateIcon(val id: Int) { + UNKNOWN_ICON(0), + + // Clear, day & night. + SUNNY(1), + CLEAR_NIGHT(2), + + // Mostly clear, day & night. + MOSTLY_SUNNY(3), + MOSTLY_CLEAR_NIGHT(4), + + // Partly cloudy, day & night. + PARTLY_CLOUDY(5), + PARTLY_CLOUDY_NIGHT(6), + + // Mostly cloudy, day & night. + MOSTLY_CLOUDY_DAY(7), + MOSTLY_CLOUDY_NIGHT(8), + CLOUDY(9), + HAZE_FOG_DUST_SMOKE(10), + DRIZZLE(11), + HEAVY_RAIN(12), + SHOWERS_RAIN(13), + + // Scattered showers, day & night. + SCATTERED_SHOWERS_DAY(14), + SCATTERED_SHOWERS_NIGHT(15), + + // Isolated scattered thunderstorms, day & night. + ISOLATED_SCATTERED_TSTORMS_DAY(16), + ISOLATED_SCATTERED_TSTORMS_NIGHT(17), + STRONG_TSTORMS(18), + BLIZZARD(19), + BLOWING_SNOW(20), + FLURRIES(21), + HEAVY_SNOW(22), + + // Scattered snow showers, day & night. + SCATTERED_SNOW_SHOWERS_DAY(23), + SCATTERED_SNOW_SHOWERS_NIGHT(24), + SNOW_SHOWERS_SNOW(25), + MIXED_RAIN_HAIL_RAIN_SLEET(26), + SLEET_HAIL(27), + TORNADO(28), + TROPICAL_STORM_HURRICANE(29), + WINDY_BREEZY(30), + WINTRY_MIX_RAIN_SNOW(31); + + companion object { + fun fromInt(value: Int) = values().firstOrNull { it.id == value } + } + } + + override fun toString(): String { + val unit = if (useCelsius) "C" else "F" + return "$state (\"$description\") $temperature°$unit" + } +} diff --git a/packages/SystemUI/res/drawable/controls_panel_background.xml b/packages/SystemUI/res/drawable/controls_panel_background.xml index 9092877fc6fa..fc108a5e1e06 100644 --- a/packages/SystemUI/res/drawable/controls_panel_background.xml +++ b/packages/SystemUI/res/drawable/controls_panel_background.xml @@ -18,5 +18,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#1F1F1F" /> - <corners android:radius="@dimen/notification_corner_radius" /> + <corners android:radius="@dimen/controls_panel_corner_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/qs_footer_edit_circle.xml b/packages/SystemUI/res/drawable/qs_footer_edit_circle.xml new file mode 100644 index 000000000000..2e29cae0ca4f --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_footer_edit_circle.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 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. + --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:inset="@dimen/qs_footer_action_inset"> + <ripple + android:color="?android:attr/colorControlHighlight"> + <item android:id="@android:id/mask"> + <!-- We make this shape a rounded rectangle instead of a oval so that it can animate --> + <!-- properly into an app/dialog. --> + <shape android:shape="rectangle"> + <solid android:color="@android:color/white"/> + <corners android:radius="@dimen/qs_footer_action_corner_radius"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/qs_footer_action_corner_radius"/> + </shape> + </item> + + </ripple> +</inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/statusbar_chip_bg.xml b/packages/SystemUI/res/drawable/statusbar_chip_bg.xml new file mode 100644 index 000000000000..d7de16d7c5bb --- /dev/null +++ b/packages/SystemUI/res/drawable/statusbar_chip_bg.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2023 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. +--> + +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <solid android:color="?androidprv:attr/colorAccentPrimary" /> + <corners android:radius="@dimen/ongoing_appops_chip_bg_corner_radius" /> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/privacy_chip_bg.xml b/packages/SystemUI/res/drawable/statusbar_privacy_chip_bg.xml index 99c0ab4b6220..99c0ab4b6220 100644 --- a/packages/SystemUI/res/drawable/privacy_chip_bg.xml +++ b/packages/SystemUI/res/drawable/statusbar_privacy_chip_bg.xml diff --git a/packages/SystemUI/res/layout/battery_status_chip.xml b/packages/SystemUI/res/layout/battery_status_chip.xml new file mode 100644 index 000000000000..ff68ac0f9a71 --- /dev/null +++ b/packages/SystemUI/res/layout/battery_status_chip.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + Copyright (C) 2023 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. +--> + + +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center_vertical|end" + tools:parentTag="com.android.systemui.statusbar.BatteryStatusChip"> + + <LinearLayout + android:id="@+id/rounded_container" + android:layout_width="wrap_content" + android:layout_height="@dimen/ongoing_appops_chip_height" + android:layout_gravity="center" + android:background="@drawable/statusbar_chip_bg" + android:clipToOutline="true" + android:gravity="center" + android:maxWidth="@dimen/ongoing_appops_chip_max_width" + android:minWidth="@dimen/ongoing_appops_chip_min_width"> + + <com.android.systemui.battery.BatteryMeterView + android:id="@+id/battery_meter_view" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_marginHorizontal="10dp" /> + + </LinearLayout> +</merge>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml index d68982876448..dffe40b8454a 100644 --- a/packages/SystemUI/res/layout/combined_qs_header.xml +++ b/packages/SystemUI/res/layout/combined_qs_header.xml @@ -141,11 +141,14 @@ android:layout_width="wrap_content" android:layout_height="@dimen/large_screen_shade_header_min_height" android:gravity="center" - app:layout_constraintEnd_toEndOf="@id/end_guide" - app:layout_constraintTop_toTopOf="@id/date" app:layout_constraintBottom_toBottomOf="@id/date" - > - <include layout="@layout/ongoing_privacy_chip"/> + app:layout_constraintEnd_toEndOf="@id/end_guide" + app:layout_constraintTop_toTopOf="@id/date"> + + <com.android.systemui.privacy.OngoingPrivacyChip + android:layout_width="wrap_content" + android:layout_height="match_parent" /> + </FrameLayout> </com.android.systemui.util.NoRemeasureMotionLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/controls_fullscreen.xml b/packages/SystemUI/res/layout/controls_fullscreen.xml index e08e63b39e59..fa703038cc7e 100644 --- a/packages/SystemUI/res/layout/controls_fullscreen.xml +++ b/packages/SystemUI/res/layout/controls_fullscreen.xml @@ -15,19 +15,11 @@ limitations under the License. --> -<FrameLayout +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/control_detail_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> - - <LinearLayout - android:id="@+id/global_actions_controls" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:paddingHorizontal="@dimen/controls_padding_horizontal" /> - -</FrameLayout> +</LinearLayout> diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml index aa211bf8cfdc..71561c07ebd3 100644 --- a/packages/SystemUI/res/layout/controls_with_favorites.xml +++ b/packages/SystemUI/res/layout/controls_with_favorites.xml @@ -13,82 +13,94 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<merge - xmlns:android="http://schemas.android.com/apk/res/android"> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:orientation="vertical" + tools:parentTag="android.widget.LinearLayout"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginBottom="@dimen/controls_header_bottom_margin"> - - <!-- make sure the header stays centered in the layout by adding a spacer --> - <Space - android:id="@+id/controls_spacer" - android:layout_width="@dimen/controls_header_menu_size" - android:layout_height="1dp" - android:visibility="gone" /> - - <ImageView - android:id="@+id/controls_close" - android:contentDescription="@string/accessibility_desc_close" - android:src="@drawable/ic_close" - android:background="?android:attr/selectableItemBackgroundBorderless" - android:tint="@color/control_primary_text" - android:layout_width="@dimen/controls_header_menu_size" - android:layout_height="@dimen/controls_header_menu_size" - android:padding="12dp" - android:visibility="gone" /> - <!-- need to keep this outer view in order to have a correctly sized anchor - for the dropdown menu, as well as dropdown background in the right place --> <LinearLayout - android:id="@+id/controls_header" - android:orientation="horizontal" - android:layout_width="0dp" - android:layout_weight="1" - android:minHeight="48dp" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center"> - <TextView - style="@style/Control.Spinner.Header" - android:clickable="false" - android:id="@+id/app_or_structure_spinner" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" /> + android:paddingHorizontal="@dimen/controls_header_horizontal_padding" + android:layout_marginBottom="@dimen/controls_header_bottom_margin" + android:orientation="horizontal"> + + <!-- make sure the header stays centered in the layout by adding a spacer --> + <Space + android:id="@+id/controls_spacer" + android:layout_width="@dimen/controls_header_menu_button_size" + android:layout_height="1dp" + android:visibility="gone" /> + + <ImageView + android:id="@+id/controls_close" + android:layout_width="@dimen/controls_header_menu_button_size" + android:layout_height="@dimen/controls_header_menu_button_size" + android:layout_gravity="center_vertical" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/accessibility_desc_close" + android:padding="12dp" + android:src="@drawable/ic_close" + android:tint="@color/control_primary_text" + android:visibility="gone" + tools:visibility="visible" /> + + <!-- need to keep this outer view in order to have a correctly sized anchor + for the dropdown menu, as well as dropdown background in the right place --> + <LinearLayout + android:id="@+id/controls_header" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_weight="1" + android:gravity="center" + android:minHeight="48dp" + android:orientation="horizontal"> + + <TextView + android:id="@+id/app_or_structure_spinner" + style="@style/Control.Spinner.Header" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:clickable="false" + tools:text="Test app" /> + </LinearLayout> + + <ImageView + android:id="@+id/controls_more" + android:layout_width="@dimen/controls_header_menu_button_size" + android:layout_height="@dimen/controls_header_menu_button_size" + android:layout_gravity="center_vertical" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/accessibility_menu" + android:padding="12dp" + android:src="@drawable/ic_more_vert" + android:tint="@color/control_more_vert" /> </LinearLayout> - <ImageView - android:id="@+id/controls_more" - android:src="@drawable/ic_more_vert" - android:layout_width="@dimen/controls_header_menu_size" - android:layout_height="@dimen/controls_header_menu_size" - android:padding="12dp" - android:tint="@color/control_more_vert" - android:layout_gravity="center" - android:contentDescription="@string/accessibility_menu" - android:background="?android:attr/selectableItemBackgroundBorderless" /> - </LinearLayout> - <ScrollView + <ScrollView android:id="@+id/controls_scroll_view" android:layout_width="match_parent" android:layout_height="0dp" + android:layout_marginHorizontal="@dimen/controls_content_margin_horizontal" android:layout_weight="1" - android:orientation="vertical" android:clipChildren="true" + android:orientation="vertical" android:paddingHorizontal="16dp" android:scrollbars="none"> - <include layout="@layout/global_actions_controls_list_view" /> - </ScrollView> + <include layout="@layout/global_actions_controls_list_view" /> + + </ScrollView> - <FrameLayout - android:id="@+id/controls_panel" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:background="@drawable/controls_panel_background" - android:visibility="gone" - /> + <FrameLayout + android:id="@+id/controls_panel" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_marginHorizontal="@dimen/controls_content_margin_horizontal" + android:layout_weight="1" + android:background="@drawable/controls_panel_background" + android:visibility="gone" + tools:visibility="visible" /> </merge> diff --git a/packages/SystemUI/res/layout/large_screen_shade_header.xml b/packages/SystemUI/res/layout/large_screen_shade_header.xml deleted file mode 100644 index 3029a2777fd9..000000000000 --- a/packages/SystemUI/res/layout/large_screen_shade_header.xml +++ /dev/null @@ -1,100 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2021 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. ---> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res-auto" - android:id="@+id/split_shade_status_bar" - android:layout_width="match_parent" - android:layout_height="@dimen/large_screen_shade_header_height" - android:minHeight="@dimen/large_screen_shade_header_min_height" - android:clickable="false" - android:focusable="true" - android:paddingLeft="@dimen/large_screen_shade_header_left_padding" - android:paddingRight="@dimen/qs_panel_padding" - android:visibility="gone" - android:theme="@style/Theme.SystemUI.QuickSettings.Header"> - - <com.android.systemui.statusbar.policy.Clock - android:id="@+id/clock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:minWidth="48dp" - android:minHeight="@dimen/large_screen_shade_header_min_height" - android:gravity="start|center_vertical" - android:paddingStart="@dimen/status_bar_left_clock_starting_padding" - android:paddingEnd="@dimen/status_bar_left_clock_end_padding" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.QS.Status" /> - - <com.android.systemui.statusbar.policy.DateView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="start|center_vertical" - android:gravity="center_vertical" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.QS.Status" - systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" /> - - <FrameLayout - android:id="@+id/rightLayout" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:gravity="end"> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="end|center_vertical"> - - <include - android:id="@+id/carrier_group" - layout="@layout/qs_carrier_group" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="end|center_vertical" - android:layout_marginStart="8dp" - android:focusable="false" - android:minHeight="@dimen/large_screen_shade_header_min_height" - android:minWidth="48dp" /> - - <com.android.systemui.statusbar.phone.StatusIconContainer - android:id="@+id/statusIcons" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:paddingEnd="@dimen/signal_cluster_battery_padding" /> - - <com.android.systemui.battery.BatteryMeterView - android:id="@+id/batteryRemainingIcon" - android:layout_width="wrap_content" - android:layout_height="match_parent" - systemui:textAppearance="@style/TextAppearance.QS.Status" /> - <FrameLayout - android:id="@+id/privacy_container" - android:layout_width="0dp" - android:layout_height="match_parent" - android:minHeight="48dp" - android:layout_weight="1" - android:paddingStart="16dp"> - - <include layout="@layout/ongoing_privacy_chip" /> - - </FrameLayout> - </LinearLayout> - </FrameLayout> - -</LinearLayout> diff --git a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml index d1a2cf4c24b2..2c7467d726b4 100644 --- a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml +++ b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml @@ -16,16 +16,15 @@ --> -<com.android.systemui.privacy.OngoingPrivacyChip - xmlns:android="http://schemas.android.com/apk/res/android" +<merge xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/privacy_chip" + xmlns:tools="http://schemas.android.com/tools" android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="center_vertical|end" - android:focusable="true" android:clipChildren="false" android:clipToPadding="false" - android:paddingStart="8dp" + tools:parentTag="com.android.systemui.privacy.OngoingPrivacyChip"> > <LinearLayout @@ -35,8 +34,9 @@ android:paddingStart="10dp" android:paddingEnd="10dp" android:gravity="center" + android:clipToOutline="true" + android:clipToPadding="false" android:layout_gravity="center" android:minWidth="@dimen/ongoing_appops_chip_min_width" - android:maxWidth="@dimen/ongoing_appops_chip_max_width" - /> -</com.android.systemui.privacy.OngoingPrivacyChip>
\ No newline at end of file + android:maxWidth="@dimen/ongoing_appops_chip_max_width" /> +</merge>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index b1d3ed05333b..745cfc6c1655 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -64,7 +64,7 @@ android:layout_width="@dimen/qs_footer_action_button_size" android:layout_height="@dimen/qs_footer_action_button_size" android:layout_gravity="center_vertical|end" - android:background="?android:attr/selectableItemBackground" + android:background="@drawable/qs_footer_edit_circle" android:clickable="true" android:contentDescription="@string/accessibility_quick_settings_edit" android:focusable="true" diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml deleted file mode 100644 index 542a1c9d22bd..000000000000 --- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml +++ /dev/null @@ -1,111 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2017 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. ---> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res-auto" - android:id="@+id/quick_qs_status_icons" - android:layout_width="match_parent" - android:layout_height="@*android:dimen/quick_qs_offset_height" - android:clipChildren="false" - android:clipToPadding="false" - android:minHeight="@dimen/qs_header_row_min_height" - android:clickable="false" - android:focusable="true" - android:theme="@style/Theme.SystemUI.QuickSettings.Header"> - - <LinearLayout - android:id="@+id/clock_container" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:orientation="horizontal" - android:layout_gravity="center_vertical|start" - android:gravity="center_vertical|start" - > - - <com.android.systemui.statusbar.policy.Clock - android:id="@+id/clock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:minHeight="@dimen/qs_header_row_min_height" - android:gravity="center_vertical|start" - android:paddingStart="@dimen/status_bar_left_clock_starting_padding" - android:paddingEnd="@dimen/status_bar_left_clock_end_padding" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.QS.Status" /> - - <com.android.systemui.statusbar.policy.VariableDateView - android:id="@+id/date_clock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginStart="@dimen/status_bar_left_clock_end_padding" - android:gravity="center_vertical|start" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.QS.Status" - systemui:longDatePattern="@string/abbrev_wday_month_day_no_year_alarm" - systemui:shortDatePattern="@string/abbrev_month_day_no_year" - /> - </LinearLayout> - - <include layout="@layout/qs_carrier_group" - android:id="@+id/carrier_group" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:minHeight="@dimen/qs_header_row_min_height" - android:minWidth="48dp" - android:layout_marginStart="8dp" - android:layout_gravity="end|center_vertical" - android:focusable="false"/> - - <View - android:id="@+id/separator" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_gravity="center" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:visibility="gone" - /> - - <FrameLayout - android:id="@+id/rightLayout" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="end" - > - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="center_vertical|end" - > - <com.android.systemui.statusbar.phone.StatusIconContainer - android:id="@+id/statusIcons" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:paddingEnd="@dimen/signal_cluster_battery_padding" /> - - <com.android.systemui.battery.BatteryMeterView - android:id="@+id/batteryRemainingIcon" - android:layout_height="match_parent" - android:layout_width="0dp" - android:layout_weight="1" - systemui:textAppearance="@style/TextAppearance.QS.Status" - android:paddingEnd="2dp" /> - - </LinearLayout> - </FrameLayout> - -</LinearLayout> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 9fc3f409642b..1749ed403c09 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -33,32 +33,16 @@ android:paddingStart="0dp" android:elevation="4dp" > - <!-- Date and privacy. Only visible in QS when not in split shade --> - <include layout="@layout/quick_status_bar_header_date_privacy"/> - - <RelativeLayout - android:id="@+id/qs_container" + <com.android.systemui.qs.QuickQSPanel + android:id="@+id/quick_qs_panel" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="top" + android:layout_marginTop="@dimen/qqs_layout_margin_top" android:clipChildren="false" - android:clipToPadding="false"> - <!-- Time, icons and Carrier (only in QS when not in split shade) --> - <include layout="@layout/quick_qs_status_icons"/> - - <com.android.systemui.qs.QuickQSPanel - android:id="@+id/quick_qs_panel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_below="@id/quick_qs_status_icons" - android:layout_marginTop="@dimen/qqs_layout_margin_top" - android:accessibilityTraversalAfter="@id/quick_qs_status_icons" - android:clipChildren="false" - android:clipToPadding="false" - android:focusable="true" - android:paddingBottom="@dimen/qqs_layout_padding_bottom" - android:importantForAccessibility="no"> - </com.android.systemui.qs.QuickQSPanel> - </RelativeLayout> + android:clipToPadding="false" + android:focusable="true" + android:paddingBottom="@dimen/qqs_layout_padding_bottom" + android:importantForAccessibility="no"> + </com.android.systemui.qs.QuickQSPanel> </com.android.systemui.qs.QuickStatusBarHeader> diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml deleted file mode 100644 index 8b5d953c3fe7..000000000000 --- a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -** Copyright 2017, 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. ---> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res-auto" - android:id="@+id/quick_status_bar_date_privacy" - android:layout_width="match_parent" - android:layout_height="@*android:dimen/quick_qs_offset_height" - android:clipChildren="false" - android:clipToPadding="false" - android:gravity="center" - android:layout_gravity="top" - android:orientation="horizontal" - android:importantForAccessibility="no" - android:clickable="true" - android:minHeight="48dp"> - - <FrameLayout - android:id="@+id/date_container" - android:layout_width="0dp" - android:layout_height="match_parent" - android:minHeight="48dp" - android:layout_weight="1" - android:gravity="center_vertical|start" > - - <com.android.systemui.statusbar.policy.VariableDateView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="start|center_vertical" - android:gravity="center_vertical" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.QS.Status" - systemui:longDatePattern="@string/abbrev_wday_month_day_no_year_alarm" - systemui:shortDatePattern="@string/abbrev_month_day_no_year" - /> - </FrameLayout> - - <!-- We want this to be centered (to align with notches). In order to do that, the following - has to hold (in portrait): - * date_container and privacy_container must have the same width and weight - --> - <android.widget.Space - android:id="@+id/space" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_gravity="center_vertical|center_horizontal" - android:visibility="gone" /> - - <FrameLayout - android:id="@+id/privacy_container" - android:layout_width="0dp" - android:layout_height="match_parent" - android:minHeight="48dp" - android:layout_weight="1" - android:gravity="center_vertical|end" > - - <include layout="@layout/ongoing_privacy_chip" /> - - </FrameLayout> -</LinearLayout> diff --git a/packages/SystemUI/res/raw/biometricprompt_rear_landscape_base.json b/packages/SystemUI/res/raw/biometricprompt_rear_landscape_base.json new file mode 100644 index 000000000000..49c1c40f7f4f --- /dev/null +++ b/packages/SystemUI/res/raw/biometricprompt_rear_landscape_base.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":21,"w":340,"h":340,"nm":"BiometricPrompt_Rear_Landscape_Base_Foldable","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 18","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[169.478,169.749,0],"ix":2,"l":2},"a":{"a":0,"k":[-48.123,-30.19,0],"ix":1,"l":2},"s":{"a":0,"k":[132,132,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".grey400","cl":"grey400","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.75686275959,0.776470601559,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"black circle matte","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".grey904","cl":"grey904","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,35.536,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.552,0.087],[0,0]],"o":[[0,0],[0,-3.287],[0,0],[0,0]],"v":[[-2.301,8.869],[-2.301,-3.772],[2.301,-9.806],[2.301,9.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"black circle matte 2","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue401","cl":"blue401","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,-27.655,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,3.286],[0,0],[-2.552,0.086],[0,0]],"o":[[0,0],[0,-3.286],[0,0],[-2.552,-0.086]],"v":[[-2.301,16.282],[-2.301,-16.281],[2.301,-22.313],[2.301,22.313]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"black circle matte 3","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Finger 2","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":-129,"s":[-67]},{"t":-29,"s":[0]}],"ix":10},"p":{"a":0,"k":[-75.352,41.307,0],"ix":2,"l":2},"a":{"a":0,"k":[94.648,211.307,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.72,-5.642],[0,0],[-9.394,-0.562],[-0.298,-0.038]],"o":[[-5.153,4.329],[3.882,-16.05],[0.31,0.019],[-0.044,0.75]],"v":[[0.863,12.222],[-8.931,14.755],[8.005,-15.108],[8.931,-15.021]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156875134,0.454901963472,0.376470595598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[81.486,130.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 9","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.459,6.045],[-5.153,4.329],[-0.044,0.75],[3.116,-24.664],[5.23,-22.052],[8.666,11.92],[-2.9,9.135]],"o":[[0,0],[6.72,-5.642],[12.723,1.335],[-2.369,18.762],[-13.993,-5.333],[2.255,-5.502],[1.843,-5.815]],"v":[[-9.99,-18.348],[-0.196,-20.881],[7.872,-48.124],[21.578,-9.331],[12.104,48.124],[-22.574,21.555],[-14.791,-0.206]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.713725507259,0.384313732386,0.282352954149,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82.545,163.184],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 8","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"black circle matte 4","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".grey903","cl":"grey903","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-18.345,-92.442,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.07,0],[0,0],[-8.27,0],[0,0]],"o":[[0,0],[0,8.269],[0,0],[-14.024,-17.379]],"v":[[-29.778,-14.252],[-29.778,-0.721],[-14.805,14.252],[29.778,14.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"black circle matte 5","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".grey902","cl":"grey902","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.947,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[154.053,139.81,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.3,0.367],[0,0],[-2.364,0.157],[0,0]],"o":[[0,0],[2.3,-0.367],[0,0],[-2.364,-0.157]],"v":[[-3.5,75.533],[-3.5,-75.533],[3.5,-76.312],[3.5,76.312]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[113.225,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,8.269],[0,0],[2.181,-0.187],[0,0],[-2.23,0],[0,42.252],[10.593,13.127],[0,0]],"o":[[0,0],[-2.23,0],[0,0],[2.181,0.187],[42.252,0],[0,-18.182],[0,0],[-8.27,0]],"v":[[-34.946,-62.973],[-34.946,-76.504],[-41.558,-76.201],[-41.558,76.201],[-34.946,76.504],[41.558,0],[24.61,-48],[-19.973,-48]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156.824,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 5","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black 2","cl":"black","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-48.123,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.833],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.167],"y":[0,0,0]},"t":-129,"s":[0,0,100]},{"t":-79,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".grey700","cl":"grey700","parent":15,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-56.481,-59.936,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.767,0],[0,0],[0,-3.767],[0,0],[-3.767,0],[0,0],[0,3.767],[0,0]],"o":[[0,0],[-3.767,0],[0,0],[0,3.767],[0,0],[3.767,0],[0,0],[0,-3.767]],"v":[[46.055,-14.479],[-46.056,-14.479],[-52.876,-7.659],[-52.876,7.658],[-46.056,14.479],[46.055,14.479],[52.876,7.658],[52.876,-7.659]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".grey901","cl":"grey901","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.485,2.727,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50,50,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.184,0],[0,0],[0,0],[0,0],[0,-4.375]],"o":[[0,4.184],[0,0],[0,0],[0,0],[4.375,0],[0,0]],"v":[[114.116,92.129],[106.54,99.705],[7.788,99.705],[7.788,-99.704],[106.161,-99.704],[114.116,-91.749]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.707,0],[0,0],[1.894,-1.05],[0.886,0.346],[0,0],[2.166,0],[0,0],[0,-5.707],[0,0],[0,-1.46],[0,0],[-1.133,-0.038],[0,0],[0,-1.459],[0,0],[-1.133,-0.038],[0,0],[-5.708,0],[0,0],[-1.894,1.05],[-0.846,-0.289],[0,0],[-2.166,0],[0,0],[0,5.706],[0,0]],"o":[[0,0],[-2.166,0],[-0.883,0.354],[0,0],[-1.895,-1.05],[0,0],[-5.708,0],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[0,5.707],[0,0],[2.165,0],[0.833,-0.334],[0,0],[1.894,1.05],[0,0],[5.707,0],[0,0],[0,-5.707]],"v":[[106.16,-102.082],[8.455,-102.082],[2.265,-100.48],[-0.488,-100.468],[-0.519,-100.48],[-6.71,-102.082],[-104.116,-102.082],[-114.45,-91.748],[-114.45,-36.119],[-116.494,-33.44],[-116.494,-18.979],[-114.45,-16.3],[-114.45,-0.877],[-116.494,1.802],[-116.494,28.704],[-114.45,31.383],[-114.45,91.749],[-104.116,102.083],[-6.495,102.083],[-0.305,100.481],[2.294,100.425],[2.395,100.481],[9.872,102.083],[106.161,102.083],[116.494,91.75],[116.494,-91.748]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.529411792755,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0}],"markers":[{"tm":255,"cm":"","dr":0},{"tm":364,"cm":"","dr":0},{"tm":482,"cm":"","dr":0},{"tm":600,"cm":"","dr":0}]}
\ No newline at end of file diff --git a/packages/SystemUI/res/raw/biometricprompt_rear_portrait_base.json b/packages/SystemUI/res/raw/biometricprompt_rear_portrait_base.json new file mode 100644 index 000000000000..9ea0d35e1de2 --- /dev/null +++ b/packages/SystemUI/res/raw/biometricprompt_rear_portrait_base.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":21,"w":340,"h":340,"nm":"BiometricPrompt_Rear_Portrait_Base_Foldable","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 18","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[169.478,169.749,0],"ix":2,"l":2},"a":{"a":0,"k":[-48.123,-30.19,0],"ix":1,"l":2},"s":{"a":0,"k":[132,132,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".grey400","cl":"grey400","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.75686275959,0.776470601559,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"black circle matte","parent":14,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".grey904","cl":"grey904","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,35.536,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.552,0.087],[0,0]],"o":[[0,0],[0,-3.287],[0,0],[0,0]],"v":[[-2.301,8.869],[-2.301,-3.772],[2.301,-9.806],[2.301,9.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"black circle matte 2","parent":14,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue401","cl":"blue401","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,-27.655,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,3.286],[0,0],[-2.552,0.086],[0,0]],"o":[[0,0],[0,-3.286],[0,0],[-2.552,-0.086]],"v":[[-2.301,16.282],[-2.301,-16.281],[2.301,-22.313],[2.301,22.313]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"black circle matte 3","parent":14,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Finger 3","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-2,"ix":10},"p":{"a":0,"k":[260.134,83.782,0],"ix":2,"l":2},"a":{"a":0,"k":[302.634,38.782,0],"ix":1,"l":2},"s":{"a":0,"k":[178,178,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.262,5.076],[0,0],[-0.424,-7.095],[-0.028,-0.225]],"o":[[3.269,-3.892],[-12.123,2.932],[0.015,0.234],[0.567,-0.034]],"v":[[9.232,0.652],[11.145,-6.746],[-11.412,6.046],[-11.346,6.746]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156875134,0.454901963472,0.376470595598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[241.281,55.033],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.565,-1.102],[3.269,-3.892],[0.566,-0.033],[-18.63,2.353],[-16.656,3.951],[9.004,6.546],[6.9,-2.19]],"o":[[0,0],[-4.262,5.076],[1.008,9.61],[14.171,-1.79],[-4.028,-10.569],[-4.156,1.703],[-4.392,1.392]],"v":[[-13.858,-7.546],[-15.771,-0.148],[-36.349,5.946],[-7.047,16.299],[36.349,9.142],[16.281,-17.051],[-0.156,-11.172]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.713725507259,0.384313732386,0.282352954149,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[266.285,55.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"black circle matte 4","parent":14,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey903","cl":"grey903","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-18.345,-92.442,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.07,0],[0,0],[-8.27,0],[0,0]],"o":[[0,0],[0,8.269],[0,0],[-14.024,-17.379]],"v":[[-29.778,-14.252],[-29.778,-0.721],[-14.805,14.252],[29.778,14.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"black circle matte 5","parent":14,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".grey902","cl":"grey902","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.947,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[154.053,139.81,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.3,0.367],[0,0],[-2.364,0.157],[0,0]],"o":[[0,0],[2.3,-0.367],[0,0],[-2.364,-0.157]],"v":[[-3.5,75.533],[-3.5,-75.533],[3.5,-76.312],[3.5,76.312]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[113.225,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,8.269],[0,0],[2.181,-0.187],[0,0],[-2.23,0],[0,42.252],[10.593,13.127],[0,0]],"o":[[0,0],[-2.23,0],[0,0],[2.181,0.187],[42.252,0],[0,-18.182],[0,0],[-8.27,0]],"v":[[-34.946,-62.973],[-34.946,-76.504],[-41.558,-76.201],[-41.558,76.201],[-34.946,76.504],[41.558,0],[24.61,-48],[-19.973,-48]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156.824,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 5","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".black 2","cl":"black","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-48.123,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.833],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.167],"y":[0,0,0]},"t":-129,"s":[0,0,100]},{"t":-79,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".grey700","cl":"grey700","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-56.481,-59.936,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.767,0],[0,0],[0,-3.767],[0,0],[-3.767,0],[0,0],[0,3.767],[0,0]],"o":[[0,0],[-3.767,0],[0,0],[0,3.767],[0,0],[3.767,0],[0,0],[0,-3.767]],"v":[[46.055,-14.479],[-46.056,-14.479],[-52.876,-7.659],[-52.876,7.658],[-46.056,14.479],[46.055,14.479],[52.876,7.658],[52.876,-7.659]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".grey901","cl":"grey901","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.485,2.727,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50,50,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.184,0],[0,0],[0,0],[0,0],[0,-4.375]],"o":[[0,4.184],[0,0],[0,0],[0,0],[4.375,0],[0,0]],"v":[[114.116,92.129],[106.54,99.705],[7.788,99.705],[7.788,-99.704],[106.161,-99.704],[114.116,-91.749]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.707,0],[0,0],[1.894,-1.05],[0.886,0.346],[0,0],[2.166,0],[0,0],[0,-5.707],[0,0],[0,-1.46],[0,0],[-1.133,-0.038],[0,0],[0,-1.459],[0,0],[-1.133,-0.038],[0,0],[-5.708,0],[0,0],[-1.894,1.05],[-0.846,-0.289],[0,0],[-2.166,0],[0,0],[0,5.706],[0,0]],"o":[[0,0],[-2.166,0],[-0.883,0.354],[0,0],[-1.895,-1.05],[0,0],[-5.708,0],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[0,5.707],[0,0],[2.165,0],[0.833,-0.334],[0,0],[1.894,1.05],[0,0],[5.707,0],[0,0],[0,-5.707]],"v":[[106.16,-102.082],[8.455,-102.082],[2.265,-100.48],[-0.488,-100.468],[-0.519,-100.48],[-6.71,-102.082],[-104.116,-102.082],[-114.45,-91.748],[-114.45,-36.119],[-116.494,-33.44],[-116.494,-18.979],[-114.45,-16.3],[-114.45,-0.877],[-116.494,1.802],[-116.494,28.704],[-114.45,31.383],[-114.45,91.749],[-104.116,102.083],[-6.495,102.083],[-0.305,100.481],[2.294,100.425],[2.395,100.481],[9.872,102.083],[106.161,102.083],[116.494,91.75],[116.494,-91.748]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.529411792755,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0}],"markers":[{"tm":255,"cm":"","dr":0},{"tm":364,"cm":"","dr":0},{"tm":482,"cm":"","dr":0},{"tm":600,"cm":"","dr":0}]}
\ No newline at end of file diff --git a/packages/SystemUI/res/raw/biometricprompt_rear_portrait_reverse_base.json b/packages/SystemUI/res/raw/biometricprompt_rear_portrait_reverse_base.json new file mode 100644 index 000000000000..f2b259335034 --- /dev/null +++ b/packages/SystemUI/res/raw/biometricprompt_rear_portrait_reverse_base.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":21,"w":340,"h":340,"nm":"BiometricPrompt_Rear_Portrait_Reverse_Base_Foldable","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 18","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[169.478,169.749,0],"ix":2,"l":2},"a":{"a":0,"k":[-48.123,-30.19,0],"ix":1,"l":2},"s":{"a":0,"k":[132,132,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".grey400","cl":"grey400","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.75686275959,0.776470601559,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"black circle matte","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".grey904","cl":"grey904","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,35.536,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.552,0.087],[0,0]],"o":[[0,0],[0,-3.287],[0,0],[0,0]],"v":[[-2.301,8.869],[-2.301,-3.772],[2.301,-9.806],[2.301,9.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"black circle matte 2","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue401","cl":"blue401","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-62.577,-27.655,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,3.286],[0,0],[-2.552,0.086],[0,0]],"o":[[0,0],[0,-3.286],[0,0],[-2.552,-0.086]],"v":[[-2.301,16.282],[-2.301,-16.281],[2.301,-22.313],[2.301,22.313]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"black circle matte 3","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Finger 2","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-75.352,41.307,0],"ix":2,"l":2},"a":{"a":0,"k":[94.648,211.307,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.72,-5.642],[0,0],[-9.394,-0.562],[-0.298,-0.038]],"o":[[-5.153,4.329],[3.882,-16.05],[0.31,0.019],[-0.044,0.75]],"v":[[0.863,12.222],[-8.931,14.755],[8.005,-15.108],[8.931,-15.021]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156875134,0.454901963472,0.376470595598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[81.486,130.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 9","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.459,6.045],[-5.153,4.329],[-0.044,0.75],[3.116,-24.664],[5.23,-22.052],[8.666,11.92],[-2.9,9.135]],"o":[[0,0],[6.72,-5.642],[12.723,1.335],[-2.369,18.762],[-13.993,-5.333],[2.255,-5.502],[1.843,-5.815]],"v":[[-9.99,-18.348],[-0.196,-20.881],[7.872,-48.124],[21.578,-9.331],[12.104,48.124],[-22.574,21.555],[-14.791,-0.206]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.713725507259,0.384313732386,0.282352954149,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82.545,163.184],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 8","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"black circle matte 4","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".grey903","cl":"grey903","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-18.345,-92.442,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.07,0],[0,0],[-8.27,0],[0,0]],"o":[[0,0],[0,8.269],[0,0],[-14.024,-17.379]],"v":[[-29.778,-14.252],[-29.778,-0.721],[-14.805,14.252],[29.778,14.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"black circle matte 5","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".grey902","cl":"grey902","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.947,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[154.053,139.81,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.3,0.367],[0,0],[-2.364,0.157],[0,0]],"o":[[0,0],[2.3,-0.367],[0,0],[-2.364,-0.157]],"v":[[-3.5,75.533],[-3.5,-75.533],[3.5,-76.312],[3.5,76.312]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[113.225,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,8.269],[0,0],[2.181,-0.187],[0,0],[-2.23,0],[0,42.252],[10.593,13.127],[0,0]],"o":[[0,0],[-2.23,0],[0,0],[2.181,0.187],[42.252,0],[0,-18.182],[0,0],[-8.27,0]],"v":[[-34.946,-62.973],[-34.946,-76.504],[-41.558,-76.201],[-41.558,76.201],[-34.946,76.504],[41.558,0],[24.61,-48],[-19.973,-48]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156.824,139.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Layer 5","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".black 2","cl":"black","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-48.123,-30.19,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.833],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.167],"y":[0,0,0]},"t":-129,"s":[0,0,100]},{"t":-79,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-42.252,0],[0,42.252],[42.252,0],[0,-42.252]],"o":[[42.252,0],[0,-42.252],[-42.252,0],[0,42.252]],"v":[[0,76.504],[76.504,0],[0,-76.504],[-76.504,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".grey700","cl":"grey700","parent":15,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-56.481,-59.936,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.767,0],[0,0],[0,-3.767],[0,0],[-3.767,0],[0,0],[0,3.767],[0,0]],"o":[[0,0],[-3.767,0],[0,0],[0,3.767],[0,0],[3.767,0],[0,0],[0,-3.767]],"v":[[46.055,-14.479],[-46.056,-14.479],[-52.876,-7.659],[-52.876,7.658],[-46.056,14.479],[46.055,14.479],[52.876,7.658],[52.876,-7.659]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".grey901","cl":"grey901","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.485,2.727,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[50,50,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.184,0],[0,0],[0,0],[0,0],[0,-4.375]],"o":[[0,4.184],[0,0],[0,0],[0,0],[4.375,0],[0,0]],"v":[[114.116,92.129],[106.54,99.705],[7.788,99.705],[7.788,-99.704],[106.161,-99.704],[114.116,-91.749]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.707,0],[0,0],[1.894,-1.05],[0.886,0.346],[0,0],[2.166,0],[0,0],[0,-5.707],[0,0],[0,-1.46],[0,0],[-1.133,-0.038],[0,0],[0,-1.459],[0,0],[-1.133,-0.038],[0,0],[-5.708,0],[0,0],[-1.894,1.05],[-0.846,-0.289],[0,0],[-2.166,0],[0,0],[0,5.706],[0,0]],"o":[[0,0],[-2.166,0],[-0.883,0.354],[0,0],[-1.895,-1.05],[0,0],[-5.708,0],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[-1.133,0.038],[0,0],[0,1.46],[0,0],[0,5.707],[0,0],[2.165,0],[0.833,-0.334],[0,0],[1.894,1.05],[0,0],[5.707,0],[0,0],[0,-5.707]],"v":[[106.16,-102.082],[8.455,-102.082],[2.265,-100.48],[-0.488,-100.468],[-0.519,-100.48],[-6.71,-102.082],[-104.116,-102.082],[-114.45,-91.748],[-114.45,-36.119],[-116.494,-33.44],[-116.494,-18.979],[-114.45,-16.3],[-114.45,-0.877],[-116.494,1.802],[-116.494,28.704],[-114.45,31.383],[-114.45,91.749],[-104.116,102.083],[-6.495,102.083],[-0.305,100.481],[2.294,100.425],[2.395,100.481],[9.872,102.083],[106.161,102.083],[116.494,91.75],[116.494,-91.748]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.529411792755,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-189,"op":711,"st":-189,"bm":0}],"markers":[{"tm":255,"cm":"","dr":0},{"tm":364,"cm":"","dr":0},{"tm":482,"cm":"","dr":0},{"tm":600,"cm":"","dr":0}]}
\ No newline at end of file diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index a2fa52c91f4d..4a73390d17cc 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Kennisgewingskerm."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Vinnige instellings."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sluitskerm."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Werksluitskerm"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Maak toe"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleuromkering"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Kleurregstelling"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Lettergrootte"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Bestuur gebruikers"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Maak toe"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"skermopname"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Titelloos"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Lettergrootte"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Maak kleiner"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Maak groter"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingvenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vergrotingvensterkontroles"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoem in"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Minstens een toestel beskikbaar is"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak en hou kortpad"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Kanselleer"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Wissel skerms nou"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Ontvou foon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Wissel skerms?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Gebruik die agterste kamera vir hoër resolusie"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Keer die foon om vir hoër resolusie"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Voubare toestel word ontvou"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Voubare toestel word omgekeer"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> batterykrag oor"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skakel oor na werkprofiel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Maak toe"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Sluitskerminstellings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-fi is nie beskikbaar nie"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera is geblokkeer"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera en mikrofoon is geblokkeer"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoon is geblokkeer"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitmodus is aan"</string> </resources> diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml index da24a79759f7..662aa717ffc1 100644 --- a/packages/SystemUI/res/values-af/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Af"</item> <item msgid="5966994759929723339">"Aan"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Onbeskikbaar"</item> + <item msgid="2478289035899842865">"Af"</item> + <item msgid="5137565285664080143">"Aan"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 7f2ccac9058c..101382ed9af0 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"የማሳወቂያ ጥላ።"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ፈጣን ቅንብሮች።"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ማያ ገጽ ቆልፍ።"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"የስራ ማያ ገጽ ቁልፍ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ዝጋ"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ብሩህነት"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ተቃራኒ ቀለም"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"የቀለም ማስተካከያ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"የቅርጸ-ቁምፊ መጠን"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ተጠቃሚዎችን ያስተዳድሩ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ተከናውኗል"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ዝጋ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ማያን መቅረጽ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ርዕስ የለም"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"የቅርጸ-ቁምፊ መጠን"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"አሳንስ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ተለቅ አድርግ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"የማጉያ መስኮት"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"የማጉያ መስኮት መቆጣጠሪያዎች"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"አጉላ"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"መሰራጨት አይችልም"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"ማስቀመጥ አልተቻለም። እንደገና ይሞክሩ።"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"ማስቀመጥ አልተቻለም።"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"ቢያንስ 4 ቁምፊዎችን ይጠቀሙ"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"ከ16 የሚያንሱ ቁምፊዎችን ይጠቀሙ"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"የግንብ ቁጥር"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"የገንባ ቁጥር ወደ ቅንጥብ ሰሌዳ ተቀድቷል።"</string> <string name="basic_status" msgid="2315371112182658176">"ውይይት ይክፈቱ"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ቢያንስ አንድ መሣሪያ ይገኛል"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"የይንኩ እና ይያዙ አቋራጭ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ይቅር"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ማያ ገፆችን አሁን ይቀይሩ"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ስልክን ይዘርጉ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ማያ ገፆች ይቀየሩ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ለከፍተኛ ጥራት የኋላ ካሜራውን ይጠቀሙ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ለከፍተኛ ጥራት ስልኩን ይቀይሩ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"መታጠፍ የሚችል መሣሪያ እየተዘረጋ ነው"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"መታጠፍ የሚችል መሣሪያ እየተገለበጠ ነው"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ባትሪ ይቀራል"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ወደ የሥራ መገለጫ ቀይር"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ዝጋ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"የማያ ገጽ ቁልፍ ቅንብሮች"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi አይገኝም"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ካሜራ ታግዷል"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ካሜራ እና ማይክሮፎን ታግደዋል"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ማይክሮፎን ታግዷል"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"የቅድሚያ ሁነታ በርቷል"</string> </resources> diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml index 26ef52d996ac..e5d68d985792 100644 --- a/packages/SystemUI/res/values-am/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ጠፍቷል"</item> <item msgid="5966994759929723339">"በርቷል"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"አይገኝም"</item> + <item msgid="2478289035899842865">"ጠፍቷል"</item> + <item msgid="5137565285664080143">"በርቷል"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 50165d4cd1f2..f629387f6971 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"مركز الإشعارات."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"الإعدادات السريعة."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"شاشة القفل."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"شاشة قفل بيانات العمل"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"إغلاق"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"السطوع"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"قلب الألوان"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"تصحيح الألوان"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"حجم الخط"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"إدارة المستخدمين"</string> <string name="quick_settings_done" msgid="2163641301648855793">"تم"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"إغلاق"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"تسجيل محتوى الشاشة"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"بلا عنوان"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"حجم الخط"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"تصغير الحجم"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"تكبير الحجم"</string> <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"عناصر التحكم في نافذة التكبير"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"تكبير"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"يتعذّر البث"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"لا يمكن إجراء الحفظ. يُرجى إعادة المحاولة."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"لا يمكن إجراء الحفظ."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"يجب استخدام 4 أحرف على الأقل."</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"يجب أن يحتوي الرمز على أقل من 16 حرفًا."</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"رقم الإصدار"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"تم نسخ رقم الإصدار إلى الحافظة."</string> <string name="basic_status" msgid="2315371112182658176">"محادثة مفتوحة"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• توفُّر جهاز واحد على الأقل"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"انقر مع الاستمرار على الاختصار."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"إلغاء"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"تبديل الشاشتَين الآن"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"فتح الهاتف"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"هل تريد تبديل الشاشتَين؟"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"للحصول على درجة دقة أعلى، استخدِم الكاميرا الخلفية."</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"للحصول على درجة دقة أعلى، اقلِب الهاتف."</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"جهاز قابل للطي يجري فتحه"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"جهاز قابل للطي يجري قلبه"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"النسبة المئوية المتبقية من شحن البطارية: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"التبديل إلى الملف الشخصي للعمل"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"إغلاق"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"إعدادات شاشة القفل"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml index b88d09706595..31d97076ce4e 100644 --- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"غير مفعّلة"</item> <item msgid="5966994759929723339">"مفعَّلة"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"الخيار غير متوفّر"</item> + <item msgid="2478289035899842865">"الخيار غير مفعَّل"</item> + <item msgid="5137565285664080143">"الخيار مفعَّل"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 2f868ec0009e..aa198424065d 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"জাননী পেনেল।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ক্ষিপ্ৰ ছেটিং।"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"বন্ধ স্ক্ৰীন।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীন"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ কৰক"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ৰং বিপৰীতকৰণ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ৰং শুধৰণী"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ফণ্টৰ আকাৰ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ব্যৱহাৰকাৰী পৰিচালনা কৰক"</string> <string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন কৰা হ’ল"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ কৰক"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"স্ক্ৰীন ৰেকৰ্ডিং"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ফণ্টৰ আকাৰ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"সৰু কৰক"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ডাঙৰ কৰক"</string> <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"জুম ইন কৰক"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"সম্প্ৰচাৰ কৰিব নোৱাৰি"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"ছেভ কৰিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"ছেভ কৰিব নোৱাৰি।"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"অতি কমেও ৪ টা বৰ্ণ ব্যৱহাৰ কৰক"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"১৬ টাতকৈ কম বৰ্ণ ব্যৱহাৰ কৰক"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"বিল্ডৰ নম্বৰ"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"ক্লিপব’ৰ্ডলৈ বিল্ডৰ নম্বৰ প্ৰতিলিপি কৰা হ’ল।"</string> <string name="basic_status" msgid="2315371112182658176">"বাৰ্তালাপ খোলক"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• অতি কমেও এটা ডিভাইচ উপলব্ধ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"শ্বৰ্টকাটটোত স্পৰ্শ কৰি ধৰি ৰাখক"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"বাতিল কৰক"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"এতিয়াই স্ক্ৰীন সলনি কৰক"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ফ’নটো আনফ’ল্ড কৰক"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"স্ক্ৰীন সলনি কৰিবনে?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"অধিক ৰিজ’লিউছনৰ বাবে, পিছফালৰ কেমেৰাটো ব্যৱহাৰ কৰক"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"অধিক ৰিজ’লিউছনৰ বাবে, ফ’নটো লুটিয়াই দিয়ক"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"জপাব পৰা ডিভাইচৰ জাপ খুলি থকা হৈছে"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"জপাব পৰা ডিভাইচৰ ওলোটাই থকা হৈছে"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> বেটাৰী বাকী আছে"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"কৰ্মস্থানৰ প্ৰ’ফাইললৈ সলনি কৰক"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"বন্ধ কৰক"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"লক স্ক্ৰীনৰ ছেটিং"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ৱাই-ফাই উপলব্ধ নহয়"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"কেমেৰা অৱৰোধ কৰা আছে"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"কেমেৰা আৰু মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"অগ্ৰাধিকাৰ দিয়া ম’ড অন আছে"</string> </resources> diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml index e7dc9b4e180a..a9c3e3b997b7 100644 --- a/packages/SystemUI/res/values-as/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"অফ আছে"</item> <item msgid="5966994759929723339">"অন আছে"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"উপলব্ধ নহয়"</item> + <item msgid="2478289035899842865">"অফ আছে"</item> + <item msgid="5137565285664080143">"অন আছে"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index db801251a51a..c3312412c978 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bildiriş kölgəsi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tez ayarlar."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilid ekranı."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekran kilidi"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Qapadın"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaqlıq"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rəng inversiyası"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Rəng korreksiyası"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Şrift ölçüsü"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"İstifadəçiləri idarə edin"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hazır"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bağlayın"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekran çəkimi"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıq yoxdur"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Şrift ölçüsü"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Kiçildin"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Böyüdün"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Böyütmə Pəncərəsi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Böyütmə Pəncərəsi Kontrolları"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yaxınlaşdırın"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Yayımlamaq mümkün deyil"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Yadda saxlamaq mümkün deyil. Yenə cəhd edin."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Yadda saxlamaq mümkün deyil."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Ən azı 4 simvoldan istifadə edin"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Maksimum 16 simvoldan istifadə edin"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Montaj nömrəsi"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Versiya nömrəsi mübadilə buferinə kopyalandı."</string> <string name="basic_status" msgid="2315371112182658176">"Açıq söhbət"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ən azı bir cihaz əlçatandır"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Qısayola toxunub saxlayın"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Ləğv edin"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"İndi ekranları dəyişin"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefonu açın"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Ekranlar dəyişdirilsin?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Daha yüksək ayırdetmə dəqiqliyi üçün arxa kameradan istifadə edin"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Daha yüksək ayırdetmə dəqiqliyi üçün telefonu çevirin"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Qatlana bilən cihaz açılır"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Qatlana bilən cihaz fırladılır"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> enerji qalıb"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"İş profilinə keçin"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Bağlayın"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Kilid ekranı ayarları"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi əlçatan deyil"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklanıb"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera və mikrofon bloklanıb"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklanıb"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritet rejimi aktivdir"</string> </resources> diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml index e0fcf890a505..d973e4ead3c2 100644 --- a/packages/SystemUI/res/values-az/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Deaktiv"</item> <item msgid="5966994759929723339">"Aktiv"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Əlçatan deyil"</item> + <item msgid="2478289035899842865">"Deaktiv"</item> + <item msgid="5137565285664080143">"Aktiv"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 494bcbe42aa6..3355feb06d58 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Prozor sa obaveštenjima."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brza podešavanja."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Brza podešavanja i traka sa obaveštenjima."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan ekran za posao"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string> @@ -257,8 +258,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvetljenost"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekcija boja"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Veličina fonta"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Upravljajte korisnicima"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string> @@ -779,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje ekrana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Veličina fonta"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Umanjite"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Uvećajte"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećanje"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Uvećajte"</string> @@ -1030,16 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• da je dostupan barem jedan uređaj"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečicu"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Otkaži"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Zameni ekrane"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otvorite telefon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Želite da zamenite ekrane?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Za veću rezoluciju koristite zadnju kameru"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Za veću rezoluciju obrnite telefon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Uređaj na preklop se otvara"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Uređaj na preklop se obrće"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Preostalo je još<xliff:g id="PERCENTAGE">%s</xliff:g> baterije"</string> @@ -1051,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Pređi na poslovni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zatvori"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Podešavanja zaključanog ekrana"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi nije dostupan"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetni režim je uključen"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml index fd604b5f079f..32051ef19743 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Isključeno"</item> <item msgid="5966994759929723339">"Uključeno"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nedostupno"</item> + <item msgid="2478289035899842865">"Isključeno"</item> + <item msgid="5137565285664080143">"Uključeno"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 62faafbf04bf..d2279bed089c 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Цень апавяшчэння.."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Хуткія налады."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блакіроўкі."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Экран блакіроўкі дзейнасці"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыць"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркасць"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія колераў"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Карэкцыя колераў"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Памер шрыфту"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Кіраваць карыстальнікамі"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Гатова"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыць"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"запіс экрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без назвы"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Памер шрыфту"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Паменшыць"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Павялічыць"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Акно павелічэння"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Налады акна павелічэння"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Павялічыць маштаб"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Не ўдалося запусціць трансляцыю"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Не ўдалося захаваць. Паўтарыце спробу."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Не ўдалося захаваць."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Скарыстайце не менш як 4 сімвалы"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Скарыстайце менш за 16 сімвалаў"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Нумар зборкі"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Нумар зборкі скапіраваны ў буфер абмену."</string> <string name="basic_status" msgid="2315371112182658176">"Адкрытая размова"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Даступная хаця б адна прылада."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Дакраніцеся і ўтрымлівайце ярлык"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Скасаваць"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Пераключыцца на іншы экран"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Раскрыйце тэлефон"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Пераключыцца на іншы экран?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Каб рабіць фота з больш высокай раздзяляльнасцю, выкарыстоўвайце заднюю камеру"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Каб зрабіць фота з больш высокай раздзяляльнасцю, павярніце тэлефон"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Складная прылада ў раскладзеным выглядзе"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Перавернутая складная прылада"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Засталося зараду: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Пераключыцца на працоўны профіль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрыць"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Налады экрана блакіроўкі"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml index 4050129df5c4..e71c29bd15de 100644 --- a/packages/SystemUI/res/values-be/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Выключана"</item> <item msgid="5966994759929723339">"Уключана"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Недаступна"</item> + <item msgid="2478289035899842865">"Выключана"</item> + <item msgid="5137565285664080143">"Уключана"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index ad34919c17d1..36b3c8b8d44b 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Падащ панел с известия."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Бързи настройки."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заключване на екрана."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Заключен екран на служебния профил"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Затваряне"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркост"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Цветове: инверт."</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекция на цветове"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Размер на шрифта"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Управление на потребителите"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затваряне"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"записване на екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Няма заглавие"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Размер на шрифта"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Намаляване на размера"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Увеличаване на размера"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за увеличение"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли за прозореца за увеличение"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увеличаване на мащаба"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Предаването не е възможно"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Не може да се запази. Опитайте отново."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Не може да се запази."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Използвайте поне 4 знака"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Използвайте по-малко от 16 знака"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер на компилацията"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Номерът на компилацията е копиран в буферната памет."</string> <string name="basic_status" msgid="2315371112182658176">"Отворен разговор"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Налице е поне едно устройство."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Докоснете и задръжте прекия път"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Отказ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Превключване на екраните сега"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Отворете телефона"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Да се превключи ли екранът?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"За по-висока разделителна способност използвайте задната камера"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"За по-висока разделителна способност обърнете телефона"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Разгъване на сгъваемо устройство"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Обръщане на сгъваемо устройство"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Оставаща батерия: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Превключване към служебния потребителски профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затваряне"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Настройки за заключения екран"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi не е налице"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Достъпът до камерата е блокиран"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Достъпът до камерата и микрофона е блокиран"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Достъпът до микрофона е блокиран"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетният режим е включен"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml index 011c62490606..24b41d23e900 100644 --- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Изкл."</item> <item msgid="5966994759929723339">"Вкл."</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Не е налице"</item> + <item msgid="2478289035899842865">"Изключено"</item> + <item msgid="5137565285664080143">"Включено"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 319684206c6f..0f3f00c465e3 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"বিজ্ঞপ্তি শেড৷"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"দ্রুত সেটিংস৷"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"লক স্ক্রিন।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"কর্মস্থলের স্ক্রিন লক"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ করুন"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"কালার ইনভার্সন"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"রঙ সংশোধন"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ফন্ট সাইজ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ব্যবহারকারীদের ম্যানেজ করুন"</string> <string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন হয়েছে"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ করুন"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"স্ক্রিন রেকর্ডিং"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"কোনও শীর্ষক নেই"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ফন্ট সাইজ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"আরও ছোট করুন"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"আরও বড় করুন"</string> <string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"উইন্ডো কন্ট্রোল বড় করে দেখা"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"বড় করুন"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• অন্তত একটি ডিভাইস উপলভ্য"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"শর্টকাট টাচ করে ধরে রাখুন"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"বাতিল করুন"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"এখন স্ক্রিন পাল্টান"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ফোন আনফোল্ড করুন"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"স্ক্রিন পাল্টাবেন?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"আরও বেশি রেজোলিউশনের জন্য, রিয়ার ক্যামেরা ব্যবহার করুন"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"আরও বেশি রেজোলিউশনের জন্য, ফোন ফ্লিপ করুন"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ফোল্ড করা যায় এমন ডিভাইস খোলা হচ্ছে"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ফোল্ড করা যায় এমন ডিভাইস উল্টানো হচ্ছে"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ব্যাটারির চার্জ বাকি আছে"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"অফিস প্রোফাইলে পাল্টে নিন"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"বন্ধ করুন"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"লক স্ক্রিন সেটিংস"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml index 00ce04e42e13..59061c223580 100644 --- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"বন্ধ আছে"</item> <item msgid="5966994759929723339">"চালু আছে"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"উপলভ্য নেই"</item> + <item msgid="2478289035899842865">"বন্ধ আছে"</item> + <item msgid="5137565285664080143">"চালু আছে"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8134ec9944b1..823b72367b95 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Obavještenja sa sjenčenjem."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brze postavke."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Brze postavke i zaslon obavijesti."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan ekran radnog profila"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje ekrana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Veličina fonta"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Smanjivanje"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Povećavanje"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećavanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećavanje"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Uvećavanje"</string> @@ -1029,11 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Dostupan je najmanje jedan uređaj"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečicu"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Otkaži"</string> - <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Promijenite zaslon odmah"</string> - <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otklopite telefon"</string> - <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Želite li promijeniti zaslon?"</string> - <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Za višu razlučivost upotrijebite stražnju kameru"</string> - <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Za višu razlučivost okrenite telefon"</string> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Promijenite ekran sada"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Rasklopite telefon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Promijeniti ekran?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Za višu rezoluciju koristite zadnju kameru"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Za višu rezoluciju obrnite telefon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Sklopivi uređaj se rasklapa"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Sklopivi uređaj se obrće"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Preostalo baterije: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Pređite na radni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zatvori"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Postavke zaključavanja ekrana"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi mreža nije dostupna"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Način rada Prioriteti je uključen"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index ca8a4c366094..d60722fc1d11 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Àrea de notificacions"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuració ràpida"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueig"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueig per a la feina"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Tanca"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillantor"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversió de colors"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correcció de color"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Cos de font"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gestiona els usuaris"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tanca"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravació de pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sense títol"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Cos de font"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Redueix"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Amplia"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra d\'ampliació"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra de controls d\'ampliació"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Amplia"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"No es pot emetre"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"No es pot desar. Torna-ho a provar."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"No es pot desar."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Utilitza 4 caràcters com a mínim"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Utilitza menys de 16 caràcters"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilació"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"El número de compilació s\'ha copiat al porta-retalls."</string> <string name="basic_status" msgid="2315371112182658176">"Conversa oberta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Almenys un dispositiu està disponible."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén premuda la drecera"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel·la"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Canvia de pantalla ara"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Desplega el telèfon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vols canviar de pantalla?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Per a una resolució més alta, utilitza la càmera posterior"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Per a una resolució més alta, gira el telèfon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositiu plegable desplegant-se"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositiu plegable girant"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de bateria"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Canvia al perfil de treball"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tanca"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Configuració pantalla de bloqueig"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml index 067b970226d8..e99926c57324 100644 --- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desactivat"</item> <item msgid="5966994759929723339">"Activat"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"No disponible"</item> + <item msgid="2478289035899842865">"Desactivat"</item> + <item msgid="5137565285664080143">"Activat"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 0e6643ef6a52..6662ca10ffc0 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel oznámení."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Rychlé nastavení."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Obrazovka uzamčení"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Obrazovka uzamčení pracovního profilu"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zavřít"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Převrácení barev"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekce barev"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Velikost písma"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Správa uživatelů"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavřít"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"nahrávání obrazovky"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Velikost písma"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Zmenšit"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Zvětšit"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Zvětšovací okno"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládací prvky zvětšovacího okna"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Přiblížit"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Je k dispozici alespoň jedno zařízení"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Podržte zkratku"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Zrušit"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Přepnout obrazovky"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Rozevřete telefon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Přepnout obrazovky?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Pomocí zadního fotoaparátu dosáhnete vyššího rozlišení"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Otočte telefon, abyste dosáhli vyššího rozlišení"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Rozkládání rozkládacího zařízení"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Otáčení rozkládacího zařízení"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Zbývá <xliff:g id="PERCENTAGE">%s</xliff:g> baterie"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Přepnout na pracovní profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zavřít"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Nastavení obrazovky uzamčení"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Síť Wi-Fi není dostupná"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokována"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofon jsou blokovány"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokován"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml index df3d403d14dc..6359f94112bb 100644 --- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Vypnuto"</item> <item msgid="5966994759929723339">"Zapnuto"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nedostupné"</item> + <item msgid="2478289035899842865">"Vypnuto"</item> + <item msgid="5137565285664080143">"Zapnuto"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 0fc389736447..ee9d8a60b760 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notifikationspanel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Kvikmenu."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskærm."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låseskærm til arbejde"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Luk"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ombytning af farver"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Farvekorrigering"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Skriftstørrelse"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Administrer brugere"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Udfør"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Luk"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"skærmoptagelse"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Skriftstørrelse"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Formindsk"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Forstør"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vindue med forstørrelse"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vindue med forstørrelsesstyring"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom ind"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Der kan ikke udsendes en fællesbesked"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Der kan ikke gemmes. Prøv igen."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Der kan ikke gemmes."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Angiv mindst 4 tegn"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Angiv højst 16 tegn"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Buildnummer"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Buildnummeret blev kopieret til udklipsholderen."</string> <string name="basic_status" msgid="2315371112182658176">"Åben samtale"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Mindst én enhed er tilgængelig"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Hold fingeren på genvejen"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuller"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Skift skærm nu"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Fold telefonen ud"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vil du skifte skærm?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Brug kameraet på bagsiden for at få højere opløsning"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Vend telefonen for at få højere opløsning"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldbar enhed foldes ud"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldbar enhed vendes om"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> batteri tilbage"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skift til arbejdsprofil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Luk"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Indstillinger for låseskærm"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml index 7e2f87de778e..1daed4cd6864 100644 --- a/packages/SystemUI/res/values-da/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Fra"</item> <item msgid="5966994759929723339">"Til"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ikke tilgængelig"</item> + <item msgid="2478289035899842865">"Fra"</item> + <item msgid="5137565285664080143">"Til"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index d6568e7b1b8c..66fa2317d284 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Benachrichtigungsleiste"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Schnelleinstellungen"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sperrbildschirm"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Sperrbildschirm für Arbeitsprofil"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Schließen"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helligkeit"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Farbumkehr"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Farbkorrektur"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Schriftgröße"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Nutzer verwalten"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fertig"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Schließen"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"Bildschirmaufzeichnung"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Kein Titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Schriftgröße"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Verkleinern"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Vergrößern"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrößerungsfenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Einstellungen für Vergrößerungsfenster"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Heranzoomen"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Mindestens ein Gerät ist verfügbar"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Verknüpfung berühren & halten"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Abbrechen"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bildschirm jetzt wechseln"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Smartphone auffalten"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Bildschirm wechseln?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Mit der Rückkamera lassen sich Fotos mit höherer Auflösung aufnehmen"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Smartphone umdrehen, um Fotos mit höherer Auflösung aufzunehmen"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Faltbares Gerät wird geöffnet"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Faltbares Gerät wird umgeklappt"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akku bei <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Zum Arbeitsprofil wechseln"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Schließen"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Sperrbildschirm-Einstellungen"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml index bd73a0583c53..9a087472bd03 100644 --- a/packages/SystemUI/res/values-de/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Aus"</item> <item msgid="5966994759929723339">"An"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nicht verfügbar"</item> + <item msgid="2478289035899842865">"Aus"</item> + <item msgid="5137565285664080143">"An"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 7b413edd78db..84d661021067 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Πλαίσιο σκίασης ειδοποιήσεων."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Γρήγορες ρυθμίσεις."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Οθόνη κλειδώματος"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Οθόνη κλειδωμένης εργασίας"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Κλείσιμο"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Φωτεινότητα"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Αντιστροφή χρωμάτων"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Διόρθωση χρωμάτων"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Μέγεθος γραμματοσειράς"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Διαχείριση χρηστών"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Τέλος"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Κλείσιμο"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"εγγραφή οθόνης"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Χωρίς τίτλο"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Μέγεθος γραμματοσειράς"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Να μικρύνουν"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Να μεγαλώσουν"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Παράθυρο μεγέθυνσης"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Στοιχεία ελέγχου παραθύρου μεγέθυνσης"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Μεγέθυνση"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Δεν είναι δυνατή η μετάδοση"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Δεν είναι δυνατή η αποθήκευση. Δοκιμάστε ξανά."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Δεν είναι δυνατή η αποθήκευση."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Χρησιμοποιήστε τουλάχιστον 4 χαρακτήρες"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Χρησιμοποιήστε λιγότερους από 16 χαρακτήρες"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Αριθμός έκδοσης"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Ο αριθμός έκδοσης αντιγράφηκε στο πρόχειρο."</string> <string name="basic_status" msgid="2315371112182658176">"Άνοιγμα συνομιλίας"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Είναι διαθέσιμη τουλάχιστον μία συσκευή"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Παρατεταμένο άγγιγμα συντόμευσης"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Ακύρωση"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Εναλλαγή οθονών τώρα"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Ξεδιπλώστε το τηλέφωνο"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Αλλαγή οθονών;"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Για υψηλότερη ανάλυση, χρησιμοποιήστε την πίσω κάμερα"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Για υψηλότερη ανάλυση, αναστρέψτε το τηλέφωνο"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Αναδιπλούμενη συσκευή που ξεδιπλώνει"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Αναδιπλούμενη συσκευή που διπλώνει"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Απομένει το <xliff:g id="PERCENTAGE">%s</xliff:g> της μπαταρίας"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Εναλλαγή σε προφίλ εργασίας"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Κλείσιμο"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Ρυθμίσεις κλειδώματος οθόνης"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Δεν υπάρχει διαθέσιμο δίκτυο Wi-Fi"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Η κάμερα έχει αποκλειστεί"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Η κάμερα και το μικρόφωνο έχουν αποκλειστεί"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Το μικρόφωνο έχει αποκλειστεί"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Η λειτουργία προτεραιότητας είναι ενεργοποιημένη"</string> </resources> diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml index 5c7c7380943a..4d94515ac130 100644 --- a/packages/SystemUI/res/values-el/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Ανενεργό"</item> <item msgid="5966994759929723339">"Ενεργό"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Μη διαθέσιμο"</item> + <item msgid="2478289035899842865">"Ανενεργό"</item> + <item msgid="5137565285664080143">"Ενεργό"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 5b6c106115cc..59eaeab3ae59 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Quick Settings and notification shade."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Font size"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Make smaller"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Make larger"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom in"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Switch to work profile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Close"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lock screen settings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 50134c831bee..cbc9d6ae47b1 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Quick settings and Notification shade."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Font Size"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Make smaller"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Make larger"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification Window Controls"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom in"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Switch to work profile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Close"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lock screen settings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera blocked"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 5b6c106115cc..59eaeab3ae59 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Quick Settings and notification shade."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Font size"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Make smaller"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Make larger"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom in"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Switch to work profile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Close"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lock screen settings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 5b6c106115cc..59eaeab3ae59 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Quick Settings and notification shade."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Font size"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Make smaller"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Make larger"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom in"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Switch to work profile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Close"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lock screen settings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index f8f77591c8bb..e718dde381c1 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Quick settings and Notification shade."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Font Size"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Make smaller"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Make larger"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification Window Controls"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom in"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Switch to work profile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Close"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lock screen settings"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi not available"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera blocked"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 4b49a20551f5..020b9e5ed206 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuración rápida"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla bloqueada del perfil de trabajo"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Invertir colores"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corregir colores"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Tamaño de la fuente"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Administrar usuarios"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"Grabación de pant."</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamaño de fuente"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Reducir tamaño"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar tamaño"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles de ampliación de la ventana"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Acercar"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Error al iniciar transmisión"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"No se puede guardar. Vuelve a intentarlo."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"No se puede guardar."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Usa al menos 4 caracteres"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Usa menos de 16 caracteres"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Se copió el número de compilación en el portapapeles."</string> <string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Hay al menos un dispositivo disponible."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantener presionado atajo"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Cambiar de pantalla ahora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Desplegar teléfono"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"¿Quieres cambiar de pantalla?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Para obtener una resolución más alta, usa la cámara posterior"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para obtener una resolución más alta, gira el teléfono"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo plegable siendo desplegado"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo plegable siendo girado"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> de batería restante"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar al perfil de trabajo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Cerrar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Config. de pantalla de bloqueo"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml index e15610096626..bb3983b0bb09 100644 --- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"No"</item> <item msgid="5966994759929723339">"Sí"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"No disponible"</item> + <item msgid="2478289035899842865">"Desactivado"</item> + <item msgid="5137565285664080143">"Activado"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index a180e2cf2f6d..c8e9b23b83e8 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ajustes rápidos"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueo para el perfil de trabajo"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Invertir colores"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corrección de color"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Tamaño de fuente"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gestionar usuarios"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hecho"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"grabación de pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamaño de fuente"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Reducir tamaño"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar tamaño"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ventana de controles de ampliación"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Ampliar"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"No se puede emitir"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"No se puede guardar. Inténtalo de nuevo."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"No se puede guardar."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Usa 4 caracteres como mínimo"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Usa menos de 16 caracteres"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Número de compilación copiado en el portapapeles."</string> <string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Al menos un dispositivo debe estar disponible"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén pulsado el acceso directo"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Cambia de pantalla ahora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Abre el teléfono"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"¿Cambiar de pantalla?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Para una mayor resolución, usa la cámara trasera"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para una mayor resolución, gira el teléfono"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo plegable desplegándose"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo plegable mostrado desde varios ángulos"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Batería restante: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar al perfil de trabajo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Cerrar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Ajustes de pantalla de bloqueo"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml index cee83711077c..7451e6b9ada8 100644 --- a/packages/SystemUI/res/values-es/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desactivado"</item> <item msgid="5966994759929723339">"Activado"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"No disponible"</item> + <item msgid="2478289035899842865">"Desactivado"</item> + <item msgid="5137565285664080143">"Activado"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index b9d753e106cc..a46f53d9aaaf 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Märguande vari."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Kiirseaded."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kuva lukustamine."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Töö lukustuskuva"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Sulgemine"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Heledus"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Värvide ümberpööramine"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Värviparandus"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Fondi suurus"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Kasutajate haldamine"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sule"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekraanikuva salvest."</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Pealkiri puudub"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Fondi suurus"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Vähendamine"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Suurendamine"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Suurendamisakna juhtelemendid"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Suumi sisse"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Vähemalt üks seade on saadaval"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pikalt puudutamise otsetee"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Tühista"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Vaheta ekraane kohe"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefoni lahtivoltimine"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Kas vahetada ekraane?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Suurema eraldusvõime saavutamiseks kasutage tagakaamerat"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Suurema eraldusvõime saavutamiseks pöörake telefon ümber"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Volditava seadme lahtivoltimine"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Volditava seadme ümberpööramine"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akutase on <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Lülitu tööprofiilile"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Sule"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lukustuskuva seaded"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml index 7bf520f581c3..6a9edbbe812a 100644 --- a/packages/SystemUI/res/values-et/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Väljas"</item> <item msgid="5966994759929723339">"Sees"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Pole saadaval"</item> + <item msgid="2478289035899842865">"Väljas"</item> + <item msgid="5137565285664080143">"Sees"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 722bd7870146..53ec95e22d7a 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Jakinarazpenen panela."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ezarpen bizkorrak."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantaila blokeatzeko aukera."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Laneko pantaila blokeatua"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Itxi"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Distira"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kolore-alderantzikatzea"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Koloreen zuzenketa"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Letra-tamaina"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Kudeatu erabiltzaileak"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Eginda"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Itxi"</string> @@ -1030,16 +1031,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Gutxienez gailu bat erabilgarri dago."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Eduki sakatuta lasterbidea"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Utzi"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Aldatu pantaila batetik bestera"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Ireki telefonoa"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Pantaila batetik bestera aldatu nahi duzu?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Erabili atzeko kamera bereizmen handiago a lortzeko"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Irauli telefonoa bereizmen handiago a lortzeko"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Gailu tolesgarria zabaltzen"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Gailu tolesgarria biratzen"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Bateriaren <xliff:g id="PERCENTAGE">%s</xliff:g> geratzen da"</string> @@ -1051,4 +1047,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Aldatu laneko profilera"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Itxi"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Pantaila blokeatuaren ezarpenak"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi-konexioa ez dago erabilgarri"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blokeatuta dago"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera eta mikrofonoa blokeatuta daude"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonoa blokeatuta dago"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Lehentasun modua aktibatuta dago"</string> </resources> diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml index 333ede134f45..d023076ca2bf 100644 --- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desaktibatuta"</item> <item msgid="5966994759929723339">"Aktibatuta"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ez dago erabilgarri"</item> + <item msgid="2478289035899842865">"Desaktibatuta"</item> + <item msgid="5137565285664080143">"Aktibatuta"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index fa7c5c6e9f9d..938bc82c2d19 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -93,7 +93,7 @@ <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"مرز سمت راست <xliff:g id="PERCENT">%1$d</xliff:g> درصد"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"در برنامه <xliff:g id="APP">%1$s</xliff:g> در نمایه کاری ذخیره شد"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Files"</string> - <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> این نماگرفت را تشخیص داد."</string> + <string name="screenshot_detected_template" msgid="7940376642921719915">"«<xliff:g id="APPNAME">%1$s</xliff:g>» این نماگرفت را تشخیص داد."</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> و سایر برنامههای باز این نماگرفت را تشخیص دادند."</string> <string name="screenrecord_name" msgid="2596401223859996572">"ضبطکننده صفحهنمایش"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"درحال پردازش ضبط صفحهنمایش"</string> @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"باتری <xliff:g id="NUMBER">%d</xliff:g> درصد."</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"درصد شارژ باتری: <xliff:g id="PERCENTAGE">%1$d</xliff:g>، <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"در حال شارژ باتری، <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> درصد"</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"درصد شارژ باتری: <xliff:g id="PERCENTAGE">%d</xliff:g>، شارژ شدن برای محافظت از باتری موقتاً متوقف شد."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"درصد شارژ باتری: <xliff:g id="PERCENTAGE">%1$d</xliff:g>، <xliff:g id="TIME">%2$s</xliff:g>، شارژ شدن برای محافظت از باتری موقتاً متوقف شد."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"شارژ باتری <xliff:g id="PERCENTAGE">%d</xliff:g> درصد است. شارژ شدن برای محافظت از باتری موقتاً متوقف شد."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"شارژ باتری <xliff:g id="PERCENTAGE">%1$d</xliff:g> درصد، <xliff:g id="TIME">%2$s</xliff:g>. شارژ شدن برای محافظت از باتری موقتاً متوقف شد."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"دیدن همه اعلانها"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"تلهتایپ فعال شد."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"زنگ لرزشی."</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"مجموعه اعلان."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"تنظیمات سریع."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"صفحه قفل."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"صفحه قفل کاری"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"بستن"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"روشنایی"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"وارونگی رنگ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"تصحیح رنگ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"اندازه قلم"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"مدیریت کاربران"</string> <string name="quick_settings_done" msgid="2163641301648855793">"تمام"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بستن"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ضبط صفحهنمایش"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"اندازه قلم"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"کوچکتر کردن"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"بزرگتر کردن"</string> <string name="magnification_window_title" msgid="4863914360847258333">"پنجره درشتنمایی"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"کنترلهای پنجره درشتنمایی"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"زومپیش کردن"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• حداقل یک دستگاه دردسترس باشد"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"میانبر را لمس کنید و نگه دارید"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"لغو کردن"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"صفحهها اکنون جابهجا میشود"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"باز کردن تلفن"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"صفحهها جابهجا شود؟"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"برای وضوح بیشتر، از دوربین پشت استفاده کنید"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"برای وضوح بیشتر، تلفن را برگردانید"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"دستگاه تاشو درحال باز شدن"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"دستگاه تاشو درحال چرخش به اطراف"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> باتری باقی مانده است"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"رفتن به نمایه کاری"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"بستن"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"تنظیمات صفحه قفل"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi دردسترس نیست"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"دوربین مسدود شده است"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"دوربین و میکروفون مسدود شدهاند"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"میکروفون مسدود شده است"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"حالت اولویت روشن است"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml index 436ea31f2044..b341e9e64c7b 100644 --- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"خاموش"</item> <item msgid="5966994759929723339">"روشن"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"دردسترس نیست"</item> + <item msgid="2478289035899842865">"خاموش"</item> + <item msgid="5137565285664080143">"روشن"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 7191d6c63126..6f9b38bf0d9d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -28,7 +28,7 @@ <string name="invalid_charger_text" msgid="2339310107232691577">"Käytä laitteesi mukana tullutta laturia"</string> <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Otetaanko virransäästö käyttöön?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Tietoa virransäästöstä"</string> - <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Ota käyttöön"</string> + <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Laita päälle"</string> <string name="battery_saver_start_action" msgid="8353766979886287140">"Laita päälle"</string> <string name="battery_saver_dismiss_action" msgid="7199342621040014738">"Ei kiitos"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Näytön automaattinen kääntö"</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Ilmoitusalue."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Pika-asetukset."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lukitse näyttö."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Työlukitusnäyttö"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Sulje"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kirkkaus"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Käänteiset värit"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Värinkorjaus"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Fonttikoko"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Ylläpidä käyttäjiä"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sulje"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"näytön tallennus"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ei nimeä"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Fonttikoko"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Pienennä"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Suurenna"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurennusikkuna"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Suurennusikkunan ohjaimet"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Lähennä"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Ei voi lähettää"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Tallennus ei onnistu. Yritä uudelleen."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Tallennus ei onnistu."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Käytä vähintään 4 merkkiä"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Käytä alle 16 merkkiä"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Koontiversion numero"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Koontiversion numero kopioitu leikepöydälle"</string> <string name="basic_status" msgid="2315371112182658176">"Avaa keskustelu"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ainakin yksi laite on käytettävissä"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Kosketa pikakuvaketta pitkään"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Peru"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Vaihda näyttöä nyt"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Taita puhelin auki"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vaihdetaanko näyttöä?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Resoluutio on parempi, kun käytät takakameraa"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Resoluutio on parempi, kun käännät puhelimen"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Taitettava laite taitetaan"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Taitettava laite käännetään ympäri"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akkua jäljellä <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Vaihda työprofiiliin"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Sulje"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lukitusnäytön asetukset"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi-yhteys ei ole käytettävissä"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera estetty"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ja mikrofoni estetty"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni estetty"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Tärkeät-tila on päällä"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml index 4bec4b3157cb..bbd64fdb87da 100644 --- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Poissa päältä"</item> <item msgid="5966994759929723339">"Päällä"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ei saatavilla"</item> + <item msgid="2478289035899842865">"Pois päältä"</item> + <item msgid="5137565285664080143">"Päällä"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index dbd35189a4f2..c6f8cab527a5 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Paramètres rapides"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Verrouillage de l\'écran du profil professionnel"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correction des couleurs"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Taille de la police"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gérer les utilisateurs"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Terminé"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string> @@ -909,10 +910,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Impossible de diffuser"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Impossible d\'enregistrer. Réessayez."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Impossible d\'enregistrer."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Utilisez au moins 4 caractères"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Utilisez moins de 16 caractères"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numéro de version"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Le numéro de version a été copié dans le presse-papiers."</string> <string name="basic_status" msgid="2315371112182658176">"Ouvrir la conversation"</string> @@ -1032,16 +1031,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• qu\'au moins un appareil est utilisable;"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Maintenir le doigt sur raccourci"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuler"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Changer d\'écran maintenant"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Déplier le téléphone"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Changer d\'écran?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Pour une meilleure résolution, utilisez l\'appareil photo arrière"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Pour une meilleure résolution, retournez le téléphone"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Appareil pliable en cours de dépliage"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Appareil pliable en train d\'être retourné"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Charge restante de la pile : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1047,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Passer au profil professionnel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fermer"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Paramètres écran de verrouillage"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml index 788f56de1bdc..8df62113b674 100644 --- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Désactivé"</item> <item msgid="5966994759929723339">"Activé"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Non accessible"</item> + <item msgid="2478289035899842865">"Désactivée"</item> + <item msgid="5137565285664080143">"Activée"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index ff8c44fe6e7b..a191259b7f1e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Réglages rapides"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Écran de verrouillage du profil professionnel"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correction des couleurs"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Taille de la police"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gérer les utilisateurs"</string> <string name="quick_settings_done" msgid="2163641301648855793">"OK"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"enregistrement écran"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Taille de police"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Réduire"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Agrandir"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Fenêtre des commandes d\'agrandissement"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Faire un zoom avant"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Impossible de diffuser"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Impossible d\'enregistrer. Réessayez."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Impossible d\'enregistrer."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Utilisez au moins quatre caractères"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Utilisez moins de 16 caractères"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numéro de build"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Numéro de build copié dans le presse-papiers."</string> <string name="basic_status" msgid="2315371112182658176">"Conversation ouverte"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Au moins un appareil est disponible"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Appuyez de manière prolongée sur raccourci"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuler"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Changer d\'écran maintenant"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Déplier le téléphone"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Changer d\'écran ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Pour une résolution plus élevée, utilisez la caméra arrière"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Pour une résolution plus élevée, retournez le téléphone"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Appareil pliable qui est déplié"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Appareil pliable qui est retourné"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> de batterie restante"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Passer au profil professionnel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fermer"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Paramètres écran de verrouillage"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml index 3f63a9639a80..ce39cd2dc78d 100644 --- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Désactivé"</item> <item msgid="5966994759929723339">"Activé"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Non disponible"</item> + <item msgid="2478289035899842865">"Désactivé"</item> + <item msgid="5137565285664080143">"Activé"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 62d0a3082b58..2684b92581c9 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel despregable"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuración rápida"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueo do perfil de traballo"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Pechar"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversión da cor"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corrección da cor"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Tamaño do tipo de letra"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Administrar usuarios"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Feito"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Pechar"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravación pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sen título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamaño do tipo de letra"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Reducir o tamaño"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar o tamaño"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controis de ampliación da ventá"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Achegar"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Non se puido iniciar a emisión"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Non se puido gardar a información. Téntao de novo."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Non se pode gardar a información."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Utiliza como mínimo 4 caracteres"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Utiliza menos de 16 caracteres"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Copiouse o número de compilación no portapapeis."</string> <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ten que haber polo menos un dispositivo dispoñible"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Mantén premido o atallo"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Cambiar de pantalla agora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Desprega o teléfono"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Queres cambiar de pantalla?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Usa a cámara traseira para gozar dunha maior resolución"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Dálle a volta ao teléfono para gozar dunha maior resolución"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo pregable abríndose"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo pregable xirando"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Batería restante: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar ao perfil de traballo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Pechar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Configuración pantalla bloqueo"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml index 94fc3f487d17..b03f31171e5c 100644 --- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desactivado"</item> <item msgid="5966994759929723339">"Activado"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Non dispoñible"</item> + <item msgid="2478289035899842865">"Desactivado"</item> + <item msgid="5137565285664080143">"Activado"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index ab37dbb011a5..cf1000d76a4c 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"નોટિફિકેશન શેડ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ઝડપી સેટિંગ."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"લૉક સ્ક્રીન."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"કાર્ય લૉક સ્ક્રીન"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"બંધ કરો"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"તેજ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"વિપરીત રંગમાં બદલવું"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"રંગ સુધારણા"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ફૉન્ટનું કદ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"વપરાશકર્તાઓને મેનેજ કરો"</string> <string name="quick_settings_done" msgid="2163641301648855793">"થઈ ગયું"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"બંધ કરો"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"સ્ક્રીન રેકોર્ડિંગ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ફૉન્ટનું કદ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"વધુ નાનું બનાવો"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"વધુ મોટું બનાવો"</string> <string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"વિસ્તૃતીકરણ વિંડોના નિયંત્રણો"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"મોટું કરો"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"બ્રોડકાસ્ટ કરી શકતા નથી"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"સાચવી શકતા નથી. ફરી પ્રયાસ કરો."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"સાચવી શકતા નથી."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"ઓછામાં ઓછા 4 અક્ષરનો ઉપયોગ કરો"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16 કરતાં ઓછા અક્ષરનો ઉપયોગ કરો"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"બિલ્ડ નંબર"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"બિલ્ડ નંબર ક્લિપબૉર્ડ પર કૉપિ કર્યો."</string> <string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ઓછામાં ઓછું એક ડિવાઇસ ઉપલબ્ધ છે"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"શૉર્ટકટને ટચ વડે પળભર દબાવી રાખો"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"રદ કરો"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"હમણાં સ્ક્રીન સ્વિચ કરો"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ફોનને અનફોલ્ડ કરો"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"સ્ક્રીન સ્વિચ કરીએ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"વધુ રિઝોલ્યુશન માટે, રીઅર કૅમેરાનો ઉપયોગ કરો"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"વધુ રિઝોલ્યુશન માટે, ફોનને ફ્લિપ કરો"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ અનફોલ્ડ કરવામાં આવી રહ્યું છે"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ ફ્લિપ કરવામાં આવી રહ્યું છે"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> બૅટરી બાકી છે"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ઑફિસની પ્રોફાઇલ પર સ્વિચ કરો"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"બંધ કરો"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"લૉક સ્ક્રીનના સેટિંગ"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml index e92168c37cb8..5d1ad6ff0514 100644 --- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"બંધ છે"</item> <item msgid="5966994759929723339">"ચાલુ છે"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"અનુપલબ્ધ"</item> + <item msgid="2478289035899842865">"બંધ"</item> + <item msgid="5137565285664080143">"ચાલુ"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 22933ba04605..7bab739d51d1 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"त्वरित सेटिंग."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"वर्क लॉक स्क्रीन"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करें"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"स्क्रीन की रोशनी"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"रंग बदलने की सुविधा"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"रंग में सुधार करने की सुविधा"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"फ़ॉन्ट का साइज़"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"उपयोगकर्ताओं को मैनेज करें"</string> <string name="quick_settings_done" msgid="2163641301648855793">"हो गया"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"रद्द करें"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रिकॉर्डिंग"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फ़ॉन्ट का साइज़"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"छोटा करें"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"बड़ा करें"</string> <string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"स्क्रीन को बड़ा करके दिखाने वाली विंडो के नियंत्रण"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ज़ूम इन करें"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• कम से कम एक डिवाइस उपलब्ध है"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"शॉर्टकट को दबाकर रखें"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"रद्द करें"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"अब स्क्रीन स्विच करें"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"अपना फ़ोन अनफ़ोल्ड करें"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"स्क्रीन स्विच करनी है?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"बेहतर रिज़ॉल्यूशन वाली फ़ोटो खींचने के लिए, पीछे का कैमरा इस्तेमाल करें"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"बेहतर रिज़ॉल्यूशन वाली फ़ोटो खींचने के लिए, फ़ोन को फ़्लिप करें"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फ़ोल्ड किया जा सकने वाला डिवाइस अनफ़ोल्ड किया जा रहा है"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फ़ोल्ड किया जा सकने वाला डिवाइस पलटा जा रहा है"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> बैटरी बची है"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"वर्क प्रोफ़ाइल पर स्विच करें"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"बंद करें"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"लॉक स्क्रीन की सेटिंग"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"वाई-फ़ाई उपलब्ध नहीं है"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कैमरे का ऐक्सेस नहीं है"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कैमरे और माइक्रोफ़ोन का ऐक्सेस नहीं है"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफ़ोन का ऐक्सेस नहीं है"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राथमिकता मोड चालू है"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml index 0abf8b31ca1a..cd29fb92063f 100644 --- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"बंद है"</item> <item msgid="5966994759929723339">"चालू है"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"अभी उपलब्ध नहीं है"</item> + <item msgid="2478289035899842865">"बंद है"</item> + <item msgid="5137565285664080143">"चालू है"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 5de0d542cbe0..5a9bf91e5ae7 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Zaslon obavijesti."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brze postavke."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Brze postavke i zaslon obavijesti."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključavanje zaslona."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan zaslon radnog profila"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvaranje"</string> @@ -778,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje zaslona"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Veličina fonta"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Smanji"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Povećaj"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za povećavanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za povećavanje"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Povećaj"</string> @@ -1045,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Prijeđite na poslovni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zatvori"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Postavke zaključanog zaslona"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nije dostupan"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Blokirani su kamera i mikrofon"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Uključen je prioritetni način rada"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index ffeeb14a3e74..8a088a1bff9b 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Értesítési felület."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Gyorsbeállítások."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lezárási képernyő."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Munka lezárási képernyővel"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Bezárás"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Fényerő"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Színek invertálása"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Színjavítás"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Betűméret"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Felhasználók kezelése"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Kész"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bezárás"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"képernyőrögzítés"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nincs cím"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Betűméret"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Kisebb"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Nagyobb"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Nagyítás ablaka"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Nagyítási vezérlők ablaka"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Nagyítás"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Nem sikerült a közvetítés"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"A mentés nem sikerült. Próbálja újra."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"A mentés nem sikerült."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Legalább négy karaktert használjon"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Legfeljebb 16 karaktert használhat"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Buildszám"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Buildszám a vágólapra másolva."</string> <string name="basic_status" msgid="2315371112182658176">"Beszélgetés megnyitása"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Legalább egy eszköz rendelkezésre áll"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Tartsa nyomva a parancsikont"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Mégse"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Váltson képernyőt most"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Hajtsa ki a telefont"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Szeretne képernyőt váltani?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"A nagyobb felbontás érdekében használja a hátlapi kamerát."</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"A nagyobb felbontás érdekében fordítsa meg a telefont"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Összehajtható eszköz kihajtása"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Összehajtható eszköz körbeforgatása"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akkumulátor töltöttségi szintje: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Váltás munkaprofilra"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Bezárás"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Lezárási képernyő beállításai"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml index 0416a5504ae9..157c552b31a6 100644 --- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Ki"</item> <item msgid="5966994759929723339">"Be"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nem áll rendelkezésre"</item> + <item msgid="2478289035899842865">"Ki"</item> + <item msgid="5137565285664080143">"Be"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 4bd3a65c9ba4..819a02990183 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -187,7 +187,7 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"Մարտկոցը <xliff:g id="NUMBER">%d</xliff:g> տոկոս է:"</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%1$d</xliff:g> տոկոս է։ Այն կաշխատի <xliff:g id="TIME">%2$s</xliff:g>։"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Մարտկոցը լիցքավորվում է: Լիցքը <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> տոկոս է:"</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%d</xliff:g> է։ Լիցքավորումը դադարեցվել է՝ մարտկոցը պաշտպանելու համար։"</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%d</xliff:g> տոկոս է։ Լիցքավորումը դադարեցվել է՝ մարտկոցը պաշտպանելու համար։"</string> <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%1$d</xliff:g> է։ Այն կաշխատի <xliff:g id="TIME">%2$s</xliff:g>։ Լիցքավորումը դադարեցվել է՝ մարտկոցը պաշտպանելու նպատակով։"</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Տեսնել բոլոր ծանուցումները"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Հեռատիպը միացված է:"</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Ծանուցումների վահանակ:"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Արագ կարգավորումներ:"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Էկրանի կողպում:"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Աշխատանքային պրոֆիլի կողպէկրան"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Փակել"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Պայծառություն"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Գունաշրջում"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Գունաշտկում"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Տառաչափ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Կառավարել օգտատերերին"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Փակել"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"էկրանի տեսագրում"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Տառաչափ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Փոքրացնել"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Մեծացնել"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Խոշորացման պատուհան"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Խոշորացման պատուհանի կառավարման տարրեր"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Մեծացնել"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Հասանելի է առնվազն մեկ սարք"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Հպեք դյուրանցմանը և պահեք"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Չեղարկել"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Փոխել էկրանը հիմա"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Բացեք հեռախոսի փեղկը"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Փոխե՞լ էկրանը"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Ավելի մեծ լուծաչափի համար օգտագործեք հիմնական տեսախցիկը"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Ավելի մեծ լուծաչափի համար շրջեք հեռախոսը"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ծալովի սարք՝ բացված վիճակում"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Ծալովի սարք՝ շրջված վիճակում"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Մարտկոցի լիցքը՝ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Անցնել աշխատանքային պրոֆիլ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Փակել"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Կողպէկրանի կարգավորումներ"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml index 9f30f1cd3a87..089716fa51d6 100644 --- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Անջատված է"</item> <item msgid="5966994759929723339">"Միացված է"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Հասանելի չէ"</item> + <item msgid="2478289035899842865">"Անջատված է"</item> + <item msgid="5137565285664080143">"Միացված է"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 0618ec6d6463..b70173a73829 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bayangan pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Setelan cepat."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Layar kunci."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Layar kunci kantor"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversi warna"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Koreksi warna"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Ukuran font"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Kelola pengguna"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"perekaman layar"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Tanpa judul"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Ukuran Font"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Buat lebih kecil"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Buat lebih besar"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Jendela Pembesaran"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrol Jendela Pembesaran"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Perbesar"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Tidak dapat menyiarkan"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Tidak dapat menyimpan. Coba lagi."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Tidak dapat menyimpan."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Gunakan minimal 4 karakter"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Gunakan kurang dari 16 karakter"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nomor build"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Nomor versi disalin ke papan klip."</string> <string name="basic_status" msgid="2315371112182658176">"Membuka percakapan"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Tersedia minimal satu perangkat"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Sentuh lama pintasan"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Batal"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Beralih layar sekarang"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Bentangkan ponsel"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Beralih layar?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Untuk resolusi lebih tinggi, gunakan kamera belakang"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Untuk resolusi lebih tinggi, balik ponsel"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Perangkat foldable sedang dibentangkan"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Perangkat foldable sedang dibalik"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Baterai tersisa <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Beralih ke profil kerja"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tutup"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Setelan layar kunci"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml index c31404089220..71460a71b414 100644 --- a/packages/SystemUI/res/values-in/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Nonaktif"</item> <item msgid="5966994759929723339">"Aktif"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Tidak tersedia"</item> + <item msgid="2478289035899842865">"Nonaktif"</item> + <item msgid="5137565285664080143">"Aktif"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index afdaa5dbd56d..85b435ec23cc 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> prósent á rafhlöðu."</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Hleðsla rafhlöðu er <xliff:g id="PERCENTAGE">%1$d</xliff:g> prósent, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Rafhlaða í hleðslu, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Hleðsla rafhlöðu er <xliff:g id="PERCENTAGE">%d</xliff:g> prósent, hlé gert á hleðslu til að vernda rafhlöðuna."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Hleðsla rafhlöðu er <xliff:g id="PERCENTAGE">%1$d</xliff:g> prósent, <xliff:g id="TIME">%2$s</xliff:g>, hlé gert á hleðslu til að vernda rafhlöðuna."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Rafhleðsla er <xliff:g id="PERCENTAGE">%d</xliff:g> prósent, hlé gert á hleðslu til að vernda rafhlöðuna."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Rafhleðsla er <xliff:g id="PERCENTAGE">%1$d</xliff:g> prósent, <xliff:g id="TIME">%2$s</xliff:g>, hlé gert á hleðslu til að vernda rafhlöðuna."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Sjá allar tilkynningar"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Fjarriti virkur."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Titrar við hringingu."</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Tilkynningasvæði."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Flýtistillingar."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lásskjár."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Vinnulásskjár"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Loka"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Birtustig"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Umsnúningur lita"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Litaleiðrétting"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Leturstærð"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Stjórna notendum"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Lokið"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Loka"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"skjáupptaka"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Enginn titill"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Leturstærð"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Minnka"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Stækka"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Stækkunargluggi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Stækkunarstillingar glugga"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Auka aðdrátt"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Ekki hægt að senda út"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Ekki hægt að vista. Reyndu aftur."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Ekki hægt að vista."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Notaðu að minnsta kosti 4 stafi"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Notaðu færri en 16 stafi"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Útgáfunúmer smíðar"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Útgáfunúmer smíðar afritað á klippiborð."</string> <string name="basic_status" msgid="2315371112182658176">"Opna samtal"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Að minnsta kosti eitt tæki er tiltækt"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Haltu flýtilyklinum inni"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Hætta við"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Skipta um skjá núna"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Opnaðu símann"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Skipta um skjá?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Notaðu aftari myndavélina til að fá betri upplausn"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Snúðu símanum til að fá betri upplausn"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Samanbrjótanlegt tæki opnað"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Samanbrjótanlegu tæki snúið við"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> hleðsla eftir á rafhlöðu"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skipta yfir í vinnusnið"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Loka"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Stillingar fyrir lásskjá"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml index cca4943a062e..17aaf6c2a877 100644 --- a/packages/SystemUI/res/values-is/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Slökkt"</item> <item msgid="5966994759929723339">"Kveikt"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ekki tiltækt"</item> + <item msgid="2478289035899842865">"Slökkt"</item> + <item msgid="5137565285664080143">"Kveikt"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 2f366ecab79c..8c25677fce78 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Area notifiche."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Impostazioni rapide."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Area notifiche e Impostazioni rapide."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Schermata di blocco."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Schermata di blocco del profilo di lavoro"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Chiudi"</string> @@ -257,8 +258,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosità"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversione dei colori"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correzione del colore"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Dimensioni carattere"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gestisci utenti"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fine"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Chiudi"</string> @@ -779,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"Registraz. schermo"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Dimensioni carattere"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Rimpicciolisci"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Ingrandisci"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra ingrandimento"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra controlli di ingrandimento"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumenta lo zoom"</string> @@ -909,10 +906,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Impossibile trasmettere"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Impossibile salvare. Riprova."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Impossibile salvare."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Usa almeno 4 caratteri"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Usa meno di 16 caratteri"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numero build"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Numero build copiato negli appunti."</string> <string name="basic_status" msgid="2315371112182658176">"Apri conversazione"</string> @@ -1032,16 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ci sia almeno un dispositivo disponibile"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Tocca scorciatoia/tieni premuto"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annulla"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Cambia schermo ora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Apri il telefono"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vuoi cambiare schermo?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Usa la fotocamera posteriore per una maggiore risoluzione"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Gira il telefono per una maggiore risoluzione"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo pieghevole che viene aperto"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo pieghevole che viene capovolto"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> batteria rimanente"</string> @@ -1053,4 +1043,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Passa a profilo di lavoro"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Chiudi"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Impostazioni schermata di blocco"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml index 79e5aca07162..7aa09d420f87 100644 --- a/packages/SystemUI/res/values-it/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Off"</item> <item msgid="5966994759929723339">"On"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Non disponibile"</item> + <item msgid="2478289035899842865">"Off"</item> + <item msgid="5137565285664080143">"On"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 840744bb9afb..1237ba66f18a 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"לוח התראות."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"הגדרות מהירות."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"מסך נעילה."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה של עבודה"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"סגירה"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"בהירות"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"היפוך צבעים"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"תיקון צבע"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"גודל הגופן"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ניהול משתמשים"</string> <string name="quick_settings_done" msgid="2163641301648855793">"סיום"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"סגירה"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"הקלטת המסך"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ללא שם"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"גודל גופן"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"הקטנה"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"הגדלה"</string> <string name="magnification_window_title" msgid="4863914360847258333">"חלון הגדלה"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"בקרות של חלון ההגדלה"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"התקרבות"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• יש לפחות מכשיר אחד זמין"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"מקש קיצור ללחיצה ארוכה"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ביטול"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"כן, אני רוצה להחליף בין המסכים"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"פתיחת הטלפון"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"להחליף בין המסכים?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"כדי לצלם תמונה ברזולוציה גבוהה יותר, כדאי להשתמש במצלמה האחורית"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"כדי לצלם תמונה ברזולוציה גבוהה יותר, כדאי להפוך את הטלפון"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"מכשיר מתקפל עובר למצב לא מקופל"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"מכשיר מתקפל עובר למצב מהופך"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"רמת הטעינה שנותרה בסוללה: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"מעבר לפרופיל עבודה"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"סגירה"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"הגדרות מסך הנעילה"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ה-Wi-Fi לא זמין"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"המצלמה חסומה"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"המצלמה והמיקרופון חסומים"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"המיקרופון חסום"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"מצב \'עדיפות\' מופעל"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml index 374f5af7f513..d5a0e7236f55 100644 --- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"כבוי"</item> <item msgid="5966994759929723339">"מופעל"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"לא זמין"</item> + <item msgid="2478289035899842865">"מושבת"</item> + <item msgid="5137565285664080143">"מופעל"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 4e9c1bdda389..2ce2f536571a 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知シェード"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"クイック設定"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ロック画面"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"仕事用プロファイルのロック画面"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"閉じる"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"画面の明るさ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"色反転"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色補正"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"フォントサイズ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ユーザーを管理"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完了"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"閉じる"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"画面の録画"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"タイトルなし"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"フォントサイズ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"縮小"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"拡大"</string> <string name="magnification_window_title" msgid="4863914360847258333">"拡大ウィンドウ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"拡大ウィンドウ コントロール"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"拡大"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• 利用できるデバイスが 1 台以上ある"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ショートカットの長押しが必要です"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"キャンセル"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"画面を切り替えましょう"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"スマートフォンを開いてください"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"画面を切り替えますか?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"高解像度で撮るには背面カメラを使用してください"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"高解像度で撮るにはスマートフォンを裏返してください"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"折りたたみ式デバイスが広げられている"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"折りたたみ式デバイスがひっくり返されている"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"バッテリー残量 <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"仕事用プロファイルに切り替える"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"閉じる"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ロック画面の設定"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi は利用できません"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"カメラはブロックされています"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"カメラとマイクはブロックされています"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"マイクはブロックされています"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先モードは ON です"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml index 64f7c394499c..31158ca59882 100644 --- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"OFF"</item> <item msgid="5966994759929723339">"ON"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"使用不可"</item> + <item msgid="2478289035899842865">"OFF"</item> + <item msgid="5137565285664080143">"ON"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index b6ab02c554a4..59febea1bc91 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"შეტყობინებების ფარდა"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"სწრაფი პარამეტრები"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ეკრანის დაბლოკვა."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"სამსახურის ჩაკეტილი ეკრანი"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"დახურვა"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"განათება"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ფერთა ინვერსია"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ფერთა კორექცია"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"შრიფტის ზომა"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"მომხმარებლების მართვა"</string> <string name="quick_settings_done" msgid="2163641301648855793">"დასრულდა"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"დახურვა"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ეკრანის ჩაწერა"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"უსათაურო"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"შრიფტის ზომა"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"დაპატარავება"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"გადიდება"</string> <string name="magnification_window_title" msgid="4863914360847258333">"გადიდების ფანჯარა"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"გადიდების კონტროლის ფანჯარა"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"მასშტაბის გადიდება"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ხელმისაწვდომია მინიმუმ ერთი მოწყობილობა"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"შეხების დაamp; მოცდის მალსახმობი"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"გაუქმება"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ეკრანების ახლა გადართვა"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"გაშალეთ ტელეფონი"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"გადაირთოს ეკრანები?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"მაღალი გარჩევადობისთვის გამოიყენეთ უკანა კამერა"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"მაღალი გარჩევადობისთვის ამოაბრუნეთ ტელეფონი"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"დასაკეცი მოწყობილობა იხსნება"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"დასაკეცი მოწყობილობა ტრიალებს"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"დარჩენილია ბატარეის <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"სამსახურის პროფილზე გადართვა"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"დახურვა"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ჩაკეტილი ეკრანის პარამეტრები"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi მიუწვდომელია"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"კამერა დაბლოკილია"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"კამერა და მიკროფონი დაბლოკილია"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"მიკროფონი დაბლოკილია"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"პრიორიტეტული რეჟიმი ჩართულია"</string> </resources> diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml index 99c5263a1102..366030a2231f 100644 --- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"გამორთულია"</item> <item msgid="5966994759929723339">"ჩართულია"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"მიუწვდომელია"</item> + <item msgid="2478289035899842865">"გამორთული"</item> + <item msgid="5137565285664080143">"ჩართული"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 79d54c55bfb8..6bdb0aa41925 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Хабарландыру тақтасы"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Жылдам параметрлер."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Бекіту экраны."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Әрекетті құлыптау экраны"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Жабу"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарықтығы"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түс инверсиясы"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Түсті түзету"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Қаріп өлшемі"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Пайдаланушыларды басқару"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Дайын"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабу"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"экранды бейнеге жазу"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Атауы жоқ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Қаріп өлшемі"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Кішірейту"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Үлкейту"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ұлғайту терезесі"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ұлғайту терезесінің басқару элементтері"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Ұлғайту"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Тарату мүмкін емес"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Сақталмайды. Қайталап көріңіз."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Сақталмайды."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Кемінде 4 таңба пайдаланыңыз."</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Ең көбі 16 таңба пайдаланыңыз."</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Құрама нөмірі"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Құрама нөмірі буферге көшірілді."</string> <string name="basic_status" msgid="2315371112182658176">"Ашық әңгіме"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Кемінде бір құрылғы қолжетімді"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Таңбашаны басып тұрыңыз."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Бас тарту"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Экрандарды қазір ауыстыру"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Телефонды ашу"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Экрандарды ауыстыру керек пе?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Жоғары ажыратымдылық үшін артқы камераны пайдаланыңыз."</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Жоғары ажыратымдылық үшін телефонды айналдырыңыз."</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Бүктемелі құрылғы ашылып жатыр."</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Бүктемелі құрылғы аударылып жатыр."</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Қалған батарея заряды: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Жұмыс профиліне ауысу"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Жабу"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Экран құлпының параметрлері"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml index be7546eb7686..b8089e44a5ce 100644 --- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Өшірулі."</item> <item msgid="5966994759929723339">"Қосулы."</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Қолжетімсіз"</item> + <item msgid="2478289035899842865">"Өшірулі"</item> + <item msgid="5137565285664080143">"Қосулы"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 306d104a9292..080769a4dd6a 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ពណ៌ការជូនដំណឹង"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ការកំណត់រហ័ស។"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ចាក់សោអេក្រង់។"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"អេក្រង់ចាក់សោលក្ខណៈការងារ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"បិទ"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ពន្លឺ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ការបញ្ច្រាសពណ៌"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ការកែតម្រូវពណ៌"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ទំហំពុម្ពអក្សរ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"គ្រប់គ្រងអ្នកប្រើប្រាស់"</string> <string name="quick_settings_done" msgid="2163641301648855793">"រួចរាល់"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"បិទ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ការថតវីដេអូអេក្រង់"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"គ្មានចំណងជើង"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ទំហំពុម្ពអក្សរ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"កំណត់ឱ្យតូចជាងមុន"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"កំណត់ឱ្យធំជាងមុន"</string> <string name="magnification_window_title" msgid="4863914360847258333">"វិនដូការពង្រីក"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"វិនដូគ្រប់គ្រងការពង្រីក"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ពង្រីក"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"មិនអាចផ្សាយបានទេ"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"មិនអាចរក្សាទុកបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"មិនអាចរក្សាទុកបានទេ។"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"ប្រើយ៉ាងហោចណាស់ 4 តួអក្សរ"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"ប្រើតិចជាង 16 តួអក្សរ"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"លេខកំណែបង្កើត"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"បានចម្លងលេខកំណែបង្កើតទៅឃ្លីបបត។"</string> <string name="basic_status" msgid="2315371112182658176">"បើកការសន្ទនា"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ឧបករណ៍យ៉ាងតិចមួយអាចប្រើបាន"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ចុចឱ្យជាប់លើផ្លូវកាត់"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"បោះបង់"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ប្ដូរអេក្រង់ឥឡូវនេះ"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"លាតទូរសព្ទ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ប្ដូរអេក្រង់ឬ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"សម្រាប់កម្រិតគុណភាពកាន់តែខ្ពស់ សូមប្រើប្រាស់កាមេរ៉ាខាងក្រោយ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"សម្រាប់កម្រិតគុណភាពកាន់តែខ្ពស់ សូមត្រឡប់ទូរសព្ទ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ឧបករណ៍អាចបត់បានកំពុងត្រូវបានលា"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ឧបករណ៍អាចបត់បានកំពុងត្រូវបានលា"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"ថ្មនៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ប្ដូរទៅកម្រងព័ត៌មានការងារ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"បិទ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ការកំណត់អេក្រង់ចាក់សោ"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"មិនមាន Wi-Fi ទេ"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"បានទប់ស្កាត់កាមេរ៉ា"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"បានទប់ស្កាត់កាមេរ៉ា និងមីក្រូហ្វូន"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"បានទប់ស្កាត់មីក្រូហ្វូន"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"មុខងារអាទិភាពត្រូវបានបើក"</string> </resources> diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml index 37e839f01dfc..8c5c8d1ce088 100644 --- a/packages/SystemUI/res/values-km/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"បិទ"</item> <item msgid="5966994759929723339">"បើក"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"មិនមានទេ"</item> + <item msgid="2478289035899842865">"បិទ"</item> + <item msgid="5137565285664080143">"បើក"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 1b186149ed09..4a8bbd862dd2 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ಅಧಿಸೂಚನೆಯ ಛಾಯೆ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ಲಾಕ್ ಸ್ಕ್ರೀನ್."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ಕೆಲಸದ ಲಾಕ್ ಪರದೆ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ಮುಚ್ಚು"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ಪ್ರಕಾಶಮಾನ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ಕಲರ್ ಇನ್ವರ್ಶನ್"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ಬಣ್ಣದ ತಿದ್ದುಪಡಿ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ಫಾಂಟ್ ಗಾತ್ರ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಿ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ಮುಚ್ಚಿರಿ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ಫಾಂಟ್ ಗಾತ್ರ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ಚಿಕ್ಕದಾಗಿಸಿ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ದೊಡ್ಡದಾಗಿಸಿ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ವರ್ಧನೆಯ ವಿಂಡೋ ನಿಯಂತ್ರಣಗಳು"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ಝೂಮ್ ಇನ್ ಮಾಡಿ"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ಕನಿಷ್ಠ ಒಂದು ಸಾಧನ ಲಭ್ಯವಿದೆ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ಸ್ಪರ್ಶಿಸಿ ಹೋಲ್ಡ್ ಮಾಡಿ ಶಾರ್ಟ್ಕಟ್"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ರದ್ದುಗೊಳಿಸಿ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ಈಗ ಸ್ಕ್ರೀನ್ಗಳನ್ನು ಬದಲಿಸಿ"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ಫೋನ್ ಅನ್ನು ಅನ್ಫೋಲ್ಡ್ ಮಾಡಿ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ಸ್ಕ್ರೀನ್ಗಳನ್ನು ಬದಲಿಸಬೇಕೆ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ಅಧಿಕ ರೆಸಲ್ಯೂಷನ್ಗಾಗಿ, ಹಿಂಬದಿಯ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಿ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ಅಧಿಕ ರೆಸಲ್ಯೂಷನ್ಗಾಗಿ, ಫೋನ್ ಅನ್ನು ಫ್ಲಿಪ್ ಮಾಡಿ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಅನ್ಫೋಲ್ಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಸುತ್ತಲೂ ತಿರುಗಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ಬ್ಯಾಟರಿ ಉಳಿದಿದೆ"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಬದಲಿಸಿ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ಮುಚ್ಚಿರಿ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ವೈ-ಫೈ ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ಕ್ಯಾಮರಾವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ಆದ್ಯತೆಯ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string> </resources> diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml index 8a2ad2a8bb13..16e82eacdd63 100644 --- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ಆಫ್ ಮಾಡಿ"</item> <item msgid="5966994759929723339">"ಆನ್ ಮಾಡಿ"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ಲಭ್ಯವಿಲ್ಲ"</item> + <item msgid="2478289035899842865">"ಆಫ್ ಆಗಿದೆ"</item> + <item msgid="5137565285664080143">"ಆನ್ ಆಗಿದೆ"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 12cef5509c94..dd68c5a30e22 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"알림 세부정보"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"빠른 설정"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"화면을 잠급니다."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"업무용 잠금 화면"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"닫기"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"밝기"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"색상 반전"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"색상 보정"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"글꼴 크기"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"사용자 관리"</string> <string name="quick_settings_done" msgid="2163641301648855793">"완료"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"닫기"</string> @@ -909,10 +910,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"방송할 수 없음"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"저장할 수 없습니다. 다시 시도해 주세요."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"저장할 수 없습니다."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"4자 이상 입력하세요."</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16자 미만이어야 합니다."</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"빌드 번호"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"빌드 번호가 클립보드에 복사되었습니다."</string> <string name="basic_status" msgid="2315371112182658176">"대화 열기"</string> @@ -1032,16 +1031,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• 1대 이상의 기기를 사용할 수 있습니다."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"바로가기를 길게 터치하세요."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"취소"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"지금 화면 전환"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"휴대전화 펼치기"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"화면을 전환할까요?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"해상도를 높이려면 후면 카메라를 사용하세요."</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"해상도를 높이려면 후면 카메라를 사용하세요."</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"폴더블 기기를 펼치는 모습"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"폴더블 기기를 뒤집는 모습"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"배터리 <xliff:g id="PERCENTAGE">%s</xliff:g> 남음"</string> @@ -1053,4 +1047,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"직장 프로필로 전환"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"닫기"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"잠금 화면 설정"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml index c3d9d44db26a..7981d285946c 100644 --- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"꺼짐"</item> <item msgid="5966994759929723339">"켜짐"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"사용 불가"</item> + <item msgid="2478289035899842865">"사용 안함"</item> + <item msgid="5137565285664080143">"사용"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 834d1bf69577..efd9c086ddd3 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Билдирмелер тактасы."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Тез тууралоолор."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Кулпуланган экран."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Жумуштун кулпуланган экраны"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Жабуу"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарыктыгы"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түстөрдү инверсиялоо"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Түстөрдү тууралоо"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Ариптин өлчөмү"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Колдонуучуларды тескөө"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Бүттү"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабуу"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"экранды жаздыруу"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Арип өлчөмү"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Кичирейтүү"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Чоңойтуу"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Чоңойтуу терезеси"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Чоңойтуу терезесин башкаруу каражаттары"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Жакындатуу"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Кабарлоого болбойт"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Сакталган жок. Кайталап көрүңүз."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Сакталган жок."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Кеминде 4 символдон турушу керек"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16 символдон ашпашы керек"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Курама номери"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Курама номери алмашуу буферине көчүрүлдү."</string> <string name="basic_status" msgid="2315371112182658176">"Ачык сүйлөшүү"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Кеминде бир түзмөк жеткиликтүү"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Ыкчам баскычты басып туруңуз"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Токтотуу"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Экрандарды азыр которуштуруу"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Телефонду жайып алыңыз"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Экрандар которуштурулсунбу?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Жогорку дааналык үчүн арткы камераны колдонуңуз"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Жогорку дааналык үчүн телефондун арткы камерасын колдонуңуз"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ачылып турган бүктөлмө түзмөк"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Оодарылып жаткан бүктөлмө түзмөк"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Батареянын кубаты: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Жумуш профилине которулуу"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Жабуу"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Кулпуланган экран параметрлери"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi жеткиликтүү эмес"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера бөгөттөлдү"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера менен микрофон бөгөттөлдү"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгөттөлдү"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Маанилүү сүйлөшүүлөр режими күйүк"</string> </resources> diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml index f4b84478d56b..0f277f9de292 100644 --- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Өчүк"</item> <item msgid="5966994759929723339">"Күйүк"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Жеткиликсиз"</item> + <item msgid="2478289035899842865">"Өчүк"</item> + <item msgid="5137565285664080143">"Күйүк"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml index ac81dccecc0a..4f38e6058723 100644 --- a/packages/SystemUI/res/values-land/dimens.xml +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -63,7 +63,7 @@ <dimen name="large_dialog_width">348dp</dimen> <dimen name="qs_panel_padding_top">@dimen/qqs_layout_margin_top</dimen> - <dimen name="qs_panel_padding_top_combined_headers">@dimen/qs_panel_padding_top</dimen> - <dimen name="controls_padding_horizontal">16dp</dimen> + <dimen name="controls_header_horizontal_padding">12dp</dimen> + <dimen name="controls_content_margin_horizontal">16dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 0b4c2dc2ae00..00190ec716fe 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ໜ້າຈໍແຈ້ງເຕືອນ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ການຕັ້ງຄ່າດ່ວນ."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ລັອກໜ້າຈໍ."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ໜ້າຈໍລັອກວຽກ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ປິດ"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ຄວາມແຈ້ງ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ການປີ້ນສີ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ການແກ້ໄຂສີ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ຂະໜາດຟອນ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ຈັດການຜູ້ໃຊ້"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ແລ້ວໆ"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ປິດ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ການບັນທຶກໜ້າຈໍ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ບໍ່ມີຊື່"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ຂະໜາດຟອນ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ເຮັດໃຫ້ນ້ອຍລົງ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ເຮັດໃຫ້ໃຫຍ່ຂຶ້ນ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ໜ້າຈໍການຂະຫຍາຍ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ການຄວບຄຸມໜ້າຈໍການຂະຫຍາຍ"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ຊູມເຂົ້າ"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ມີຢ່າງໜ້ອຍ 1 ອຸປະກອນພ້ອມໃຫ້ນຳໃຊ້"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ແຕະທາງລັດຄ້າງໄວ້"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ຍົກເລີກ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ສະຫຼັບໜ້າຈໍດຽວນີ້"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ພືໂທລະສັບອອກ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ສະຫຼັບໜ້າຈໍບໍ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ເພື່ອຄວາມລະອຽດທີ່ສູງຂຶ້ນ, ໃຫ້ໃຊ້ກ້ອງຖ່າຍຮູບຫຼັງ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ເພື່ອຄວາມລະອຽດທີ່ສູງຂຶ້ນ, ໃຫ້ປີ້ນໂທລະສັບ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ອຸປະກອນທີ່ພັບໄດ້ກຳລັງກາງອອກ"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ອຸປະກອນທີ່ພັກໄດ້ກຳລັງປີ້ນໄປມາ"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"ແບັດເຕີຣີເຫຼືອ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ສະຫຼັບໄປໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ປິດ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ການຕັ້ງຄ່າໜ້າຈໍລັອກ"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ບໍ່ພ້ອມໃຫ້ນຳໃຊ້"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ກ້ອງຖ່າຍຮູບຖືກບລັອກຢູ່"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ໂໝດຄວາມສຳຄັນເປີດຢູ່"</string> </resources> diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml index f7f4b623402c..d54cf4d24181 100644 --- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ປິດ"</item> <item msgid="5966994759929723339">"ເປີດ"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ບໍ່ສາມາດເບິ່ງໄດ້"</item> + <item msgid="2478289035899842865">"ປິດ"</item> + <item msgid="5137565285664080143">"ເປີດ"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 583624f7182d..5bcd893af655 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pranešimų gaubtas."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Spartieji nustatymai."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Užrakinimo ekranas."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Darbo profilio užrakinimo ekranas"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Uždaryti"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Šviesumas"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Spalvų inversija"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Spalvų taisymas"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Šrifto dydis"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Tvarkyti naudotojus"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Atlikta"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Uždaryti"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekrano įrašymas"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nėra pavadinimo"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Šrifto dydis"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Padaryti mažesnius"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Padaryti didesnius"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Didinimo langas"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Didinimo lango valdikliai"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Artinti"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Pasiekiamas bent vienas įrenginys"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Paliesk. ir palaik. spart. klav."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Atšaukti"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Perjungti ekranus dabar"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Atlenkite telefoną"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Perjungti ekranus?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Didesnei raiškai naudokite galinį fotoaparatą"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Kad raiška būtų geresnė, apverskite telefoną"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Lankstomasis įrenginys išlankstomas"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Lankstomasis įrenginys apverčiamas"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Liko akumuliatoriaus įkrovos: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Perjungti į darbo profilį"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Uždaryti"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Užrakinimo ekrano nustatymai"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"„Wi-Fi“ ryšys nepasiekiamas"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparatas užblokuotas"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparatas ir mikrofonas užblokuoti"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonas užblokuotas"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteto režimas įjungtas"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml index 58379150e4a7..e66f590364dd 100644 --- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Išjungta"</item> <item msgid="5966994759929723339">"Įjungta"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nepasiekiama"</item> + <item msgid="2478289035899842865">"Išjungta"</item> + <item msgid="5137565285664080143">"Įjungta"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 2b68f2ae6a1b..4dcb45413ac7 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"Akumulators: <xliff:g id="NUMBER">%d</xliff:g> procenti"</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%%, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Notiek akumulatora uzlāde, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%d</xliff:g>%%, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>%%, <xliff:g id="TIME">%2$s</xliff:g>, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%d</xliff:g>, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$d</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>, uzlāde ir apturēta, lai aizsargātu akumulatoru."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Skatīt visus paziņojumus"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teletaips ir iespējots."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Zvana signāls — vibrācija."</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Paziņojumu panelis"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ātrie iestatījumi"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Bloķēšanas ekrāns."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Darba profila bloķēšanas ekrāns"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Aizvērt"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Spilgtums"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Krāsu inversija"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Krāsu korekcija"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Fonta lielums"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Pārvaldīt lietotājus"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gatavs"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Aizvērt"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekrāna ierakstīšana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nav nosaukuma"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Fonta lielums"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Samazināt"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Palielināt"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Palielināšanas logs"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Palielināšanas loga vadīklas"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Tuvināt"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Nevar apraidīt"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Nevar saglabāt. Mēģiniet vēlreiz."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Nevar saglabāt."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Izmantojiet vismaz 4 rakstzīmes"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Izmantojiet mazāk nekā 16 rakstzīmes"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Versijas numurs"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Versijas numurs ir kopēts starpliktuvē."</string> <string name="basic_status" msgid="2315371112182658176">"Atvērt sarunu"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ir pieejama vismaz viena ierīce."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pieskarieties saīsnei un turiet."</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Atcelt"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Mainīt ekrānus tagad"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Tālruņa atlocīšana"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vai mainīt ekrānus?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Lai izmantotu augstāku izšķirtspēju, lietojiet aizmugurējo kameru"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Lai izmantotu augstāku izšķirtspēju, apvērsiet tālruni"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Salokāma ierīce tiek atlocīta"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Salokāma ierīce tiek apgriezta"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Atlikušais uzlādes līmenis: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Pārslēgties uz darba profilu"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Aizvērt"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Bloķēšanas ekrāna iestatījumi"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml index 9a534c4eaeed..d32efec81a99 100644 --- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Izslēgts"</item> <item msgid="5966994759929723339">"Ieslēgts"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nav pieejams"</item> + <item msgid="2478289035899842865">"Izslēgts"</item> + <item msgid="5137565285664080143">"Ieslēgts"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 3ba3bc067fd6..e80be9248e88 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панел за известување"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Брзи поставки."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заклучи екран."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Работен заклучен екран"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветленост"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија на боите"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекција на боите"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Големина на фонтот"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Управувајте со корисниците"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"снимање на екранот"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслов"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Големина на фонтот"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Намали"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Зголеми"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за зголемување"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли на прозорец за зголемување"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Зумирај"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Не може да се емитува"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Не може да се зачува. Обидете се повторно."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Не може да се зачува."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Употребете најмалку 4 знаци"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Употребете помалку од 16 знаци"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Број на верзија"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Бројот на верзијата е копиран во привремената меморија."</string> <string name="basic_status" msgid="2315371112182658176">"Започни разговор"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• достапен е најмалку еден уред"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Допрете и задржете ја кратенката"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Откажи"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Променете го екранот сега"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Отворете го телефонот"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Да се промени екранот?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Користете ја задната камера за да добиете повисока резолуција"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Отворете го телефонот за да добиете повисока резолуција"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Преклопувачки уред се отклопува"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Преклопувачки уред се врти"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Преостаната батерија: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Префрли се на работен профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затвори"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Поставки за заклучен екран"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml index d088f120b362..8c4459a9ae6e 100644 --- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Исклучено"</item> <item msgid="5966994759929723339">"Вклучено"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Недостапно"</item> + <item msgid="2478289035899842865">"Исклучено"</item> + <item msgid="5137565285664080143">"Вклучено"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 123c42447b18..6622fb90be17 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"അറിയിപ്പ് ഷെയ്ഡ്."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ദ്രുത ക്രമീകരണങ്ങൾ."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ലോക്ക് സ്ക്രീൻ."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ഔദ്യോഗിക ലോക്ക് സ്ക്രീൻ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"അവസാനിപ്പിക്കുക"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"തെളിച്ചം"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"നിറം വിപരീതമാക്കൽ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"നിറം ശരിയാക്കൽ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ഫോണ്ട് വലുപ്പം"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ഉപയോക്താക്കളെ മാനേജ് ചെയ്യുക"</string> <string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"അടയ്ക്കുക"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"സ്ക്രീൻ റെക്കോർഡിംഗ്"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"പേരില്ല"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ഫോണ്ട് വലുപ്പം"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ചെറുതാക്കുക"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"വലുതാക്കുക"</string> <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"സൂം ഇൻ ചെയ്യുക"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ഒരു ഉപകരണമെങ്കിലും ലഭ്യമാണ്"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"സ്പർശിച്ച് പിടിക്കുക കുറുക്കുവഴി"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"റദ്ദാക്കുക"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ഇപ്പോൾ സ്ക്രീനുകൾ മാറുക"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ഫോൺ അൺഫോൾഡ് ചെയ്യൽ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"സ്ക്രീനുകൾ മാറണോ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ഉയർന്ന റെസല്യൂഷന്, പിൻ ക്യാമറ ഉപയോഗിക്കുക"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ഉയർന്ന റെസല്യൂഷന്, ഫോൺ ഫ്ലിപ്പ് ചെയ്യുക"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ഫോൾഡ് ചെയ്യാവുന്ന ഉപകരണം അൺഫോൾഡ് ആകുന്നു"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ഫോൾഡ് ചെയ്യാവുന്ന ഉപകരണം, കറങ്ങുന്ന വിധത്തിൽ ഫ്ലിപ്പ് ആകുന്നു"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ബാറ്ററി ചാർജ് ശേഷിക്കുന്നു"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാറുക"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"അടയ്ക്കുക"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ലോക്ക് സ്ക്രീൻ ക്രമീകരണം"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"വൈഫൈ ലഭ്യമല്ല"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ക്യാമറ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ക്യാമറയും മൈക്രോഫോണും ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"മൈക്രോഫോൺ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"മുൻഗണനാ മോഡ് ഓണാണ്"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml index 108e173e003a..62bac5cd1212 100644 --- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ഓഫാണ്"</item> <item msgid="5966994759929723339">"ഓണാണ്"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ലഭ്യമല്ല"</item> + <item msgid="2478289035899842865">"ഓഫാണ്"</item> + <item msgid="5137565285664080143">"ഓണാണ്"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index d74e7dc56194..5e875d1e31b0 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Мэдэгдлийн хураангуй самбар"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Шуурхай тохиргоо."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Дэлгэц түгжих."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ажлын түгжигдсэн дэлгэц"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Хаах"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Тодрол"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Өнгө хувиргалт"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Өнгө тохируулга"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Фонтын хэмжээ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Хэрэглэгчдийг удирдах"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Дууссан"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Хаах"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"дэлгэцийн бичлэг"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Гарчиггүй"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Фонтын хэмжээ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Жижгэрүүлэх"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Томруулах"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Томруулалтын цонх"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Томруулалтын цонхны хяналт"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Томруулах"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Нэвтрүүлэх боломжгүй"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Хадгалах боломжгүй. Дахин оролдоно уу."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Хадгалах боломжгүй."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Дор хаяж 4 тэмдэгт ашиглана уу."</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16-аас цөөн тэмдэгт ашиглана уу"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Хийцийн дугаар"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Хийцийн дугаарыг түр санах ойд хуулсан."</string> <string name="basic_status" msgid="2315371112182658176">"Харилцан яриаг нээх"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Дор хаяж нэг төхөөрөмж боломжтой"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Товчлолд хүрээд удаан дарна уу"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Цуцлах"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Одоо дэлгэцүүдийг сэлгэх"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Утсыг дэлгэх"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Дэлгэцүүдийг сэлгэх үү?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Илүү өндөр нягтрал авах бол ар талын камерыг ашиглана уу"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Илүү өндөр нягтрал авах бол утсыг хөнтөрнө үү"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Эвхэгддэг төхөөрөмжийг дэлгэж байна"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Эвхэгддэг төхөөрөмжийг хөнтөрч байна"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> батарей үлдлээ"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Ажлын профайл руу сэлгэх"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Хаах"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Түгжигдсэн дэлгэцийн тохиргоо"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi боломжгүй байна"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камерыг блоклосон"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камер болон микрофоныг блоклосон"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофоныг блоклосон"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Чухал горим асаалттай байна"</string> </resources> diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml index 5cd21c1d2ec8..33f359672477 100644 --- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Унтраалттай"</item> <item msgid="5966994759929723339">"Асаалттай"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Боломжгүй"</item> + <item msgid="2478289035899842865">"Унтраалттай"</item> + <item msgid="5137565285664080143">"Асаалттай"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 3d73e2259c6e..9f3680dbdbed 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"क्विक सेटिंग्ज."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"कार्य लॉक स्क्रीन"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करा"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"चमक"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्व्हर्जन"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"रंग सुधारणा"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"फॉंटचा आकार"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"वापरकर्ते व्यवस्थापित करा"</string> <string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करा"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रेकॉर्डिंग"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फॉंट आकार"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"आणखी लहान करा"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"आणखी मोठे करा"</string> <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"झूम इन करा"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"ब्रॉडकास्ट करू शकत नाही"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"सेव्ह करू शकत नाही. पुन्हा प्रयत्न करा."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"सेव्ह करू शकत नाही."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"किमान चार वर्ण वापरा"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"१६ पेक्षा कमी वर्ण वापरा"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"बिल्ड नंबर"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"बिल्ड नंबर क्लिपबोर्डवर कॉपी केला."</string> <string name="basic_status" msgid="2315371112182658176">"संभाषण उघडा"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• किमान एक डिव्हाइस उपलब्ध करणे"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"स्पर्श करा आणि धरून ठेवा शॉर्टकट"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"रद्द करा"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"आता स्क्रीन स्विच करा"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"फोन उघडा"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"स्क्रीन स्विच करायच्या का?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"उच्च रेझोल्यूशनसाठी रीअर कॅमेरा वापरा"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"उच्च रेझोल्यूशनसाठी, फोन फ्लिप करा"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्ड करता येण्यासारखे डिव्हाइस अनफोल्ड केले जात आहे"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्ड करता येण्यासारखे डिव्हाइस आजूबाजूला फ्लिप केले जात आहे"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> बॅटरी शिल्लक आहे"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"कार्य प्रोफाइलवर स्विच करा"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"बंद करा"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"लॉक स्क्रीन सेटिंग्ज"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml index 78560c4314c6..24d3b47af961 100644 --- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"बंद आहे"</item> <item msgid="5966994759929723339">"सुरू आहे"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"उपलब्ध नाही"</item> + <item msgid="2478289035899842865">"बंद आहे"</item> + <item msgid="5137565285664080143">"सुरू आहे"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index c3408b7ad8e6..109d5193c5ee 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bidai pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tetapan pantas."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kunci skrin."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Skrin kunci kerja"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Penyongsangan warna"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Pembetulan warna"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Saiz fon"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Urus pengguna"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"rakaman skrin"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Saiz Fon"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Kecilkan"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Besarkan"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Tetingkap Pembesaran"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kawalan Tetingkap Pembesaran"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zum masuk"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Sekurang-kurangnya satu peranti tersedia"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pintasan sentuh & tahan"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Batal"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Tukar skrin sekarang"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Buka telefon"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Tukar skrin?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Untuk peleraian lebih tinggi, gunakan kamera belakang"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Untuk peleraian lebih tinggi, balikkan telefon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Peranti boleh lipat dibuka"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Peranti boleh lipat diterbalikkan"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Bateri tinggal <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Tukar kepada profil kerja"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tutup"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Tetapan skrin kunci"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi tidak tersedia"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera disekat"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon disekat"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon disekat"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mod keutamaan dihidupkan"</string> </resources> diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml index f3dafa519140..07a8426feeb2 100644 --- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Mati"</item> <item msgid="5966994759929723339">"Hidup"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Tidak tersedia"</item> + <item msgid="2478289035899842865">"Mati"</item> + <item msgid="5137565285664080143">"Hidup"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index b74dd93bf75f..4fa84eb0d933 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"အကြောင်းကြားစာအကွက်"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"အမြန်လုပ် အပြင်အဆင်"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"မျက်နှာပြင် သော့ပိတ်ရန်"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"အလုပ်သုံး လော့ခ်မျက်နှာပြင်"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ပိတ်ရန်"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"အလင်းတောက်ပမှု"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"အရောင်ပြောင်းပြန်ပြုလုပ်ရန်"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"အရောင် အမှန်ပြင်ခြင်း"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ဖောင့်အရွယ်အစား"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"အသုံးပြုသူများ စီမံရန်"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ပြီးပါပြီ"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ပိတ်ရန်"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"စခရင်ရိုက်ကူးမှု"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ခေါင်းစဉ် မရှိပါ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ဖောင့်အရွယ်အစား"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ချုံ့ရန်"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ချဲ့ရန်"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ဝင်းဒိုး ချဲ့ခြင်း"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ဝင်းဒိုး ထိန်းချုပ်မှုများ ချဲ့ခြင်း"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ဇူးမ်ဆွဲရန်"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"ထုတ်လွှင့်၍ မရပါ"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"သိမ်း၍မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"သိမ်း၍မရပါ။"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"အနည်းဆုံး အက္ခရာ ၄ လုံး သုံးရန်"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"အက္ခရာ ၁၆ လုံးအောက် သုံးရန်"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်မှုနံပါတ်"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"တည်ဆောက်မှုနံပါတ်ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပါပြီ။"</string> <string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• အနည်းဆုံး စက်တစ်ခုသုံးနိုင်ရမည်"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ဖြတ်လမ်းလင့်ခ်ကို ထိပြီးဖိထားပါ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"မလုပ်တော့"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"စခရင်များ ယခုပြောင်းရန်"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ဖုန်းကို ဖြန့်လိုက်ပါ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"စခရင်များ ပြောင်းမလား။"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ပုံရိပ် ပိုမိုပြတ်သားစေရန် အနောက်ကင်မရာသုံးပါ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ပုံရိပ် ပိုမိုပြတ်သားစေရန် ဖုန်းကို တစ်ဖက်သို့ လှန်လိုက်ပါ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ခေါက်နိုင်သောစက်ကို ဖြန့်လိုက်သည်"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ခေါက်နိုင်သောစက်ကို တစ်ဘက်သို့ လှန်လိုက်သည်"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"ဘက်ထရီ <xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်သေးသည်"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"အလုပ်ပရိုဖိုင်သို့ ပြောင်းရန်"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ပိတ်ရန်"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"လော့ခ်မျက်နှာပြင် ဆက်တင်များ"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi မရနိုင်ပါ"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ကင်မရာကို ပိတ်ထားသည်"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ဦးစားပေးမုဒ် ဖွင့်ထားသည်"</string> </resources> diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml index cadf00975048..fd375d4f3eb1 100644 --- a/packages/SystemUI/res/values-my/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ပိတ်"</item> <item msgid="5966994759929723339">"ဖွင့်"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"မရနိုင်ပါ"</item> + <item msgid="2478289035899842865">"ပိတ်"</item> + <item msgid="5137565285664080143">"ဖွင့်"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index af9cf7e24df4..7e8e5f0c7d06 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Varselskygge."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hurtiginnstillinger."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskjerm."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låseskjerm for arbeid"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Lukk"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Fargeinvertering"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Fargekorrigering"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Skriftstørrelse"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Administrer brukere"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Ferdig"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Lukk"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"skjermopptak"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen tittel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Skriftstørrelse"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Gjør mindre"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Gjør større"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Forstørringsvindu"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontroller for forstørringsvindu"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom inn"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Kan ikke kringkaste"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Kan ikke lagre. Prøv på nytt."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Kan ikke lagre."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Bruk minst 4 tegn"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Bruk færre enn 16 tegn"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Delversjonsnummer"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Delversjonsnummeret er kopiert til utklippstavlen."</string> <string name="basic_status" msgid="2315371112182658176">"Åpen samtale"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• minst én enhet er tilgjengelig"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bytt skjerm nå"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Brett ut telefonen"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vil du bytte skjerm?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Bruk baksidekameraet for å få høyere oppløsning"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Brett ut telefonen for å få høyere oppløsning"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"En sammenleggbar enhet blir brettet ut"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"En sammenleggbar enhet blir snudd"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> batteri gjenstår"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Bytt til jobbprofilen"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Lukk"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Innstillinger for låseskjermen"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi er ikke tilgjengelig"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokkert"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameraet og mikrofonen er blokkert"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokkert"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteringsmodus er på"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml index b465617aa6fd..e4a811941b2a 100644 --- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Av"</item> <item msgid="5966994759929723339">"På"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Utilgjengelig"</item> + <item msgid="2478289035899842865">"Av"</item> + <item msgid="5137565285664080143">"På"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index ff017ab166cd..db4c1a2cffe0 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना कक्ष।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"द्रुत सेटिङहरू"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"स्क्रीन बन्द गर्नुहोस्।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"कार्य प्रोफाइलको लक स्क्रिन"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"बन्द गर्नुहोस्"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"उज्यालपन"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्भर्सन"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"कलर करेक्सन"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"फन्टको आकार"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"प्रयोगकर्ताहरू व्यवस्थित गर्नुहोस्"</string> <string name="quick_settings_done" msgid="2163641301648855793">"भयो"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बन्द गर्नुहोस्"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रिन रेकर्डिङ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फन्टको आकार"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"अझ सानो बनाउनुहोस्"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"अझ ठुलो बनाउनुहोस्"</string> <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"जुम इन गर्नुहोस्"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• कम्तीमा एउटा डिभाइस उपलब्ध छ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"सर्टकट थिचिराख्नुहोस्"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"रद्द गर्नुहोस्"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"अहिले नै स्क्रिन बदल्नुहोस्"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"फोन अनफोल्ड गर्नुहोस्"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"स्क्रिनहरू बदल्ने हो?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"उच्च रिजोल्युसनको सेल्फी खिच्न पछाडिको क्यामेरा प्रयोग गर्नुहोस्"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"उच्च रिजोल्युसनको सेल्फी खिच्न फोन फ्लिप गर्नुहोस्"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्ड गर्न मिल्ने डिभाइस अनफोल्ड गरेको देखाइएको एनिमेसन"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्ड गर्न मिल्ने डिभाइस यताउता पल्टाएर देखाइएको एनिमेसन"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ब्याट्री बाँकी छ"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"कार्य प्रोफाइल प्रयोग गर्नुहोस्"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"बन्द गर्नुहोस्"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"लक स्क्रिनसम्बन्धी सेटिङ"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi उपलब्ध छैन"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"क्यामेरा ब्लक गरिएको छ"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"क्यामेरा र माइक्रोफोन ब्लक गरिएको छ"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफोन ब्लक गरिएको छ"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राथमिकता मोड अन छ"</string> </resources> diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml index bbdf72a3fa44..5cf91e533494 100644 --- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"अफ"</item> <item msgid="5966994759929723339">"अन"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"उपलब्ध छैन"</item> + <item msgid="2478289035899842865">"अफ छ"</item> + <item msgid="5137565285664080143">"अन छ"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index a368fcf90cab..28a78e1355d0 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Meldingenpaneel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Snelle instellingen."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Vergrendelscherm."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Vergrendelscherm voor werk"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Sluiten"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleurinversie"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Kleurcorrectie"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Lettergrootte"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gebruikers beheren"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sluiten"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"schermopname"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Geen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Lettergrootte"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Verkleinen"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Vergroten"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingsvenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Bediening van vergrotingsvenster"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Inzoomen"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Er is ten minste één apparaat beschikbaar"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Houd de sneltoets ingedrukt"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Annuleren"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Wissel nu van scherm"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefoon openklappen"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Van scherm wisselen?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Gebruik de camera aan de achterzijde voor een hogere resolutie"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Draai de telefoon om voor een hogere resolutie"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Opvouwbaar apparaat wordt uitgevouwen"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Opvouwbaar apparaat wordt gedraaid"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Nog <xliff:g id="PERCENTAGE">%s</xliff:g> batterijlading"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Overschakelen naar werkprofiel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Sluiten"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Instellingen vergrendelscherm"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi niet beschikbaar"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera geblokkeerd"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera en microfoon geblokkeerd"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfoon geblokkeerd"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitsmodus aan"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml index b51dc653912b..592ecf5b69d6 100644 --- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Uit"</item> <item msgid="5966994759929723339">"Aan"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Niet beschikbaar"</item> + <item msgid="2478289035899842865">"Uit"</item> + <item msgid="5137565285664080143">"Aan"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 0fd1d1d86556..d3ce6fcfcd37 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"କ୍ୱିକ୍ ସେଟିଂସ୍।"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ୱର୍କ ଲକ୍ ସ୍କ୍ରୀନ୍"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ବନ୍ଦ କରନ୍ତୁ"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ଉଜ୍ଜ୍ୱଳତା"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ରଙ୍ଗ ଇନଭାର୍ସନ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ରଙ୍ଗ ସଂଶୋଧନ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ଫଣ୍ଟର ଆକାର"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ୟୁଜରମାନଙ୍କୁ ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ବନ୍ଦ କରନ୍ତୁ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ସ୍କ୍ରିନ ରେକର୍ଡିଂ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ଫଣ୍ଟର ଆକାର"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ଛୋଟ କରନ୍ତୁ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ବହୁତ ବଡ଼ କରନ୍ତୁ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ଜୁମ୍ ଇନ୍ କରନ୍ତୁ"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ଅତିକମରେ ଗୋଟିଏ ଡିଭାଇସ ଉପଲବ୍ଧ ଅଛି"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ସର୍ଟକଟକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ବାତିଲ କରନ୍ତୁ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ବର୍ତ୍ତମାନ ସ୍କ୍ରିନ ସ୍ୱିଚ କରନ୍ତୁ"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ଫୋନକୁ ଅନଫୋଲ୍ଡ କରନ୍ତୁ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ସ୍କ୍ରିନ ସ୍ୱିଚ କରିବେ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ଉଚ୍ଚ ରିଜୋଲ୍ୟୁସନ ପାଇଁ ପଛ କେମେରା ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ଉଚ୍ଚ ରିଜୋଲ୍ୟୁସନ ପାଇଁ ଫୋନକୁ ଫ୍ଲିପ କରନ୍ତୁ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଅନଫୋଲ୍ଡ କରାଯାଉଛି"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଫ୍ଲିପ କରାଯାଉଛି"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବେଟେରୀ ଚାର୍ଜ ବାକି ଅଛି"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ୱାର୍କ ପ୍ରୋଫାଇଲକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ଲକ ସ୍କ୍ରିନ ସେଟିଂସ"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"କେମେରାକୁ ବ୍ଲକ କରାଯାଇଛି"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"କେମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ପ୍ରାୟୋରିଟି ମୋଡ ଚାଲୁ ଅଛି"</string> </resources> diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml index 5e4b730f6144..d362c65fa971 100644 --- a/packages/SystemUI/res/values-or/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ବନ୍ଦ ଅଛି"</item> <item msgid="5966994759929723339">"ଚାଲୁ ଅଛି"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ଅନୁପଲବ୍ଧ"</item> + <item msgid="2478289035899842865">"ବନ୍ଦ ଅଛି"</item> + <item msgid="5137565285664080143">"ଚାଲୁ ଅଛି"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 28c6b314a41d..70e15b8fec45 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ਸੂਚਨਾ ਸ਼ੇਡ।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ।"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">" ਲਾਕ ਸਕ੍ਰੀਨ।"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ਕਾਰਜ-ਸਥਾਨ ਲਾਕ ਸਕ੍ਰੀਨ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ਬੰਦ ਕਰੋ"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ਚਮਕ"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"ਰੰਗ ਪਲਟਨਾ"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"ਰੰਗ ਸੁਧਾਈ"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ਫੌਂਟ ਦਾ ਆਕਾਰ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ਬੰਦ ਕਰੋ"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ਫ਼ੌਂਟ ਦਾ ਆਕਾਰ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ਛੋਟਾ ਕਰੋ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ਵੱਡਾ ਕਰੋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window ਦੇ ਕੰਟਰੋਲ"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ਜ਼ੂਮ ਵਧਾਓ"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• ਘੱਟੋ-ਘੱਟ ਇੱਕ ਡੀਵਾਈਸ ਉਪਲਬਧ ਹੈ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਸਪਰਸ਼ ਕਰ ਕੇ ਰੱਖੋ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ਰੱਦ ਕਰੋ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ਹੁਣ ਸਕ੍ਰੀਨਾਂ ਨੂੰ ਸਵਿੱਚ ਕਰੋ"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ਫ਼ੋਨ ਨੂੰ ਖੋਲ੍ਹੋ"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"ਕੀ ਸਕ੍ਰੀਨਾਂ ਨੂੰ ਸਵਿੱਚ ਕਰਨਾ ਹੈ?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਲਈ, ਪਿਛਲਾ ਕੈਮਰਾ ਵਰਤੋ"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਲਈ, ਫ਼ੋਨ ਨੂੰ ਫਲਿੱਪ ਕਰੋ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਆਲੇ-ਦੁਆਲੇ ਫਲਿੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬੈਟਰੀ ਬਾਕੀ"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਜਾਓ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ਬੰਦ ਕਰੋ"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"ਲਾਕ ਸਕ੍ਰੀਨ ਸੈਟਿੰਗਾਂ"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml index 5628a3167b87..f249afb72b6d 100644 --- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ਬੰਦ"</item> <item msgid="5966994759929723339">"ਚਾਲੂ"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ਉਪਲਬਧ ਨਹੀਂ"</item> + <item msgid="2478289035899842865">"ਬੰਦ"</item> + <item msgid="5137565285664080143">"ਚਾਲੂ"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ed0d257889b4..b67bd0036df9 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Obszar powiadomień."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Szybkie ustawienia."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekran blokady."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekran blokady wyświetlany podczas działania"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zamknij"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jasność"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Odwrócenie kolorów"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korekcja kolorów"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Rozmiar czcionki"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Zarządzaj użytkownikami"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotowe"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zamknij"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"nagrywanie ekranu"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez tytułu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Rozmiar czcionki"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Pomniejsz"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Powiększ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno powiększenia"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Elementy sterujące okna powiększenia"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Powiększ"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Dostępne jest co najmniej 1 urządzenie."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Skrót – naciśnij i przytrzymaj"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anuluj"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Przełącz ekrany teraz"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otwieranie telefonu"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Przełączyć ekrany?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Użyj tylnego aparatu, aby uzyskać wyższą rozdzielczość"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Odwróć telefon, aby uzyskać wyższą rozdzielczość"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Składane urządzenie jest rozkładane"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Składane urządzenie jest obracane"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Pozostało <xliff:g id="PERCENTAGE">%s</xliff:g> baterii"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Przełącz na profil służbowy"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zamknij"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Ustawienia ekranu blokady"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml index c32aa1a69a43..c73cbed76946 100644 --- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Wyłączono"</item> <item msgid="5966994759929723339">"Włączono"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Brak dostępu"</item> + <item msgid="2478289035899842865">"Wyłączono"</item> + <item msgid="5137565285664080143">"Włączono"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 1b9e0150ce26..f3ef1523a7e6 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Aba de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configurações rápidas."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Tela de bloqueio de trabalho"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Tamanho da fonte"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gerenciar usuários"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de tela"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamanho da fonte"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Diminuir"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumentar zoom"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Não foi possível fazer a transmissão"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Falha ao salvar. Tente de novo."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Falha ao salvar."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Use pelo menos 4 caracteres"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Use menos de 16 caracteres"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número da versão"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Número da versão copiado para a área de transferência."</string> <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Pelo menos um dispositivo está disponível"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Toque e pressione o atalho"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Trocar de tela agora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Abra o smartphone"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Trocar de tela?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Para uma resolução maior, use a câmera traseira"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para uma resolução maior, vire o smartphone"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo dobrável sendo aberto"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo dobrável sendo virado"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Bateria restante: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Alternar para o perfil de trabalho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fechar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Configurações de tela de bloqueio"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo de prioridade ativado"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml index cea45323069f..28c07f40b6b9 100644 --- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desativado"</item> <item msgid="5966994759929723339">"Ativado"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Indisponível"</item> + <item msgid="2478289035899842865">"Desativado"</item> + <item msgid="5137565285664080143">"Ativado"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 22ddebfc0317..ac7886c56b35 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Painel de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Definições rápidas."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecrã de bloqueio."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ecrã de bloqueio de trabalho"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string> @@ -778,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de ecrã"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamanho do tipo de letra"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Diminuir"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controlos da janela de ampliação"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumentar zoom"</string> @@ -1045,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Mudar para perfil de trabalho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fechar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Definições do ecrã de bloqueio"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmara e microfone bloqueados"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo Prioridade ativado"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 1b9e0150ce26..f3ef1523a7e6 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Aba de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configurações rápidas."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Tela de bloqueio de trabalho"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Tamanho da fonte"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gerenciar usuários"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de tela"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Tamanho da fonte"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Diminuir"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Aumentar"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumentar zoom"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Não foi possível fazer a transmissão"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Falha ao salvar. Tente de novo."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Falha ao salvar."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Use pelo menos 4 caracteres"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Use menos de 16 caracteres"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número da versão"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Número da versão copiado para a área de transferência."</string> <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Pelo menos um dispositivo está disponível"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Toque e pressione o atalho"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancelar"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Trocar de tela agora"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Abra o smartphone"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Trocar de tela?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Para uma resolução maior, use a câmera traseira"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para uma resolução maior, vire o smartphone"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo dobrável sendo aberto"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo dobrável sendo virado"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Bateria restante: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Alternar para o perfil de trabalho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fechar"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Configurações de tela de bloqueio"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo de prioridade ativado"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml index cea45323069f..28c07f40b6b9 100644 --- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Desativado"</item> <item msgid="5966994759929723339">"Ativado"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Indisponível"</item> + <item msgid="2478289035899842865">"Desativado"</item> + <item msgid="5137565285664080143">"Ativado"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 907b9c185c3c..4bdbbc4ee91d 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Fereastră pentru notificări."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Setări rapide."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecranul de blocare."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ecran de blocare pentru serviciu"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Închide"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminozitate"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversarea culorilor"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Corecția culorii"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Dimensiunea fontului"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Gestionează utilizatorii"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Terminat"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Închide"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"înregistrare de ecran"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Fără titlu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Dimensiunea fontului"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Micșorează"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Mărește"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fereastra de mărire"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Comenzi pentru fereastra de mărire"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Mărește"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Este disponibil cel puțin un dispozitiv"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Atinge lung comanda rapidă"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anulează"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Schimbă ecranul acum"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Deschide telefonul"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Schimbi ecranul?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Pentru o rezoluție mai mare, folosește camera foto posterioară"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Pentru o rezoluție mai mare, deschide telefonul"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispozitiv pliabil care este desfăcut"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispozitiv pliabil care este întors"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> baterie rămasă"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Comută la profilul de serviciu"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Închide"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Setările ecranului de blocare"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Conexiune Wi-Fi indisponibilă"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera foto a fost blocată"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera foto și microfonul sunt blocate"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfonul a fost blocat"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modul Cu prioritate este activat"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml index 782afc5d7299..5a5eb9f6788c 100644 --- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Dezactivat"</item> <item msgid="5966994759929723339">"Activat"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Indisponibil"</item> + <item msgid="2478289035899842865">"Dezactivat"</item> + <item msgid="5137565285664080143">"Activat"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 2b8c776915bd..f1a0cc38d8f7 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панель уведомлений"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Быстрые настройки"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блокировки."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Заблокировано"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыть"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркость"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверсия цветов"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Коррекция цвета"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Размер шрифта"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Управление пользователями"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыть"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"запись экрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без названия"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Размер шрифта"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Уменьшить"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Увеличить"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Окно увеличения"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Настройки окна увеличения"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увеличить"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Не удалось запустить трансляцию"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Не удалось сохранить. Повторите попытку."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Не удалось сохранить."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Минимальное количество символов – 4"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Максимальное количество символов – 16"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер сборки"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Номер сборки скопирован в буфер обмена."</string> <string name="basic_status" msgid="2315371112182658176">"Открытый чат"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Доступно хотя бы одно устройство."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Нажмите и удерживайте ярлык"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Отмена"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Переключиться на другой экран"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Разложите телефон"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Переключиться на другой экран?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Используйте основную камеру, чтобы делать снимки с более высоким разрешением."</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Переверните телефон и используйте основную камеру, чтобы делать снимки с более высоким разрешением."</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Складное устройство в разложенном виде"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Перевернутое складное устройство"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Уровень заряда батареи: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Перейти в рабочий профиль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрыть"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Настройки блокировки экрана"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Функция Wi-Fi недоступна"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблокирована"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон заблокированы"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон заблокирован"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Режим \"Только важные\" включен"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml index 9a4960b1ada9..cd140791bbd5 100644 --- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Отключено"</item> <item msgid="5966994759929723339">"Включено"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Недоступно"</item> + <item msgid="2478289035899842865">"Выключено"</item> + <item msgid="5137565285664080143">"Включено"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 8c8511989e2e..c3351897d912 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"දැනුම්දීම් ආවරණය."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ක්ෂණික සැකසීම්."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"අගුළු තිරය."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"කාර්යාල අගුලු තිරය"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"වසන්න"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"දීප්තිමත් බව"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"වර්ණ අපවර්තනය"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"වර්ණ නිවැරදි කිරීම"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"අකුරු විශාලත්වය"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"පරිශීලකයන් කළමනාකරණය කරන්න"</string> <string name="quick_settings_done" msgid="2163641301648855793">"නිමයි"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"වසන්න"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"තිර පටිගත කිරීම"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"මාතෘකාවක් නැත"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"අකුරු විශාලත්වය"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"වඩා කුඩා කරන්න"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"වඩා විශාල කරන්න"</string> <string name="magnification_window_title" msgid="4863914360847258333">"විශාලන කවුළුව"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"විශාලනය කිරීමේ කවුළු පාලන"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"විශාලනය වැඩි කරන්න"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"විකාශනය කළ නොහැකිය"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"සුරැකිය නොහැකිය. නැවත උත්සාහ කරන්න."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"සුරැකිය නොහැකිය."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"අවම වශයෙන් අනුලකුණු 4ක් භාවිතා කරන්න"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"අනුලකුණු 16කට වඩා අඩුවෙන් භාවිතා කරන්න"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"නිමැවුම් අංකය"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"නිමැවුම් අංකය පසුරු පුවරුවට පිටපත් කරන ලදි."</string> <string name="basic_status" msgid="2315371112182658176">"සංවාදය විවෘත කරන්න"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• අවම වශයෙන් එක උපාංගයක් ලැබේ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ස්පර්ශ කර අල්ලා සිටීමේ කෙටිමඟ"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"අවලංගු කරන්න"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"දැන් තිර මාරු කරන්න"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"දුරකථනය දිගහරින්න"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"තිර මාරු කරන්න ද?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ඉහළ විභේදනය සඳහා, පසුපස කැමරාව භාවිතා කරන්න"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ඉහළ විභේදනය සඳහා, දුරකථනය හරවන්න"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"දිග හැරෙමින් පවතින නැමිය හැකි උපාංගය"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"වටා පෙරළෙමින් තිබෙන නැමිය හැකි උපාංගය"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> බැටරිය ඉතිරිව ඇත"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"කාර්යාල පැතිකඩ වෙත මාරු වන්න"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"වසන්න"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"අගුළු තිර සැකසීම්"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ලද නොහැක"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"කැමරාව අවහිරයි"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"කැමරාව සහ මයික්රොෆෝනය අවහිරයි"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"මයික්රොෆෝනය අවහිරයි"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ප්රමුඛතා මාදිලිය සක්රීයයි"</string> </resources> diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml index c9312ff08040..fcd768bfc4e3 100644 --- a/packages/SystemUI/res/values-si/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ක්රියාවිරහිතයි"</item> <item msgid="5966994759929723339">"ක්රියාත්මකයි"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"නොමැත"</item> + <item msgid="2478289035899842865">"ක්රියාවිරහිතයි"</item> + <item msgid="5137565285664080143">"ක්රියාත්මකයි"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 262e269dd790..1174755f6793 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel upozornení."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Rýchle nastavenia."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Uzamknutá obrazovka"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Uzamknutá obrazovka pracovného profilu"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zavrieť"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzia farieb"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Úprava farieb"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Veľkosť písma"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Spravovať používateľov"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavrieť"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"nahrávanie obrazovky"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Veľkosť písma"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Zmenšiť"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Zväčšiť"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládacie prvky okna priblíženia"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Priblížiť"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• K dispozícii je minimálne jedno zariadenie"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pridržte skratku"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Zrušiť"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Prepnite obrazovky"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Rozloženie telefónu"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Chcete prepnúť obrazovky?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Ak chcete vyššie rozlíšenie, použite zadnú kameru"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Ak chcete vyššie rozlíšenie, prevráťte telefón"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Rozloženie skladacieho zariadenia"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Prevrátenie skladacieho zariadenia"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Zostáva <xliff:g id="PERCENTAGE">%s</xliff:g> batérie"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Prepnúť na pracovný profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zavrieť"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Nastavenia uzamknutej obrazovky"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi‑Fi nie je k dispozícii"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokovaná"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofón sú blokované"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofón je blokovaný"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml index 3540eabb8205..660f85d365e2 100644 --- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Vypnuté"</item> <item msgid="5966994759929723339">"Zapnuté"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nedostupné"</item> + <item msgid="2478289035899842865">"Vypnuté"</item> + <item msgid="5137565285664080143">"Zapnuté"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 012b14f959e2..ffb74aeb164a 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterija <xliff:g id="NUMBER">%d</xliff:g> odstotkov."</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Baterija je napolnjena na <xliff:g id="PERCENTAGE">%1$d</xliff:g> %% – <xliff:g id="TIME">%2$s</xliff:g>."</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Baterija se polni, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> odstotkov."</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Baterija je napolnjena na <xliff:g id="PERCENTAGE">%d</xliff:g> %% – zaradi zaščite baterije je polnjenje začasno zaustavljeno."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Baterija je napolnjena na <xliff:g id="PERCENTAGE">%1$d</xliff:g> %% – <xliff:g id="TIME">%2$s</xliff:g> je zaradi zaščite baterije polnjenje začasno zaustavljeno."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Baterija je napolnjena na <xliff:g id="PERCENTAGE">%d</xliff:g> odstotkov. Zaradi zaščite baterije je polnjenje začasno zaustavljeno."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Baterija je napolnjena na <xliff:g id="PERCENTAGE">%1$d</xliff:g> odstotkov – <xliff:g id="TIME">%2$s</xliff:g>. Zaradi zaščite baterije je polnjenje začasno zaustavljeno."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Prikaži vsa obvestila"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter omogočen."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Zvonjenje z vibriranjem."</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Zaslon z obvestili."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hitre nastavitve."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaklenjen zaslon"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaklenjen zaslon delovnega profila"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zapri"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svetlost"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija barv"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Popravljanje barv"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Velikost pisave"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Upravljanje uporabnikov"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zapri"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"snemanje zaslona"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Brez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Velikost pisave"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Pomanjšanje"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Povečanje"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Povečevalno okno"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrolniki povečevalnega okna"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Povečaj"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Na voljo mora biti vsaj ena naprava."</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pridržite bližnjico"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Prekliči"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Preklopi zaslona zdaj"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Razprite telefon."</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Želite preklopiti zaslona?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Za višjo ločljivost uporabite hrbtni fotoaparat"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Za višjo ločljivost obrnite telefon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Razpiranje zložljive naprave"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Obračanje zložljive naprave"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Preostanek energije baterije: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Preklopi na delovni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zapri"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Nastavitve zaklepanja zaslona"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ni na voljo."</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparat je blokiran."</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparat in mikrofon sta blokirana."</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran."</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prednostni način je vklopljen."</string> </resources> diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml index 985b7796c567..d7e62caac28d 100644 --- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Izklopljeno"</item> <item msgid="5966994759929723339">"Vklopljeno"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ni na voljo"</item> + <item msgid="2478289035899842865">"Izklopljeno"</item> + <item msgid="5137565285664080143">"Vklopljeno"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index a9c8784a0251..84a5f96f4b3d 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Streha e njoftimeve."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Cilësimet e shpejta."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekrani i kyçjes."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekrani i kyçjes së punës"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Mbylle"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ndriçimi"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Anasjellja e ngjyrës"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Korrigjimi i ngjyrës"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Madhësia e fontit"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Menaxho përdoruesit"</string> <string name="quick_settings_done" msgid="2163641301648855793">"U krye"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Mbyll"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"regjistrim i ekranit"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Pa titull"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Madhësia e fontit"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Zvogëlo"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Zmadho"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dritarja e zmadhimit"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrollet e dritares së zmadhimit"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zmadho"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Ofrohet të paktën një pajisje"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Prek dhe mbaj shtypur shkurtoren"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anulo"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Ndërro ekranet tani"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Shpalos telefonin"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Të ndërrohen ekranet?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Për rezolucion më të lartë, përdor kamerën e pasme"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Për rezolucion më të lartë, përmbys telefonin"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Pajisja e palosshme duke u hapur"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Pajisja e palosshme duke u rrotulluar"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Përqindja e mbetur e baterisë: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Kalo te profili i punës"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Mbyll"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Cilësimet e ekranit të kyçjes"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nuk ofrohet"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera u bllokua"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dhe mikrofoni u bllokuan"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni u bllokua"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modaliteti i përparësisë aktiv"</string> </resources> diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml index 5862e2ef2b1c..45f63bf8e2e8 100644 --- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Joaktiv"</item> <item msgid="5966994759929723339">"Aktiv"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Nuk ofrohet"</item> + <item msgid="2478289035899842865">"Joaktiv"</item> + <item msgid="5137565285664080143">"Aktiv"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index a9df97a4007d..f9b3dd65415c 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Прозор са обавештењима."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Брза подешавања."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Брза подешавања и трака са обавештењима."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Закључан екран."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Закључан екран за посао"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string> @@ -257,8 +258,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветљеност"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија боја"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекција боја"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Величина фонта"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Управљаjте корисницима"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string> @@ -779,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"снимање екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслова"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Величина фонта"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Умањите"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Увећајте"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроле прозора за увећање"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увећајте"</string> @@ -1030,16 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• да је доступан барем један уређај"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Додирните и задржите пречицу"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Откажи"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Замени екране"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Отворите телефон"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Желите да замените екране?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"За већу резолуцију користите задњу камеру"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"За већу резолуцију обрните телефон"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Уређај на преклоп се отвара"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Уређај на преклоп се обрће"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Преостало је још<xliff:g id="PERCENTAGE">%s</xliff:g> батерије"</string> @@ -1051,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Пређи на пословни профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затвори"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Подешавања закључаног екрана"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi није доступан"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера је блокирана"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон су блокирани"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон је блокиран"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетни режим је укључен"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml index e817eea952ec..c959bfb0eb73 100644 --- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Искључено"</item> <item msgid="5966994759929723339">"Укључено"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Недоступно"</item> + <item msgid="2478289035899842865">"Искључено"</item> + <item msgid="5137565285664080143">"Укључено"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index d839a1117401..be4f200e9bbd 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Meddelandepanel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Snabbinställningar."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låsskärm."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låsskärm för arbete"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Stäng"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ljusstyrka"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Färginvertering"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Färgkorrigering"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Teckenstorlek"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Hantera användare"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klart"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Stäng"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"skärminspelning"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Teckenstorlek"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Förminska"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Förstora"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Förstoringsfönster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Inställningar för förstoringsfönster"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zooma in"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Det gick inte att sända ut"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Det gick inte att spara. Försök igen."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Det gick inte att spara."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Använd minst 4 tecken"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Använd färre än 16 tecken"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Versionsnummer"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Versionsnumret har kopierats till urklipp."</string> <string name="basic_status" msgid="2315371112182658176">"Öppen konversation"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• minst en enhet är tillgänglig"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Tryck länge på genvägen"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Byt skärm nu"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Vik ut telefonen"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vill du byta skärm?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Använd den bakre kameran för högre upplösning"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Vänd telefonen för högre upplösning"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"En vikbar enhet viks upp"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"En vikbar enhet vänds"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> av batteriet återstår"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Byt till jobbprofilen"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Stäng"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Inställningar för låsskärm"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi är inte tillgängligt"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameran är blockerad"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameran och mikrofonen är blockerade"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen är blockerad"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetsläge är aktiverat"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml index 45169aa8b1f4..28717dfa5229 100644 --- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Av"</item> <item msgid="5966994759929723339">"På"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Inte tillgängligt"</item> + <item msgid="2478289035899842865">"Av"</item> + <item msgid="5137565285664080143">"På"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index c303c09375aa..4e04b6467820 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Kivuli cha arifa."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Mipangilio ya haraka."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Skrini iliyofungwa."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Skrini iliyofungwa ya kazini"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Funga"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ung\'avu"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ugeuzaji rangi"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Usahihishaji wa rangirangi"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Ukubwa wa fonti"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Dhibiti watumiaji"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Nimemaliza"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Funga"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"kurekodi skrini"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Wimbo hauna jina"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Ukubwa wa Fonti"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Punguza"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Kuza"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dirisha la Ukuzaji"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vidhibiti vya Dirisha la Ukuzaji"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Vuta karibu"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Imeshindwa kutuma arifa"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Imeshindwa kuhifadhi. Jaribu tena."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Imeshindwa kuhifadhi."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Tumia angalau herufi 4"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Tumia herufi chini ya 16"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nambari ya muundo"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Nambari ya muundo imewekwa kwenye ubao wa kunakili."</string> <string name="basic_status" msgid="2315371112182658176">"Fungua mazungumzo"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Angalau kifaa kimoja kinapatikana"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Gusa na ushikilie njia ya mkato"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Ghairi"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Badilisha skrini sasa"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Kunjua simu"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Ungependa kubadilisha skrini?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Kwa ubora wa juu, tumia kamera ya nyuma"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Kwa ubora wa juu, geuza simu"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Kifaa kinachokunjwa kikikunjuliwa"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Kifaa kinachokunjwa kikigeuzwa"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Chaji ya betri imesalia <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Tumia wasifu wa kazini"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Funga"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Mipangilio ya skrini iliyofungwa"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml index aad00999f0f6..2fe40603bc7d 100644 --- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Imezimwa"</item> <item msgid="5966994759929723339">"Imewashwa"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Haipatikani"</item> + <item msgid="2478289035899842865">"Umezima"</item> + <item msgid="5137565285664080143">"Umewasha"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index 45b137a9acec..59becc69506c 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -62,7 +62,6 @@ <dimen name="qs_security_footer_background_inset">0dp</dimen> <dimen name="qs_panel_padding_top">8dp</dimen> - <dimen name="qs_panel_padding_top_combined_headers">@dimen/qs_panel_padding_top</dimen> <!-- The width of large/content heavy dialogs (e.g. Internet, Media output, etc) --> <dimen name="large_dialog_width">472dp</dimen> @@ -88,4 +87,7 @@ <!-- Biometric Auth pattern view size, better to align keyguard_security_width --> <dimen name="biometric_auth_pattern_view_size">348dp</dimen> + + <dimen name="controls_header_horizontal_padding">12dp</dimen> + <dimen name="controls_content_margin_horizontal">24dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-sw720dp-land/dimens.xml b/packages/SystemUI/res/values-sw720dp-land/dimens.xml index 9ed936050aa2..8583f0549960 100644 --- a/packages/SystemUI/res/values-sw720dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp-land/dimens.xml @@ -37,6 +37,8 @@ <dimen name="qs_media_rec_album_size">112dp</dimen> <dimen name="qs_media_rec_album_side_margin">16dp</dimen> + <dimen name="controls_panel_corner_radius">40dp</dimen> + <dimen name="lockscreen_shade_max_over_scroll_amount">42dp</dimen> <!-- Roughly the same distance as media on LS to media on QS. We will translate by this value diff --git a/packages/SystemUI/res/values-sw720dp-port/dimens.xml b/packages/SystemUI/res/values-sw720dp-port/dimens.xml index 8b41a44b9ba3..9248d585bba7 100644 --- a/packages/SystemUI/res/values-sw720dp-port/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp-port/dimens.xml @@ -33,5 +33,7 @@ side --> <dimen name="qs_tiles_page_horizontal_margin">60dp</dimen> + <dimen name="controls_panel_corner_radius">46dp</dimen> + <dimen name="notification_section_divider_height">16dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-sw720dp/dimens.xml b/packages/SystemUI/res/values-sw720dp/dimens.xml index 8f59df655c3a..20864591ae5a 100644 --- a/packages/SystemUI/res/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp/dimens.xml @@ -19,7 +19,8 @@ <!-- gap on either side of status bar notification icons --> <dimen name="status_bar_icon_padding">1dp</dimen> - <dimen name="controls_padding_horizontal">40dp</dimen> + <dimen name="controls_header_horizontal_padding">28dp</dimen> + <dimen name="controls_content_margin_horizontal">40dp</dimen> <dimen name="large_screen_shade_header_height">56dp</dimen> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index e58acfa56c6d..f623ff1740c3 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"அறிவிப்பு விவரம்."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"உடனடி அமைப்பு."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"லாக் ஸ்கிரீன்."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"பணி லாக் ஸ்கிரீன்"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"மூடு"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ஒளிர்வு"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"கலர் இன்வெர்ஷன்"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"கலர் கரெக்ஷன்"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"எழுத்து வடிவத்தின் அளவு"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"பயனர்களை நிர்வகியுங்கள்"</string> <string name="quick_settings_done" msgid="2163641301648855793">"முடிந்தது"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"மூடுக"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ஸ்கிரீன் ரெக்கார்டிங்"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"தலைப்பு இல்லை"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"எழுத்து வடிவத்தின் அளவு"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"சிறிதாக்கும்"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"பெரிதாக்கும்"</string> <string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"பெரிதாக்கல் சாளரக் கட்டுப்பாடுகள்"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"பெரிதாக்கு"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"ஒளிபரப்ப முடியவில்லை"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"சேமிக்க முடியவில்லை. மீண்டும் முயலவும்."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"சேமிக்க முடியவில்லை."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"குறைந்தது 4 எழுத்துகளைப் பயன்படுத்துங்கள்"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16 எழுத்துகளுக்குக் குறைவாகப் பயன்படுத்துங்கள்"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"பதிப்பு எண்"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"பதிப்பு எண் கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது."</string> <string name="basic_status" msgid="2315371112182658176">"திறந்தநிலை உரையாடல்"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• குறைந்தபட்சம் ஒரு சாதனமாவது கிடைக்க வேண்டும்"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"ஷார்ட்கட்டை தொட்டுப் பிடிக்கவும்"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ரத்துசெய்"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"இப்போது திரைகளை மாற்றவா?"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"மொபைலை விரியுங்கள்"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"காட்சித் திரைகளை மாற்றுவது எப்படி?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"உயர் தெளிவுத்திறனுக்கு, பின்புறக் கேமராவை உபயோகிங்கள்"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"உயர் தெளிவுத்திறனுக்கு, மொபைலை ஃபிளிப் செய்யுங்கள்"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"மடக்கத்தக்க சாதனம் திறக்கப்படுகிறது"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"மடக்கத்தக்க சாதனம் ஃபிளிப் செய்யப்பட்டு திருப்பப்படுகிறது"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> பேட்டரி மீதமுள்ளது"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"பணிக் கணக்கிற்கு மாறு"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"மூடுக"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"பூட்டுத் திரை அமைப்புகள்"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"வைஃபை கிடைக்கவில்லை"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"கேமரா தடுக்கப்பட்டுள்ளது"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டுள்ளன"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"மைக்ரோஃபோன் தடுக்கப்பட்டுள்ளது"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"முன்னுரிமைப் பயன்முறை இயக்கத்தில் உள்ளது"</string> </resources> diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml index 1a22d9fa1476..5bcc6c761e1c 100644 --- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"முடக்கப்பட்டுள்ளது"</item> <item msgid="5966994759929723339">"இயக்கப்பட்டுள்ளது"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"கிடைக்கவில்லை"</item> + <item msgid="2478289035899842865">"முடக்கப்பட்டுள்ளது"</item> + <item msgid="5137565285664080143">"இயக்கப்பட்டுள்ளது"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 11f528a1cc25..9ddbe9b6d491 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"నోటిఫికేషన్ షేడ్."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"శీఘ్ర సెట్టింగ్లు."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"లాక్ స్క్రీన్."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"కార్యాలయ లాక్ స్క్రీన్"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"మూసివేస్తుంది"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ప్రకాశం"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"కలర్ మార్పిడి"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"కలర్ కరెక్షన్"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ఫాంట్ సైజ్"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"యూజర్లను మేనేజ్ చేయండి"</string> <string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"స్క్రీన్ రికార్డింగ్"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"శీర్షిక లేదు"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ఫాంట్ సైజ్"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"చిన్నదిగా చేస్తుంది"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"పెద్దదిగా చేస్తుంది"</string> <string name="magnification_window_title" msgid="4863914360847258333">"మ్యాగ్నిఫికేషన్ విండో"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"మ్యాగ్నిఫికేషన్ నియంత్రణల విండో"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"దగ్గరగా జూమ్ చేయండి"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• కనీసం ఒక పరికరమైనా అందుబాటులో ఉందని"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"షార్ట్కట్ను తాకి, నొక్కి ఉంచు"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"రద్దు చేయండి"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ఇప్పుడే స్క్రీన్లను మార్చండి"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ఫోన్ను అన్ఫోల్డ్ చేయండి"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"స్క్రీన్లను మార్చాలా?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"అధిక రిజల్యూషన్ కోసం, వెనుక వైపు కెమెరాను ఉపయోగించండి"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"అధిక రిజల్యూషన్ కోసం, ఫోన్ను తిప్పండి"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"మడవగల పరికరం విప్పబడుతోంది"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"మడవగల పరికరం చుట్టూ తిప్పబడుతోంది"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> బ్యాటరీ మిగిలి ఉంది"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"వర్క్ ప్రొఫైల్కు మారండి"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"మూసివేయండి"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"లాక్ స్క్రీన్ సెట్టింగ్లు"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi అందుబాటులో లేదు"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"కెమెరా బ్లాక్ చేయబడింది"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"కెమెరా, మైక్రోఫోన్ బ్లాక్ చేయబడ్డాయి"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"మైక్రోఫోన్ బ్లాక్ చేయబడింది"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ప్రయారిటీ మోడ్ ఆన్లో ఉంది"</string> </resources> diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml index c5a525cb611f..6549c5631161 100644 --- a/packages/SystemUI/res/values-te/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ఆఫ్"</item> <item msgid="5966994759929723339">"ఆన్"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"అందుబాటులో లేదు"</item> + <item msgid="2478289035899842865">"ఆఫ్లో ఉంది"</item> + <item msgid="5137565285664080143">"ఆన్లో ఉంది"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index c3037be4ea6f..c01929bec67b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"หน้าต่างแจ้งเตือน"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"การตั้งค่าด่วน"</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"การตั้งค่าด่วนและหน้าต่างแจ้งเตือน"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ล็อกหน้าจอ"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"หน้าจอล็อกของโปรไฟล์งาน"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ปิด"</string> @@ -257,8 +258,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ความสว่าง"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"การกลับสี"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"การแก้สี"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ขนาดแบบอักษร"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"จัดการผู้ใช้"</string> <string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ปิด"</string> @@ -779,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"การบันทึกหน้าจอ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ไม่มีชื่อ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"ขนาดแบบอักษร"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"ทำให้เล็กลง"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"ทำให้ใหญ่ขึ้น"</string> <string name="magnification_window_title" msgid="4863914360847258333">"หน้าต่างการขยาย"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"การควบคุมหน้าต่างการขยาย"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ซูมเข้า"</string> @@ -1030,16 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• มีอุปกรณ์พร้อมใช้งานอย่างน้อย 1 รายการ"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"แตะแป้นพิมพ์ลัดค้างไว้"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ยกเลิก"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"สลับหน้าจอเลย"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"กางโทรศัพท์ออก"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"สลับหน้าจอไหม"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"ใช้กล้องหลังเพื่อให้ได้ภาพที่มีความละเอียดมากขึ้น"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"พลิกด้านโทรศัพท์เพื่อให้ได้ภาพที่มีความละเอียดมากขึ้น"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"อุปกรณ์ที่พับได้กำลังกางออก"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"อุปกรณ์ที่พับได้กำลังพลิกไปมา"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"เหลือแบตเตอรี่ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1043,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"สลับไปใช้โปรไฟล์งาน"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ปิด"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"การตั้งค่าหน้าจอล็อก"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml index 61e0fe6bde77..69449a72196e 100644 --- a/packages/SystemUI/res/values-th/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"ปิด"</item> <item msgid="5966994759929723339">"เปิด"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"ไม่พร้อมใช้งาน"</item> + <item msgid="2478289035899842865">"ปิด"</item> + <item msgid="5137565285664080143">"เปิด"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index c991c82eb936..d65704a89281 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Mga mabilisang setting."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Lock screen sa trabaho"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Isara"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Pag-invert ng kulay"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Pagtatama ng kulay"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Laki ng font"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Pamahalaan ang mga user"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Tapos na"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Isara"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"pag-record ng screen"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Walang pamagat"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Laki ng Font"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Paliitin"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Palakihin"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Window ng Pag-magnify"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Mga Kontrol sa Pag-magnify ng Window"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Mag-zoom in"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Hindi makapag-broadcast"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Hindi ma-save. Subukan ulit."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Hindi ma-save."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Gumamit ng hindi bababa sa 4 na character"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Gumamit ng mas kaunti sa 16 na character"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numero ng build"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Nakopya sa clipboard ang numero ng build."</string> <string name="basic_status" msgid="2315371112182658176">"Buksan ang pag-uusap"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• May kahit isang device na available"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pindutin nang matagal: shortcut"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Kanselahin"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Lumipat na ng screen"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"I-unfold ang telepono"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Lumipat ng screen?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Para sa mas mataas na resolution, gamitin ang camera sa likod"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para sa mas mataas na resolution, i-flip ang telepono"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ina-unfold na foldable na device"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Fini-flip na foldable na device"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> baterya na lang ang natitira"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Lumipat sa profile sa trabaho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Isara"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Mga setting ng lock screen"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Hindi available ang Wi-Fi"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Naka-block ang camera"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Naka-block ang camera at mikropono"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Naka-block ang mikropono"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Naka-on ang Priority mode"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml index 4522945908c9..689c2a26ca61 100644 --- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Naka-off"</item> <item msgid="5966994759929723339">"Naka-on"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Hindi available"</item> + <item msgid="2478289035899842865">"Naka-off"</item> + <item msgid="5137565285664080143">"Naka-on"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index d8569b32b1b2..34b3b1f862ea 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bildirim gölgesi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hızlı ayarlar."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilit ekranı"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"İş profili kilit ekranı"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Kapat"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaklık"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rengi ters çevirme"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Renk düzeltme"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Yazı tipi boyutu"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Kullanıcıları yönet"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Bitti"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Kapat"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekran kaydı"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıksız"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Yazı Tipi Boyutu"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Küçült"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Büyüt"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Büyütme Penceresi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Büyütme Penceresi Kontrolleri"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yakınlaştır"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Yayınlanamıyor"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Kaydedilemiyor. Tekrar deneyin."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Kaydedilemiyor."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"En az 4 karakter kullanın."</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"En fazla 16 karakter kullanın"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Derleme numarası"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Derleme numarası panoya kopyalandı."</string> <string name="basic_status" msgid="2315371112182658176">"Görüşmeyi aç"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• En az bir cihaz mevcut olmalıdır"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Kısayola dokunup basılı tutun"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"İptal"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Ekranı şimdi değiştirin"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefonu açın"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Ekran değiştirilsin mi?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Daha yüksek çözünürlük için arka kamerayı kullanın"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Daha yüksek çözünürlük için telefonu çevirin"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Katlanabilir cihaz açılıyor"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Katlanabilir cihaz döndürülüyor"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> pil kaldı"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"İş profiline geç"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Kapat"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Kilit ekranı ayarları"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kablosuz bağlantı kullanılamıyor"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera engellendi"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ve mikrofon engellendi"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon engellendi"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Öncelik modu etkin"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml index 5d6a7f429614..a8c7f784920d 100644 --- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Kapalı"</item> <item msgid="5966994759929723339">"Açık"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Kullanılamıyor"</item> + <item msgid="2478289035899842865">"Kapalı"</item> + <item msgid="5137565285664080143">"Açık"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index df1d27a5aa38..e439bec78585 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панель сповіщень."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Швидке налаштування."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заблокований екран."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Екран блокування завдання"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Закрити"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яскравість"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія кольорів"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Корекція кольору"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Розмір шрифту"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Керувати користувачами"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрити"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"запис відео з екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без назви"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Розмір шрифту"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Зменшити"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Збільшити"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Вікно збільшення"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Елементи керування вікна збільшення"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Наблизити"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Неможливо транслювати"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Не вдалося зберегти. Повторіть спробу."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Не вдалося зберегти."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Введіть принаймні 4 символи"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Введіть менше ніж 16 символів"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер складання"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Номер складання скопійовано в буфер обміну."</string> <string name="basic_status" msgid="2315371112182658176">"Відкрита розмова"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Принаймні один пристрій доступний"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Натисніть і утримуйте ярлик"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Скасувати"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Використовувати інший екран"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Розгорніть телефон"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Використовувати інший екран?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Для вищої роздільної здатності використовуйте основну камеру"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Для вищої роздільної здатності переверніть телефон"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Розкладний пристрій у розкладеному стані"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Розкладний пристрій обертається"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Заряд акумулятора: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Перейти в робочий профіль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрити"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Параметри заблокованого екрана"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml index a0cc1c19d46d..4062f1be4c08 100644 --- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Вимкнено"</item> <item msgid="5966994759929723339">"Увімкнено"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Недоступно"</item> + <item msgid="2478289035899842865">"Вимкнено"</item> + <item msgid="5137565285664080143">"Увімкнено"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 089e4b476843..1d4385d60c46 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -93,8 +93,8 @@ <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"دایاں احاطہ <xliff:g id="PERCENT">%1$d</xliff:g> فیصد"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"دفتری پروفائل میں <xliff:g id="APP">%1$s</xliff:g> میں محفوظ کی گئی"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"فائلز"</string> - <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> نے اس اسکرین شاٹ کا پتا لگایا۔"</string> - <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> اور دیگر کھلی ایپس نے اس اسکرین شاٹ کا پتا لگایا۔"</string> + <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> نے اس اسکرین شاٹ کا پتا لگایا۔"</string> + <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> اور دیگر کھلی ایپس نے اس اسکرین شاٹ کا پتا لگایا۔"</string> <string name="screenrecord_name" msgid="2596401223859996572">"اسکرین ریکارڈر"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"سکرین ریکارڈنگ پروسیس ہورہی ہے"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"بیٹری <xliff:g id="NUMBER">%d</xliff:g> فیصد۔"</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"بیٹری <xliff:g id="PERCENTAGE">%1$d</xliff:g> فیصد ہے، <xliff:g id="TIME">%2$s</xliff:g> تک چلے گی"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"بیٹری چارج ہو رہی ہے، اس وقت <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> فیصد ہے۔"</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"بیٹری <xliff:g id="PERCENTAGE">%d</xliff:g> فیصد پے، بیٹری کے تحفظ کے لیے چارجنگ موقوف ہو گئی ہے۔"</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"بیٹری <xliff:g id="PERCENTAGE">%1$d</xliff:g> فیصد پے، <xliff:g id="TIME">%2$s</xliff:g> تک چلے گی، بیٹری کے تحفظ کے لیے چارجنگ موقوف ہو گئی ہے۔"</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"بیٹری <xliff:g id="PERCENTAGE">%d</xliff:g> فیصد، بیٹری کے تحفظ کے لیے چارجنگ موقوف ہو گئی ہے۔"</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"بیٹری <xliff:g id="PERCENTAGE">%1$d</xliff:g> فیصد، <xliff:g id="TIME">%2$s</xliff:g>، بیٹری کے تحفظ کے لیے چارجنگ موقوف ہو گئی ہے۔"</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"تمام اطلاعات دیکھیں"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"ٹیلی ٹائپ رائٹر فعال ہے۔"</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"رنگر وائبریٹ۔"</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"اطلاعاتی شیڈ۔"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"فوری ترتیبات۔"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"مقفل اسکرین۔"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"دفتری مقفل اسکرین"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"بند کریں"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"چمکیلا پن"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"رنگوں کی تقلیب"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"رنگ کی اصلاح"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"فونٹ سائز"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"صارفین کا نظم کریں"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ہو گیا"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بند کریں"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"اسکرین ریکارڈنگ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"کوئی عنوان نہیں ہے"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"فونٹ سائز"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"چھوٹا کریں"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"بڑا کریں"</string> <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"زوم ان کریں"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"براڈکاسٹ نہیں کیا جا سکتا"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"محفوظ نہیں کیا جا سکا۔ پھر کوشش کریں۔"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"محفوظ نہیں کیا جا سکا۔"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"کم از کم 4 حروف استعمال کریں"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"16 حروف سے کم استعمال کریں"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"بلڈ نمبر"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"بلڈ نمبر کلپ بورڈ میں کاپی ہو گیا۔"</string> <string name="basic_status" msgid="2315371112182658176">"گفتگو کھولیں"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• کم از کم ایک آلہ دستیاب ہے"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"شارٹ کٹ ٹچ کریں اور دبائے رکھیں"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"منسوخ کریں"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"اب اسکرینز سوئچ کریں"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"فون کھولیں"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"اسکرینز سوئچ کریں؟"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"زیادہ ریزولوشن کے لیے، بَیک کیمرا استعمال کریں"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"زیادہ ریزولوشن کے لیے، فون پلٹائیں"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"فولڈ ہونے والے آلے کو کھولا جا رہا ہے"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"فولڈ ہونے والے آلے کو گھمایا جا رہا ہے"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> بیٹری باقی ہے"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"دفتری پروفائل پر سوئچ کریں"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"بند کریں"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"مقفل اسکرین کی ترتیبات"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi دستیاب نہیں ہے"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"کیمرا مسدود ہے"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"کیمرا اور مائیکروفون مسدود ہے"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"مائیکروفون مسدود ہے"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ترجیحی موڈ آن ہے"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml index 5e2b0736ec8f..bb27b9fbe9f2 100644 --- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"آف"</item> <item msgid="5966994759929723339">"آن"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"دستیاب نہیں ہیں"</item> + <item msgid="2478289035899842865">"آف ہے"</item> + <item msgid="5137565285664080143">"آن ہے"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 7df2aed28fff..836fea27c9fa 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -93,8 +93,8 @@ <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"Oʻng chegara <xliff:g id="PERCENT">%1$d</xliff:g> foiz"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"Ish profilidagi <xliff:g id="APP">%1$s</xliff:g> ilovasiga saqlandi"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Fayllar"</string> - <string name="screenshot_detected_template" msgid="7940376642921719915">"Bu skrinshotda <xliff:g id="APPNAME">%1$s</xliff:g> aniqlandi."</string> - <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"Bu skrinshotda <xliff:g id="APPNAME">%1$s</xliff:g> va boshqa ochiq ilovalar aniqlandi"</string> + <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> skrinshot olinganini aniqladi."</string> + <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> va boshqa ochiq ilovalar skrinshot olinganini aniqladi."</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrandan yozib olish"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran yozib olinmoqda"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"Batareya <xliff:g id="NUMBER">%d</xliff:g> foiz."</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"Batareya <xliff:g id="PERCENTAGE">%1$d</xliff:g> foiz, <xliff:g id="TIME">%2$s</xliff:g> yetadi."</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Batareya quvvat olmoqda, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> foiz."</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Batareya <xliff:g id="PERCENTAGE">%d</xliff:g> foiz, batareya himoyasi uchun quvvatlash toʻxtatildi."</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Batareya <xliff:g id="PERCENTAGE">%1$d</xliff:g> foiz, <xliff:g id="TIME">%2$s</xliff:g> yetadi, batareya himoyasi uchun quvvatlash toʻxtatildi."</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"Batareya <xliff:g id="PERCENTAGE">%d</xliff:g> foiz, batareya himoyasi uchun quvvatlash pauza qilindi."</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"Batareya <xliff:g id="PERCENTAGE">%1$d</xliff:g> foiz, <xliff:g id="TIME">%2$s</xliff:g>, batareya himoyasi uchun quvvatlash pauza qilindi."</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"Barcha bildirishnomalarni ko‘rish"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter yoqildi."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Vibratsiyali qo‘ng‘iroq"</string> @@ -197,6 +197,7 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Xabarnoma soyasi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tezkor sozlamalar."</string> + <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"Tezkor sozlamalar va eslatma soyasi."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Qulflash ekrani."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ishchi ekran qulfi"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Yopish"</string> @@ -257,8 +258,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Yorqinlik"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ranglarni akslantirish"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ranglarni tuzatish"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Shrift oʻlchami"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Foydalanuvchilarni boshqarish"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Tayyor"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Yopish"</string> @@ -779,12 +779,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekranni yozuvi"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nomsiz"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Shrift oʻlchami"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Kichiklashtirish"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Kattalashtirish"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Kattalashtirish oynasi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kattalashtirish oynasi sozlamalari"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yaqinlashtirish"</string> @@ -1030,16 +1027,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Kamida bitta qurilma mavjud"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Bosib turish yorligʻi"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Bekor qilish"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Ekranlarni hozir almashtirish"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefonni yoying"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Ekranlar almashtirilsinmi?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Yuqori aniqlik uchun orqa kameradan foydalaning"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Yuqori aniqlik uchun telefonni aylantiring"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Buklanadigan qurilma ochilmoqda"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Buklanadigan qurilma aylantirilmoqda"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Batareya quvvati: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1043,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Ish profiliga almashish"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Yopish"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Qulflangan ekran sozlamalari"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi mavjud emas"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklangan"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera va mikrofon bloklangan"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklangan"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Imtiyozli rejim yoniq"</string> </resources> diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml index 6d55fc1f1225..4a45f03f4cbe 100644 --- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Oʻchiq"</item> <item msgid="5966994759929723339">"Yoniq"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Mavjud emas"</item> + <item msgid="2478289035899842865">"Oʻchiq"</item> + <item msgid="5137565285664080143">"Yoniq"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index caeb44c5985e..1cb78ceecdf7 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bóng thông báo."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Cài đặt nhanh."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Màn hình khóa."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Màn hình khóa công việc"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Đóng"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Độ sáng"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Đảo màu"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Chỉnh màu"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Cỡ chữ"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Quản lý người dùng"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Đóng"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ghi màn hình"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Cỡ chữ"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Thu nhỏ"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Phóng to"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Cửa sổ phóng to"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Các tùy chọn điều khiển cửa sổ phóng to"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Phóng to"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"Không thể truyền"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"Không lưu được. Hãy thử lại."</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"Không lưu được."</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"Sử dụng ít nhất 4 ký tự"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"Sử dụng ít hơn 16 ký tự"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"Số bản dựng"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"Đã sao chép số bản dựng vào bảng nhớ tạm."</string> <string name="basic_status" msgid="2315371112182658176">"Mở cuộc trò chuyện"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Có ít nhất một thiết bị đang hoạt động"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ phím tắt"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Huỷ"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Chuyển đổi màn hình ngay"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Mở điện thoại"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Chuyển đổi màn hình?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Để có độ phân giải cao hơn, hãy dùng máy ảnh sau"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Để có độ phân giải cao hơn, hãy lật điện thoại"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Thiết bị có thể gập lại đang được mở ra"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Thiết bị có thể gập lại đang được lật ngược"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Còn <xliff:g id="PERCENTAGE">%s</xliff:g> pin"</string> @@ -1053,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Chuyển sang hồ sơ công việc"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Đóng"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Cài đặt màn hình khoá"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml index 5b816fb9e62e..201a45b3d445 100644 --- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Tắt"</item> <item msgid="5966994759929723339">"Đang bật"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Không có sẵn"</item> + <item msgid="2478289035899842865">"Đang tắt"</item> + <item msgid="5137565285664080143">"Đang bật"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index f2ddb99a176a..25ea39d1f75e 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知栏。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快捷设置。"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"锁定屏幕。"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"工作锁定屏幕"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"关闭"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"颜色反转"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"字号"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"管理用户"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"关闭"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"屏幕录制"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"字体大小"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"缩小"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"放大"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大窗口"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大窗口控件"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string> @@ -909,10 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"无法广播"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"无法保存,请重试。"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"无法保存。"</string> - <!-- no translation found for media_output_broadcast_code_hint_no_less_than_min (4663836092607696185) --> - <skip /> - <!-- no translation found for media_output_broadcast_code_hint_no_more_than_max (9181869364856175638) --> - <skip /> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"必须至少 4 个字符"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"必须少于 16 个字符"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本号"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"已将版本号复制到剪贴板。"</string> <string name="basic_status" msgid="2315371112182658176">"开放式对话"</string> @@ -1032,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• 至少有一台设备可用"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"轻触并按住快捷方式"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"取消"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"立即切换屏幕"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"展开手机"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"切换屏幕?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"若要获得更高的分辨率,请使用后置摄像头"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"若要获得更高的分辨率,请翻转手机"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展开可折叠设备"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻转可折叠设备"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"电池还剩 <xliff:g id="PERCENTAGE">%s</xliff:g> 的电量"</string> @@ -1053,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"切换到工作资料"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"关闭"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"锁屏设置"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"没有 WLAN 连接"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已禁用摄像头"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已禁用摄像头和麦克风"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已禁用麦克风"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"已开启优先模式"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml index 5d7d02f2dbeb..3ab2d7a3d1c7 100644 --- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"关闭"</item> <item msgid="5966994759929723339">"已开启"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"不可用"</item> + <item msgid="2478289035899842865">"已关闭"</item> + <item msgid="5137565285664080143">"已开启"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 1898f8c479b7..2bb1ab896522 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -187,8 +187,8 @@ <string name="accessibility_battery_level" msgid="5143715405241138822">"電池電量為百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"目前電池電量為 <xliff:g id="PERCENTAGE">%1$d</xliff:g>,剩餘使用時間為 <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"正在充電:<xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%。"</string> - <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"目前電池電量為 <xliff:g id="PERCENTAGE">%d</xliff:g>。為保護電池,系統已暫停充電。"</string> - <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"目前電池電量為 <xliff:g id="PERCENTAGE">%1$d</xliff:g>,剩餘使用時間為 <xliff:g id="TIME">%2$s</xliff:g>。為保護電池,系統已暫停充電。"</string> + <string name="accessibility_battery_level_charging_paused" msgid="3560711496775146763">"目前電池電量為百分之 <xliff:g id="PERCENTAGE">%d</xliff:g>。為保護電池,系統已暫停充電。"</string> + <string name="accessibility_battery_level_charging_paused_with_estimate" msgid="2223541217743647858">"目前電池電量為百分之 <xliff:g id="PERCENTAGE">%1$d</xliff:g>,剩餘使用時間為 <xliff:g id="TIME">%2$s</xliff:g>。為保護電池,系統已暫停充電。"</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"睇所有通知"</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter (TTY) 已啟用。"</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"鈴聲震動。"</string> @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知欄。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快速設定。"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"上鎖畫面。"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"工作螢幕鎖定"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"字型大小"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"管理使用者"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"錄製螢幕畫面"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"字型大小"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"縮小"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"放大"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string> @@ -909,8 +907,8 @@ <string name="media_output_broadcast_start_failed" msgid="3670835946856129775">"無法廣播"</string> <string name="media_output_broadcast_update_error" msgid="1420868236079122521">"無法儲存,請再試一次。"</string> <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"無法儲存。"</string> - <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"至少要有 4 個半形字元"</string> - <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"不得超過 16 個半形字元"</string> + <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"請至少使用 4 個字元"</string> + <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"請使用少於 16 個字元"</string> <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本號碼"</string> <string name="build_number_copy_toast" msgid="877720921605503046">"版本號碼已複製到剪貼簿。"</string> <string name="basic_status" msgid="2315371112182658176">"開啟對話"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• 至少一部裝置可用"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"輕觸並按住快速鍵"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"取消"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"立即切換螢幕"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"打開手機"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"要切換螢幕嗎?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"如要提高解像度,請使用後置鏡頭"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"如要提高解像度,請切換至手機後置鏡頭"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展開折疊式裝置"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻轉折疊式裝置"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"剩餘電量:<xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"切換至工作設定檔"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"關閉"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"上鎖畫面設定"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"無法連線至 Wi-Fi"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖相機"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖相機和麥克風"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先模式已開啟"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml index 2e51f920055a..89d66284ede6 100644 --- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"已關閉"</item> <item msgid="5966994759929723339">"已開啟"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"無法使用"</item> + <item msgid="2478289035899842865">"關閉"</item> + <item msgid="5137565285664080143">"開啟"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index a1296507fc61..612005e20fd9 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知欄。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快捷設定。"</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"螢幕鎖定。"</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work 螢幕鎖定"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"色彩校正"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"字型大小"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"管理使用者"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"錄製螢幕畫面"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"字型大小"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"縮小"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"放大"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• 至少要有一部可用裝置"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"按住快速鍵"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"取消"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"立即切換螢幕"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"展開手機"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"要切換螢幕嗎?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"如要提高解析度,請使用後置鏡頭"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"如要提高解析度,請切換至手機後置鏡頭"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展開的折疊式裝置"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻轉折疊式裝置"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"剩餘電量:<xliff:g id="PERCENTAGE">%s</xliff:g>"</string> @@ -1051,4 +1044,9 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"切換至工作資料夾"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"關閉"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"螢幕鎖定設定"</string> + <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"無法連上 Wi-Fi"</string> + <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖攝影機"</string> + <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖攝影機和麥克風"</string> + <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先模式已開啟"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml index f1f01853d342..a046e3354729 100644 --- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"已關閉"</item> <item msgid="5966994759929723339">"已開啟"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"無法使用"</item> + <item msgid="2478289035899842865">"關閉"</item> + <item msgid="5137565285664080143">"開啟"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 16f184a9a823..b3f96b03a9f1 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -197,6 +197,8 @@ <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Umthunzi wesaziso."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Izilingiselelo ezisheshayo."</string> + <!-- no translation found for accessibility_desc_qs_notification_shade (8327226953072700376) --> + <skip /> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Khiya isikrini."</string> <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ukukhiya isikrini somsebenzi"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Vala"</string> @@ -257,8 +259,7 @@ <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ukugqama"</string> <string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ukuguqulwa kombala"</string> <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ukulungiswa kombala"</string> - <!-- no translation found for quick_settings_font_scaling_label (5289001009876936768) --> - <skip /> + <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"Usayizi wefonti"</string> <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"Phatha abasebenzisi"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Kwenziwe"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Vala"</string> @@ -779,12 +780,9 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"ukurekhoda isikrini"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Asikho isihloko"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string> - <!-- no translation found for font_scaling_dialog_title (6273107303850248375) --> - <skip /> - <!-- no translation found for font_scaling_smaller (1012032217622008232) --> - <skip /> - <!-- no translation found for font_scaling_larger (5476242157436806760) --> - <skip /> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Usayizi Wefonti"</string> + <string name="font_scaling_smaller" msgid="1012032217622008232">"Yenza kube kuncane"</string> + <string name="font_scaling_larger" msgid="5476242157436806760">"Yenza kube kukhulu"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Iwindi Lesikhulisi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Izilawuli Zewindi Lesikhulisi"</string> <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Sondeza"</string> @@ -1030,16 +1028,11 @@ <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• Okungenani idivayisi eyodwa iyatholakala"</string> <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Thinta futhi ubambe isinqamuleli"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Khansela"</string> - <!-- no translation found for rear_display_bottom_sheet_confirm (1507591562761552899) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_title (3930008746560711990) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_title (6291111173057304055) --> - <skip /> - <!-- no translation found for rear_display_folded_bottom_sheet_description (6842767125783222695) --> - <skip /> - <!-- no translation found for rear_display_unfolded_bottom_sheet_description (7229961336309960201) --> - <skip /> + <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Shintsha izikrini manje"</string> + <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Vula ifoni"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Shintsha izikrini?"</string> + <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Ukuze uthole ukulungiswa okuphezulu, sebenzisa ikhamera yangemuva"</string> + <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Ukuze uthole ukulungiswa okuphezulu, phendula ifoni"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Idivayisi egoqekayo iyembulwa"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Idivayisi egoqekayo iphendulwa nxazonke"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ibhethri elisele"</string> @@ -1051,4 +1044,14 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Shintshela kuphrofayela yomsebenzi"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Vala"</string> <string name="lock_screen_settings" msgid="9197175446592718435">"Amasethingi okukhiya isikrini"</string> + <!-- no translation found for wifi_unavailable_dream_overlay_content_description (2024166212194640100) --> + <skip /> + <!-- no translation found for camera_blocked_dream_overlay_content_description (4074759493559418130) --> + <skip /> + <!-- no translation found for camera_and_microphone_blocked_dream_overlay_content_description (7891078093416249764) --> + <skip /> + <!-- no translation found for microphone_blocked_dream_overlay_content_description (5466897982130007033) --> + <skip /> + <!-- no translation found for priority_mode_dream_overlay_content_description (6044561000253314632) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml index a8ccbb58366a..e35840b85ab4 100644 --- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml @@ -176,7 +176,9 @@ <item msgid="8014986104355098744">"Valiwe"</item> <item msgid="5966994759929723339">"Vuliwe"</item> </string-array> - <!-- no translation found for tile_states_font_scaling:0 (3173069902082305985) --> - <!-- no translation found for tile_states_font_scaling:1 (2478289035899842865) --> - <!-- no translation found for tile_states_font_scaling:2 (5137565285664080143) --> + <string-array name="tile_states_font_scaling"> + <item msgid="3173069902082305985">"Ayitholakali"</item> + <item msgid="2478289035899842865">"Valiwe"</item> + <item msgid="5137565285664080143">"Vuliwe"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index d48ea214e8d9..bf949a0f4368 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -616,8 +616,7 @@ <dimen name="qs_dual_tile_padding_horizontal">6dp</dimen> <dimen name="qs_panel_elevation">4dp</dimen> <dimen name="qs_panel_padding_bottom">@dimen/footer_actions_height</dimen> - <dimen name="qs_panel_padding_top">48dp</dimen> - <dimen name="qs_panel_padding_top_combined_headers">80dp</dimen> + <dimen name="qs_panel_padding_top">80dp</dimen> <dimen name="qs_data_usage_text_size">14sp</dimen> <dimen name="qs_data_usage_usage_text_size">36sp</dimen> @@ -1154,11 +1153,13 @@ <!-- Home Controls --> <dimen name="controls_header_menu_size">48dp</dimen> + <dimen name="controls_header_menu_button_size">48dp</dimen> <dimen name="controls_header_bottom_margin">16dp</dimen> + <dimen name="controls_header_horizontal_padding">12dp</dimen> <dimen name="controls_header_app_icon_size">24dp</dimen> <dimen name="controls_top_margin">48dp</dimen> - <dimen name="controls_padding_horizontal">0dp</dimen> - <dimen name="control_header_text_size">20sp</dimen> + <dimen name="controls_content_margin_horizontal">0dp</dimen> + <dimen name="control_header_text_size">24sp</dimen> <dimen name="control_item_text_size">16sp</dimen> <dimen name="control_menu_item_text_size">16sp</dimen> <dimen name="control_menu_item_min_height">56dp</dimen> @@ -1189,6 +1190,8 @@ <item name="controls_task_view_width_percentage" translatable="false" format="float" type="dimen">1.0</item> <dimen name="controls_task_view_right_margin">0dp</dimen> + <dimen name="controls_panel_corner_radius">42dp</dimen> + <!-- Home Controls activity view detail panel--> <dimen name="controls_activity_view_corner_radius">@*android:dimen/config_bottomDialogCornerRadius</dimen> diff --git a/packages/SystemUI/screenshot/AndroidManifest.xml b/packages/SystemUI/screenshot/AndroidManifest.xml index a405836bd77f..ba3dc8c53fff 100644 --- a/packages/SystemUI/screenshot/AndroidManifest.xml +++ b/packages/SystemUI/screenshot/AndroidManifest.xml @@ -20,6 +20,7 @@ <application> <activity android:name="com.android.systemui.testing.screenshot.ScreenshotActivity" + android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize" android:exported="true" android:theme="@style/Theme.SystemUI.Screenshot" /> </application> diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index 1254e1ee3311..92ee37310130 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -48,7 +48,7 @@ import com.android.systemui.plugins.ClockTickRate import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogLevel.DEBUG import com.android.systemui.shared.regionsampling.RegionSampler -import com.android.systemui.plugins.Weather +import com.android.systemui.plugins.WeatherData import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback import com.android.systemui.statusbar.policy.ConfigurationController @@ -291,10 +291,8 @@ constructor( clock?.events?.onTimeFormatChanged(DateFormat.is24HourFormat(context)) } - override fun onWeatherDataChanged(data: Weather?) { - if (data != null) { - clock?.events?.onWeatherDataChanged(data) - } + override fun onWeatherDataChanged(data: WeatherData) { + clock?.events?.onWeatherDataChanged(data) } } diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java index a25b281f807c..c5a06b48e015 100644 --- a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java +++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java @@ -24,7 +24,6 @@ import android.view.ViewConfiguration; import android.widget.Button; import com.android.internal.util.EmergencyAffordanceManager; -import com.android.internal.widget.LockPatternUtils; /** * This class implements a smart emergency button that updates itself based @@ -40,8 +39,6 @@ public class EmergencyButton extends Button { private int mDownY; private boolean mLongPressWasDragged; - private LockPatternUtils mLockPatternUtils; - private final boolean mEnableEmergencyCallWhileSimLocked; public EmergencyButton(Context context) { @@ -58,7 +55,6 @@ public class EmergencyButton extends Button { @Override protected void onFinishInflate() { super.onFinishInflate(); - mLockPatternUtils = new LockPatternUtils(mContext); if (mEmergencyAffordanceManager.needsEmergencyAffordance()) { setOnLongClickListener(v -> { if (!mLongPressWasDragged @@ -95,7 +91,8 @@ public class EmergencyButton extends Button { return super.performLongClick(); } - void updateEmergencyCallButton(boolean isInCall, boolean hasTelephonyRadio, boolean simLocked) { + void updateEmergencyCallButton(boolean isInCall, boolean hasTelephonyRadio, boolean simLocked, + boolean isSecure) { boolean visible = false; if (hasTelephonyRadio) { // Emergency calling requires a telephony radio. @@ -107,7 +104,7 @@ public class EmergencyButton extends Button { visible = mEnableEmergencyCallWhileSimLocked; } else { // Only show if there is a secure screen (pin/pattern/SIM pin/SIM puk); - visible = mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser()); + visible = isSecure; } } } diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButtonController.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButtonController.java index ea808eb19b90..f7e8eb492584 100644 --- a/packages/SystemUI/src/com/android/keyguard/EmergencyButtonController.java +++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButtonController.java @@ -18,6 +18,7 @@ package com.android.keyguard; import static com.android.systemui.DejankUtils.whitelistIpcs; +import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.content.Intent; @@ -31,16 +32,22 @@ import android.telephony.TelephonyManager; import android.util.Log; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.dagger.KeyguardBouncerScope; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.util.EmergencyDialerConstants; import com.android.systemui.util.ViewController; +import java.util.concurrent.Executor; + import javax.inject.Inject; /** View Controller for {@link com.android.keyguard.EmergencyButton}. */ @@ -57,6 +64,9 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { private final MetricsLogger mMetricsLogger; private EmergencyButtonCallback mEmergencyButtonCallback; + private LockPatternUtils mLockPatternUtils; + private Executor mMainExecutor; + private Executor mBackgroundExecutor; private final KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @@ -78,12 +88,15 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { } }; - private EmergencyButtonController(@Nullable EmergencyButton view, + @VisibleForTesting + public EmergencyButtonController(@Nullable EmergencyButton view, ConfigurationController configurationController, KeyguardUpdateMonitor keyguardUpdateMonitor, TelephonyManager telephonyManager, PowerManager powerManager, ActivityTaskManager activityTaskManager, ShadeController shadeController, - @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger) { + @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger, + LockPatternUtils lockPatternUtils, + Executor mainExecutor, Executor backgroundExecutor) { super(view); mConfigurationController = configurationController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; @@ -93,6 +106,9 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { mShadeController = shadeController; mTelecomManager = telecomManager; mMetricsLogger = metricsLogger; + mLockPatternUtils = lockPatternUtils; + mMainExecutor = mainExecutor; + mBackgroundExecutor = backgroundExecutor; } @Override @@ -113,13 +129,27 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { mConfigurationController.removeCallback(mConfigurationListener); } - private void updateEmergencyCallButton() { + /** + * Updates the visibility of the emergency button. + * + * This method runs binder calls in a background thread. + */ + @VisibleForTesting + @SuppressLint("MissingPermission") + public void updateEmergencyCallButton() { if (mView != null) { - mView.updateEmergencyCallButton( - mTelecomManager != null && mTelecomManager.isInCall(), - getContext().getPackageManager().hasSystemFeature( - PackageManager.FEATURE_TELEPHONY), - mKeyguardUpdateMonitor.isSimPinVoiceSecure()); + // Run in bg thread to avoid throttling the main thread with binder call. + mBackgroundExecutor.execute(() -> { + boolean isInCall = mTelecomManager != null && mTelecomManager.isInCall(); + boolean isSecure = mLockPatternUtils + .isSecure(KeyguardUpdateMonitor.getCurrentUser()); + mMainExecutor.execute(() -> mView.updateEmergencyCallButton( + /* isInCall= */ isInCall, + /* hasTelephonyRadio= */ getContext().getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_TELEPHONY), + /* simLocked= */ mKeyguardUpdateMonitor.isSimPinVoiceSecure(), + /* isSecure= */ isSecure)); + }); } } @@ -129,6 +159,7 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { /** * Shows the emergency dialer or returns the user to the existing call. */ + @SuppressLint("MissingPermission") public void takeEmergencyCallAction() { mMetricsLogger.action(MetricsEvent.ACTION_EMERGENCY_CALL); if (mPowerManager != null) { @@ -136,29 +167,35 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { } mActivityTaskManager.stopSystemLockTaskMode(); mShadeController.collapseShade(false); - if (mTelecomManager != null && mTelecomManager.isInCall()) { - mTelecomManager.showInCallScreen(false); - if (mEmergencyButtonCallback != null) { - mEmergencyButtonCallback.onEmergencyButtonClickedWhenInCall(); - } - } else { - mKeyguardUpdateMonitor.reportEmergencyCallAction(true /* bypassHandler */); - if (mTelecomManager == null) { - Log.wtf(LOG_TAG, "TelecomManager was null, cannot launch emergency dialer"); - return; - } - Intent emergencyDialIntent = - mTelecomManager.createLaunchEmergencyDialerIntent(null /* number*/) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - | Intent.FLAG_ACTIVITY_CLEAR_TOP) - .putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE, - EmergencyDialerConstants.ENTRY_TYPE_LOCKSCREEN_BUTTON); - - getContext().startActivityAsUser(emergencyDialIntent, - ActivityOptions.makeCustomAnimation(getContext(), 0, 0).toBundle(), - new UserHandle(KeyguardUpdateMonitor.getCurrentUser())); - } + // Run in bg thread to avoid throttling the main thread with binder call. + mBackgroundExecutor.execute(() -> { + boolean isInCall = mTelecomManager != null && mTelecomManager.isInCall(); + mMainExecutor.execute(() -> { + if (isInCall) { + mTelecomManager.showInCallScreen(false); + if (mEmergencyButtonCallback != null) { + mEmergencyButtonCallback.onEmergencyButtonClickedWhenInCall(); + } + } else { + mKeyguardUpdateMonitor.reportEmergencyCallAction(true /* bypassHandler */); + if (mTelecomManager == null) { + Log.wtf(LOG_TAG, "TelecomManager was null, cannot launch emergency dialer"); + return; + } + Intent emergencyDialIntent = + mTelecomManager.createLaunchEmergencyDialerIntent(null /* number*/) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + | Intent.FLAG_ACTIVITY_CLEAR_TOP) + .putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE, + EmergencyDialerConstants.ENTRY_TYPE_LOCKSCREEN_BUTTON); + + getContext().startActivityAsUser(emergencyDialIntent, + ActivityOptions.makeCustomAnimation(getContext(), 0, 0).toBundle(), + new UserHandle(KeyguardUpdateMonitor.getCurrentUser())); + } + }); + }); } /** */ @@ -178,13 +215,19 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { @Nullable private final TelecomManager mTelecomManager; private final MetricsLogger mMetricsLogger; + private final LockPatternUtils mLockPatternUtils; + private final Executor mMainExecutor; + private final Executor mBackgroundExecutor; @Inject public Factory(ConfigurationController configurationController, KeyguardUpdateMonitor keyguardUpdateMonitor, TelephonyManager telephonyManager, PowerManager powerManager, ActivityTaskManager activityTaskManager, ShadeController shadeController, - @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger) { + @Nullable TelecomManager telecomManager, MetricsLogger metricsLogger, + LockPatternUtils lockPatternUtils, + @Main Executor mainExecutor, + @Background Executor backgroundExecutor) { mConfigurationController = configurationController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; @@ -194,14 +237,17 @@ public class EmergencyButtonController extends ViewController<EmergencyButton> { mShadeController = shadeController; mTelecomManager = telecomManager; mMetricsLogger = metricsLogger; + mLockPatternUtils = lockPatternUtils; + mMainExecutor = mainExecutor; + mBackgroundExecutor = backgroundExecutor; } /** Construct an {@link com.android.keyguard.EmergencyButtonController}. */ public EmergencyButtonController create(EmergencyButton view) { return new EmergencyButtonController(view, mConfigurationController, mKeyguardUpdateMonitor, mTelephonyManager, mPowerManager, mActivityTaskManager, - mShadeController, - mTelecomManager, mMetricsLogger); + mShadeController, mTelecomManager, mMetricsLogger, mLockPatternUtils, + mMainExecutor, mBackgroundExecutor); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index eec788b7add8..f164e7d33642 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -492,12 +492,14 @@ public class KeyguardSecurityContainer extends ConstraintLayout { case MotionEvent.ACTION_MOVE: mVelocityTracker.addMovement(event); int pointerIndex = event.findPointerIndex(mActivePointerId); - float y = event.getY(pointerIndex); - if (mLastTouchY != -1) { - float dy = y - mLastTouchY; - setTranslationY(getTranslationY() + dy * TOUCH_Y_MULTIPLIER); + if (pointerIndex != -1) { + float y = event.getY(pointerIndex); + if (mLastTouchY != -1) { + float dy = y - mLastTouchY; + setTranslationY(getTranslationY() + dy * TOUCH_Y_MULTIPLIER); + } + mLastTouchY = y; } - mLastTouchY = y; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 92cbb296f270..b8bb2603fa03 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -17,7 +17,6 @@ package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; -import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_BIOMETRIC; import static com.android.keyguard.KeyguardSecurityContainer.BOUNCER_DISMISS_EXTENDED_ACCESS; @@ -36,7 +35,6 @@ import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; import android.hardware.biometrics.BiometricOverlayConstants; -import android.hardware.biometrics.BiometricSourceType; import android.media.AudioManager; import android.metrics.LogMaker; import android.os.SystemClock; @@ -320,7 +318,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard KeyguardSecurityContainerController.this.onDensityOrFontScaleChanged(); } }; - private boolean mBouncerVisible = false; private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -355,19 +352,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard public void onDevicePolicyManagerStateChanged() { showPrimarySecurityScreen(false); } - - @Override - public void onBiometricRunningStateChanged(boolean running, - BiometricSourceType biometricSourceType) { - if (biometricSourceType == FINGERPRINT) { - updateSideFpsVisibility(); - } - } - - @Override - public void onStrongAuthStateChanged(int userId) { - updateSideFpsVisibility(); - } }; @Inject @@ -459,35 +443,24 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard getCurrentSecurityController().onPause(); } mView.onPause(); - // It might happen that onStartingToHide is not called when the device is locked while on - // bouncer. - setBouncerVisible(false); mView.clearFocus(); } - private void updateSideFpsVisibility() { + /** + * Shows and hides the side finger print sensor animation. + * + * @param isVisible sets whether we show or hide the side fps animation + */ + public void updateSideFpsVisibility(boolean isVisible) { if (!mSideFpsController.isPresent()) { return; } - final boolean sfpsEnabled = getResources().getBoolean( - R.bool.config_show_sidefps_hint_on_bouncer); - final boolean fpsDetectionRunning = mUpdateMonitor.isFingerprintDetectionRunning(); - final boolean isUnlockingWithFpAllowed = - mUpdateMonitor.isUnlockingWithFingerprintAllowed(); - boolean toShow = mBouncerVisible && sfpsEnabled && fpsDetectionRunning - && isUnlockingWithFpAllowed; - - if (DEBUG) { - Log.d(TAG, "sideFpsToShow=" + toShow + ", " - + "mBouncerVisible=" + mBouncerVisible + ", " - + "configEnabled=" + sfpsEnabled + ", " - + "fpsDetectionRunning=" + fpsDetectionRunning + ", " - + "isUnlockingWithFpAllowed=" + isUnlockingWithFpAllowed); - } - if (toShow) { - mSideFpsController.get().show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); + if (isVisible) { + mSideFpsController.get().show( + SideFpsUiRequestSource.PRIMARY_BOUNCER, + BiometricOverlayConstants.REASON_AUTH_KEYGUARD + ); } else { mSideFpsController.get().hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); } @@ -636,7 +609,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED, state); getCurrentSecurityController().onResume(reason); - updateSideFpsVisibility(); } mView.onResume( mSecurityModel.getSecurityMode(KeyguardUpdateMonitor.getCurrentUser()), @@ -690,22 +662,15 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard if (mCurrentSecurityMode != SecurityMode.None) { getCurrentSecurityController().onStartingToHide(); } - setBouncerVisible(false); } /** Called when the bouncer changes visibility. */ - public void onBouncerVisibilityChanged(@View.Visibility int visibility) { - setBouncerVisible(visibility == View.VISIBLE); - if (visibility == View.INVISIBLE) { + public void onBouncerVisibilityChanged(boolean isVisible) { + if (!isVisible) { mView.resetScale(); } } - private void setBouncerVisible(boolean visible) { - mBouncerVisible = visible; - updateSideFpsVisibility(); - } - /** * Shows the next security screen if there is one. * @param authenticated true if the user entered the correct authentication diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index b53b868025e8..f4c581552bc4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -21,8 +21,6 @@ import android.util.Slog; import com.android.keyguard.KeyguardClockSwitch.ClockSize; import com.android.keyguard.logging.KeyguardLogger; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; @@ -62,7 +60,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV KeyguardUpdateMonitor keyguardUpdateMonitor, ConfigurationController configurationController, DozeParameters dozeParameters, - FeatureFlags featureFlags, ScreenOffAnimationController screenOffAnimationController, KeyguardLogger logger) { super(keyguardStatusView); @@ -73,8 +70,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView, keyguardStateController, dozeParameters, screenOffAnimationController, /* animateYPos= */ true, logger.getBuffer()); - mKeyguardVisibilityHelper.setOcclusionTransitionFlagEnabled( - featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION)); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 8e11a990a4dc..b2d4215b388a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -148,7 +148,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpsysTableLogger; import com.android.systemui.log.SessionTracker; -import com.android.systemui.plugins.Weather; +import com.android.systemui.plugins.WeatherData; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.TaskStackChangeListener; @@ -3286,12 +3286,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab /** * @param data the weather data (temp, conditions, unit) for weather clock to use */ - public void sendWeatherData(Weather data) { + public void sendWeatherData(WeatherData data) { mHandler.post(()-> { handleWeatherDataUpdate(data); }); } - private void handleWeatherDataUpdate(Weather data) { + private void handleWeatherDataUpdate(WeatherData data) { Assert.isMainThread(); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 0da799e0964d..38f3e5065eec 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -23,7 +23,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settingslib.fuelgauge.BatteryStatus; -import com.android.systemui.plugins.Weather; +import com.android.systemui.plugins.WeatherData; import com.android.systemui.statusbar.KeyguardIndicationController; import java.util.TimeZone; @@ -61,7 +61,7 @@ public class KeyguardUpdateMonitorCallback { /** * Called when receive new weather data. */ - public void onWeatherDataChanged(Weather data) { } + public void onWeatherDataChanged(WeatherData data) { } /** * Called when the carrier PLMN or SPN changes. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java index 7e48193bfc62..a678edc0eb06 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java @@ -28,7 +28,6 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; -import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -49,7 +48,6 @@ public class KeyguardVisibilityHelper { private boolean mAnimateYPos; private boolean mKeyguardViewVisibilityAnimating; private boolean mLastOccludedState = false; - private boolean mIsUnoccludeTransitionFlagEnabled = false; private final AnimationProperties mAnimationProperties = new AnimationProperties(); private final LogBuffer mLogBuffer; @@ -77,10 +75,6 @@ public class KeyguardVisibilityHelper { return mKeyguardViewVisibilityAnimating; } - public void setOcclusionTransitionFlagEnabled(boolean enabled) { - mIsUnoccludeTransitionFlagEnabled = enabled; - } - /** * Set the visibility of a keyguard view based on some new state. */ @@ -156,24 +150,9 @@ public class KeyguardVisibilityHelper { // since it may need to be cancelled due to keyguard lifecycle events. mScreenOffAnimationController.animateInKeyguard( mView, mAnimateKeyguardStatusViewVisibleEndRunnable); - } else if (!mIsUnoccludeTransitionFlagEnabled && mLastOccludedState && !isOccluded) { - // An activity was displayed over the lock screen, and has now gone away - log("Unoccluded transition"); - mView.setVisibility(View.VISIBLE); - mView.setAlpha(0f); - - mView.animate() - .setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP) - .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .alpha(1f) - .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable) - .start(); } else { log("Direct set Visibility to VISIBLE"); mView.setVisibility(View.VISIBLE); - if (!mIsUnoccludeTransitionFlagEnabled) { - mView.setAlpha(1f); - } } } else { log("Direct set Visibility to GONE"); diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java index 0a4880e1ce66..3b0644eaab82 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java @@ -33,7 +33,6 @@ import android.widget.TextView; import androidx.annotation.Nullable; -import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -46,7 +45,6 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { private final TextView mDigitText; private final TextView mKlondikeText; - private final LockPatternUtils mLockPatternUtils; private final PowerManager mPM; private int mDigit = -1; @@ -107,7 +105,6 @@ public class NumPadKey extends ViewGroup implements NumPadAnimationListener { setOnHoverListener(new LiftToActivateListener( (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE))); - mLockPatternUtils = new LockPatternUtils(context); mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); diff --git a/packages/SystemUI/src/com/android/keyguard/mediator/ScreenOnCoordinator.kt b/packages/SystemUI/src/com/android/keyguard/mediator/ScreenOnCoordinator.kt index 0f00a040b094..603471b1de41 100644 --- a/packages/SystemUI/src/com/android/keyguard/mediator/ScreenOnCoordinator.kt +++ b/packages/SystemUI/src/com/android/keyguard/mediator/ScreenOnCoordinator.kt @@ -73,6 +73,10 @@ class ScreenOnCoordinator @Inject constructor( @BinderThread fun onScreenTurnedOn() { foldAodAnimationController?.onScreenTurnedOn() + } + + @BinderThread + fun onScreenTurnedOff() { pendingTasks.reset() } } diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 03d999f697d0..ce4253477a41 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -24,6 +24,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.annotation.IntDef; +import android.annotation.IntRange; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -195,7 +196,13 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { return false; } - void onBatteryLevelChanged(int level, boolean pluggedIn) { + /** + * Update battery level + * + * @param level int between 0 and 100 (representing percentage value) + * @param pluggedIn whether the device is plugged in or not + */ + public void onBatteryLevelChanged(@IntRange(from = 0, to = 100) int level, boolean pluggedIn) { mDrawable.setCharging(pluggedIn); mDrawable.setBatteryLevel(level); mCharging = pluggedIn; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt index 3ea3cd171062..709ddf5ce748 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt @@ -231,21 +231,29 @@ open class AuthBiometricFingerprintIconController( if (isReverseDefaultRotation) (rotation + 1) % 4 else rotation @RawRes - private fun getSideFpsAnimationForTransition(rotation: Int): Int = when (rotation) { - Surface.ROTATION_90 -> if (isDeviceFolded) { - R.raw.biometricprompt_folded_base_topleft - } else { - R.raw.biometricprompt_portrait_base_topleft - } - Surface.ROTATION_270 -> if (isDeviceFolded) { - R.raw.biometricprompt_folded_base_bottomright - } else { - R.raw.biometricprompt_portrait_base_bottomright - } - else -> if (isDeviceFolded) { - R.raw.biometricprompt_folded_base_default - } else { - R.raw.biometricprompt_landscape_base + private fun getSideFpsAnimationForTransition(rotation: Int): Int { + when (rotation) { + Surface.ROTATION_90 -> if (context.isInRearDisplayMode()) { + return R.raw.biometricprompt_rear_portrait_reverse_base + } else if (isDeviceFolded) { + return R.raw.biometricprompt_folded_base_topleft + } else { + return R.raw.biometricprompt_portrait_base_topleft + } + Surface.ROTATION_270 -> if (context.isInRearDisplayMode()) { + return R.raw.biometricprompt_rear_portrait_base + } else if (isDeviceFolded) { + return R.raw.biometricprompt_folded_base_bottomright + } else { + return R.raw.biometricprompt_portrait_base_bottomright + } + else -> if (context.isInRearDisplayMode()) { + return R.raw.biometricprompt_rear_landscape_base + } else if (isDeviceFolded) { + return R.raw.biometricprompt_folded_base_default + } else { + return R.raw.biometricprompt_landscape_base + } } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index e12c1706798e..a7b6e6ae6d40 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -658,6 +658,7 @@ public abstract class AuthBiometricView extends LinearLayout { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mIconController.onConfigurationChanged(newConfig); + updateState(mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_STATE)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index febf75e90a14..68e1f72d042a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -847,7 +847,7 @@ public class AuthContainerView extends LinearLayout final WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, + WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL, windowFlags, PixelFormat.TRANSLUCENT); lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt index 6c490780b79a..ac6a22c1474b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt @@ -172,12 +172,16 @@ constructor( override fun show( sensorId: Int, @BiometricOverlayConstants.ShowReason reason: Int - ) = - if (reason.isReasonToAutoShow(activityTaskManager)) { + ) { + if ( + reason.isReasonToAutoShow(activityTaskManager) && + !context.isInRearDisplayMode() + ) { show(SideFpsUiRequestSource.AUTO_SHOW, reason) } else { hide(SideFpsUiRequestSource.AUTO_SHOW) } + } override fun hide(sensorId: Int) = hide(SideFpsUiRequestSource.AUTO_SHOW) } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/Utils.kt b/packages/SystemUI/src/com/android/systemui/biometrics/Utils.kt index d0d6f4cbf166..3d563267ca74 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/Utils.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/Utils.kt @@ -36,6 +36,7 @@ import android.view.WindowManager import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityManager import com.android.internal.widget.LockPatternUtils +import com.android.systemui.R import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy @@ -117,4 +118,7 @@ object Utils { @Retention(RetentionPolicy.SOURCE) @IntDef(CREDENTIAL_PIN, CREDENTIAL_PATTERN, CREDENTIAL_PASSWORD) internal annotation class CredentialType -}
\ No newline at end of file +} + +fun Context.isInRearDisplayMode(): Boolean = resources.getIntArray( + com.android.internal.R.array.config_rearDisplayDeviceStates).isNotEmpty()
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java index 8e062bd69d63..653c12ef955e 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java @@ -46,11 +46,11 @@ public class BroadcastDialog extends SystemUIDialog { @VisibleForTesting protected View mDialogView; private MediaOutputDialogFactory mMediaOutputDialogFactory; - private String mSwitchBroadcastApp; + private String mCurrentBroadcastApp; private String mOutputPackageName; public BroadcastDialog(Context context, MediaOutputDialogFactory mediaOutputDialogFactory, - String switchBroadcastApp, String outputPkgName, UiEventLogger uiEventLogger) { + String currentBroadcastApp, String outputPkgName, UiEventLogger uiEventLogger) { super(context); if (DEBUG) { Log.d(TAG, "Init BroadcastDialog"); @@ -58,7 +58,7 @@ public class BroadcastDialog extends SystemUIDialog { mContext = getContext(); mMediaOutputDialogFactory = mediaOutputDialogFactory; - mSwitchBroadcastApp = switchBroadcastApp; + mCurrentBroadcastApp = currentBroadcastApp; mOutputPackageName = outputPkgName; mUiEventLogger = uiEventLogger; } @@ -77,20 +77,18 @@ public class BroadcastDialog extends SystemUIDialog { TextView title = mDialogView.requireViewById(R.id.dialog_title); TextView subTitle = mDialogView.requireViewById(R.id.dialog_subtitle); - title.setText( - mContext.getString(R.string.bt_le_audio_broadcast_dialog_title, - MediaDataUtils.getAppLabel(mContext, mOutputPackageName, - mContext.getString( - R.string.bt_le_audio_broadcast_dialog_unknown_name)))); - subTitle.setText( - mContext.getString(R.string.bt_le_audio_broadcast_dialog_sub_title, - mSwitchBroadcastApp)); + title.setText(mContext.getString( + R.string.bt_le_audio_broadcast_dialog_title, mCurrentBroadcastApp)); + String switchBroadcastApp = MediaDataUtils.getAppLabel(mContext, mOutputPackageName, + mContext.getString(R.string.bt_le_audio_broadcast_dialog_unknown_name)); + subTitle.setText(mContext.getString( + R.string.bt_le_audio_broadcast_dialog_sub_title, switchBroadcastApp)); Button switchBroadcast = mDialogView.requireViewById(R.id.switch_broadcast); Button changeOutput = mDialogView.requireViewById(R.id.change_output); Button cancelBtn = mDialogView.requireViewById(R.id.cancel); switchBroadcast.setText(mContext.getString( - R.string.bt_le_audio_broadcast_dialog_switch_app, mSwitchBroadcastApp), null); + R.string.bt_le_audio_broadcast_dialog_switch_app, switchBroadcastApp)); changeOutput.setOnClickListener((view) -> { mMediaOutputDialogFactory.create(mOutputPackageName, true, null); dismiss(); diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java index 8a54345ae28c..1b699e8ea5dd 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java @@ -47,10 +47,15 @@ public class BroadcastDialogController { mMediaOutputDialogFactory = mediaOutputDialogFactory; } - public void createBroadcastDialog(String switchAppName, String outputPkgName, + /** Creates a [BroadcastDialog] for the user to switch broadcast or change the output device + * + * @param currentBroadcastAppName Indicates the APP name currently broadcasting + * @param outputPkgName Indicates the output media package name to be switched + */ + public void createBroadcastDialog(String currentBroadcastAppName, String outputPkgName, boolean aboveStatusBar, View view) { BroadcastDialog broadcastDialog = new BroadcastDialog(mContext, mMediaOutputDialogFactory, - switchAppName, outputPkgName, mUiEventLogger); + currentBroadcastAppName, outputPkgName, mUiEventLogger); if (view != null) { mDialogLaunchAnimator.showFromView(broadcastDialog, view); } else { diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java index 826253947ce1..1833202d64d4 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java +++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java @@ -110,7 +110,7 @@ public class SeekBarWithIconButtonsView extends LinearLayout { mSeekbar.setOnSeekBarChangeListener(mSeekBarListener); - mIconStart.setOnClickListener((view) -> { + mIconStartFrame.setOnClickListener((view) -> { final int progress = mSeekbar.getProgress(); if (progress > 0) { mSeekbar.setProgress(progress - 1); @@ -118,7 +118,7 @@ public class SeekBarWithIconButtonsView extends LinearLayout { } }); - mIconEnd.setOnClickListener((view) -> { + mIconEndFrame.setOnClickListener((view) -> { final int progress = mSeekbar.getProgress(); if (progress < mSeekbar.getMax()) { mSeekbar.setProgress(progress + 1); diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt index 3a3f9b4e5265..bf0a69296dfd 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt @@ -68,7 +68,7 @@ class ControlsActivity @Inject constructor( getLifecycle().addObserver( ControlsAnimations.observerForAnimations( - requireViewById<ViewGroup>(R.id.control_detail_root), + requireViewById(R.id.control_detail_root), window, intent, !featureFlags.isEnabled(Flags.USE_APP_PANELS) @@ -95,7 +95,7 @@ class ControlsActivity @Inject constructor( override fun onStart() { super.onStart() - parent = requireViewById<ViewGroup>(R.id.global_actions_controls) + parent = requireViewById(R.id.control_detail_root) parent.alpha = 0f if (featureFlags.isEnabled(Flags.USE_APP_PANELS) && !keyguardStateController.isUnlocked) { controlsSettingsDialogManager.maybeShowDialog(this) { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 9405c602caf7..860601bfa290 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -546,8 +546,12 @@ class ControlsUiControllerImpl @Inject constructor ( RenderInfo.registerComponentIcon(it.componentName, it.icon) } - var adapter = ItemAdapter(context, R.layout.controls_spinner_item).apply { - addAll(items) + val adapter = ItemAdapter(context, R.layout.controls_spinner_item).apply { + add(selected) + addAll(items + .filter { it !== selected } + .sortedBy { it.appName.toString() } + ) } val iconSize = context.resources diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt index 3b6ab20e39d4..78e87cafc4f2 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/PanelTaskViewController.kt @@ -71,7 +71,7 @@ class PanelTaskViewController( taskView.post { val roundedCorner = activityContext.resources.getDimensionPixelSize( - R.dimen.notification_corner_radius + R.dimen.controls_panel_corner_radius ) val radii = FloatArray(8) { roundedCorner.toFloat() } taskView.background = diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index 03a1dc068d3d..378b7bb618f8 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule; +import com.android.systemui.statusbar.events.StatusBarEventsModule; import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider; import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager; import com.android.systemui.statusbar.phone.DozeServiceHost; @@ -101,6 +102,7 @@ import dagger.Provides; QSModule.class, ReferenceScreenshotModule.class, RotationLockModule.class, + StatusBarEventsModule.class, StartCentralSurfacesModule.class, VolumeModule.class }) diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 5b4ce065791d..f0ee44305b10 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -255,6 +255,11 @@ public abstract class SystemUIModule { @BindsOptionalOf abstract FingerprintInteractiveToAuthProvider optionalFingerprintInteractiveToAuthProvider(); + @BindsOptionalOf + //TODO(b/269430792 remove full qualifier. Full qualifier is used to avoid merge conflict.) + abstract com.android.systemui.statusbar.events.SystemStatusAnimationScheduler + optionalSystemStatusAnimationScheduler(); + @SysUISingleton @Binds abstract SystemClock bindSystemClock(SystemClockImpl systemClock); diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index 5aebc3268b90..9660aaeeceb2 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -195,7 +195,14 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ mDreamOverlayTouchMonitor.init(); mStateController.setShouldShowComplications(shouldShowComplications()); - addOverlayWindowLocked(layoutParams); + + // If we are not able to add the overlay window, reset the overlay. + if (!addOverlayWindowLocked(layoutParams)) { + resetCurrentDreamOverlayLocked(); + return; + } + + setCurrentStateLocked(Lifecycle.State.RESUMED); mStateController.setOverlayActive(true); final ComponentName dreamComponent = getDreamComponent(); @@ -241,7 +248,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ * @param layoutParams The {@link android.view.WindowManager.LayoutParams} which allow inserting * into the dream window. */ - private void addOverlayWindowLocked(WindowManager.LayoutParams layoutParams) { + private boolean addOverlayWindowLocked(WindowManager.LayoutParams layoutParams) { mWindow = new PhoneWindow(mContext); // Default to SystemUI name for TalkBack. mWindow.setTitle(""); @@ -266,9 +273,22 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ // risk an IllegalStateException in some cases when setting the container view as the // window's content view and the container view hasn't been properly removed previously). removeContainerViewFromParentLocked(); + mWindow.setContentView(mDreamOverlayContainerViewController.getContainerView()); - mWindowManager.addView(mWindow.getDecorView(), mWindow.getAttributes()); + // It is possible that a dream's window (and the dream as a whole) is no longer valid by + // the time the overlay service processes the dream. This can happen for example if + // another dream is started immediately after the existing dream begins. In this case, the + // overlay service should identify the situation through the thrown exception and tear down + // the overlay. + try { + mWindowManager.addView(mWindow.getDecorView(), mWindow.getAttributes()); + return true; + } catch (WindowManager.BadTokenException exception) { + Log.e(TAG, "Dream activity window invalid: " + layoutParams.packageName, + exception); + return false; + } } private void removeContainerViewFromParentLocked() { diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/SmartSpaceComplication.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/SmartSpaceComplication.java index e39073bb6711..ff1f31245570 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/SmartSpaceComplication.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/SmartSpaceComplication.java @@ -28,6 +28,8 @@ import android.widget.FrameLayout; import com.android.systemui.CoreStartable; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dreams.smartspace.DreamSmartspaceController; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -68,6 +70,7 @@ public class SmartSpaceComplication implements Complication { private final DreamSmartspaceController mSmartSpaceController; private final DreamOverlayStateController mDreamOverlayStateController; private final SmartSpaceComplication mComplication; + private final FeatureFlags mFeatureFlags; private final BcSmartspaceDataPlugin.SmartspaceTargetListener mSmartspaceListener = new BcSmartspaceDataPlugin.SmartspaceTargetListener() { @@ -85,15 +88,21 @@ public class SmartSpaceComplication implements Complication { DreamOverlayStateController dreamOverlayStateController, SmartSpaceComplication smartSpaceComplication, DreamSmartspaceController smartSpaceController, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @Named(DREAM_PRETEXT_MONITOR) Monitor monitor, + FeatureFlags featureFlags) { super(monitor); mDreamOverlayStateController = dreamOverlayStateController; mComplication = smartSpaceComplication; mSmartSpaceController = smartSpaceController; + mFeatureFlags = featureFlags; } @Override public void onStart() { + if (mFeatureFlags.isEnabled(Flags.HIDE_SMARTSPACE_ON_DREAM_OVERLAY)) { + return; + } + mDreamOverlayStateController.addCallback(new DreamOverlayStateController.Callback() { @Override public void onStateChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index 88c02b8aa790..13563dfd03f0 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -29,7 +29,7 @@ import com.android.systemui.dreams.DreamOverlayNotificationCountProvider; import com.android.systemui.dreams.DreamOverlayService; import com.android.systemui.dreams.complication.dagger.RegisteredComplicationsModule; import com.android.systemui.dreams.touch.scrim.dagger.ScrimModule; -import com.android.systemui.process.condition.UserProcessCondition; +import com.android.systemui.process.condition.SystemProcessCondition; import com.android.systemui.shared.condition.Condition; import com.android.systemui.shared.condition.Monitor; @@ -126,7 +126,7 @@ public interface DreamModule { @Binds @IntoSet @Named(DREAM_PRETEXT_CONDITIONS) - Condition bindsUserProcessCondition(UserProcessCondition condition); + Condition bindSystemProcessCondition(SystemProcessCondition condition); /** */ @Provides diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/scrim/BouncerScrimController.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/scrim/BouncerScrimController.java index f5bbba780b27..776b7bd080d0 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/scrim/BouncerScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/scrim/BouncerScrimController.java @@ -34,7 +34,7 @@ public class BouncerScrimController implements ScrimController { @Override public void show() { - mStatusBarKeyguardViewManager.showBouncer(false); + mStatusBarKeyguardViewManager.showPrimaryBouncer(false); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 6bc1eddf26f7..4fb763ff6038 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -62,7 +62,7 @@ object Flags { val FSI_REQUIRES_KEYGUARD = releasedFlag(110, "fsi_requires_keyguard") // TODO(b/259130119): Tracking Bug - val FSI_ON_DND_UPDATE = unreleasedFlag(259130119, "fsi_on_dnd_update", teamfood = true) + val FSI_ON_DND_UPDATE = releasedFlag(259130119, "fsi_on_dnd_update") // TODO(b/265804648): Tracking Bug @JvmField val DISABLE_FSI = unreleasedFlag(265804648, "disable_fsi") @@ -189,10 +189,6 @@ object Flags { @JvmField val REVAMPED_WALLPAPER_UI = unreleasedFlag(222, "revamped_wallpaper_ui", teamfood = true) - /** A different path for unocclusion transitions back to keyguard */ - // TODO(b/262859270): Tracking Bug - @JvmField val UNOCCLUSION_TRANSITION = releasedFlag(223, "unocclusion_transition") - // flag for controlling auto pin confirmation and material u shapes in bouncer @JvmField val AUTO_PIN_CONFIRMATION = @@ -235,10 +231,12 @@ object Flags { val SMARTSPACE_DATE_WEATHER_DECOUPLED = sysPropBooleanFlag(403, "persist.sysui.ss.dw_decoupled", default = false) + // TODO(b/270223352): Tracking Bug + @JvmField + val HIDE_SMARTSPACE_ON_DREAM_OVERLAY = unreleasedFlag(404, "hide_smartspace_on_dream_overlay") + // 500 - quick settings - // TODO(b/254512321): Tracking Bug - @JvmField val COMBINED_QS_HEADERS = releasedFlag(501, "combined_qs_headers") val PEOPLE_TILE = resourceBooleanFlag(502, R.bool.flag_conversations, "people_tile") @JvmField @@ -249,6 +247,9 @@ object Flags { "qs_user_detail_shortcut" ) + @JvmField + val QS_PIPELINE_NEW_HOST = unreleasedFlag(504, "qs_pipeline_new_host", teamfood = false) + // TODO(b/254512383): Tracking Bug @JvmField val FULL_SCREEN_USER_SWITCHER = @@ -268,6 +269,12 @@ object Flags { @JvmField val ENABLE_FONT_SCALING_TILE = unreleasedFlag(509, "enable_font_scaling_tile", teamfood = false) + /** Enables new QS Edit Mode visual refresh */ + // TODO(b/269787742): Tracking Bug + @JvmField + val ENABLE_NEW_QS_EDIT_MODE = + unreleasedFlag(510, "enable_new_qs_edit_mode", teamfood = false) + // 600- status bar // TODO(b/256614753): Tracking Bug @@ -294,6 +301,9 @@ object Flags { val NEW_STATUS_BAR_ICONS_DEBUG_COLORING = unreleasedFlag(611, "new_status_bar_icons_debug_coloring") + // TODO(b/265892345): Tracking Bug + val PLUG_IN_STATUS_BAR_CHIP = unreleasedFlag(265892345, "plug_in_status_bar_chip") + // 700 - dialer/calls // TODO(b/254512734): Tracking Bug val ONGOING_CALL_STATUS_BAR_CHIP = releasedFlag(700, "ongoing_call_status_bar_chip") @@ -367,6 +377,9 @@ object Flags { // TODO(b/267166152) : Tracking Bug val MEDIA_RETAIN_RECOMMENDATIONS = unreleasedFlag(916, "media_retain_recommendations") + // TODO(b/270437894): Tracking Bug + val MEDIA_REMOTE_RESUME = unreleasedFlag(917, "media_remote_resume") + // 1000 - dock val SIMULATE_DOCK_THROUGH_CHARGING = releasedFlag(1000, "simulate_dock_through_charging") diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardModule.kt b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardModule.kt index e9b8908214fc..496c64e1120e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardModule.kt @@ -17,6 +17,14 @@ package com.android.systemui.keyboard +import com.android.systemui.keyboard.data.repository.KeyboardRepository +import com.android.systemui.keyboard.data.repository.KeyboardRepositoryImpl +import dagger.Binds import dagger.Module -@Module abstract class KeyboardModule +@Module +abstract class KeyboardModule { + + @Binds + abstract fun bindKeyboardRepository(repository: KeyboardRepositoryImpl): KeyboardRepository +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/data/model/BacklightModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/data/model/BacklightModel.kt new file mode 100644 index 000000000000..ea15a9f18584 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/data/model/BacklightModel.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.systemui.keyboard.data.model + +/** + * Model for current state of keyboard backlight brightness. [level] indicates current level of + * backlight brightness and [maxLevel] its max possible value. + */ +data class BacklightModel(val level: Int, val maxLevel: Int) diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt new file mode 100644 index 000000000000..70faf406d621 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.systemui.keyboard.data.repository + +import android.hardware.input.InputManager +import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.keyboard.data.model.BacklightModel +import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.shareIn + +interface KeyboardRepository { + val keyboardConnected: Flow<Boolean> + val backlight: Flow<BacklightModel> +} + +@SysUISingleton +class KeyboardRepositoryImpl +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + @Background private val backgroundDispatcher: CoroutineDispatcher, + private val inputManager: InputManager, +) : KeyboardRepository { + + private val connectedDeviceIds: Flow<Set<Int>> = + conflatedCallbackFlow { + fun send(element: Set<Int>) = trySendWithFailureLogging(element, TAG) + + var connectedKeyboards = inputManager.inputDeviceIds.toSet() + val listener = + object : InputManager.InputDeviceListener { + override fun onInputDeviceAdded(deviceId: Int) { + connectedKeyboards = connectedKeyboards + deviceId + send(connectedKeyboards) + } + + override fun onInputDeviceChanged(deviceId: Int) = Unit + + override fun onInputDeviceRemoved(deviceId: Int) { + connectedKeyboards = connectedKeyboards - deviceId + send(connectedKeyboards) + } + } + send(connectedKeyboards) + inputManager.registerInputDeviceListener(listener, /* handler= */ null) + awaitClose { inputManager.unregisterInputDeviceListener(listener) } + } + .shareIn( + scope = applicationScope, + started = SharingStarted.Lazily, + replay = 1, + ) + + override val keyboardConnected: Flow<Boolean> = + connectedDeviceIds + .map { it.any { deviceId -> isPhysicalFullKeyboard(deviceId) } } + .distinctUntilChanged() + .flowOn(backgroundDispatcher) + + override val backlight: Flow<BacklightModel> = + conflatedCallbackFlow { + // TODO(b/268645734) register BacklightListener + } + + private fun isPhysicalFullKeyboard(deviceId: Int): Boolean { + val device = inputManager.getInputDevice(deviceId) + return !device.isVirtual && device.isFullKeyboard + } + + companion object { + const val TAG = "KeyboardRepositoryImpl" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 47872d2d68bb..4d40db0a0cfd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -638,6 +638,7 @@ public class KeyguardService extends Service { checkPermission(); mKeyguardViewMediator.onScreenTurnedOff(); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_OFF); + mScreenOnCoordinator.onScreenTurnedOff(); } @Override // Binder interface diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 6db1f8959e8a..d914bf5d8d9a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -58,6 +58,7 @@ import android.hardware.biometrics.BiometricSourceType; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.SoundPool; +import android.os.Binder; import android.os.Bundle; import android.os.DeadObjectException; import android.os.Handler; @@ -66,6 +67,7 @@ import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; @@ -101,6 +103,7 @@ import com.android.internal.policy.IKeyguardDismissCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardStateCallback; import com.android.internal.policy.ScreenDecorationsUtils; +import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardConstants; @@ -123,8 +126,6 @@ import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.dagger.KeyguardModule; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -269,6 +270,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; + private final IStatusBarService mStatusBarService; + private final IBinder mStatusBarDisableToken = new Binder(); private final UserTracker mUserTracker; private final SysuiStatusBarStateController mStatusBarStateController; private final Executor mUiBgExecutor; @@ -510,8 +513,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private CentralSurfaces mCentralSurfaces; - private boolean mUnocclusionTransitionFlagEnabled = false; - private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = new DeviceConfig.OnPropertiesChangedListener() { @Override @@ -963,9 +964,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, public void onAnimationStart(int transit, RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException { - if (!mUnocclusionTransitionFlagEnabled) { - setOccluded(true /* isOccluded */, true /* animate */); - } if (apps == null || apps.length == 0 || apps[0] == null) { if (DEBUG) { Log.d(TAG, "No apps provided to the OccludeByDream runner; " @@ -1016,7 +1014,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void onAnimationEnd(Animator animation) { try { - if (!mIsCancelled && mUnocclusionTransitionFlagEnabled) { + if (!mIsCancelled) { // We're already on the main thread, don't queue this call handleSetOccluded(true /* isOccluded */, false /* animate */); @@ -1193,7 +1191,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, ScreenOnCoordinator screenOnCoordinator, InteractionJankMonitor interactionJankMonitor, DreamOverlayStateController dreamOverlayStateController, - FeatureFlags featureFlags, Lazy<ShadeController> shadeControllerLazy, Lazy<NotificationShadeWindowController> notificationShadeWindowControllerLazy, Lazy<ActivityLaunchAnimator> activityLaunchAnimator, @@ -1211,6 +1208,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mPM = powerManager; mTrustManager = trustManager; mUserSwitcherController = userSwitcherController; + mStatusBarService = IStatusBarService.Stub.asInterface( + ServiceManager.getService(Context.STATUS_BAR_SERVICE)); mKeyguardDisplayManager = keyguardDisplayManager; mShadeController = shadeControllerLazy; dumpManager.registerDumpable(getClass().getName(), this); @@ -1250,7 +1249,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mDreamOpenAnimationDuration = (int) DREAMING_ANIMATION_DURATION_MS; mDreamCloseAnimationDuration = (int) LOCKSCREEN_ANIMATION_DURATION_MS; - mUnocclusionTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION); } public void userActivity() { @@ -2931,7 +2929,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, // TODO (b/155663717) After restart, status bar will not properly hide home button // unless disable is called to show un-hide it once first if (forceClearFlags) { - mStatusBarManager.disable(flags); + try { + mStatusBarService.disableForUser(flags, mStatusBarDisableToken, + mContext.getPackageName(), mUserTracker.getUserId()); + } catch (RemoteException e) { + Log.d(TAG, "Failed to force clear flags", e); + } } if (forceHideHomeRecentsButtons || isShowingAndNotOccluded()) { @@ -2947,7 +2950,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, + " --> flags=0x" + Integer.toHexString(flags)); } - mStatusBarManager.disable(flags); + try { + mStatusBarService.disableForUser(flags, mStatusBarDisableToken, + mContext.getPackageName(), mUserTracker.getUserId()); + } catch (RemoteException e) { + Log.d(TAG, "Failed to set disable flags: " + flags, e); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index 98d3570106ce..47ef0fac17ab 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -39,7 +39,6 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -113,7 +112,6 @@ public class KeyguardModule { ScreenOnCoordinator screenOnCoordinator, InteractionJankMonitor interactionJankMonitor, DreamOverlayStateController dreamOverlayStateController, - FeatureFlags featureFlags, Lazy<ShadeController> shadeController, Lazy<NotificationShadeWindowController> notificationShadeWindowController, Lazy<ActivityLaunchAnimator> activityLaunchAnimator, @@ -144,7 +142,6 @@ public class KeyguardModule { screenOnCoordinator, interactionJankMonitor, dreamOverlayStateController, - featureFlags, shadeController, notificationShadeWindowController, activityLaunchAnimator, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt index 4331fe66a0dc..0e85347c24b0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt @@ -60,7 +60,6 @@ interface KeyguardBouncerRepository { */ val panelExpansionAmount: StateFlow<Float> val keyguardPosition: StateFlow<Float> - val onScreenTurnedOff: StateFlow<Boolean> val isBackButtonEnabled: StateFlow<Boolean?> /** Determines if user is already unlocked */ val keyguardAuthenticated: StateFlow<Boolean?> @@ -70,6 +69,8 @@ interface KeyguardBouncerRepository { val bouncerErrorMessage: CharSequence? val alternateBouncerVisible: StateFlow<Boolean> val alternateBouncerUIAvailable: StateFlow<Boolean> + val sideFpsShowing: StateFlow<Boolean> + var lastAlternateBouncerVisibleTime: Long fun setPrimaryScrimmed(isScrimmed: Boolean) @@ -98,11 +99,11 @@ interface KeyguardBouncerRepository { fun setIsBackButtonEnabled(isBackButtonEnabled: Boolean) - fun setOnScreenTurnedOff(onScreenTurnedOff: Boolean) - fun setAlternateVisible(isVisible: Boolean) fun setAlternateBouncerUIAvailable(isAvailable: Boolean) + + fun setSideFpsShowing(isShowing: Boolean) } @SysUISingleton @@ -142,8 +143,6 @@ constructor( override val panelExpansionAmount = _panelExpansionAmount.asStateFlow() private val _keyguardPosition = MutableStateFlow(0f) override val keyguardPosition = _keyguardPosition.asStateFlow() - private val _onScreenTurnedOff = MutableStateFlow(false) - override val onScreenTurnedOff = _onScreenTurnedOff.asStateFlow() private val _isBackButtonEnabled = MutableStateFlow<Boolean?>(null) override val isBackButtonEnabled = _isBackButtonEnabled.asStateFlow() private val _keyguardAuthenticated = MutableStateFlow<Boolean?>(null) @@ -165,6 +164,8 @@ constructor( private val _alternateBouncerUIAvailable = MutableStateFlow(false) override val alternateBouncerUIAvailable: StateFlow<Boolean> = _alternateBouncerUIAvailable.asStateFlow() + private val _sideFpsShowing = MutableStateFlow(false) + override val sideFpsShowing: StateFlow<Boolean> = _sideFpsShowing.asStateFlow() init { setUpLogging() @@ -235,8 +236,8 @@ constructor( _isBackButtonEnabled.value = isBackButtonEnabled } - override fun setOnScreenTurnedOff(onScreenTurnedOff: Boolean) { - _onScreenTurnedOff.value = onScreenTurnedOff + override fun setSideFpsShowing(isShowing: Boolean) { + _sideFpsShowing.value = isShowing } /** Sets up logs for state flows. */ @@ -276,9 +277,6 @@ constructor( .map { it.toInt() } .logDiffsForTable(buffer, "", "KeyguardPosition", -1) .launchIn(applicationScope) - onScreenTurnedOff - .logDiffsForTable(buffer, "", "OnScreenTurnedOff", false) - .launchIn(applicationScope) isBackButtonEnabled .filterNotNull() .logDiffsForTable(buffer, "", "IsBackButtonEnabled", false) @@ -293,6 +291,9 @@ constructor( alternateBouncerUIAvailable .logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false) .launchIn(applicationScope) + sideFpsShowing + .logDiffsForTable(buffer, "", "isSideFpsShowing", false) + .launchIn(applicationScope) } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt index dfe10381720c..014052956d2f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt @@ -24,6 +24,7 @@ import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.LegacyAlternateBouncer +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.time.SystemClock import javax.inject.Inject import kotlinx.coroutines.flow.Flow @@ -33,6 +34,7 @@ import kotlinx.coroutines.flow.Flow class AlternateBouncerInteractor @Inject constructor( + private val keyguardStateController: KeyguardStateController, private val bouncerRepository: KeyguardBouncerRepository, private val biometricSettingsRepository: BiometricSettingsRepository, private val deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository, @@ -102,7 +104,8 @@ constructor( biometricSettingsRepository.isFingerprintEnrolled.value && biometricSettingsRepository.isStrongBiometricAllowed.value && biometricSettingsRepository.isFingerprintEnabledByDevicePolicy.value && - !deviceEntryFingerprintAuthRepository.isLockedOut.value + !deviceEntryFingerprintAuthRepository.isLockedOut.value && + !keyguardStateController.isUnlocked } else { legacyAlternateBouncer != null && keyguardUpdateMonitor.isUnlockingWithBiometricAllowed(true) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt index 6610983a6ff6..c709fd18298c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractor.kt @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.domain.interactor +import android.content.Context import android.content.res.ColorStateList import android.hardware.biometrics.BiometricSourceType import android.os.Handler @@ -23,9 +24,13 @@ import android.os.Trace import android.os.UserHandle import android.os.UserManager import android.view.View +import android.util.Log +import com.android.keyguard.KeyguardConstants import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.DejankUtils +import com.android.systemui.R import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main @@ -62,8 +67,9 @@ constructor( private val primaryBouncerCallbackInteractor: PrimaryBouncerCallbackInteractor, private val falsingCollector: FalsingCollector, private val dismissCallbackRegistry: DismissCallbackRegistry, + private val context: Context, + private val keyguardUpdateMonitor: KeyguardUpdateMonitor, keyguardBypassController: KeyguardBypassController, - keyguardUpdateMonitor: KeyguardUpdateMonitor, ) { /** Whether we want to wait for face auth. */ private val primaryBouncerFaceDelay = @@ -90,7 +96,6 @@ constructor( } val keyguardAuthenticated: Flow<Boolean> = repository.keyguardAuthenticated.filterNotNull() - val screenTurnedOff: Flow<Unit> = repository.onScreenTurnedOff.filter { it }.map {} val show: Flow<KeyguardBouncerModel> = repository.primaryBouncerShow.filterNotNull() val hide: Flow<Unit> = repository.primaryBouncerHide.filter { it }.map {} val startingToHide: Flow<Unit> = repository.primaryBouncerStartingToHide.filter { it }.map {} @@ -115,6 +120,24 @@ constructor( } /** Allow for interaction when just about fully visible */ val isInteractable: Flow<Boolean> = bouncerExpansion.map { it > 0.9 } + val sideFpsShowing: Flow<Boolean> = repository.sideFpsShowing + + init { + keyguardUpdateMonitor.registerCallback( + object : KeyguardUpdateMonitorCallback() { + override fun onBiometricRunningStateChanged( + running: Boolean, + biometricSourceType: BiometricSourceType? + ) { + updateSideFpsVisibility() + } + + override fun onStrongAuthStateChanged(userId: Int) { + updateSideFpsVisibility() + } + } + ) + } // TODO(b/243685699): Move isScrimmed logic to data layer. // TODO(b/243695312): Encapsulate all of the show logic for the bouncer. @@ -122,7 +145,6 @@ constructor( @JvmOverloads fun show(isScrimmed: Boolean) { // Reset some states as we show the bouncer. - repository.setOnScreenTurnedOff(false) repository.setKeyguardAuthenticated(null) repository.setPrimaryHide(false) repository.setPrimaryStartingToHide(false) @@ -262,11 +284,6 @@ constructor( repository.setKeyguardAuthenticated(strongAuth) } - /** Tell the bouncer the screen has turned off. */ - fun onScreenTurnedOff() { - repository.setOnScreenTurnedOff(true) - } - /** Update the position of the bouncer when showing. */ fun setKeyguardPosition(position: Float) { repository.setKeyguardPosition(position) @@ -301,6 +318,35 @@ constructor( repository.setPrimaryStartDisappearAnimation(finishRunnable) } + /** Determine whether to show the side fps animation. */ + fun updateSideFpsVisibility() { + val sfpsEnabled: Boolean = + context.resources.getBoolean(R.bool.config_show_sidefps_hint_on_bouncer) + val fpsDetectionRunning: Boolean = keyguardUpdateMonitor.isFingerprintDetectionRunning + val isUnlockingWithFpAllowed: Boolean = + keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed + val bouncerVisible = repository.primaryBouncerVisible.value + val toShow = + (repository.primaryBouncerVisible.value && + sfpsEnabled && + fpsDetectionRunning && + isUnlockingWithFpAllowed && + !isAnimatingAway()) + + if (KeyguardConstants.DEBUG) { + Log.d( + TAG, + ("sideFpsToShow=$toShow\n" + + "bouncerVisible=$bouncerVisible\n" + + "configEnabled=$sfpsEnabled\n" + + "fpsDetectionRunning=$fpsDetectionRunning\n" + + "isUnlockingWithFpAllowed=$isUnlockingWithFpAllowed\n" + + "isAnimatingAway=${isAnimatingAway()}") + ) + } + repository.setSideFpsShowing(toShow) + } + /** Returns whether bouncer is fully showing. */ fun isFullyShowing(): Boolean { return (repository.primaryBouncerShowingSoon.value || @@ -344,4 +390,8 @@ constructor( DejankUtils.removeCallbacks(showRunnable) mainHandler.removeCallbacks(showRunnable) } + + companion object { + private const val TAG = "PrimaryBouncerInteractor" + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt index 56f911f8b1da..7db567b2a0e9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBouncerViewBinder.kt @@ -34,6 +34,7 @@ import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.ActivityStarter import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch @@ -121,7 +122,6 @@ object KeyguardBouncerViewBinder { launch { viewModel.hide.collect { securityContainerController.cancelDismissAction() - securityContainerController.onPause() securityContainerController.reset() } } @@ -155,13 +155,18 @@ object KeyguardBouncerViewBinder { launch { viewModel.isBouncerVisible.collect { isVisible -> - val visibility = if (isVisible) View.VISIBLE else View.INVISIBLE - view.visibility = visibility - securityContainerController.onBouncerVisibilityChanged(visibility) + view.visibility = if (isVisible) View.VISIBLE else View.INVISIBLE + securityContainerController.onBouncerVisibilityChanged(isVisible) } } launch { + viewModel.isBouncerVisible + .filter { !it } + .collect { securityContainerController.onPause() } + } + + launch { viewModel.isInteractable.collect { isInteractable -> securityContainerController.setInteractable(isInteractable) } @@ -204,10 +209,14 @@ object KeyguardBouncerViewBinder { } launch { - viewModel.screenTurnedOff.collect { - if (view.visibility == View.VISIBLE) { - securityContainerController.onPause() - } + viewModel.shouldUpdateSideFps.collect { + viewModel.updateSideFpsVisibility() + } + } + + launch { + viewModel.sideFpsShowing.collect { + securityContainerController.updateSideFpsVisibility(it) } } awaitCancellation() diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt index b8b3a8e5db20..97e94d8f3232 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModel.kt @@ -24,7 +24,9 @@ import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge /** Models UI state for the lock screen bouncer; handles user input. */ class KeyguardBouncerViewModel @@ -66,8 +68,16 @@ constructor( /** Observe whether keyguard is authenticated already. */ val keyguardAuthenticated: Flow<Boolean> = interactor.keyguardAuthenticated - /** Observe whether screen is turned off. */ - val screenTurnedOff: Flow<Unit> = interactor.screenTurnedOff + /** Observe whether the side fps is showing. */ + val sideFpsShowing: Flow<Boolean> = interactor.sideFpsShowing + + /** Observe whether we should update fps is showing. */ + val shouldUpdateSideFps: Flow<Unit> = + merge( + interactor.startingToHide, + interactor.isVisible.map {}, + interactor.startingDisappearAnimation.filterNotNull().map {} + ) /** Observe whether we want to update resources. */ fun notifyUpdateResources() { @@ -84,6 +94,10 @@ constructor( interactor.onMessageShown() } + fun updateSideFpsVisibility() { + interactor.updateSideFpsVisibility() + } + /** Observe whether back button is enabled. */ fun observeOnIsBackButtonEnabled(systemUiVisibility: () -> Int): Flow<Int> { return interactor.isBackButtonEnabled.map { enabled -> diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index 817de7976352..642c9f73f625 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -62,6 +62,15 @@ public class LogModule { return factory.create("NotifLog", maxSize, false /* systrace */); } + /** Provides a logging buffer for all logs related to notifications on the lockscreen. */ + @Provides + @SysUISingleton + @NotificationLockscreenLog + public static LogBuffer provideNotificationLockScreenLogBuffer( + LogBufferFactory factory) { + return factory.create("NotifLockscreenLog", 50, false /* systrace */); + } + /** Provides a logging buffer for logs related to heads up presentation of notifications. */ @Provides @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java new file mode 100644 index 000000000000..a2d381ec90f0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.log.dagger; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import com.android.systemui.plugins.log.LogBuffer; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Qualifier; + +/** A {@link LogBuffer} for notification & lockscreen related messages. */ +@Qualifier +@Documented +@Retention(RUNTIME) +public @interface NotificationLockscreenLog { +} diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt index f5558a240a70..e70a2f3ed446 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt @@ -665,7 +665,7 @@ class MediaDataManager( appIntent: PendingIntent, packageName: String ) { - if (TextUtils.isEmpty(desc.title)) { + if (desc.title.isNullOrBlank()) { Log.e(TAG, "Description incomplete") // Delete the placeholder entry mediaEntries.remove(packageName) @@ -1339,10 +1339,13 @@ class MediaDataManager( fun onNotificationRemoved(key: String) { Assert.isMainThread() val removed = mediaEntries.remove(key) ?: return - + val isEligibleForResume = + removed.isLocalSession() || + (mediaFlags.isRemoteResumeAllowed() && + removed.playbackLocation != MediaData.PLAYBACK_CAST_REMOTE) if (keyguardUpdateMonitor.isUserInLockdown(removed.userId)) { logger.logMediaRemoved(removed.appUid, removed.packageName, removed.instanceId) - } else if (useMediaResumption && removed.resumeAction != null && removed.isLocalSession()) { + } else if (useMediaResumption && removed.resumeAction != null && isEligibleForResume) { convertToResumePlayer(key, removed) } else if (mediaFlags.isRetainingPlayersEnabled()) { handlePossibleRemoval(key, removed, notificationRemoved = true) @@ -1405,6 +1408,13 @@ class MediaDataManager( /** Set the given [MediaData] as a resume state player and notify listeners */ private fun convertToResumePlayer(key: String, data: MediaData) { if (DEBUG) Log.d(TAG, "Converting $key to resume") + // Resumption controls must have a title. + if (data.song.isNullOrBlank()) { + Log.e(TAG, "Description incomplete") + notifyMediaDataRemoved(key) + logger.logMediaRemoved(data.appUid, data.packageName, data.instanceId) + return + } // Move to resume key (aka package name) if that key doesn't already exist. val resumeAction = data.resumeAction?.let { getResumeMediaAction(it) } val actions = resumeAction?.let { listOf(resumeAction) } ?: emptyList() diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt index 2d10b823f784..2af21c4dbd9f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/MediaResumeListener.kt @@ -37,6 +37,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.pipeline.RESUME_MEDIA_TIMEOUT +import com.android.systemui.media.controls.util.MediaFlags import com.android.systemui.settings.UserTracker import com.android.systemui.tuner.TunerService import com.android.systemui.util.Utils @@ -63,7 +64,8 @@ constructor( private val tunerService: TunerService, private val mediaBrowserFactory: ResumeMediaBrowserFactory, dumpManager: DumpManager, - private val systemClock: SystemClock + private val systemClock: SystemClock, + private val mediaFlags: MediaFlags, ) : MediaDataManager.Listener, Dumpable { private var useMediaResumption: Boolean = Utils.useMediaResumption(context) @@ -231,7 +233,11 @@ constructor( mediaBrowser = null } // If we don't have a resume action, check if we haven't already - if (data.resumeAction == null && !data.hasCheckedForResume && data.isLocalSession()) { + val isEligibleForResume = + data.isLocalSession() || + (mediaFlags.isRemoteResumeAllowed() && + data.playbackLocation != MediaData.PLAYBACK_CAST_REMOTE) + if (data.resumeAction == null && !data.hasCheckedForResume && isEligibleForResume) { // TODO also check for a media button receiver intended for restarting (b/154127084) Log.d(TAG, "Checking for service component for " + data.packageName) val pm = context.packageManager diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt index 68d2c5c5f4c4..6cf051ad7668 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt @@ -39,6 +39,7 @@ import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor @@ -68,6 +69,7 @@ import com.android.systemui.util.time.SystemClock import com.android.systemui.util.traceSection import java.io.PrintWriter import java.util.TreeMap +import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.CoroutineScope @@ -93,7 +95,8 @@ constructor( private val mediaHostStatesManager: MediaHostStatesManager, private val activityStarter: ActivityStarter, private val systemClock: SystemClock, - @Main executor: DelayableExecutor, + @Main private val mainExecutor: DelayableExecutor, + @Background private val backgroundExecutor: Executor, private val mediaManager: MediaDataManager, configurationController: ConfigurationController, falsingCollector: FalsingCollector, @@ -256,7 +259,7 @@ constructor( MediaCarouselScrollHandler( mediaCarousel, pageIndicator, - executor, + mainExecutor, this::onSwipeToDismiss, this::updatePageIndicatorLocation, this::updateSeekbarListening, @@ -618,10 +621,50 @@ constructor( MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (existingPlayer == null) { - val newPlayer = mediaControlPanelFactory.get() - newPlayer.attachPlayer( - MediaViewHolder.create(LayoutInflater.from(context), mediaContent) + setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey) + } else { + existingPlayer.bindPlayer(data, key) + MediaPlayerData.addMediaPlayer( + key, + data, + existingPlayer, + systemClock, + isSsReactivated, + debugLogger ) + val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String() + // In case of recommendations hits. + // Check the playing status of media player and the package name. + // To make sure we scroll to the right app's media player. + if ( + isReorderingAllowed || + shouldScrollToKey && + data.isPlaying == true && + packageName == data.packageName + ) { + reorderAllPlayers(curVisibleMediaKey, key) + } else { + needsReordering = true + } + updatePageIndicator() + mediaCarouselScrollHandler.onPlayersChanged() + mediaFrame.requiresRemeasuring = true + } + return existingPlayer == null + } + + private fun setupNewPlayer( + key: String, + data: MediaData, + isSsReactivated: Boolean, + curVisibleMediaKey: MediaPlayerData.MediaSortKey?, + ) { + backgroundExecutor.execute { + val mediaViewHolder = createMediaViewHolderInBg() + // Add the new player in the main thread. + mainExecutor.execute { + val newPlayer = mediaControlPanelFactory.get() + newPlayer.attachPlayer(mediaViewHolder) newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( @@ -651,36 +694,16 @@ constructor( } else { needsReordering = true } - } else { - existingPlayer.bindPlayer(data, key) - MediaPlayerData.addMediaPlayer( - key, - data, - existingPlayer, - systemClock, - isSsReactivated, - debugLogger - ) - val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String() - // In case of recommendations hits. - // Check the playing status of media player and the package name. - // To make sure we scroll to the right app's media player. - if ( - isReorderingAllowed || - shouldScrollToKey && - data.isPlaying == true && - packageName == data.packageName - ) { - reorderAllPlayers(curVisibleMediaKey, key) - } else { - needsReordering = true - } + updatePageIndicator() + mediaCarouselScrollHandler.onPlayersChanged() + mediaFrame.requiresRemeasuring = true } - updatePageIndicator() - mediaCarouselScrollHandler.onPlayersChanged() - mediaFrame.requiresRemeasuring = true - return existingPlayer == null } + } + + private fun createMediaViewHolderInBg(): MediaViewHolder { + return MediaViewHolder.create(LayoutInflater.from(context), mediaContent) + } private fun addSmartspaceMediaRecommendations( key: String, @@ -714,15 +737,14 @@ constructor( debugLogger.logPotentialMemoryLeak(existingSmartspaceMediaKey) } } - val newRecs = mediaControlPanelFactory.get() - newRecs.attachRecommendation( + val recommendationViewHolder = RecommendationViewHolder.create( LayoutInflater.from(context), mediaContent, mediaFlags.isRecommendationCardUpdateEnabled() ) - ) + newRecs.attachRecommendation(recommendationViewHolder) newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( @@ -746,17 +768,6 @@ constructor( reorderAllPlayers(curVisibleMediaKey) updatePageIndicator() mediaFrame.requiresRemeasuring = true - // Check postcondition: mediaContent should have the same number of children as there - // are - // elements in mediaPlayers. - if (MediaPlayerData.players().size != mediaContent.childCount) { - Log.e( - TAG, - "Size of players list and number of views in carousel are out of sync. " + - "Players size is ${MediaPlayerData.players().size}. " + - "View count is ${mediaContent.childCount}." - ) - } } fun removePlayer( diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java index 767706209475..4ab93daef70c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java @@ -226,7 +226,7 @@ public class MediaControlPanel { private final BroadcastDialogController mBroadcastDialogController; private boolean mIsCurrentBroadcastedApp = false; private boolean mShowBroadcastDialogButton = false; - private String mSwitchBroadcastApp; + private String mCurrentBroadcastApp; private MultiRippleController mMultiRippleController; private TurbulenceNoiseController mTurbulenceNoiseController; private final FeatureFlags mFeatureFlags; @@ -572,9 +572,8 @@ public class MediaControlPanel { // TODO(b/233698402): Use the package name instead of app label to avoid the // unexpected result. mIsCurrentBroadcastedApp = device != null - && TextUtils.equals(device.getName(), - MediaDataUtils.getAppLabel(mContext, mPackageName, mContext.getString( - R.string.bt_le_audio_broadcast_dialog_unknown_name))); + && TextUtils.equals(device.getName(), + mContext.getString(R.string.broadcasting_description_is_broadcasting)); useDisabledAlpha = !mIsCurrentBroadcastedApp; // Always be enabled if the broadcast button is shown isTapEnabled = true; @@ -629,8 +628,8 @@ public class MediaControlPanel { // media output dialog. if (!mIsCurrentBroadcastedApp) { mLogger.logOpenBroadcastDialog(mUid, mPackageName, mInstanceId); - mSwitchBroadcastApp = device.getName().toString(); - mBroadcastDialogController.createBroadcastDialog(mSwitchBroadcastApp, + mCurrentBroadcastApp = device.getName().toString(); + mBroadcastDialogController.createBroadcastDialog(mCurrentBroadcastApp, mPackageName, true, mMediaViewHolder.getSeamlessButton()); } else { mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId); diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt index c3fa76ec9433..9bc66f6c98d0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt @@ -61,4 +61,7 @@ class MediaFlags @Inject constructor(private val featureFlags: FeatureFlags) { /** If true, do not automatically dismiss the recommendation card */ fun isPersistentSsCardEnabled() = featureFlags.isEnabled(Flags.MEDIA_RETAIN_RECOMMENDATIONS) + + /** Check whether we allow remote media to generate resume controls */ + fun isRemoteResumeAllowed() = featureFlags.isEnabled(Flags.MEDIA_REMOTE_RESUME) } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 6ee86aa021a3..5b02aaf089e0 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -41,7 +41,6 @@ import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode import android.app.StatusBarManager; import android.app.StatusBarManager.WindowVisibleState; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; @@ -68,7 +67,6 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.recents.utilities.Utilities; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -78,6 +76,7 @@ import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarTransitionsController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.pip.Pip; @@ -169,16 +168,20 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private BackAnimation mBackAnimation; + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Inject public TaskbarDelegate(Context context, EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, - LightBarTransitionsController.Factory lightBarTransitionsControllerFactory) { + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory; mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); mContext = context; mDisplayManager = mContext.getSystemService(DisplayManager.class); mPipListener = mEdgeBackGestureHandler::setPipStashExclusionBounds; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; + mStatusBarKeyguardViewManager.setTaskbarDelegate(this); } public void setDependencies(CommandQueue commandQueue, diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt index 8ad2f867a073..79167f276576 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt @@ -16,7 +16,11 @@ package com.android.systemui.privacy import android.content.Context import android.util.AttributeSet +import android.view.Gravity.CENTER_VERTICAL +import android.view.Gravity.END import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.ImageView import android.widget.LinearLayout import com.android.settingslib.Utils @@ -35,7 +39,7 @@ class OngoingPrivacyChip @JvmOverloads constructor( private var iconSize = 0 private var iconColor = 0 - private lateinit var iconsContainer: LinearLayout + private val iconsContainer: LinearLayout var privacyList = emptyList<PrivacyItem>() set(value) { @@ -43,11 +47,13 @@ class OngoingPrivacyChip @JvmOverloads constructor( updateView(PrivacyChipBuilder(context, field)) } - override fun onFinishInflate() { - super.onFinishInflate() - + init { + inflate(context, R.layout.ongoing_privacy_chip, this) + id = R.id.privacy_chip + layoutParams = LayoutParams(WRAP_CONTENT, MATCH_PARENT, CENTER_VERTICAL or END) + clipChildren = true + clipToPadding = true iconsContainer = requireViewById(R.id.icons_container) - updateResources() } @@ -107,6 +113,6 @@ class OngoingPrivacyChip @JvmOverloads constructor( val padding = context.resources .getDimensionPixelSize(R.dimen.ongoing_appops_chip_side_padding) iconsContainer.setPaddingRelative(padding, 0, padding, 0) - iconsContainer.background = context.getDrawable(R.drawable.privacy_chip_bg) + iconsContainer.background = context.getDrawable(R.drawable.statusbar_privacy_chip_bg) } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java b/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java index 245cf89a8337..27510720ae2f 100644 --- a/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java @@ -26,7 +26,10 @@ public class ProcessWrapper { @Inject public ProcessWrapper() {} - public int getUserHandleIdentifier() { - return android.os.Process.myUserHandle().getIdentifier(); + /** + * Returns {@code true} if System User is running the current process. + */ + public boolean isSystemUser() { + return android.os.Process.myUserHandle().isSystem(); } } diff --git a/packages/SystemUI/src/com/android/systemui/process/condition/UserProcessCondition.java b/packages/SystemUI/src/com/android/systemui/process/condition/SystemProcessCondition.java index 5a21ea075ea3..80fbf9115065 100644 --- a/packages/SystemUI/src/com/android/systemui/process/condition/UserProcessCondition.java +++ b/packages/SystemUI/src/com/android/systemui/process/condition/SystemProcessCondition.java @@ -17,29 +17,26 @@ package com.android.systemui.process.condition; import com.android.systemui.process.ProcessWrapper; -import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.condition.Condition; import javax.inject.Inject; /** - * {@link UserProcessCondition} provides a signal when the process handle belongs to the current - * user. + * {@link SystemProcessCondition} checks to make sure the current process is being ran by the + * System User. */ -public class UserProcessCondition extends Condition { +public class SystemProcessCondition extends Condition { private final ProcessWrapper mProcessWrapper; - private final UserTracker mUserTracker; @Inject - public UserProcessCondition(ProcessWrapper processWrapper, UserTracker userTracker) { + public SystemProcessCondition(ProcessWrapper processWrapper) { + super(); mProcessWrapper = processWrapper; - mUserTracker = userTracker; } @Override protected void start() { - updateCondition(mUserTracker.getUserId() - == mProcessWrapper.getUserHandleIdentifier()); + updateCondition(mProcessWrapper.isSystemUser()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt b/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt index be93550158c6..c70cce9fec26 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.kt @@ -183,7 +183,7 @@ class AutoAddTracker @VisibleForTesting constructor( } fun getRestoredTilePosition(tile: String): Int = - restoredTiles?.get(tile)?.index ?: QSTileHost.POSITION_AT_END + restoredTiles?.get(tile)?.index ?: QSHost.POSITION_AT_END /** * Returns `true` if the tile has been auto-added before diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index e1289a61d45d..a7aac5a4824d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -135,7 +135,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener private int mNumQuickTiles; private int mLastQQSTileHeight; private float mLastPosition; - private final QSTileHost mHost; + private final QSHost mHost; private final Executor mExecutor; private boolean mShowCollapsedOnKeyguard; private int mQQSTop; @@ -146,7 +146,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener @Inject public QSAnimator(QS qs, QuickQSPanel quickPanel, QuickStatusBarHeader quickStatusBarHeader, QSPanelController qsPanelController, - QuickQSPanelController quickQSPanelController, QSTileHost qsTileHost, + QuickQSPanelController quickQSPanelController, QSHost qsTileHost, @Main Executor executor, TunerService tunerService, QSExpansionPathInterpolator qsExpansionPathInterpolator) { mQs = qs; @@ -330,12 +330,8 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener // Offset the translation animation on the views // (that goes from 0 to getOffsetTranslation) - int offsetWithQSBHTranslation = - yOffset - mQuickStatusBarHeader.getOffsetTranslation(); - qqsTranslationYBuilder.addFloat(quickTileView, "translationY", 0, - offsetWithQSBHTranslation); - translationYBuilder.addFloat(tileView, "translationY", - -offsetWithQSBHTranslation, 0); + qqsTranslationYBuilder.addFloat(quickTileView, "translationY", 0, yOffset); + translationYBuilder.addFloat(tileView, "translationY", -yOffset, 0); translationXBuilder.addFloat(quickTileView, "translationX", 0, xOffset); translationXBuilder.addFloat(tileView, "translationX", -xOffset, 0); @@ -489,7 +485,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener if (specs.isEmpty()) { // specs should not be empty in a valid secondary page, as we scrolled to it. // We may crash later on because there's a null animator. - specs = mQsPanelController.getHost().mTileSpecs; + specs = mHost.getSpecs(); Log.e(TAG, "Trying to create animators for empty page " + page + ". Tiles: " + specs); // return null; } @@ -614,7 +610,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener View commonView = mQs.getView(); getRelativePositionInt(qsPosition, view1, commonView); getRelativePositionInt(qqsPosition, view2, commonView); - return (qsPosition[1] - qqsPosition[1]) - mQuickStatusBarHeader.getOffsetTranslation(); + return qsPosition[1] - qqsPosition[1]; } private boolean isIconInAnimatedRow(int count) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 0c242d9da25f..b7f9f6bc0e4a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -53,7 +53,6 @@ public class QSContainerImpl extends FrameLayout implements Dumpable { private boolean mQsDisabled; private int mContentHorizontalPadding = -1; private boolean mClippingEnabled; - private boolean mUseCombinedHeaders; public QSContainerImpl(Context context, AttributeSet attrs) { super(context, attrs); @@ -68,10 +67,6 @@ public class QSContainerImpl extends FrameLayout implements Dumpable { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); } - void setUseCombinedHeaders(boolean useCombinedHeaders) { - mUseCombinedHeaders = useCombinedHeaders; - } - @Override public boolean hasOverlappingRendering() { return false; @@ -150,8 +145,7 @@ public class QSContainerImpl extends FrameLayout implements Dumpable { void updateResources(QSPanelController qsPanelController, QuickStatusBarHeaderController quickStatusBarHeaderController) { int topPadding = QSUtils.getQsHeaderSystemIconsAreaHeight(mContext); - if (mUseCombinedHeaders - && !LargeScreenUtils.shouldUseLargeScreenShadeHeader(mContext.getResources())) { + if (!LargeScreenUtils.shouldUseLargeScreenShadeHeader(mContext.getResources())) { topPadding = mContext.getResources() .getDimensionPixelSize(R.dimen.large_screen_shade_header_height); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java index 28b4c8228d38..73a5faabda3b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java @@ -22,8 +22,6 @@ import android.content.res.Configuration; import android.view.MotionEvent; import android.view.View; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -66,15 +64,13 @@ public class QSContainerImplController extends ViewController<QSContainerImpl> { QSPanelController qsPanelController, QuickStatusBarHeaderController quickStatusBarHeaderController, ConfigurationController configurationController, - FalsingManager falsingManager, - FeatureFlags featureFlags) { + FalsingManager falsingManager) { super(view); mQsPanelController = qsPanelController; mQuickStatusBarHeaderController = quickStatusBarHeaderController; mConfigurationController = configurationController; mFalsingManager = falsingManager; mQSPanelContainer = mView.getQSPanelContainer(); - view.setUseCombinedHeaders(featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index ae965d37557f..9d34df8c1eb8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -228,7 +228,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { // Lazily update animators whenever the scrolling changes mQSAnimator.requestAnimatorUpdate(); - mHeader.setExpandedScrollAmount(scrollY); if (mScrollListener != null) { mScrollListener.onQsPanelScrollChanged(scrollY); } @@ -648,8 +647,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca int heightDiff = getHeightDiff(); float panelTranslationY = translationScaleY * heightDiff; - // Let the views animate their contents correctly by giving them the necessary context. - mHeader.setExpansion(onKeyguardAndExpanded, expansion, panelTranslationY); if (expansion < 1 && expansion > 0.99) { if (mQuickQSPanelController.switchTileLayout(false)) { mHeader.updateResources(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java index 1da30ade951b..a71e6ddb6abd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java @@ -14,15 +14,48 @@ package com.android.systemui.qs; +import android.content.ComponentName; import android.content.Context; +import android.content.res.Resources; +import android.os.Build; +import android.provider.Settings; import com.android.internal.logging.InstanceId; import com.android.internal.logging.UiEventLogger; +import com.android.systemui.R; +import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.plugins.qs.QSTileView; +import com.android.systemui.util.leak.GarbageMonitor; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.List; public interface QSHost { + String TILES_SETTING = Settings.Secure.QS_TILES; + int POSITION_AT_END = -1; + + /** + * Returns the default QS tiles for the context. + * @param context the context to obtain the resources from + * @return a list of specs of the default tiles + */ + static List<String> getDefaultSpecs(Context context) { + final ArrayList<String> tiles = new ArrayList(); + + final Resources res = context.getResources(); + final String defaultTileList = res.getString(R.string.quick_settings_tiles_default); + + tiles.addAll(Arrays.asList(defaultTileList.split(","))); + if (Build.IS_DEBUGGABLE + && GarbageMonitor.ADD_MEMORY_TILE_TO_DEFAULT_ON_DEBUGGABLE_BUILDS) { + tiles.add(GarbageMonitor.MemoryTile.TILE_SPEC); + } + return tiles; + } + void warn(String message, Throwable t); void collapsePanels(); void forceCollapsePanels(); @@ -37,6 +70,44 @@ public interface QSHost { void removeTile(String tileSpec); void removeTiles(Collection<String> specs); + List<String> getSpecs(); + /** + * Create a view for a tile, iterating over all possible {@link QSFactory}. + * + * @see QSFactory#createTileView + */ + QSTileView createTileView(Context themedContext, QSTile tile, boolean collapsedView); + /** Create a {@link QSTile} of a {@code tileSpec} type. */ + QSTile createTile(String tileSpec); + + /** + * Add a tile to the end + * + * @param spec string matching a pre-defined tilespec + */ + void addTile(String spec); + + /** + * Add a tile into the requested spot, or at the end if the position is greater than the number + * of tiles. + * @param spec string matching a pre-defined tilespec + * @param requestPosition -1 for end, 0 for beginning, or X for insertion at position X + */ + void addTile(String spec, int requestPosition); + void addTile(ComponentName tile); + + /** + * Adds a custom tile to the set of current tiles. + * @param tile the component name of the {@link android.service.quicksettings.TileService} + * @param end if true, the tile will be added at the end. If false, at the beginning. + */ + void addTile(ComponentName tile, boolean end); + void removeTileByUser(ComponentName tile); + void changeTilesByUser(List<String> previousTiles, List<String> newTiles); + + boolean isTileAdded(ComponentName componentName, int userId); + void setTileAdded(ComponentName componentName, int userId, boolean added); + int indexOf(String tileSpec); InstanceId getNewInstanceId(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index a0be151e15a1..b476521f1975 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -79,7 +79,6 @@ public class QSPanel extends LinearLayout implements Tunable { protected boolean mExpanded; protected boolean mListening; - @Nullable protected QSTileHost mHost; private final List<OnConfigurationChangedListener> mOnConfigurationChangedListeners = new ArrayList<>(); @@ -104,7 +103,6 @@ public class QSPanel extends LinearLayout implements Tunable { private final Rect mClippingRect = new Rect(); private ViewGroup mMediaHostView; private boolean mShouldMoveMediaOnExpansion = true; - private boolean mUsingCombinedHeaders = false; private QSLogger mQsLogger; /** * Specifies if we can collapse to QQS in current state. In split shade that should be always @@ -155,10 +153,6 @@ public class QSPanel extends LinearLayout implements Tunable { } } - void setUsingCombinedHeaders(boolean usingCombinedHeaders) { - mUsingCombinedHeaders = usingCombinedHeaders; - } - protected void setHorizontalContentContainerClipping() { mHorizontalContentContainer.setClipChildren(true); mHorizontalContentContainer.setClipToPadding(false); @@ -364,11 +358,6 @@ public class QSPanel extends LinearLayout implements Tunable { } } - @Nullable - public QSTileHost getHost() { - return mHost; - } - public void updateResources() { updatePadding(); @@ -383,9 +372,7 @@ public class QSPanel extends LinearLayout implements Tunable { protected void updatePadding() { final Resources res = mContext.getResources(); - int paddingTop = res.getDimensionPixelSize( - mUsingCombinedHeaders ? R.dimen.qs_panel_padding_top_combined_headers - : R.dimen.qs_panel_padding_top); + int paddingTop = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top); int paddingBottom = res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom); setPaddingRelative(getPaddingStart(), paddingTop, diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 01dbb1825208..83b373d5e626 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -17,7 +17,6 @@ package com.android.systemui.qs; import static com.android.systemui.classifier.Classifier.QS_SWIPE_SIDE; -import static com.android.systemui.flags.Flags.COMBINED_QS_HEADERS; import static com.android.systemui.media.dagger.MediaModule.QS_PANEL; import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS; import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER; @@ -28,7 +27,6 @@ import android.view.View; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.media.controls.ui.MediaHierarchyManager; import com.android.systemui.media.controls.ui.MediaHost; import com.android.systemui.media.controls.ui.MediaHostState; @@ -73,7 +71,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { @Inject QSPanelController(QSPanel view, TunerService tunerService, - QSTileHost qstileHost, QSCustomizerController qsCustomizerController, + QSHost qsHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QS_PANEL) MediaHost mediaHost, QSTileRevealController.Factory qsTileRevealControllerFactory, @@ -81,9 +79,8 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSliderController.Factory brightnessSliderFactory, FalsingManager falsingManager, - StatusBarKeyguardViewManager statusBarKeyguardViewManager, - FeatureFlags featureFlags) { - super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { + super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; @@ -96,7 +93,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController); mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; - mView.setUsingCombinedHeaders(featureFlags.isEnabled(COMBINED_QS_HEADERS)); } @Override @@ -176,12 +172,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { mBrightnessMirrorHandler.setController(brightnessMirrorController); } - /** Get the QSTileHost this panel uses. */ - public QSTileHost getHost() { - return mHost; - } - - /** Update appearance of QSPanel. */ public void updateResources() { mView.updateResources(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index bbdf6cc70541..2668d2e36731 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -64,7 +64,7 @@ import kotlin.jvm.functions.Function1; public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewController<T> implements Dumpable{ private static final String TAG = "QSPanelControllerBase"; - protected final QSTileHost mHost; + protected final QSHost mHost; private final QSCustomizerController mQsCustomizerController; private final boolean mUsingMediaPlayer; protected final MediaHost mMediaHost; @@ -128,7 +128,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr protected QSPanelControllerBase( T view, - QSTileHost host, + QSHost host, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, MediaHost mediaHost, diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 98af9dfe7f37..0ead97976ad9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -18,7 +18,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; -import android.os.Build; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings.Secure; @@ -56,17 +55,14 @@ import com.android.systemui.settings.UserFileManager; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.CentralSurfaces; -import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; -import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.util.settings.SecureSettings; import org.jetbrains.annotations.NotNull; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; @@ -94,16 +90,13 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final int MAX_QS_INSTANCE_ID = 1 << 20; - public static final int POSITION_AT_END = -1; - public static final String TILES_SETTING = Secure.QS_TILES; - // Shared prefs that hold tile lifecycle info. @VisibleForTesting static final String TILES = "tiles_prefs"; private final Context mContext; private final LinkedHashMap<String, QSTile> mTiles = new LinkedHashMap<>(); - protected final ArrayList<String> mTileSpecs = new ArrayList<>(); + private final ArrayList<String> mTileSpecs = new ArrayList<>(); private final TunerService mTunerService; private final PluginManager mPluginManager; private final DumpManager mDumpManager; @@ -117,7 +110,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P private final List<Callback> mCallbacks = new ArrayList<>(); @Nullable private AutoTileManager mAutoTiles; - private final StatusBarIconController mIconController; private final ArrayList<QSFactory> mQsFactories = new ArrayList<>(); private int mCurrentUser; private final Optional<CentralSurfaces> mCentralSurfacesOptional; @@ -135,7 +127,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P @Inject public QSTileHost(Context context, - StatusBarIconController iconController, QSFactory defaultFactory, @Main Executor mainExecutor, PluginManager pluginManager, @@ -152,7 +143,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P TileLifecycleManager.Factory tileLifecycleManagerFactory, UserFileManager userFileManager ) { - mIconController = iconController; mContext = context; mUserContext = context; mTunerService = tunerService; @@ -186,10 +176,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P }); } - public StatusBarIconController getIconController() { - return mIconController; - } - @Override public InstanceId getNewInstanceId() { return mInstanceIdSequence.newInstanceId(); @@ -438,12 +424,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P addTile(spec, POSITION_AT_END); } - /** - * Add a tile into the requested spot, or at the end if the position is greater than the number - * of tiles. - * @param spec string matching a pre-defined tilespec - * @param requestPosition -1 for end, 0 for beginning, or X for insertion at position X - */ + @Override public void addTile(String spec, int requestPosition) { mMainExecutor.execute(() -> changeTileSpecs(tileSpecs -> { @@ -483,15 +464,12 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P } } + @Override public void addTile(ComponentName tile) { addTile(tile, /* end */ false); } - /** - * Adds a custom tile to the set of current tiles. - * @param tile the component name of the {@link android.service.quicksettings.TileService} - * @param end if true, the tile will be added at the end. If false, at the beginning. - */ + @Override public void addTile(ComponentName tile, boolean end) { String spec = CustomTile.toSpec(tile); addTile(spec, end ? POSITION_AT_END : 0); @@ -501,6 +479,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P * This will call through {@link #changeTilesByUser}. It should only be used when a tile is * removed by a <b>user action</b> like {@code adb}. */ + @Override public void removeTileByUser(ComponentName tile) { mMainExecutor.execute(() -> { List<String> newSpecs = new ArrayList<>(mTileSpecs); @@ -519,6 +498,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P * that are removed. */ @MainThread + @Override public void changeTilesByUser(List<String> previousTiles, List<String> newTiles) { final List<String> copy = new ArrayList<>(previousTiles); final int NP = copy.size(); @@ -542,8 +522,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P saveTilesToSettings(newTiles); } - /** Create a {@link QSTile} of a {@code tileSpec} type. */ @Nullable + @Override public QSTile createTile(String tileSpec) { for (int i = 0; i < mQsFactories.size(); i++) { QSTile t = mQsFactories.get(i).createTile(tileSpec); @@ -554,11 +534,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P return null; } - /** - * Create a view for a tile, iterating over all possible {@link QSFactory}. - * - * @see QSFactory#createTileView - */ + @Override public QSTileView createTileView(Context themedContext, QSTile tile, boolean collapsedView) { for (int i = 0; i < mQsFactories.size(); i++) { QSTileView view = mQsFactories.get(i) @@ -578,6 +554,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P * tile. * @param userId the user to check */ + @Override public boolean isTileAdded(ComponentName componentName, int userId) { return mUserFileManager .getSharedPreferences(TILES, 0, userId) @@ -593,6 +570,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P * @param userId the user for this tile * @param added {@code true} if the tile is being added, {@code false} otherwise */ + @Override public void setTileAdded(ComponentName componentName, int userId, boolean added) { mUserFileManager.getSharedPreferences(TILES, 0, userId) .edit() @@ -600,6 +578,11 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P .apply(); } + @Override + public List<String> getSpecs() { + return mTileSpecs; + } + protected static List<String> loadTileSpecs(Context context, String tileList) { final Resources res = context.getResources(); @@ -617,7 +600,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P if (tile.isEmpty()) continue; if (tile.equals("default")) { if (!addedDefault) { - List<String> defaultSpecs = getDefaultSpecs(context); + List<String> defaultSpecs = QSHost.getDefaultSpecs(context); for (String spec : defaultSpecs) { if (!addedSpecs.contains(spec)) { tiles.add(spec); @@ -650,25 +633,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P return tiles; } - /** - * Returns the default QS tiles for the context. - * @param context the context to obtain the resources from - * @return a list of specs of the default tiles - */ - public static List<String> getDefaultSpecs(Context context) { - final ArrayList<String> tiles = new ArrayList<String>(); - - final Resources res = context.getResources(); - final String defaultTileList = res.getString(R.string.quick_settings_tiles_default); - - tiles.addAll(Arrays.asList(defaultTileList.split(","))); - if (Build.IS_DEBUGGABLE - && GarbageMonitor.ADD_MEMORY_TILE_TO_DEFAULT_ON_DEBUGGABLE_BUILDS) { - tiles.add(GarbageMonitor.MemoryTile.TILE_SPEC); - } - return tiles; - } - @Override public void dump(PrintWriter pw, String[] args) { pw.println("QSTileHost:"); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index 6aabe3b1ced1..2d543139a1b4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -48,7 +48,7 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> private final Provider<Boolean> mUsingCollapsedLandscapeMediaProvider; @Inject - QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost, + QuickQSPanelController(QuickQSPanel view, QSHost qsHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QUICK_QS_PANEL) MediaHost mediaHost, @@ -57,7 +57,7 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager ) { - super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, + super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mUsingCollapsedLandscapeMediaProvider = usingCollapsedLandscapeMediaProvider; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index e696d131267f..691a1a14444a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -20,35 +20,15 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Pair; -import android.view.DisplayCutout; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.WindowInsets; import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.Space; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.policy.SystemBarUtils; -import com.android.settingslib.Utils; import com.android.systemui.R; -import com.android.systemui.battery.BatteryMeterView; -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider; -import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; -import com.android.systemui.statusbar.phone.StatusIconContainer; -import com.android.systemui.statusbar.policy.Clock; -import com.android.systemui.statusbar.policy.VariableDateView; import com.android.systemui.util.LargeScreenUtils; -import java.util.List; - /** * View that contains the top-most bits of the QS panel (primarily the status bar with date, time, * battery, carrier info and privacy icons) and also contains the {@link QuickQSPanel}. @@ -58,182 +38,30 @@ public class QuickStatusBarHeader extends FrameLayout { private boolean mExpanded; private boolean mQsDisabled; - @Nullable - private TouchAnimator mAlphaAnimator; - @Nullable - private TouchAnimator mTranslationAnimator; - @Nullable - private TouchAnimator mIconsAlphaAnimator; - private TouchAnimator mIconsAlphaAnimatorFixed; - protected QuickQSPanel mHeaderQsPanel; - private View mDatePrivacyView; - private View mDateView; - // DateView next to clock. Visible on QQS - private VariableDateView mClockDateView; - private View mStatusIconsView; - private View mContainer; - - private View mQSCarriers; - private ViewGroup mClockContainer; - private Clock mClockView; - private Space mDatePrivacySeparator; - private View mClockIconsSeparator; - private boolean mShowClockIconsSeparator; - private View mRightLayout; - private View mDateContainer; - private View mPrivacyContainer; - - private BatteryMeterView mBatteryRemainingIcon; - private StatusIconContainer mIconContainer; - private View mPrivacyChip; - - @Nullable - private TintedIconManager mTintedIconManager; - @Nullable - private QSExpansionPathInterpolator mQSExpansionPathInterpolator; - private StatusBarContentInsetsProvider mInsetsProvider; - - private int mRoundedCornerPadding = 0; - private int mWaterfallTopInset; - private int mCutOutPaddingLeft; - private int mCutOutPaddingRight; - private float mKeyguardExpansionFraction; - private int mTextColorPrimary = Color.TRANSPARENT; - private int mTopViewMeasureHeight; - - @NonNull - private List<String> mRssiIgnoredSlots = List.of(); - private boolean mIsSingleCarrier; - - private boolean mHasCenterCutout; - private boolean mConfigShowBatteryEstimate; - - private boolean mUseCombinedQSHeader; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); } - /** - * How much the view containing the clock and QQS will translate down when QS is fully expanded. - * - * This matches the measured height of the view containing the date and privacy icons. - */ - public int getOffsetTranslation() { - return mTopViewMeasureHeight; - } - @Override protected void onFinishInflate() { super.onFinishInflate(); - mHeaderQsPanel = findViewById(R.id.quick_qs_panel); - mDatePrivacyView = findViewById(R.id.quick_status_bar_date_privacy); - mStatusIconsView = findViewById(R.id.quick_qs_status_icons); - mQSCarriers = findViewById(R.id.carrier_group); - mContainer = findViewById(R.id.qs_container); - mIconContainer = findViewById(R.id.statusIcons); - mPrivacyChip = findViewById(R.id.privacy_chip); - mDateView = findViewById(R.id.date); - mClockDateView = findViewById(R.id.date_clock); - mClockIconsSeparator = findViewById(R.id.separator); - mRightLayout = findViewById(R.id.rightLayout); - mDateContainer = findViewById(R.id.date_container); - mPrivacyContainer = findViewById(R.id.privacy_container); - - mClockContainer = findViewById(R.id.clock_container); - mClockView = findViewById(R.id.clock); - mDatePrivacySeparator = findViewById(R.id.space); - // Tint for the battery icons are handled in setupHost() - mBatteryRemainingIcon = findViewById(R.id.batteryRemainingIcon); updateResources(); - Configuration config = mContext.getResources().getConfiguration(); - setDatePrivacyContainersWidth(config.orientation == Configuration.ORIENTATION_LANDSCAPE); - - updateBatteryMode(); - - mIconsAlphaAnimatorFixed = new TouchAnimator.Builder() - .addFloat(mIconContainer, "alpha", 0, 1) - .addFloat(mBatteryRemainingIcon, "alpha", 0, 1) - .build(); - } - - void onAttach(TintedIconManager iconManager, - QSExpansionPathInterpolator qsExpansionPathInterpolator, - List<String> rssiIgnoredSlots, - StatusBarContentInsetsProvider insetsProvider, - boolean useCombinedQSHeader) { - mUseCombinedQSHeader = useCombinedQSHeader; - mTintedIconManager = iconManager; - mRssiIgnoredSlots = rssiIgnoredSlots; - mInsetsProvider = insetsProvider; - int fillColor = Utils.getColorAttrDefaultColor(getContext(), - android.R.attr.textColorPrimary); - - // Set the correct tint for the status icons so they contrast - iconManager.setTint(fillColor); - - mQSExpansionPathInterpolator = qsExpansionPathInterpolator; - updateAnimators(); - } - - void setIsSingleCarrier(boolean isSingleCarrier) { - mIsSingleCarrier = isSingleCarrier; - updateAlphaAnimator(); - } - - public QuickQSPanel getHeaderQsPanel() { - return mHeaderQsPanel; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mDatePrivacyView.getMeasuredHeight() != mTopViewMeasureHeight) { - mTopViewMeasureHeight = mDatePrivacyView.getMeasuredHeight(); - post(this::updateAnimators); - } } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); updateResources(); - setDatePrivacyContainersWidth(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE); - } - - @Override - public void onRtlPropertiesChanged(int layoutDirection) { - super.onRtlPropertiesChanged(layoutDirection); - updateResources(); - } - - private void setDatePrivacyContainersWidth(boolean landscape) { - LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mDateContainer.getLayoutParams(); - lp.width = landscape ? WRAP_CONTENT : 0; - lp.weight = landscape ? 0f : 1f; - mDateContainer.setLayoutParams(lp); - - lp = (LinearLayout.LayoutParams) mPrivacyContainer.getLayoutParams(); - lp.width = landscape ? WRAP_CONTENT : 0; - lp.weight = landscape ? 0f : 1f; - mPrivacyContainer.setLayoutParams(lp); - } - - private void updateBatteryMode() { - if (mConfigShowBatteryEstimate && !mHasCenterCutout) { - mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); - } else { - mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ON); - } } @Override public boolean onTouchEvent(MotionEvent event) { - // If using combined headers, only react to touches inside QuickQSPanel - if (!mUseCombinedQSHeader || event.getY() > mHeaderQsPanel.getTop()) { + // Only react to touches inside QuickQSPanel + if (event.getY() > mHeaderQsPanel.getTop()) { return super.onTouchEvent(event); } else { return false; @@ -245,193 +73,29 @@ public class QuickStatusBarHeader extends FrameLayout { boolean largeScreenHeaderActive = LargeScreenUtils.shouldUseLargeScreenShadeHeader(resources); - boolean gone = largeScreenHeaderActive || mUseCombinedQSHeader || mQsDisabled; - mStatusIconsView.setVisibility(gone ? View.GONE : View.VISIBLE); - mDatePrivacyView.setVisibility(gone ? View.GONE : View.VISIBLE); - - mConfigShowBatteryEstimate = resources.getBoolean(R.bool.config_showBatteryEstimateQSBH); - - mRoundedCornerPadding = resources.getDimensionPixelSize( - R.dimen.rounded_corner_content_padding); - - int qsOffsetHeight = SystemBarUtils.getQuickQsOffsetHeight(mContext); - - mDatePrivacyView.getLayoutParams().height = - Math.max(qsOffsetHeight, mDatePrivacyView.getMinimumHeight()); - mDatePrivacyView.setLayoutParams(mDatePrivacyView.getLayoutParams()); - - mStatusIconsView.getLayoutParams().height = - Math.max(qsOffsetHeight, mStatusIconsView.getMinimumHeight()); - mStatusIconsView.setLayoutParams(mStatusIconsView.getLayoutParams()); - ViewGroup.LayoutParams lp = getLayoutParams(); if (mQsDisabled) { - lp.height = mStatusIconsView.getLayoutParams().height; + lp.height = 0; } else { lp.height = WRAP_CONTENT; } setLayoutParams(lp); - int textColor = Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorPrimary); - if (textColor != mTextColorPrimary) { - int textColorSecondary = Utils.getColorAttrDefaultColor(mContext, - android.R.attr.textColorSecondary); - mTextColorPrimary = textColor; - mClockView.setTextColor(textColor); - if (mTintedIconManager != null) { - mTintedIconManager.setTint(textColor); - } - mBatteryRemainingIcon.updateColors(mTextColorPrimary, textColorSecondary, - mTextColorPrimary); - } - MarginLayoutParams qqsLP = (MarginLayoutParams) mHeaderQsPanel.getLayoutParams(); if (largeScreenHeaderActive) { qqsLP.topMargin = mContext.getResources() .getDimensionPixelSize(R.dimen.qqs_layout_margin_top); - } else if (!mUseCombinedQSHeader) { - qqsLP.topMargin = qsOffsetHeight; } else { qqsLP.topMargin = mContext.getResources() .getDimensionPixelSize(R.dimen.large_screen_shade_header_min_height); } mHeaderQsPanel.setLayoutParams(qqsLP); - - updateBatteryMode(); - updateHeadersPadding(); - updateAnimators(); - - updateClockDatePadding(); } - private void updateClockDatePadding() { - int startPadding = mContext.getResources() - .getDimensionPixelSize(R.dimen.status_bar_left_clock_starting_padding); - int endPadding = mContext.getResources() - .getDimensionPixelSize(R.dimen.status_bar_left_clock_end_padding); - mClockView.setPaddingRelative( - startPadding, - mClockView.getPaddingTop(), - endPadding, - mClockView.getPaddingBottom() - ); - - MarginLayoutParams lp = (MarginLayoutParams) mClockDateView.getLayoutParams(); - lp.setMarginStart(endPadding); - mClockDateView.setLayoutParams(lp); - } - - private void updateAnimators() { - if (mUseCombinedQSHeader) { - mTranslationAnimator = null; - return; - } - updateAlphaAnimator(); - int offset = mTopViewMeasureHeight; - - mTranslationAnimator = new TouchAnimator.Builder() - .addFloat(mContainer, "translationY", 0, offset) - .setInterpolator(mQSExpansionPathInterpolator != null - ? mQSExpansionPathInterpolator.getYInterpolator() - : null) - .build(); - } - - private void updateAlphaAnimator() { - if (mUseCombinedQSHeader) { - mAlphaAnimator = null; - return; - } - TouchAnimator.Builder builder = new TouchAnimator.Builder() - // These views appear on expanding down - .addFloat(mDateView, "alpha", 0, 0, 1) - .addFloat(mClockDateView, "alpha", 1, 0, 0) - .addFloat(mQSCarriers, "alpha", 0, 1) - .setListener(new TouchAnimator.ListenerAdapter() { - @Override - public void onAnimationAtEnd() { - super.onAnimationAtEnd(); - if (!mIsSingleCarrier) { - mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); - } - // Make it gone so there's enough room for carrier names - mClockDateView.setVisibility(View.GONE); - } - - @Override - public void onAnimationStarted() { - mClockDateView.setVisibility(View.VISIBLE); - mClockDateView.setFreezeSwitching(true); - setSeparatorVisibility(false); - if (!mIsSingleCarrier) { - mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); - } - } - - @Override - public void onAnimationAtStart() { - super.onAnimationAtStart(); - mClockDateView.setFreezeSwitching(false); - mClockDateView.setVisibility(View.VISIBLE); - setSeparatorVisibility(mShowClockIconsSeparator); - // In QQS we never ignore RSSI. - mIconContainer.removeIgnoredSlots(mRssiIgnoredSlots); - } - }); - mAlphaAnimator = builder.build(); - } - - void setChipVisibility(boolean visibility) { - if (visibility) { - // Animates the icons and battery indicator from alpha 0 to 1, when the chip is visible - mIconsAlphaAnimator = mIconsAlphaAnimatorFixed; - mIconsAlphaAnimator.setPosition(mKeyguardExpansionFraction); - } else { - mIconsAlphaAnimator = null; - mIconContainer.setAlpha(1); - mBatteryRemainingIcon.setAlpha(1); - } - - } - - /** */ public void setExpanded(boolean expanded, QuickQSPanelController quickQSPanelController) { if (mExpanded == expanded) return; mExpanded = expanded; quickQSPanelController.setExpanded(expanded); - updateEverything(); - } - - /** - * Animates the inner contents based on the given expansion details. - * - * @param forceExpanded whether we should show the state expanded forcibly - * @param expansionFraction how much the QS panel is expanded/pulled out (up to 1f) - * @param panelTranslationY how much the panel has physically moved down vertically (required - * for keyguard animations only) - */ - public void setExpansion(boolean forceExpanded, float expansionFraction, - float panelTranslationY) { - final float keyguardExpansionFraction = forceExpanded ? 1f : expansionFraction; - - if (mAlphaAnimator != null) { - mAlphaAnimator.setPosition(keyguardExpansionFraction); - } - if (mTranslationAnimator != null) { - mTranslationAnimator.setPosition(keyguardExpansionFraction); - } - if (mIconsAlphaAnimator != null) { - mIconsAlphaAnimator.setPosition(keyguardExpansionFraction); - } - // If forceExpanded (we are opening QS from lockscreen), the animators have been set to - // position = 1f. - if (forceExpanded) { - setAlpha(expansionFraction); - } else { - setAlpha(1); - } - - mKeyguardExpansionFraction = keyguardExpansionFraction; } public void disable(int state1, int state2, boolean animate) { @@ -439,133 +103,13 @@ public class QuickStatusBarHeader extends FrameLayout { if (disabled == mQsDisabled) return; mQsDisabled = disabled; mHeaderQsPanel.setDisabledByPolicy(disabled); - mStatusIconsView.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE); updateResources(); } - @Override - public WindowInsets onApplyWindowInsets(WindowInsets insets) { - // Handle padding of the views - DisplayCutout cutout = insets.getDisplayCutout(); - - Pair<Integer, Integer> sbInsets = mInsetsProvider - .getStatusBarContentInsetsForCurrentRotation(); - boolean hasCornerCutout = mInsetsProvider.currentRotationHasCornerCutout(); - - mDatePrivacyView.setPadding(sbInsets.first, 0, sbInsets.second, 0); - mStatusIconsView.setPadding(sbInsets.first, 0, sbInsets.second, 0); - LinearLayout.LayoutParams datePrivacySeparatorLayoutParams = - (LinearLayout.LayoutParams) mDatePrivacySeparator.getLayoutParams(); - LinearLayout.LayoutParams mClockIconsSeparatorLayoutParams = - (LinearLayout.LayoutParams) mClockIconsSeparator.getLayoutParams(); - - Rect topCutout = cutout == null ? null : cutout.getBoundingRectTop(); - if (topCutout == null || topCutout.isEmpty() || hasCornerCutout) { - datePrivacySeparatorLayoutParams.width = 0; - mDatePrivacySeparator.setVisibility(View.GONE); - mClockIconsSeparatorLayoutParams.width = 0; - setSeparatorVisibility(false); - mShowClockIconsSeparator = false; - mHasCenterCutout = false; - } else { - datePrivacySeparatorLayoutParams.width = topCutout.width(); - mDatePrivacySeparator.setVisibility(View.VISIBLE); - mClockIconsSeparatorLayoutParams.width = topCutout.width(); - mShowClockIconsSeparator = true; - setSeparatorVisibility(mKeyguardExpansionFraction == 0f); - mHasCenterCutout = true; - } - - mDatePrivacySeparator.setLayoutParams(datePrivacySeparatorLayoutParams); - mClockIconsSeparator.setLayoutParams(mClockIconsSeparatorLayoutParams); - mCutOutPaddingLeft = sbInsets.first; - mCutOutPaddingRight = sbInsets.second; - mWaterfallTopInset = cutout == null ? 0 : cutout.getWaterfallInsets().top; - - updateBatteryMode(); - updateHeadersPadding(); - return super.onApplyWindowInsets(insets); - } - - /** - * Sets the visibility of the separator between clock and icons. - * - * This separator is "visible" when there is a center cutout, to block that space. In that - * case, the clock and the layout on the right (containing the icons and the battery meter) are - * set to weight 1 to take the available space. - * @param visible whether the separator between clock and icons should be visible. - */ - private void setSeparatorVisibility(boolean visible) { - int newVisibility = visible ? View.VISIBLE : View.GONE; - if (mClockIconsSeparator.getVisibility() == newVisibility) return; - - mClockIconsSeparator.setVisibility(visible ? View.VISIBLE : View.GONE); - mQSCarriers.setVisibility(visible ? View.GONE : View.VISIBLE); - - LinearLayout.LayoutParams lp = - (LinearLayout.LayoutParams) mClockContainer.getLayoutParams(); - lp.width = visible ? 0 : WRAP_CONTENT; - lp.weight = visible ? 1f : 0f; - mClockContainer.setLayoutParams(lp); - - lp = (LinearLayout.LayoutParams) mRightLayout.getLayoutParams(); - lp.width = visible ? 0 : WRAP_CONTENT; - lp.weight = visible ? 1f : 0f; - mRightLayout.setLayoutParams(lp); - } - - private void updateHeadersPadding() { - setContentMargins(mDatePrivacyView, 0, 0); - setContentMargins(mStatusIconsView, 0, 0); - int paddingLeft = 0; - int paddingRight = 0; - - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); - int leftMargin = lp.leftMargin; - int rightMargin = lp.rightMargin; - - // The clock might collide with cutouts, let's shift it out of the way. - // We only do that if the inset is bigger than our own padding, since it's nicer to - // align with - if (mCutOutPaddingLeft > 0) { - // if there's a cutout, let's use at least the rounded corner inset - int cutoutPadding = Math.max(mCutOutPaddingLeft, mRoundedCornerPadding); - paddingLeft = Math.max(cutoutPadding - leftMargin, 0); - } - if (mCutOutPaddingRight > 0) { - // if there's a cutout, let's use at least the rounded corner inset - int cutoutPadding = Math.max(mCutOutPaddingRight, mRoundedCornerPadding); - paddingRight = Math.max(cutoutPadding - rightMargin, 0); - } - - mDatePrivacyView.setPadding(paddingLeft, - mWaterfallTopInset, - paddingRight, - 0); - mStatusIconsView.setPadding(paddingLeft, - mWaterfallTopInset, - paddingRight, - 0); - } - - public void updateEverything() { - post(() -> setClickable(!mExpanded)); - } - private void setContentMargins(View view, int marginStart, int marginEnd) { MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams(); lp.setMarginStart(marginStart); lp.setMarginEnd(marginEnd); view.setLayoutParams(lp); } - - /** - * Scroll the headers away. - * - * @param scrollY the scroll of the QSPanel container - */ - public void setExpandedScrollAmount(int scrollY) { - mStatusIconsView.setScrollY(scrollY); - mDatePrivacyView.setScrollY(scrollY); - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index ccaab1adaf26..64960e6ce23e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -16,154 +16,38 @@ package com.android.systemui.qs; -import android.os.Bundle; - -import com.android.internal.colorextraction.ColorExtractor; -import com.android.systemui.R; -import com.android.systemui.battery.BatteryMeterViewController; -import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.demomode.DemoMode; -import com.android.systemui.demomode.DemoModeController; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; -import com.android.systemui.qs.carrier.QSCarrierGroupController; import com.android.systemui.qs.dagger.QSScope; -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider; -import com.android.systemui.statusbar.phone.StatusBarIconController; -import com.android.systemui.statusbar.phone.StatusBarLocation; -import com.android.systemui.statusbar.phone.StatusIconContainer; -import com.android.systemui.statusbar.policy.Clock; -import com.android.systemui.statusbar.policy.VariableDateViewController; import com.android.systemui.util.ViewController; -import java.util.List; - import javax.inject.Inject; /** * Controller for {@link QuickStatusBarHeader}. */ @QSScope -class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader> implements - ChipVisibilityListener { +class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader> { - private final QSCarrierGroupController mQSCarrierGroupController; private final QuickQSPanelController mQuickQSPanelController; - private final Clock mClockView; - private final StatusBarIconController mStatusBarIconController; - private final DemoModeController mDemoModeController; - private final StatusIconContainer mIconContainer; - private final StatusBarIconController.TintedIconManager mIconManager; - private final DemoMode mDemoModeReceiver; - private final QSExpansionPathInterpolator mQSExpansionPathInterpolator; - private final FeatureFlags mFeatureFlags; - private final BatteryMeterViewController mBatteryMeterViewController; - private final StatusBarContentInsetsProvider mInsetsProvider; - - private final VariableDateViewController mVariableDateViewControllerDateView; - private final VariableDateViewController mVariableDateViewControllerClockDateView; - private final HeaderPrivacyIconsController mPrivacyIconsController; - private boolean mListening; - private SysuiColorExtractor mColorExtractor; - private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener; - @Inject QuickStatusBarHeaderController(QuickStatusBarHeader view, - HeaderPrivacyIconsController headerPrivacyIconsController, - StatusBarIconController statusBarIconController, - DemoModeController demoModeController, - QuickQSPanelController quickQSPanelController, - QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder, - SysuiColorExtractor colorExtractor, - QSExpansionPathInterpolator qsExpansionPathInterpolator, - FeatureFlags featureFlags, - VariableDateViewController.Factory variableDateViewControllerFactory, - BatteryMeterViewController batteryMeterViewController, - StatusBarContentInsetsProvider statusBarContentInsetsProvider, - StatusBarIconController.TintedIconManager.Factory tintedIconManagerFactory) { + QuickQSPanelController quickQSPanelController + ) { super(view); - mPrivacyIconsController = headerPrivacyIconsController; - mStatusBarIconController = statusBarIconController; - mDemoModeController = demoModeController; mQuickQSPanelController = quickQSPanelController; - mQSExpansionPathInterpolator = qsExpansionPathInterpolator; - mFeatureFlags = featureFlags; - mBatteryMeterViewController = batteryMeterViewController; - mInsetsProvider = statusBarContentInsetsProvider; - - mQSCarrierGroupController = qsCarrierGroupControllerBuilder - .setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) - .build(); - mClockView = mView.findViewById(R.id.clock); - mIconContainer = mView.findViewById(R.id.statusIcons); - mVariableDateViewControllerDateView = variableDateViewControllerFactory.create( - mView.requireViewById(R.id.date) - ); - mVariableDateViewControllerClockDateView = variableDateViewControllerFactory.create( - mView.requireViewById(R.id.date_clock) - ); - - mIconManager = tintedIconManagerFactory.create(mIconContainer, StatusBarLocation.QS); - mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); - mColorExtractor = colorExtractor; - mOnColorsChangedListener = (extractor, which) -> { - final boolean lightTheme = mColorExtractor.getNeutralColors().supportsDarkText(); - mClockView.onColorsChanged(lightTheme); - }; - mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener); - - // Don't need to worry about tuner settings for this icon - mBatteryMeterViewController.ignoreTunerUpdates(); - } - - @Override - protected void onInit() { - mBatteryMeterViewController.init(); } @Override protected void onViewAttached() { - mPrivacyIconsController.onParentVisible(); - mPrivacyIconsController.setChipVisibilityListener(this); - mIconContainer.addIgnoredSlot( - getResources().getString(com.android.internal.R.string.status_bar_managed_profile)); - mIconContainer.addIgnoredSlot( - getResources().getString(com.android.internal.R.string.status_bar_alarm_clock)); - mIconContainer.setShouldRestrictIcons(false); - mStatusBarIconController.addIconGroup(mIconManager); - - mView.setIsSingleCarrier(mQSCarrierGroupController.isSingleCarrier()); - mQSCarrierGroupController - .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier); - - List<String> rssiIgnoredSlots = List.of( - getResources().getString(com.android.internal.R.string.status_bar_mobile) - ); - - mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots, - mInsetsProvider, mFeatureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)); - - mDemoModeController.addCallback(mDemoModeReceiver); - - mVariableDateViewControllerDateView.init(); - mVariableDateViewControllerClockDateView.init(); } @Override protected void onViewDetached() { - mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); - mPrivacyIconsController.onParentInvisible(); - mStatusBarIconController.removeIconGroup(mIconManager); - mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); - mDemoModeController.removeCallback(mDemoModeReceiver); setListening(false); } public void setListening(boolean listening) { - mQSCarrierGroupController.setListening(listening); - if (listening == mListening) { return; } @@ -174,48 +58,9 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader if (mQuickQSPanelController.switchTileLayout(false)) { mView.updateResources(); } - - if (listening) { - mPrivacyIconsController.startListening(); - } else { - mPrivacyIconsController.stopListening(); - } - } - - @Override - public void onChipVisibilityRefreshed(boolean visible) { - mView.setChipVisibility(visible); } public void setContentMargins(int marginStart, int marginEnd) { mQuickQSPanelController.setContentMargins(marginStart, marginEnd); } - - private static class ClockDemoModeReceiver implements DemoMode { - private Clock mClockView; - - @Override - public List<String> demoCommands() { - return List.of(COMMAND_CLOCK); - } - - ClockDemoModeReceiver(Clock clockView) { - mClockView = clockView; - } - - @Override - public void dispatchDemoCommand(String command, Bundle args) { - mClockView.dispatchDemoCommand(command, args); - } - - @Override - public void onDemoModeStarted() { - mClockView.onDemoModeStarted(); - } - - @Override - public void onDemoModeFinished() { - mClockView.onDemoModeFinished(); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java index 97390112c3ed..a319fb8d8756 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java @@ -40,7 +40,7 @@ import com.android.systemui.plugins.qs.QSContainerController; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSEditEvent; import com.android.systemui.qs.QSFragment; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -57,7 +57,7 @@ import javax.inject.Inject; @QSScope public class QSCustomizerController extends ViewController<QSCustomizer> { private final TileQueryHelper mTileQueryHelper; - private final QSTileHost mQsTileHost; + private final QSHost mQsHost; private final TileAdapter mTileAdapter; private final ScreenLifecycle mScreenLifecycle; private final KeyguardStateController mKeyguardStateController; @@ -104,12 +104,12 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { @Inject protected QSCustomizerController(QSCustomizer view, TileQueryHelper tileQueryHelper, - QSTileHost qsTileHost, TileAdapter tileAdapter, ScreenLifecycle screenLifecycle, + QSHost qsHost, TileAdapter tileAdapter, ScreenLifecycle screenLifecycle, KeyguardStateController keyguardStateController, LightBarController lightBarController, ConfigurationController configurationController, UiEventLogger uiEventLogger) { super(view); mTileQueryHelper = tileQueryHelper; - mQsTileHost = qsTileHost; + mQsHost = qsHost; mTileAdapter = tileAdapter; mScreenLifecycle = screenLifecycle; mKeyguardStateController = keyguardStateController; @@ -175,7 +175,7 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { private void reset() { - mTileAdapter.resetTileSpecs(QSTileHost.getDefaultSpecs(getContext())); + mTileAdapter.resetTileSpecs(QSHost.getDefaultSpecs(getContext())); } public boolean isCustomizing() { @@ -192,7 +192,7 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { mView.show(x, y, mTileAdapter); mUiEventLogger.log(QSEditEvent.QS_EDIT_OPEN); } - mTileQueryHelper.queryTiles(mQsTileHost); + mTileQueryHelper.queryTiles(mQsHost); mKeyguardStateController.addCallback(mKeyguardCallback); mView.updateNavColors(mLightBarController); } @@ -258,13 +258,13 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { private void save() { if (mTileQueryHelper.isFinished()) { - mTileAdapter.saveSpecs(mQsTileHost); + mTileAdapter.saveSpecs(mQsHost); } } private void setTileSpecs() { List<String> specs = new ArrayList<>(); - for (QSTile tile : mQsTileHost.getTiles()) { + for (QSTile tile : mQsHost.getTiles()) { specs.add(tile.getTileSpec()); } mTileAdapter.setTileSpecs(specs); diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index d84b12c714bd..6a05684a74e8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -45,7 +45,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.qs.QSEditEvent; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.customize.TileAdapter.Holder; import com.android.systemui.qs.customize.TileQueryHelper.TileInfo; import com.android.systemui.qs.customize.TileQueryHelper.TileStateListener; @@ -91,7 +91,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta private ItemDecoration mDecoration; private final MarginTileDecoration mMarginDecoration; private final int mMinNumTiles; - private final QSTileHost mHost; + private final QSHost mHost; private int mEditIndex; private int mTileDividerIndex; private int mFocusIndex; @@ -117,7 +117,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta @Inject public TileAdapter( @QSThemedContext Context context, - QSTileHost qsHost, + QSHost qsHost, UiEventLogger uiEventLogger) { mContext = context; mHost = qsHost; @@ -176,7 +176,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta mMarginDecoration.setHalfMargin(halfMargin); } - public void saveSpecs(QSTileHost host) { + public void saveSpecs(QSHost host) { List<String> newSpecs = new ArrayList<>(); clearAccessibilityState(); for (int i = 1; i < mTiles.size() && mTiles.get(i) != null; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java index 32a7916da70f..d9f448493591 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java @@ -38,7 +38,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTile.State; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon; @@ -85,7 +85,7 @@ public class TileQueryHelper { mListener = listener; } - public void queryTiles(QSTileHost host) { + public void queryTiles(QSHost host) { mTiles.clear(); mSpecs.clear(); mFinished = false; @@ -97,7 +97,7 @@ public class TileQueryHelper { return mFinished; } - private void addCurrentAndStockTiles(QSTileHost host) { + private void addCurrentAndStockTiles(QSHost host) { String stock = mContext.getString(R.string.quick_settings_tiles_stock); String current = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.QS_TILES); @@ -153,14 +153,14 @@ public class TileQueryHelper { private class TileCollector implements QSTile.Callback { private final List<TilePair> mQSTileList = new ArrayList<>(); - private final QSTileHost mQSTileHost; + private final QSHost mQSHost; - TileCollector(List<QSTile> tilesToAdd, QSTileHost host) { + TileCollector(List<QSTile> tilesToAdd, QSHost host) { for (QSTile tile: tilesToAdd) { TilePair pair = new TilePair(tile); mQSTileList.add(pair); } - mQSTileHost = host; + mQSHost = host; if (tilesToAdd.isEmpty()) { mBgExecutor.execute(this::finished); } @@ -168,7 +168,7 @@ public class TileQueryHelper { private void finished() { notifyTilesChanged(false); - addPackageTiles(mQSTileHost); + addPackageTiles(mQSHost); } private void startListening() { @@ -207,7 +207,7 @@ public class TileQueryHelper { } } - private void addPackageTiles(final QSTileHost host) { + private void addPackageTiles(final QSHost host) { mBgExecutor.execute(() -> { Collection<QSTile> params = host.getTiles(); PackageManager pm = mContext.getPackageManager(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java index 01eb636f75d6..ce6b8d499ee0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -24,10 +24,8 @@ import android.view.LayoutInflater; import android.view.View; import com.android.systemui.R; -import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.plugins.qs.QS; -import com.android.systemui.privacy.OngoingPrivacyChip; import com.android.systemui.qs.QSContainerImpl; import com.android.systemui.qs.QSFooter; import com.android.systemui.qs.QSFooterView; @@ -37,7 +35,6 @@ import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickStatusBarHeader; import com.android.systemui.qs.customize.QSCustomizer; -import com.android.systemui.statusbar.phone.StatusIconContainer; import javax.inject.Named; @@ -106,12 +103,6 @@ public interface QSFragmentModule { /** */ @Provides - static BatteryMeterView providesBatteryMeterView(QuickStatusBarHeader quickStatusBarHeader) { - return quickStatusBarHeader.findViewById(R.id.batteryRemainingIcon); - } - - /** */ - @Provides static QSFooterView providesQSFooterView(@RootView View view) { return view.findViewById(R.id.qs_footer); } @@ -144,18 +135,4 @@ public interface QSFragmentModule { static boolean providesQSUsingCollapsedLandscapeMedia(Context context) { return useCollapsedMediaInLandscape(context.getResources()); } - - /** */ - @Provides - @QSScope - static OngoingPrivacyChip providesPrivacyChip(QuickStatusBarHeader qsHeader) { - return qsHeader.findViewById(R.id.privacy_chip); - } - - /** */ - @Provides - @QSScope - static StatusIconContainer providesStatusIconContainer(QuickStatusBarHeader qsHeader) { - return qsHeader.findViewById(R.id.statusIcons); - } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java index 27ae1710467b..431d6e847207 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java @@ -67,7 +67,7 @@ public interface QSModule { static AutoTileManager provideAutoTileManager( Context context, AutoAddTracker.Builder autoAddTrackerBuilder, - QSTileHost host, + QSHost host, @Background Handler handler, SecureSettings secureSettings, HotspotController hotspotController, diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt index 237b66e79ee5..d9e5580fc14c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt @@ -25,13 +25,13 @@ import android.os.RemoteException import android.util.Log import androidx.annotation.VisibleForTesting import com.android.internal.statusbar.IAddTileResultCallback +import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost +import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.commandline.Command import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.SystemUIDialog -import com.android.systemui.R -import com.android.systemui.statusbar.CommandQueue import java.io.PrintWriter import java.util.concurrent.atomic.AtomicBoolean import java.util.function.Consumer @@ -40,14 +40,14 @@ import javax.inject.Inject private const val TAG = "TileServiceRequestController" /** - * Controller to interface between [TileRequestDialog] and [QSTileHost]. + * Controller to interface between [TileRequestDialog] and [QSHost]. */ class TileServiceRequestController constructor( - private val qsTileHost: QSTileHost, + private val qsHost: QSHost, private val commandQueue: CommandQueue, private val commandRegistry: CommandRegistry, private val eventLogger: TileRequestDialogEventLogger, - private val dialogCreator: () -> TileRequestDialog = { TileRequestDialog(qsTileHost.context) } + private val dialogCreator: () -> TileRequestDialog = { TileRequestDialog(qsHost.context) } ) { companion object { @@ -93,7 +93,7 @@ class TileServiceRequestController constructor( } private fun addTile(componentName: ComponentName) { - qsTileHost.addTile(componentName, true) + qsHost.addTile(componentName, true) } @VisibleForTesting @@ -158,7 +158,7 @@ class TileServiceRequestController constructor( private fun isTileAlreadyAdded(componentName: ComponentName): Boolean { val spec = CustomTile.toSpec(componentName) - return qsTileHost.indexOf(spec) != -1 + return qsHost.indexOf(spec) != -1 } inner class TileServiceRequestCommand : Command { @@ -194,13 +194,13 @@ class TileServiceRequestController constructor( private val commandQueue: CommandQueue, private val commandRegistry: CommandRegistry ) { - fun create(qsTileHost: QSTileHost): TileServiceRequestController { + fun create(qsHost: QSHost): TileServiceRequestController { return TileServiceRequestController( - qsTileHost, + qsHost, commandQueue, commandRegistry, TileRequestDialogEventLogger() ) } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index 84a18d8dd365..adc71657e680 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -39,7 +39,7 @@ import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -68,22 +68,24 @@ public class TileServices extends IQSService.Stub { private final Context mContext; private final Handler mMainHandler; private final Provider<Handler> mHandlerProvider; - private final QSTileHost mHost; + private final QSHost mHost; private final KeyguardStateController mKeyguardStateController; private final BroadcastDispatcher mBroadcastDispatcher; private final CommandQueue mCommandQueue; private final UserTracker mUserTracker; + private final StatusBarIconController mStatusBarIconController; private int mMaxBound = DEFAULT_MAX_BOUND; @Inject public TileServices( - QSTileHost host, + QSHost host, @Main Provider<Handler> handlerProvider, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker, KeyguardStateController keyguardStateController, - CommandQueue commandQueue) { + CommandQueue commandQueue, + StatusBarIconController statusBarIconController) { mHost = host; mKeyguardStateController = keyguardStateController; mContext = mHost.getContext(); @@ -92,6 +94,7 @@ public class TileServices extends IQSService.Stub { mMainHandler = mHandlerProvider.get(); mUserTracker = userTracker; mCommandQueue = commandQueue; + mStatusBarIconController = statusBarIconController; mCommandQueue.addCallback(mRequestListeningCallback); } @@ -99,7 +102,7 @@ public class TileServices extends IQSService.Stub { return mContext; } - public QSTileHost getHost() { + public QSHost getHost() { return mHost; } @@ -131,8 +134,7 @@ public class TileServices extends IQSService.Stub { mTiles.remove(tile.getComponent()); final String slot = tile.getComponent().getClassName(); // TileServices doesn't know how to add more than 1 icon per slot, so remove all - mMainHandler.post(() -> mHost.getIconController() - .removeAllIconsForExternalSlot(slot)); + mMainHandler.post(() -> mStatusBarIconController.removeAllIconsForSlot(slot)); } } @@ -309,7 +311,7 @@ public class TileServices extends IQSService.Stub { mMainHandler.post(new Runnable() { @Override public void run() { - StatusBarIconController iconController = mHost.getIconController(); + StatusBarIconController iconController = mStatusBarIconController; iconController.setIcon(componentName.getClassName(), statusIcon); iconController.setExternalIcon(componentName.getClassName()); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManager.kt b/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManager.kt index e360ec20bd9b..a78b0aa97ea1 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManager.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManager.kt @@ -31,7 +31,7 @@ operator fun ConstraintChange?.plus(other: ConstraintChange?): ConstraintChange? /** * Contains all changes that need to be performed to the different [ConstraintSet] in - * [LargeScreenShadeHeaderController]. + * [ShadeHeaderController]. */ data class ConstraintsChanges( val qqsConstraintsChanges: ConstraintChange? = null, @@ -46,7 +46,7 @@ data class ConstraintsChanges( } /** - * Determines [ConstraintChanges] for [LargeScreenShadeHeaderController] based on configurations. + * Determines [ConstraintChanges] for [ShadeHeaderController] based on configurations. * * Given that the number of different scenarios is not that large, having specific methods instead * of a full map between state and [ConstraintSet] was preferred. diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt index 639172f9e37a..b445000c467d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt @@ -48,7 +48,10 @@ constructor( setOf( ViewIdToTranslate(R.id.quick_settings_panel, START, filterShade), ViewIdToTranslate(R.id.notification_stack_scroller, END, filterShade), - ViewIdToTranslate(R.id.rightLayout, END, filterShade), + ViewIdToTranslate(R.id.statusIcons, END, filterShade), + ViewIdToTranslate(R.id.privacy_container, END, filterShade), + ViewIdToTranslate(R.id.batteryRemainingIcon, END, filterShade), + ViewIdToTranslate(R.id.carrier_group, END, filterShade), ViewIdToTranslate(R.id.clock, START, filterShade), ViewIdToTranslate(R.id.date, START, filterShade)), progressProvider = progressProvider) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 2175a3358396..e53eea90ad33 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -336,7 +336,7 @@ public final class NotificationPanelViewController implements Dumpable { private final ScrimController mScrimController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final TapAgainViewController mTapAgainViewController; - private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; + private final ShadeHeaderController mShadeHeaderController; private final boolean mVibrateOnOpening; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private final FlingAnimationUtils mFlingAnimationUtilsClosing; @@ -465,7 +465,7 @@ public final class NotificationPanelViewController implements Dumpable { private int mPanelAlpha; private Runnable mPanelAlphaEndAction; private float mBottomAreaShadeAlpha; - private final ValueAnimator mBottomAreaShadeAlphaAnimator; + final ValueAnimator mBottomAreaShadeAlphaAnimator; private final AnimatableProperty mPanelAlphaAnimator = AnimatableProperty.from("panelAlpha", NotificationPanelView::setPanelAlphaInternal, NotificationPanelView::getCurrentPanelAlpha, @@ -597,7 +597,6 @@ public final class NotificationPanelViewController implements Dumpable { private int mLockscreenToDreamingTransitionTranslationY; private int mGoneToDreamingTransitionTranslationY; private int mLockscreenToOccludedTransitionTranslationY; - private boolean mUnocclusionTransitionFlagEnabled = false; private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */, mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */); @@ -693,7 +692,7 @@ public final class NotificationPanelViewController implements Dumpable { FragmentService fragmentService, ContentResolver contentResolver, RecordingController recordingController, - LargeScreenShadeHeaderController largeScreenShadeHeaderController, + ShadeHeaderController shadeHeaderController, ScreenOffAnimationController screenOffAnimationController, LockscreenGestureLogger lockscreenGestureLogger, ShadeExpansionStateManager shadeExpansionStateManager, @@ -813,7 +812,7 @@ public final class NotificationPanelViewController implements Dumpable { mSplitShadeEnabled = LargeScreenUtils.shouldUseSplitNotificationShade(mResources); mView.setWillNotDraw(!DEBUG_DRAWABLE); - mLargeScreenShadeHeaderController = largeScreenShadeHeaderController; + mShadeHeaderController = shadeHeaderController; mLayoutInflater = layoutInflater; mFeatureFlags = featureFlags; mFalsingCollector = falsingCollector; @@ -886,7 +885,6 @@ public final class NotificationPanelViewController implements Dumpable { mNotificationPanelUnfoldAnimationController = unfoldComponent.map( SysUIUnfoldComponent::getNotificationPanelUnfoldAnimationController); - mUnocclusionTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION); updateUserSwitcherFlags(); mKeyguardBottomAreaViewModel = keyguardBottomAreaViewModel; mKeyguardBottomAreaInteractor = keyguardBottomAreaInteractor; @@ -1040,67 +1038,55 @@ public final class NotificationPanelViewController implements Dumpable { } mTapAgainViewController.init(); - mLargeScreenShadeHeaderController.init(); + mShadeHeaderController.init(); mKeyguardUnfoldTransition.ifPresent(u -> u.setup(mView)); mNotificationPanelUnfoldAnimationController.ifPresent(controller -> controller.setup(mNotificationContainerParent)); - if (mUnocclusionTransitionFlagEnabled) { - // Dreaming->Lockscreen - collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(), - mDreamingToLockscreenTransition, mMainDispatcher); - collectFlow(mView, mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha(), - setTransitionAlpha(mNotificationStackScrollLayoutController), - mMainDispatcher); - collectFlow(mView, mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY( - mDreamingToLockscreenTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), - mMainDispatcher); - - // Occluded->Lockscreen - collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(), - mOccludedToLockscreenTransition, mMainDispatcher); - collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(), - setTransitionAlpha(mNotificationStackScrollLayoutController), - mMainDispatcher); - collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY( - mOccludedToLockscreenTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), - mMainDispatcher); - - // Lockscreen->Dreaming - collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(), - mLockscreenToDreamingTransition, mMainDispatcher); - collectFlow(mView, mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha(), - setTransitionAlpha(mNotificationStackScrollLayoutController), - mMainDispatcher); - collectFlow(mView, mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY( - mLockscreenToDreamingTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), - mMainDispatcher); - - // Gone->Dreaming - collectFlow(mView, mKeyguardTransitionInteractor.getGoneToDreamingTransition(), - mGoneToDreamingTransition, mMainDispatcher); - collectFlow(mView, mGoneToDreamingTransitionViewModel.getLockscreenAlpha(), - setTransitionAlpha(mNotificationStackScrollLayoutController), - mMainDispatcher); - collectFlow(mView, mGoneToDreamingTransitionViewModel.lockscreenTranslationY( - mGoneToDreamingTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), - mMainDispatcher); - - // Lockscreen->Occluded - collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToOccludedTransition(), - mLockscreenToOccludedTransition, mMainDispatcher); - collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(), - setTransitionAlpha(mNotificationStackScrollLayoutController), - mMainDispatcher); - collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY( - mLockscreenToOccludedTransitionTranslationY), - setTransitionY(mNotificationStackScrollLayoutController), - mMainDispatcher); - } + // Dreaming->Lockscreen + collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(), + mDreamingToLockscreenTransition, mMainDispatcher); + collectFlow(mView, mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha(), + setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY( + mDreamingToLockscreenTransitionTranslationY), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + + // Occluded->Lockscreen + collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(), + mOccludedToLockscreenTransition, mMainDispatcher); + collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(), + setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY( + mOccludedToLockscreenTransitionTranslationY), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + + // Lockscreen->Dreaming + collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(), + mLockscreenToDreamingTransition, mMainDispatcher); + collectFlow(mView, mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha(), + setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY( + mLockscreenToDreamingTransitionTranslationY), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + + // Gone->Dreaming + collectFlow(mView, mKeyguardTransitionInteractor.getGoneToDreamingTransition(), + mGoneToDreamingTransition, mMainDispatcher); + collectFlow(mView, mGoneToDreamingTransitionViewModel.getLockscreenAlpha(), + setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, mGoneToDreamingTransitionViewModel.lockscreenTranslationY( + mGoneToDreamingTransitionTranslationY), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); + + // Lockscreen->Occluded + collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToOccludedTransition(), + mLockscreenToOccludedTransition, mMainDispatcher); + collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(), + setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher); + collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY( + mLockscreenToOccludedTransitionTranslationY), + setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher); } @VisibleForTesting @@ -1197,6 +1183,7 @@ public final class NotificationPanelViewController implements Dumpable { } private void onSplitShadeEnabledChanged() { + mShadeLog.logSplitShadeChanged(mSplitShadeEnabled); // when we switch between split shade and regular shade we want to enforce setting qs to // the default state: expanded for split shade and collapsed otherwise if (!isOnKeyguard() && mPanelExpanded) { @@ -1777,7 +1764,7 @@ public final class NotificationPanelViewController implements Dumpable { if (animate && !isFullyCollapsed()) { animateCloseQs(true); } else { - mQsController.closeQs(); + closeQsIfPossible(); } mNotificationStackScrollLayoutController.setOverScrollAmount(0f, true /* onTop */, animate, !animate /* cancelAnimators */); @@ -1914,7 +1901,6 @@ public final class NotificationPanelViewController implements Dumpable { // we want to perform an overshoot animation when flinging open final boolean addOverscroll = expand - && !mSplitShadeEnabled // Split shade has its own overscroll logic && mStatusBarStateController.getState() != KEYGUARD && mOverExpansion == 0.0f && vel >= 0; @@ -2480,9 +2466,6 @@ public final class NotificationPanelViewController implements Dumpable { } private void onExpandingFinished() { - if (!mUnocclusionTransitionFlagEnabled) { - mScrimController.onExpandingFinished(); - } mNotificationStackScrollLayoutController.onExpansionStopped(); mHeadsUpManager.onExpandingFinished(); mConversationNotificationManager.onNotificationPanelExpandStateChanged(isFullyCollapsed()); @@ -2590,9 +2573,14 @@ public final class NotificationPanelViewController implements Dumpable { return; } mOverExpansion = overExpansion; - // Translating the quick settings by half the overexpansion to center it in the background - // frame - mQsController.updateQsFrameTranslation(); + if (mSplitShadeEnabled) { + mQsController.setOverScrollAmount((int) overExpansion); + mScrimController.setNotificationsOverScrollAmount((int) overExpansion); + } else { + // Translating the quick settings by half the overexpansion to center it in the + // background frame + mQsController.updateQsFrameTranslation(); + } mNotificationStackScrollLayoutController.setOverExpansion(overExpansion); } @@ -3332,7 +3320,7 @@ public final class NotificationPanelViewController implements Dumpable { } public void disable(int state1, int state2, boolean animated) { - mLargeScreenShadeHeaderController.disable(state1, state2, animated); + mShadeHeaderController.disable(state1, state2, animated); } /** @@ -3594,7 +3582,7 @@ public final class NotificationPanelViewController implements Dumpable { private void fling(float vel, boolean expand, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { - float target = expand ? getMaxPanelHeight() : 0; + float target = expand ? getMaxPanelTransitionDistance() : 0; if (!expand) { setClosing(true); } @@ -3679,7 +3667,7 @@ public final class NotificationPanelViewController implements Dumpable { float maxPanelHeight = getMaxPanelTransitionDistance(); if (mHeightAnimator == null) { // Split shade has its own overscroll logic - if (mTracking && !mSplitShadeEnabled) { + if (mTracking) { float overExpansionPixels = Math.max(0, h - maxPanelHeight); setOverExpansionInternal(overExpansionPixels, true /* isFromGesture */); } @@ -4025,9 +4013,17 @@ public final class NotificationPanelViewController implements Dumpable { return mExpandingFromHeadsUp; } - /** TODO: remove need for this delegate (b/254870148) */ - public void closeQs() { - mQsController.closeQs(); + /** + * We don't always want to close QS when requested as shade might be in a different state + * already e.g. when going from collapse to expand very quickly. In that case StatusBar + * window might send signal to collapse QS but we might be already expanding and in split + * shade QS are always expanded + */ + private void closeQsIfPossible() { + boolean openOrOpening = isShadeFullyOpen() || isExpanding(); + if (!(mSplitShadeEnabled && openOrOpening)) { + mQsController.closeQs(); + } } /** TODO: remove need for this delegate (b/254870148) */ diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 60fa865b83bc..87350b465895 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -38,8 +38,6 @@ import com.android.keyguard.dagger.KeyguardBouncerComponent; import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dock.DockManager; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; @@ -132,7 +130,6 @@ public class NotificationShadeWindowViewController { NotificationInsetsController notificationInsetsController, AmbientState ambientState, PulsingGestureListener pulsingGestureListener, - FeatureFlags featureFlags, KeyguardBouncerViewModel keyguardBouncerViewModel, KeyguardBouncerComponent.Factory keyguardBouncerComponentFactory, AlternateBouncerInteractor alternateBouncerInteractor, @@ -165,10 +162,8 @@ public class NotificationShadeWindowViewController { keyguardBouncerViewModel, keyguardBouncerComponentFactory); - if (featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION)) { - collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(), - mLockscreenToDreamingTransition); - } + collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(), + mLockscreenToDreamingTransition); } /** diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt index de02115184b6..fb7c5c2e31fa 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt @@ -29,8 +29,6 @@ import androidx.constraintlayout.widget.ConstraintSet.START import androidx.constraintlayout.widget.ConstraintSet.TOP import com.android.systemui.R import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.fragments.FragmentService import com.android.systemui.navigationbar.NavigationModeController import com.android.systemui.plugins.qs.QS @@ -49,14 +47,13 @@ import kotlin.reflect.KMutableProperty0 internal const val INSET_DEBOUNCE_MILLIS = 500L class NotificationsQSContainerController @Inject constructor( - view: NotificationsQuickSettingsContainer, - private val navigationModeController: NavigationModeController, - private val overviewProxyService: OverviewProxyService, - private val largeScreenShadeHeaderController: LargeScreenShadeHeaderController, - private val shadeExpansionStateManager: ShadeExpansionStateManager, - private val featureFlags: FeatureFlags, - private val fragmentService: FragmentService, - @Main private val delayableExecutor: DelayableExecutor + view: NotificationsQuickSettingsContainer, + private val navigationModeController: NavigationModeController, + private val overviewProxyService: OverviewProxyService, + private val shadeHeaderController: ShadeHeaderController, + private val shadeExpansionStateManager: ShadeExpansionStateManager, + private val fragmentService: FragmentService, + @Main private val delayableExecutor: DelayableExecutor ) : ViewController<NotificationsQuickSettingsContainer>(view), QSContainerController { private var qsExpanded = false @@ -75,8 +72,6 @@ class NotificationsQSContainerController @Inject constructor( private var panelMarginHorizontal = 0 private var topMargin = 0 - private val useCombinedQSHeaders = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS) - private var isGestureNavigation = true private var taskbarVisible = false private val taskbarVisibilityListener: OverviewProxyListener = object : OverviewProxyListener { @@ -184,7 +179,7 @@ class NotificationsQSContainerController @Inject constructor( override fun setCustomizerShowing(showing: Boolean, animationDuration: Long) { if (showing != isQSCustomizing) { isQSCustomizing = showing - largeScreenShadeHeaderController.startCustomizingAnimation(showing, animationDuration) + shadeHeaderController.startCustomizingAnimation(showing, animationDuration) updateBottomSpacing() } } @@ -250,9 +245,7 @@ class NotificationsQSContainerController @Inject constructor( if (largeScreenShadeHeaderActive) { constraintSet.constrainHeight(R.id.split_shade_status_bar, largeScreenShadeHeaderHeight) } else { - if (useCombinedQSHeaders) { - constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT) - } + constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT) } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index d041212d24c7..099ad9473673 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -56,7 +56,6 @@ import com.android.systemui.animation.Interpolators; import com.android.systemui.classifier.Classifier; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.media.controls.pipeline.MediaDataManager; import com.android.systemui.media.controls.ui.MediaHierarchyManager; @@ -110,7 +109,7 @@ public class QuickSettingsController { private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final NotificationShadeDepthController mDepthController; - private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; + private final ShadeHeaderController mShadeHeaderController; private final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; private final KeyguardStateController mKeyguardStateController; private final KeyguardBypassController mKeyguardBypassController; @@ -194,7 +193,12 @@ public class QuickSettingsController { private boolean mAnimatingHiddenFromCollapsed; private boolean mVisible; private float mExpansionHeight; + /** + * QS height when QS expansion fraction is 0 so when QS is collapsed. That state doesn't really + * exist for split shade so currently this value is always 0 then. + */ private int mMinExpansionHeight; + /** QS height when QS expansion fraction is 1 so qs is fully expanded */ private int mMaxExpansionHeight; /** Expansion fraction of the notification shade */ private float mShadeExpandedFraction; @@ -276,7 +280,7 @@ public class QuickSettingsController { NotificationStackScrollLayoutController notificationStackScrollLayoutController, LockscreenShadeTransitionController lockscreenShadeTransitionController, NotificationShadeDepthController notificationShadeDepthController, - LargeScreenShadeHeaderController largeScreenShadeHeaderController, + ShadeHeaderController shadeHeaderController, StatusBarTouchableRegionManager statusBarTouchableRegionManager, KeyguardStateController keyguardStateController, KeyguardBypassController keyguardBypassController, @@ -315,7 +319,7 @@ public class QuickSettingsController { mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mDepthController = notificationShadeDepthController; - mLargeScreenShadeHeaderController = largeScreenShadeHeaderController; + mShadeHeaderController = shadeHeaderController; mStatusBarTouchableRegionManager = statusBarTouchableRegionManager; mKeyguardStateController = keyguardStateController; mKeyguardBypassController = keyguardBypassController; @@ -396,18 +400,10 @@ public class QuickSettingsController { mResources.getDimensionPixelSize(R.dimen.large_screen_shade_header_height); int topMargin = mUseLargeScreenShadeHeader ? mLargeScreenShadeHeaderHeight : mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top); - mLargeScreenShadeHeaderController.setLargeScreenActive(mUseLargeScreenShadeHeader); + mShadeHeaderController.setLargeScreenActive(mUseLargeScreenShadeHeader); mAmbientState.setStackTopMargin(topMargin); - // TODO: When the flag is eventually removed, it means that we have a single view that is - // the same height in QQS and in Large Screen (large_screen_shade_header_height). Eventually - // the concept of largeScreenHeader or quickQsHeader will disappear outside of the class - // that controls the view as the offset needs to be the same regardless. - if (mUseLargeScreenShadeHeader || mFeatureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)) { - mQuickQsHeaderHeight = mLargeScreenShadeHeaderHeight; - } else { - mQuickQsHeaderHeight = SystemBarUtils.getQuickQsOffsetHeight(mPanelView.getContext()); - } + mQuickQsHeaderHeight = mLargeScreenShadeHeaderHeight; mEnableClipping = mResources.getBoolean(R.bool.qs_enable_clipping); } @@ -434,6 +430,11 @@ public class QuickSettingsController { updateExpansionEnabledAmbient(); } + @VisibleForTesting + void setStatusBarMinHeight(int height) { + mStatusBarMinHeight = height; + } + int getHeaderHeight() { return mQs.getHeader().getHeight(); } @@ -483,7 +484,8 @@ public class QuickSettingsController { } /** Returns whether or not event should open QS */ - private boolean isOpenQsEvent(MotionEvent event) { + @VisibleForTesting + boolean isOpenQsEvent(MotionEvent event) { final int pointerCount = event.getPointerCount(); final int action = event.getActionMasked(); @@ -663,8 +665,15 @@ public class QuickSettingsController { mDozing = dozing; } - /** set QS state to closed */ + /** + * This method closes QS but in split shade it should be used only in special cases: to make + * sure QS closes when shade is closed as well. Otherwise it will result in QS disappearing + * from split shade + */ public void closeQs() { + if (mSplitShadeEnabled) { + mShadeLog.d("Closing QS while in split shade"); + } cancelExpansionAnimation(); setExpansionHeight(getMinExpansionHeight()); // qsExpandImmediate is a safety latch in case we're calling closeQS while we're in the @@ -693,6 +702,7 @@ public class QuickSettingsController { /** update Qs height state */ public void setExpansionHeight(float height) { + checkCorrectSplitShadeState(height); int maxHeight = getMaxExpansionHeight(); height = Math.min(Math.max( height, getMinExpansionHeight()), maxHeight); @@ -714,6 +724,14 @@ public class QuickSettingsController { } } + /** TODO(b/269742565) Remove this logging */ + private void checkCorrectSplitShadeState(float height) { + if (mSplitShadeEnabled && height == 0 + && mPanelViewControllerLazy.get().isShadeFullyOpen()) { + Log.wtfStack(TAG, "qsExpansion set to 0 while split shade is expanding or open"); + } + } + /** */ public void setHeightOverrideToDesiredHeight() { if (isSizeChangeAnimationRunning() && isQsFragmentCreated()) { @@ -803,6 +821,10 @@ public class QuickSettingsController { } } + void setOverScrollAmount(int overExpansion) { + mQs.setOverScrollAmount(overExpansion); + } + private void setOverScrolling(boolean overscrolling) { mStackScrollerOverscrolling = overscrolling; if (mQs != null) { @@ -845,6 +867,11 @@ public class QuickSettingsController { mTwoFingerExpandPossible = expandPossible; } + @VisibleForTesting + boolean isTwoFingerExpandPossible() { + return mTwoFingerExpandPossible; + } + /** Called when Qs starts expanding */ private void onExpansionStarted() { cancelExpansionAnimation(); @@ -920,9 +947,9 @@ public class QuickSettingsController { float shadeExpandedFraction = mBarState == KEYGUARD ? mPanelViewControllerLazy.get().getLockscreenShadeDragProgress() : mShadeExpandedFraction; - mLargeScreenShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); - mLargeScreenShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); - mLargeScreenShadeHeaderController.setQsVisible(mVisible); + mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); + mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); + mShadeHeaderController.setQsVisible(mVisible); } /** */ @@ -1361,7 +1388,8 @@ public class QuickSettingsController { return mTouchAboveFalsingThreshold; } - private void onHeightChanged() { + @VisibleForTesting + void onHeightChanged() { mMaxExpansionHeight = isQsFragmentCreated() ? mQs.getDesiredHeight() : 0; if (mExpanded && mFullyExpanded) { mExpansionHeight = mMaxExpansionHeight; @@ -1391,7 +1419,7 @@ public class QuickSettingsController { } private void onScroll(int scrollY) { - mLargeScreenShadeHeaderController.setQsScrollY(scrollY); + mShadeHeaderController.setQsScrollY(scrollY); if (scrollY > 0 && !mFullyExpanded) { // TODO (b/265193930): remove dependency on NPVC // If we are scrolling QS, we should be fully expanded. @@ -1666,7 +1694,8 @@ public class QuickSettingsController { return false; } - private void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { + @VisibleForTesting + void onPanelExpansionChanged(ShadeExpansionChangeEvent event) { mShadeExpandedFraction = event.getFraction(); } @@ -1710,12 +1739,16 @@ public class QuickSettingsController { */ private void flingQs(float vel, int type, final Runnable onFinishRunnable, boolean isClick) { + mShadeLog.flingQs(type, isClick); float target; switch (type) { case FLING_EXPAND: target = getMaxExpansionHeight(); break; case FLING_COLLAPSE: + if (mSplitShadeEnabled) { // TODO:(b/269742565) remove below log + Log.wtfStack(TAG, "FLING_COLLAPSE called in split shade"); + } target = getMinExpansionHeight(); break; case FLING_HIDE: diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java index 026673adb86b..c1369935db54 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java @@ -270,8 +270,6 @@ public final class ShadeControllerImpl implements ShadeController { // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868) mNotificationPanelViewController.collapsePanel(false, false, 1.0f); - mNotificationPanelViewController.closeQs(); - mExpandedVisible = false; notifyVisibilityChanged(false); diff --git a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index 9d8ed460dece..37773e952875 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -41,22 +41,21 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.HEADER_TRANSITION_ID -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.QS_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.HEADER_TRANSITION_ID +import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_TRANSITION_ID +import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONSTRAINT import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope -import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_BATTERY_CONTROLLER -import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_SHADE_HEADER +import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SHADE_HEADER import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.VariableDateView @@ -67,30 +66,27 @@ import javax.inject.Inject import javax.inject.Named /** - * Controller for QS header on Large Screen width (large screen + landscape). + * Controller for QS header. * - * Additionally, this serves as the staging ground for the combined QS headers. A single - * [MotionLayout] that changes constraints depending on the configuration and can animate the - * expansion of the headers in small screen portrait. - * - * [header] will be a [MotionLayout] if [Flags.COMBINED_QS_HEADERS] is enabled. In this case, the - * [MotionLayout] has one transitions: + * [header] is a [MotionLayout] that has two transitions: * * [HEADER_TRANSITION_ID]: [QQS_HEADER_CONSTRAINT] <-> [QS_HEADER_CONSTRAINT] for portrait - * handheld device configuration. + * handheld device configuration. + * * [LARGE_SCREEN_HEADER_TRANSITION_ID]: [LARGE_SCREEN_HEADER_CONSTRAINT] for all other + * configurations */ @CentralSurfacesScope -class LargeScreenShadeHeaderController @Inject constructor( - @Named(LARGE_SCREEN_SHADE_HEADER) private val header: View, +class ShadeHeaderController +@Inject +constructor( + @Named(SHADE_HEADER) private val header: MotionLayout, private val statusBarIconController: StatusBarIconController, private val tintedIconManagerFactory: StatusBarIconController.TintedIconManager.Factory, private val privacyIconsController: HeaderPrivacyIconsController, private val insetsProvider: StatusBarContentInsetsProvider, private val configurationController: ConfigurationController, private val variableDateViewControllerFactory: VariableDateViewController.Factory, - @Named(LARGE_SCREEN_BATTERY_CONTROLLER) - private val batteryMeterViewController: BatteryMeterViewController, + @Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController, private val dumpManager: DumpManager, - private val featureFlags: FeatureFlags, private val qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder, private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager, private val demoModeController: DemoModeController, @@ -98,30 +94,24 @@ class LargeScreenShadeHeaderController @Inject constructor( ) : ViewController<View>(header), Dumpable { companion object { - /** IDs for transitions and constraints for the [MotionLayout]. These are only used when - * [Flags.COMBINED_QS_HEADERS] is enabled. - */ - @VisibleForTesting - internal val HEADER_TRANSITION_ID = R.id.header_transition + /** IDs for transitions and constraints for the [MotionLayout]. */ + @VisibleForTesting internal val HEADER_TRANSITION_ID = R.id.header_transition @VisibleForTesting internal val LARGE_SCREEN_HEADER_TRANSITION_ID = R.id.large_screen_header_transition - @VisibleForTesting - internal val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint - @VisibleForTesting - internal val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint + @VisibleForTesting internal val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint + @VisibleForTesting internal val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint @VisibleForTesting internal val LARGE_SCREEN_HEADER_CONSTRAINT = R.id.large_screen_header_constraint - private fun Int.stateToString() = when (this) { - QQS_HEADER_CONSTRAINT -> "QQS Header" - QS_HEADER_CONSTRAINT -> "QS Header" - LARGE_SCREEN_HEADER_CONSTRAINT -> "Large Screen Header" - else -> "Unknown state $this" - } + private fun Int.stateToString() = + when (this) { + QQS_HEADER_CONSTRAINT -> "QQS Header" + QS_HEADER_CONSTRAINT -> "QS Header" + LARGE_SCREEN_HEADER_CONSTRAINT -> "Large Screen Header" + else -> "Unknown state $this" + } } - private val combinedHeaders = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS) - private lateinit var iconManager: StatusBarIconController.TintedIconManager private lateinit var carrierIconSlots: List<String> private lateinit var qsCarrierGroupController: QSCarrierGroupController @@ -180,9 +170,7 @@ class LargeScreenShadeHeaderController @Inject constructor( onHeaderStateChanged() } - /** - * Expansion fraction of the QQS/QS shade. This is not the expansion between QQS <-> QS. - */ + /** Expansion fraction of the QQS/QS shade. This is not the expansion between QQS <-> QS. */ var shadeExpandedFraction = -1f set(value) { if (qsVisible && field != value) { @@ -191,9 +179,7 @@ class LargeScreenShadeHeaderController @Inject constructor( } } - /** - * Expansion fraction of the QQS <-> QS animation. - */ + /** Expansion fraction of the QQS <-> QS animation. */ var qsExpandedFraction = -1f set(value) { if (visible && field != value) { @@ -202,9 +188,7 @@ class LargeScreenShadeHeaderController @Inject constructor( } } - /** - * Current scroll of QS. - */ + /** Current scroll of QS. */ var qsScrollY = 0 set(value) { if (field != value) { @@ -213,40 +197,41 @@ class LargeScreenShadeHeaderController @Inject constructor( } } - private val insetListener = View.OnApplyWindowInsetsListener { view, insets -> - updateConstraintsForInsets(view as MotionLayout, insets) - lastInsets = WindowInsets(insets) + private val insetListener = + View.OnApplyWindowInsetsListener { view, insets -> + updateConstraintsForInsets(view as MotionLayout, insets) + lastInsets = WindowInsets(insets) - view.onApplyWindowInsets(insets) - } + view.onApplyWindowInsets(insets) + } - private val demoModeReceiver = object : DemoMode { - override fun demoCommands() = listOf(DemoMode.COMMAND_CLOCK) - override fun dispatchDemoCommand(command: String, args: Bundle) = - clock.dispatchDemoCommand(command, args) - override fun onDemoModeStarted() = clock.onDemoModeStarted() - override fun onDemoModeFinished() = clock.onDemoModeFinished() - } + private val demoModeReceiver = + object : DemoMode { + override fun demoCommands() = listOf(DemoMode.COMMAND_CLOCK) + override fun dispatchDemoCommand(command: String, args: Bundle) = + clock.dispatchDemoCommand(command, args) + override fun onDemoModeStarted() = clock.onDemoModeStarted() + override fun onDemoModeFinished() = clock.onDemoModeFinished() + } - private val chipVisibilityListener: ChipVisibilityListener = object : ChipVisibilityListener { - override fun onChipVisibilityRefreshed(visible: Boolean) { - if (header is MotionLayout) { + private val chipVisibilityListener: ChipVisibilityListener = + object : ChipVisibilityListener { + override fun onChipVisibilityRefreshed(visible: Boolean) { // If the privacy chip is visible, we hide the status icons and battery remaining // icon, only in QQS. - val update = combinedShadeHeadersConstraintManager - .privacyChipVisibilityConstraints(visible) + val update = + combinedShadeHeadersConstraintManager.privacyChipVisibilityConstraints(visible) header.updateAllConstraints(update) } } - } private val configurationControllerListener = object : ConfigurationController.ConfigurationListener { - override fun onConfigChanged(newConfig: Configuration?) { - if (header !is MotionLayout) { - val left = header.resources.getDimensionPixelSize( - R.dimen.large_screen_shade_header_left_padding - ) + override fun onConfigChanged(newConfig: Configuration?) { + val left = + header.resources.getDimensionPixelSize( + R.dimen.large_screen_shade_header_left_padding + ) header.setPadding( left, header.paddingTop, @@ -254,26 +239,21 @@ class LargeScreenShadeHeaderController @Inject constructor( header.paddingBottom ) } - } - override fun onDensityOrFontScaleChanged() { - clock.setTextAppearance(R.style.TextAppearance_QS_Status) - date.setTextAppearance(R.style.TextAppearance_QS_Status) - qsCarrierGroup.updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers) - if (header is MotionLayout) { + override fun onDensityOrFontScaleChanged() { + clock.setTextAppearance(R.style.TextAppearance_QS_Status) + date.setTextAppearance(R.style.TextAppearance_QS_Status) + qsCarrierGroup.updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers) loadConstraints() - header.minHeight = resources - .getDimensionPixelSize(R.dimen.large_screen_shade_header_min_height) + header.minHeight = + resources.getDimensionPixelSize(R.dimen.large_screen_shade_header_min_height) lastInsets?.let { updateConstraintsForInsets(header, it) } + updateResources() } - updateResources() } - } override fun onInit() { - if (header is MotionLayout) { - variableDateViewControllerFactory.create(date as VariableDateView).init() - } + variableDateViewControllerFactory.create(date as VariableDateView).init() batteryMeterViewController.init() // battery settings same as in QS icons @@ -286,20 +266,10 @@ class LargeScreenShadeHeaderController @Inject constructor( carrierIconSlots = listOf(header.context.getString(com.android.internal.R.string.status_bar_mobile)) - qsCarrierGroupController = qsCarrierGroupControllerBuilder - .setQSCarrierGroup(qsCarrierGroup) - .build() - - if (!combinedHeaders) { - // In the new header, we display alarm icon but we ignore it when not using the new - // headers. - iconContainer.addIgnoredSlot( - context.getString(com.android.internal.R.string.status_bar_alarm_clock) - ) - } - if (combinedHeaders) { - privacyIconsController.onParentVisible() - } + qsCarrierGroupController = + qsCarrierGroupControllerBuilder.setQSCarrierGroup(qsCarrierGroup).build() + + privacyIconsController.onParentVisible() } override fun onViewAttached() { @@ -307,16 +277,14 @@ class LargeScreenShadeHeaderController @Inject constructor( updateVisibility() updateTransition() - if (header is MotionLayout) { - header.setOnApplyWindowInsetsListener(insetListener) + header.setOnApplyWindowInsetsListener(insetListener) - clock.addOnLayoutChangeListener { v, _, _, _, _, _, _, _, _ -> - val newPivot = if (v.isLayoutRtl) v.width.toFloat() else 0f - v.pivotX = newPivot - v.pivotY = v.height.toFloat() / 2 + clock.addOnLayoutChangeListener { v, _, _, _, _, _, _, _, _ -> + val newPivot = if (v.isLayoutRtl) v.width.toFloat() else 0f + v.pivotX = newPivot + v.pivotY = v.height.toFloat() / 2 - qsCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0) - } + qsCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0) } dumpManager.registerDumpable(this) @@ -341,30 +309,30 @@ class LargeScreenShadeHeaderController @Inject constructor( } fun startCustomizingAnimation(show: Boolean, duration: Long) { - header.animate() - .setDuration(duration) - .alpha(if (show) 0f else 1f) - .setInterpolator(if (show) Interpolators.ALPHA_OUT else Interpolators.ALPHA_IN) - .setListener(CustomizerAnimationListener(show)) - .start() + header + .animate() + .setDuration(duration) + .alpha(if (show) 0f else 1f) + .setInterpolator(if (show) Interpolators.ALPHA_OUT else Interpolators.ALPHA_IN) + .setListener(CustomizerAnimationListener(show)) + .start() } private fun loadConstraints() { - if (header is MotionLayout) { - // Use resources.getXml instead of passing the resource id due to bug b/205018300 - header.getConstraintSet(QQS_HEADER_CONSTRAINT) - .load(context, resources.getXml(R.xml.qqs_header)) - header.getConstraintSet(QS_HEADER_CONSTRAINT) - .load(context, resources.getXml(R.xml.qs_header)) - header.getConstraintSet(LARGE_SCREEN_HEADER_CONSTRAINT) - .load(context, resources.getXml(R.xml.large_screen_shade_header)) - } + // Use resources.getXml instead of passing the resource id due to bug b/205018300 + header + .getConstraintSet(QQS_HEADER_CONSTRAINT) + .load(context, resources.getXml(R.xml.qqs_header)) + header + .getConstraintSet(QS_HEADER_CONSTRAINT) + .load(context, resources.getXml(R.xml.qs_header)) + header + .getConstraintSet(LARGE_SCREEN_HEADER_CONSTRAINT) + .load(context, resources.getXml(R.xml.large_screen_shade_header)) } private fun updateConstraintsForInsets(view: MotionLayout, insets: WindowInsets) { - val cutout = insets.displayCutout.also { - this.cutout = it - } + val cutout = insets.displayCutout.also { this.cutout = it } val sbInsets: Pair<Int, Int> = insetsProvider.getStatusBarContentInsetsForCurrentRotation() val cutoutLeft = sbInsets.first @@ -373,8 +341,8 @@ class LargeScreenShadeHeaderController @Inject constructor( updateQQSPaddings() // Set these guides as the left/right limits for content that lives in the top row, using // cutoutLeft and cutoutRight - var changes = combinedShadeHeadersConstraintManager - .edgesGuidelinesConstraints( + var changes = + combinedShadeHeadersConstraintManager.edgesGuidelinesConstraints( if (view.isLayoutRtl) cutoutRight else cutoutLeft, header.paddingStart, if (view.isLayoutRtl) cutoutLeft else cutoutRight, @@ -386,13 +354,14 @@ class LargeScreenShadeHeaderController @Inject constructor( if (topCutout.isEmpty || hasCornerCutout) { changes += combinedShadeHeadersConstraintManager.emptyCutoutConstraints() } else { - changes += combinedShadeHeadersConstraintManager.centerCutoutConstraints( - view.isLayoutRtl, - (view.width - view.paddingLeft - view.paddingRight - topCutout.width()) / 2 - ) + changes += + combinedShadeHeadersConstraintManager.centerCutoutConstraints( + view.isLayoutRtl, + (view.width - view.paddingLeft - view.paddingRight - topCutout.width()) / 2 + ) } } else { - changes += combinedShadeHeadersConstraintManager.emptyCutoutConstraints() + changes += combinedShadeHeadersConstraintManager.emptyCutoutConstraints() } view.updateAllConstraints(changes) @@ -406,7 +375,7 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun updateScrollY() { - if (!largeScreenActive && combinedHeaders) { + if (!largeScreenActive) { header.scrollY = qsScrollY } } @@ -422,12 +391,6 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun onHeaderStateChanged() { - if (largeScreenActive || combinedHeaders) { - privacyIconsController.onParentVisible() - } else { - privacyIconsController.onParentInvisible() - } - updateVisibility() updateTransition() } @@ -436,13 +399,14 @@ class LargeScreenShadeHeaderController @Inject constructor( * be visible any time the QQS/QS shade is open. */ private fun updateVisibility() { - val visibility = if (!largeScreenActive && !combinedHeaders || qsDisabled) { - View.GONE - } else if (qsVisible && !customizing) { - View.VISIBLE - } else { - View.INVISIBLE - } + val visibility = + if (qsDisabled) { + View.GONE + } else if (qsVisible && !customizing) { + View.VISIBLE + } else { + View.INVISIBLE + } if (header.visibility != visibility) { header.visibility = visibility visible = visibility == View.VISIBLE @@ -450,10 +414,6 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun updateTransition() { - if (!combinedHeaders) { - return - } - header as MotionLayout if (largeScreenActive) { logInstantEvent("Large screen constraints set") header.setTransition(LARGE_SCREEN_HEADER_TRANSITION_ID) @@ -467,7 +427,7 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun updatePosition() { - if (header is MotionLayout && !largeScreenActive && visible) { + if (!largeScreenActive && visible) { logInstantEvent("updatePosition: $qsExpandedFraction") header.progress = qsExpandedFraction updateBatteryMode() @@ -475,11 +435,7 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun logInstantEvent(message: String) { - Trace.instantForTrack( - TRACE_TAG_APP, - "LargeScreenHeaderController", - message - ) + Trace.instantForTrack(TRACE_TAG_APP, "LargeScreenHeaderController", message) } private fun updateListeners() { @@ -509,18 +465,16 @@ class LargeScreenShadeHeaderController @Inject constructor( } private fun updateQQSPaddings() { - if (header is MotionLayout) { - val clockPaddingStart = resources - .getDimensionPixelSize(R.dimen.status_bar_left_clock_starting_padding) - val clockPaddingEnd = resources - .getDimensionPixelSize(R.dimen.status_bar_left_clock_end_padding) - clock.setPaddingRelative( - clockPaddingStart, - clock.paddingTop, - clockPaddingEnd, - clock.paddingBottom - ) - } + val clockPaddingStart = + resources.getDimensionPixelSize(R.dimen.status_bar_left_clock_starting_padding) + val clockPaddingEnd = + resources.getDimensionPixelSize(R.dimen.status_bar_left_clock_end_padding) + clock.setPaddingRelative( + clockPaddingStart, + clock.paddingTop, + clockPaddingEnd, + clock.paddingBottom + ) } override fun dump(pw: PrintWriter, args: Array<out String>) { @@ -530,10 +484,7 @@ class LargeScreenShadeHeaderController @Inject constructor( pw.println("active: $largeScreenActive") pw.println("qsExpandedFraction: $qsExpandedFraction") pw.println("qsScrollY: $qsScrollY") - if (combinedHeaders) { - header as MotionLayout - pw.println("currentState: ${header.currentState.stateToString()}") - } + pw.println("currentState: ${header.currentState.stateToString()}") } private fun MotionLayout.updateConstraints(@IdRes state: Int, update: ConstraintChange) { @@ -559,11 +510,10 @@ class LargeScreenShadeHeaderController @Inject constructor( } } - @VisibleForTesting - internal fun simulateViewDetached() = this.onViewDetached() + @VisibleForTesting internal fun simulateViewDetached() = this.onViewDetached() inner class CustomizerAnimationListener( - private val enteringCustomizing: Boolean, + private val enteringCustomizing: Boolean, ) : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { super.onAnimationEnd(animation) diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index aa8c5b65e0fe..d34e127b194b 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -20,6 +20,9 @@ import android.view.MotionEvent import com.android.systemui.log.dagger.ShadeLog import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.shade.NotificationPanelViewController.FLING_COLLAPSE +import com.android.systemui.shade.NotificationPanelViewController.FLING_EXPAND +import com.android.systemui.shade.NotificationPanelViewController.FLING_HIDE import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject @@ -241,18 +244,40 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { ) } - fun logLastFlingWasExpanding( - expand: Boolean - ) { + fun logLastFlingWasExpanding(expand: Boolean) { buffer.log( - TAG, - LogLevel.VERBOSE, - { - bool1 = expand - }, - { - "NPVC mLastFlingWasExpanding set to: $bool1" - } + TAG, + LogLevel.VERBOSE, + { bool1 = expand }, + { "NPVC mLastFlingWasExpanding set to: $bool1" } + ) + } + + fun flingQs(flingType: Int, isClick: Boolean) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = flingTypeToString(flingType) + bool1 = isClick + }, + { "QS fling with type $str1, originated from click: $isClick" } + ) + } + + private fun flingTypeToString(flingType: Int) = when (flingType) { + FLING_EXPAND -> "FLING_EXPAND" + FLING_COLLAPSE -> "FLING_COLLAPSE" + FLING_HIDE -> "FLING_HIDE" + else -> "UNKNOWN" + } + + fun logSplitShadeChanged(splitShadeEnabled: Boolean) { + buffer.log( + TAG, + LogLevel.VERBOSE, + { bool1 = splitShadeEnabled }, + { "Split shade state changed: split shade ${if (bool1) "enabled" else "disabled"}" } ) } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt index 07820ecd513e..129d09ec3c14 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt @@ -43,8 +43,6 @@ constructor( shadeExpansionStateManager: ShadeExpansionStateManager, dumpManager: DumpManager, private val context: Context, - private val splitShadeOverScrollerFactory: SplitShadeOverScroller.Factory, - private val noOpOverScroller: NoOpOverScroller, private val scrimShadeTransitionController: ScrimShadeTransitionController, private val statusBarStateController: SysuiStatusBarStateController, ) { @@ -57,17 +55,6 @@ constructor( private var currentPanelState: Int? = null private var lastShadeExpansionChangeEvent: ShadeExpansionChangeEvent? = null - private val splitShadeOverScroller by lazy { - splitShadeOverScrollerFactory.create({ qs }, { notificationStackScrollLayoutController }) - } - private val shadeOverScroller: ShadeOverScroller - get() = - if (inSplitShade && isScreenUnlocked() && propertiesInitialized()) { - splitShadeOverScroller - } else { - noOpOverScroller - } - init { updateResources() configurationController.addCallback( @@ -89,21 +76,14 @@ constructor( private fun onPanelStateChanged(@PanelState state: Int) { currentPanelState = state - shadeOverScroller.onPanelStateChanged(state) scrimShadeTransitionController.onPanelStateChanged(state) } private fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) { lastShadeExpansionChangeEvent = event - shadeOverScroller.onDragDownAmountChanged(event.dragDownPxAmount) scrimShadeTransitionController.onPanelExpansionChanged(event) } - private fun propertiesInitialized() = - this::qs.isInitialized && - this::notificationPanelViewController.isInitialized && - this::notificationStackScrollLayoutController.isInitialized - private fun dump(pw: PrintWriter) { pw.println( """ diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/SplitShadeOverScroller.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/SplitShadeOverScroller.kt deleted file mode 100644 index f95125f5cb6c..000000000000 --- a/packages/SystemUI/src/com/android/systemui/shade/transition/SplitShadeOverScroller.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.shade.transition - -import android.animation.Animator -import android.animation.ValueAnimator -import android.content.Context -import android.content.res.Configuration -import android.util.MathUtils -import com.android.internal.annotations.VisibleForTesting -import com.android.systemui.R -import com.android.systemui.animation.Interpolators -import com.android.systemui.dump.DumpManager -import com.android.systemui.plugins.qs.QS -import com.android.systemui.shade.PanelState -import com.android.systemui.shade.STATE_CLOSED -import com.android.systemui.shade.STATE_OPENING -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController -import com.android.systemui.statusbar.phone.ScrimController -import com.android.systemui.statusbar.policy.ConfigurationController -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject -import java.io.PrintWriter - -class SplitShadeOverScroller -@AssistedInject -constructor( - configurationController: ConfigurationController, - dumpManager: DumpManager, - private val context: Context, - private val scrimController: ScrimController, - @Assisted private val qSProvider: () -> QS, - @Assisted private val nsslControllerProvider: () -> NotificationStackScrollLayoutController -) : ShadeOverScroller { - - private var releaseOverScrollDuration = 0L - private var maxOverScrollAmount = 0 - private var previousOverscrollAmount = 0 - private var dragDownAmount: Float = 0f - @PanelState private var panelState: Int = STATE_CLOSED - - private var releaseOverScrollAnimator: Animator? = null - - private val qS: QS - get() = qSProvider() - - private val nsslController: NotificationStackScrollLayoutController - get() = nsslControllerProvider() - - init { - updateResources() - configurationController.addCallback( - object : ConfigurationController.ConfigurationListener { - override fun onConfigChanged(newConfig: Configuration?) { - updateResources() - } - }) - dumpManager.registerCriticalDumpable("SplitShadeOverScroller") { printWriter, _ -> - dump(printWriter) - } - } - - private fun updateResources() { - val resources = context.resources - maxOverScrollAmount = resources.getDimensionPixelSize(R.dimen.shade_max_over_scroll_amount) - releaseOverScrollDuration = - resources.getInteger(R.integer.lockscreen_shade_over_scroll_release_duration).toLong() - } - - override fun onPanelStateChanged(@PanelState newPanelState: Int) { - if (shouldReleaseOverscroll(previousState = panelState, newState = newPanelState)) { - releaseOverScroll() - } - panelState = newPanelState - } - - override fun onDragDownAmountChanged(newDragDownAmount: Float) { - if (dragDownAmount == newDragDownAmount) { - return - } - dragDownAmount = newDragDownAmount - if (shouldOverscroll()) { - overScroll(newDragDownAmount) - } - } - - private fun shouldOverscroll() = panelState == STATE_OPENING - - private fun shouldReleaseOverscroll(@PanelState previousState: Int, @PanelState newState: Int) = - previousState == STATE_OPENING && newState != STATE_OPENING - - private fun overScroll(dragDownAmount: Float) { - val overscrollAmount: Int = calculateOverscrollAmount(dragDownAmount) - applyOverscroll(overscrollAmount) - previousOverscrollAmount = overscrollAmount - } - - private fun calculateOverscrollAmount(dragDownAmount: Float): Int { - val fullHeight: Int = nsslController.height - val fullHeightProgress: Float = MathUtils.saturate(dragDownAmount / fullHeight) - return (fullHeightProgress * maxOverScrollAmount).toInt() - } - - private fun applyOverscroll(overscrollAmount: Int) { - qS.setOverScrollAmount(overscrollAmount) - scrimController.setNotificationsOverScrollAmount(overscrollAmount) - nsslController.setOverScrollAmount(overscrollAmount) - } - - private fun releaseOverScroll() { - val animator = ValueAnimator.ofInt(previousOverscrollAmount, 0) - animator.addUpdateListener { - val overScrollAmount = it.animatedValue as Int - qS.setOverScrollAmount(overScrollAmount) - scrimController.setNotificationsOverScrollAmount(overScrollAmount) - nsslController.setOverScrollAmount(overScrollAmount) - } - animator.interpolator = Interpolators.STANDARD - animator.duration = releaseOverScrollDuration - animator.start() - releaseOverScrollAnimator = animator - previousOverscrollAmount = 0 - } - - @VisibleForTesting - internal fun finishAnimations() { - releaseOverScrollAnimator?.end() - releaseOverScrollAnimator = null - } - - private fun dump(pw: PrintWriter) { - pw.println( - """ - SplitShadeOverScroller: - Resources: - releaseOverScrollDuration: $releaseOverScrollDuration - maxOverScrollAmount: $maxOverScrollAmount - State: - previousOverscrollAmount: $previousOverscrollAmount - dragDownAmount: $dragDownAmount - panelState: $panelState - """.trimIndent()) - } - - @AssistedFactory - fun interface Factory { - fun create( - qSProvider: () -> QS, - nsslControllerProvider: () -> NotificationStackScrollLayoutController - ): SplitShadeOverScroller - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt new file mode 100644 index 000000000000..37140ec2aa32 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.statusbar + +import android.annotation.IntRange +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.Configuration +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout +import com.android.settingslib.Utils +import com.android.systemui.R +import com.android.systemui.battery.BatteryMeterView +import com.android.systemui.statusbar.events.BackgroundAnimatableView + +class BatteryStatusChip @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : + FrameLayout(context, attrs), BackgroundAnimatableView { + + private val roundedContainer: LinearLayout + private val batteryMeterView: BatteryMeterView + override val contentView: View + get() = batteryMeterView + + init { + inflate(context, R.layout.battery_status_chip, this) + roundedContainer = findViewById(R.id.rounded_container) + batteryMeterView = findViewById(R.id.battery_meter_view) + updateResources() + } + + /** + * When animating as a chip in the status bar, we want to animate the width for the rounded + * container. We have to subtract our own top and left offset because the bounds come to us as + * absolute on-screen bounds. + */ + override fun setBoundsForAnimation(l: Int, t: Int, r: Int, b: Int) { + roundedContainer.setLeftTopRightBottom(l - left, t - top, r - left, b - top) + } + + fun setBatteryLevel(@IntRange(from = 0, to = 100) batteryLevel: Int) { + batteryMeterView.setForceShowPercent(true) + batteryMeterView.onBatteryLevelChanged(batteryLevel, true) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + updateResources() + } + + @SuppressLint("UseCompatLoadingForDrawables") + private fun updateResources() { + val primaryColor = + Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorPrimary) + val textColorSecondary = + Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorSecondary) + batteryMeterView.updateColors(primaryColor, textColorSecondary, primaryColor) + roundedContainer.background = mContext.getDrawable(R.drawable.statusbar_chip_bg) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index f4cd985adbdb..51c5183ffee9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -213,7 +213,8 @@ public class NotificationLockscreenUserManagerImpl implements DeviceProvisionedController deviceProvisionedController, KeyguardStateController keyguardStateController, SecureSettings secureSettings, - DumpManager dumpManager) { + DumpManager dumpManager, + LockPatternUtils lockPatternUtils) { mContext = context; mMainHandler = mainHandler; mDevicePolicyManager = devicePolicyManager; @@ -225,7 +226,7 @@ public class NotificationLockscreenUserManagerImpl implements mClickNotifier = clickNotifier; mOverviewProxyServiceLazy = overviewProxyServiceLazy; statusBarStateController.addCallback(this); - mLockPatternUtils = new LockPatternUtils(context); + mLockPatternUtils = lockPatternUtils; mKeyguardManager = keyguardManager; mBroadcastDispatcher = broadcastDispatcher; mDeviceProvisionedController = deviceProvisionedController; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index f25928418cbd..6a8d5c1fca9a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -16,7 +16,7 @@ package com.android.systemui.statusbar.events -import android.animation.Animator +import androidx.core.animation.Animator import android.annotation.UiThread import android.graphics.Point import android.graphics.Rect diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt new file mode 100644 index 000000000000..3d6d48917dd3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.events + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.dump.DumpManager +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.time.SystemClock +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.CoroutineScope + +@Module +interface StatusBarEventsModule { + + companion object { + + @Provides + @SysUISingleton + fun provideSystemStatusAnimationScheduler( + featureFlags: FeatureFlags, + coordinator: SystemEventCoordinator, + chipAnimationController: SystemEventChipAnimationController, + statusBarWindowController: StatusBarWindowController, + dumpManager: DumpManager, + systemClock: SystemClock, + @Application coroutineScope: CoroutineScope, + @Main executor: DelayableExecutor + ): SystemStatusAnimationScheduler { + return if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { + SystemStatusAnimationSchedulerImpl( + coordinator, + chipAnimationController, + statusBarWindowController, + dumpManager, + systemClock, + coroutineScope + ) + } else { + SystemStatusAnimationSchedulerLegacyImpl( + coordinator, + chipAnimationController, + statusBarWindowController, + dumpManager, + systemClock, + executor + ) + } + } + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt index 4e1404d0637b..43f78c3166e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt @@ -16,24 +16,21 @@ package com.android.systemui.statusbar.events +import android.annotation.IntRange import android.annotation.SuppressLint import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.view.LayoutInflater import android.view.View import android.widget.ImageView -import com.android.settingslib.graph.ThemedBatteryDrawable -import com.android.systemui.R import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.privacy.PrivacyItem +import com.android.systemui.statusbar.BatteryStatusChip typealias ViewCreator = (context: Context) -> BackgroundAnimatableView interface StatusEvent { val priority: Int // Whether or not to force the status bar open and show a dot - val forceVisible: Boolean + var forceVisible: Boolean // Whether or not to show an animation for this event val showAnimation: Boolean val viewCreator: ViewCreator @@ -73,17 +70,16 @@ class BGImageView( } } -class BatteryEvent : StatusEvent { +class BatteryEvent(@IntRange(from = 0, to = 100) val batteryLevel: Int) : StatusEvent { override val priority = 50 - override val forceVisible = false + override var forceVisible = false override val showAnimation = true override var contentDescription: String? = "" - override val viewCreator: (context: Context) -> BGImageView = { context -> - val iv = BGImageView(context) - iv.setImageDrawable(ThemedBatteryDrawable(context, Color.WHITE)) - iv.setBackgroundDrawable(ColorDrawable(Color.GREEN)) - iv + override val viewCreator: ViewCreator = { context -> + BatteryStatusChip(context).apply { + setBatteryLevel(batteryLevel) + } } override fun toString(): String { @@ -94,13 +90,12 @@ class BatteryEvent : StatusEvent { class PrivacyEvent(override val showAnimation: Boolean = true) : StatusEvent { override var contentDescription: String? = null override val priority = 100 - override val forceVisible = true + override var forceVisible = true var privacyItems: List<PrivacyItem> = listOf() private var privacyChip: OngoingPrivacyChip? = null override val viewCreator: ViewCreator = { context -> - val v = LayoutInflater.from(context) - .inflate(R.layout.ongoing_privacy_chip, null) as OngoingPrivacyChip + val v = OngoingPrivacyChip(context) v.privacyList = privacyItems v.contentDescription = contentDescription privacyChip = v diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt index 8405aea218f0..776956a20140 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.events -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.AnimatorSet -import android.animation.ValueAnimator import android.content.Context import android.graphics.Rect import android.view.ContextThemeWrapper @@ -30,7 +26,13 @@ import android.view.View.MeasureSpec.AT_MOST import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout +import androidx.core.animation.Animator +import androidx.core.animation.AnimatorListenerAdapter +import androidx.core.animation.AnimatorSet +import androidx.core.animation.ValueAnimator import com.android.systemui.R +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.util.animation.AnimationUtil.Companion.frames @@ -43,7 +45,8 @@ import kotlin.math.roundToInt class SystemEventChipAnimationController @Inject constructor( private val context: Context, private val statusBarWindowController: StatusBarWindowController, - private val contentInsetsProvider: StatusBarContentInsetsProvider + private val contentInsetsProvider: StatusBarContentInsetsProvider, + private val featureFlags: FeatureFlags ) : SystemStatusAnimationCallback { private lateinit var animationWindowView: FrameLayout @@ -53,12 +56,14 @@ class SystemEventChipAnimationController @Inject constructor( // Left for LTR, Right for RTL private var animationDirection = LEFT - private var chipRight = 0 - private var chipLeft = 0 - private var chipWidth = 0 + private var chipBounds = Rect() + private val chipWidth get() = chipBounds.width() + private val chipRight get() = chipBounds.right + private val chipLeft get() = chipBounds.left private var chipMinWidth = context.resources.getDimensionPixelSize( R.dimen.ongoing_appops_chip_min_animation_width) - private var dotSize = context.resources.getDimensionPixelSize( + + private val dotSize = context.resources.getDimensionPixelSize( R.dimen.ongoing_appops_dot_diameter) // Use during animation so that multiple animators can update the drawing rect private var animRect = Rect() @@ -90,21 +95,26 @@ class SystemEventChipAnimationController @Inject constructor( it.view.measure( View.MeasureSpec.makeMeasureSpec( (animationWindowView.parent as View).width, AT_MOST), - View.MeasureSpec.makeMeasureSpec(animationWindowView.height, AT_MOST)) - chipWidth = it.chipWidth - } - - // decide which direction we're animating from, and then set some screen coordinates - val contentRect = contentInsetsProvider.getStatusBarContentAreaForCurrentRotation() - when (animationDirection) { - LEFT -> { - chipRight = contentRect.right - chipLeft = contentRect.right - chipWidth - } - else /* RIGHT */ -> { - chipLeft = contentRect.left - chipRight = contentRect.left + chipWidth + View.MeasureSpec.makeMeasureSpec( + (animationWindowView.parent as View).height, AT_MOST)) + + // decide which direction we're animating from, and then set some screen coordinates + val contentRect = contentInsetsProvider.getStatusBarContentAreaForCurrentRotation() + val chipTop = ((animationWindowView.parent as View).height - it.view.measuredHeight) / 2 + val chipBottom = chipTop + it.view.measuredHeight + val chipRight: Int + val chipLeft: Int + when (animationDirection) { + LEFT -> { + chipRight = contentRect.right + chipLeft = contentRect.right - it.chipWidth + } + else /* RIGHT */ -> { + chipLeft = contentRect.left + chipRight = contentRect.left + it.chipWidth + } } + chipBounds = Rect(chipLeft, chipTop, chipRight, chipBottom) } } @@ -117,16 +127,21 @@ class SystemEventChipAnimationController @Inject constructor( interpolator = null addUpdateListener { currentAnimatedView?.view?.alpha = animatedValue as Float } } + currentAnimatedView?.contentView?.alpha = 0f + val contentAlphaIn = ValueAnimator.ofFloat(0f, 1f).apply { + startDelay = 10.frames + duration = 10.frames + interpolator = null + addUpdateListener { currentAnimatedView?.contentView?.alpha = animatedValue as Float } + } val moveIn = ValueAnimator.ofInt(chipMinWidth, chipWidth).apply { startDelay = 7.frames duration = 23.frames interpolator = STATUS_BAR_X_MOVE_IN - addUpdateListener { - updateAnimatedViewBoundsWidth(animatedValue as Int) - } + addUpdateListener { updateAnimatedViewBoundsWidth(animatedValue as Int) } } val animSet = AnimatorSet() - animSet.playTogether(alphaIn, moveIn) + animSet.playTogether(alphaIn, contentAlphaIn, moveIn) return animSet } @@ -139,7 +154,7 @@ class SystemEventChipAnimationController @Inject constructor( } finish.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { animationWindowView.removeView(currentAnimatedView!!.view) } }) @@ -152,7 +167,7 @@ class SystemEventChipAnimationController @Inject constructor( duration = 9.frames interpolator = STATUS_CHIP_WIDTH_TO_DOT_KEYFRAME_1 addUpdateListener { - updateAnimatedViewBoundsWidth(it.animatedValue as Int) + updateAnimatedViewBoundsWidth(animatedValue as Int) } } @@ -161,7 +176,7 @@ class SystemEventChipAnimationController @Inject constructor( duration = 20.frames interpolator = STATUS_CHIP_WIDTH_TO_DOT_KEYFRAME_2 addUpdateListener { - updateAnimatedViewBoundsWidth(it.animatedValue as Int) + updateAnimatedViewBoundsWidth(animatedValue as Int) } } @@ -174,7 +189,7 @@ class SystemEventChipAnimationController @Inject constructor( duration = 6.frames interpolator = STATUS_CHIP_HEIGHT_TO_DOT_KEYFRAME_1 addUpdateListener { - updateAnimatedViewBoundsHeight(it.animatedValue as Int, chipVerticalCenter) + updateAnimatedViewBoundsHeight(animatedValue as Int, chipVerticalCenter) } } @@ -183,7 +198,7 @@ class SystemEventChipAnimationController @Inject constructor( duration = 15.frames interpolator = STATUS_CHIP_HEIGHT_TO_DOT_KEYFRAME_2 addUpdateListener { - updateAnimatedViewBoundsHeight(it.animatedValue as Int, chipVerticalCenter) + updateAnimatedViewBoundsHeight(animatedValue as Int, chipVerticalCenter) } } @@ -210,15 +225,32 @@ class SystemEventChipAnimationController @Inject constructor( } private fun createMoveOutAnimationDefault(): Animator { + val alphaOut = ValueAnimator.ofFloat(1f, 0f).apply { + startDelay = 6.frames + duration = 6.frames + interpolator = null + addUpdateListener { currentAnimatedView?.view?.alpha = animatedValue as Float } + } + + val contentAlphaOut = ValueAnimator.ofFloat(1f, 0f).apply { + duration = 5.frames + interpolator = null + addUpdateListener { currentAnimatedView?.contentView?.alpha = animatedValue as Float } + } + val moveOut = ValueAnimator.ofInt(chipWidth, chipMinWidth).apply { duration = 23.frames + interpolator = STATUS_BAR_X_MOVE_OUT addUpdateListener { currentAnimatedView?.apply { - updateAnimatedViewBoundsWidth(it.animatedValue as Int) + updateAnimatedViewBoundsWidth(animatedValue as Int) } } } - return moveOut + + val animSet = AnimatorSet() + animSet.playTogether(alphaOut, contentAlphaOut, moveOut) + return animSet } private fun init() { @@ -239,11 +271,15 @@ class SystemEventChipAnimationController @Inject constructor( it.marginEnd = marginEnd } - private fun initializeAnimRect() = animRect.set( - chipLeft, - currentAnimatedView!!.view.top, - chipRight, - currentAnimatedView!!.view.bottom) + private fun initializeAnimRect() = if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { + animRect.set(chipBounds) + } else { + animRect.set( + chipLeft, + currentAnimatedView!!.view.top, + chipRight, + currentAnimatedView!!.view.bottom) + } /** * To be called during an animation, sets the width and updates the current animated chip view @@ -296,6 +332,8 @@ class SystemEventChipAnimationController @Inject constructor( interface BackgroundAnimatableView { val view: View // Since this can't extend View, add a view prop get() = this as View + val contentView: View? // This will be alpha faded during appear and disappear animation + get() = null val chipWidth: Int get() = view.measuredWidth fun setBoundsForAnimation(l: Int, t: Int, r: Int, b: Int) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt index fde5d39db7e3..26fd2307c59d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt @@ -16,11 +16,14 @@ package com.android.systemui.statusbar.events +import android.annotation.IntRange import android.content.Context import android.provider.DeviceConfig import android.provider.DeviceConfig.NAMESPACE_PRIVACY import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.privacy.PrivacyChipBuilder import com.android.systemui.privacy.PrivacyItem import com.android.systemui.privacy.PrivacyItemController @@ -37,21 +40,18 @@ class SystemEventCoordinator @Inject constructor( private val systemClock: SystemClock, private val batteryController: BatteryController, private val privacyController: PrivacyItemController, - private val context: Context + private val context: Context, + private val featureFlags: FeatureFlags ) { private lateinit var scheduler: SystemStatusAnimationScheduler fun startObserving() { - /* currently unused batteryController.addCallback(batteryStateListener) - */ privacyController.addCallback(privacyStateListener) } fun stopObserving() { - /* currently unused batteryController.removeCallback(batteryStateListener) - */ privacyController.removeCallback(privacyStateListener) } @@ -59,12 +59,14 @@ class SystemEventCoordinator @Inject constructor( this.scheduler = s } - fun notifyPluggedIn() { - scheduler.onStatusEvent(BatteryEvent()) + fun notifyPluggedIn(@IntRange(from = 0, to = 100) batteryLevel: Int) { + if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { + scheduler.onStatusEvent(BatteryEvent(batteryLevel)) + } } fun notifyPrivacyItemsEmpty() { - scheduler.setShouldShowPersistentPrivacyIndicator(false) + scheduler.removePersistentDot() } fun notifyPrivacyItemsChanged(showAnimation: Boolean = true) { @@ -79,25 +81,25 @@ class SystemEventCoordinator @Inject constructor( } private val batteryStateListener = object : BatteryController.BatteryStateChangeCallback { - var plugged = false - var stateKnown = false + private var plugged = false + private var stateKnown = false override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) { if (!stateKnown) { stateKnown = true plugged = pluggedIn - notifyListeners() + notifyListeners(level) return } if (plugged != pluggedIn) { plugged = pluggedIn - notifyListeners() + notifyListeners(level) } } - private fun notifyListeners() { + private fun notifyListeners(@IntRange(from = 0, to = 100) batteryLevel: Int) { // We only care about the plugged in status - if (plugged) notifyPluggedIn() + if (plugged) notifyPluggedIn(batteryLevel) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index 197cf5608cf5..2a18f1f51ace 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2023 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. @@ -16,302 +16,21 @@ package com.android.systemui.statusbar.events -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.AnimatorSet import android.annotation.IntDef -import android.os.Process -import android.provider.DeviceConfig -import android.util.Log -import android.view.animation.PathInterpolator +import androidx.core.animation.Animator +import androidx.core.animation.AnimatorSet +import androidx.core.animation.PathInterpolator import com.android.systemui.Dumpable -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.policy.CallbackController -import com.android.systemui.statusbar.window.StatusBarWindowController -import com.android.systemui.util.Assert -import com.android.systemui.util.concurrency.DelayableExecutor -import com.android.systemui.util.time.SystemClock -import java.io.PrintWriter -import javax.inject.Inject -/** - * Dead-simple scheduler for system status events. Obeys the following principles (all values TBD): - * - Avoiding log spam by only allowing 12 events per minute (1event/5s) - * - Waits 100ms to schedule any event for debouncing/prioritization - * - Simple prioritization: Privacy > Battery > connectivity (encoded in [StatusEvent]) - * - Only schedules a single event, and throws away lowest priority events - * - * There are 4 basic stages of animation at play here: - * 1. System chrome animation OUT - * 2. Chip animation IN - * 3. Chip animation OUT; potentially into a dot - * 4. System chrome animation IN - * - * Thus we can keep all animations synchronized with two separate ValueAnimators, one for system - * chrome and the other for the chip. These can animate from 0,1 and listeners can parameterize - * their respective views based on the progress of the animator. Interpolation differences TBD - */ -@SysUISingleton -open class SystemStatusAnimationScheduler @Inject constructor( - private val coordinator: SystemEventCoordinator, - private val chipAnimationController: SystemEventChipAnimationController, - private val statusBarWindowController: StatusBarWindowController, - private val dumpManager: DumpManager, - private val systemClock: SystemClock, - @Main private val executor: DelayableExecutor -) : CallbackController<SystemStatusAnimationCallback>, Dumpable { - - companion object { - private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator" - } - public fun isImmersiveIndicatorEnabled(): Boolean { - return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - PROPERTY_ENABLE_IMMERSIVE_INDICATOR, true) - } - - @SystemAnimationState var animationState: Int = IDLE - private set - - /** True if the persistent privacy dot should be active */ - var hasPersistentDot = false - protected set - - private var scheduledEvent: StatusEvent? = null - private var cancelExecutionRunnable: Runnable? = null - private val listeners = mutableSetOf<SystemStatusAnimationCallback>() - - fun getListeners(): MutableSet<SystemStatusAnimationCallback> { - return listeners - } - - init { - coordinator.attachScheduler(this) - dumpManager.registerDumpable(TAG, this) - } - - open fun onStatusEvent(event: StatusEvent) { - // Ignore any updates until the system is up and running - if (isTooEarly() || !isImmersiveIndicatorEnabled()) { - return - } - - // Don't deal with threading for now (no need let's be honest) - Assert.isMainThread() - if ((event.priority > scheduledEvent?.priority ?: -1) && - animationState != ANIMATING_OUT && - (animationState != SHOWING_PERSISTENT_DOT && event.forceVisible)) { - // events can only be scheduled if a higher priority or no other event is in progress - if (DEBUG) { - Log.d(TAG, "scheduling event $event") - } - - scheduleEvent(event) - } else if (scheduledEvent?.shouldUpdateFromEvent(event) == true) { - if (DEBUG) { - Log.d(TAG, "updating current event from: $event. animationState=$animationState") - } - scheduledEvent?.updateFromEvent(event) - if (event.forceVisible) { - hasPersistentDot = true - // If we missed the chance to show the persistent dot, do it now - if (animationState == IDLE) { - notifyTransitionToPersistentDot() - } - } - } else { - if (DEBUG) { - Log.d(TAG, "ignoring event $event") - } - } - } - - private fun clearDotIfVisible() { - notifyHidePersistentDot() - } - - fun setShouldShowPersistentPrivacyIndicator(should: Boolean) { - if (hasPersistentDot == should || !isImmersiveIndicatorEnabled()) { - return - } - - hasPersistentDot = should - - if (!hasPersistentDot) { - clearDotIfVisible() - } - } - - public fun isTooEarly(): Boolean { - return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME - } - - /** - * Clear the scheduled event (if any) and schedule a new one - */ - private fun scheduleEvent(event: StatusEvent) { - scheduledEvent = event - - if (event.forceVisible) { - hasPersistentDot = true - } - - // If animations are turned off, we'll transition directly to the dot - if (!event.showAnimation && event.forceVisible) { - notifyTransitionToPersistentDot() - scheduledEvent = null - return - } - - chipAnimationController.prepareChipAnimation(scheduledEvent!!.viewCreator) - animationState = ANIMATION_QUEUED - executor.executeDelayed({ - runChipAnimation() - }, DEBOUNCE_DELAY) - } - - /** - * 1. Define a total budget for the chip animation (1500ms) - * 2. Send out callbacks to listeners so that they can generate animations locally - * 3. Update the scheduler state so that clients know where we are - * 4. Maybe: provide scaffolding such as: dot location, margins, etc - * 5. Maybe: define a maximum animation length and enforce it. Probably only doable if we - * collect all of the animators and run them together. - */ - private fun runChipAnimation() { - statusBarWindowController.setForceStatusBarVisible(true) - animationState = ANIMATING_IN - - val animSet = collectStartAnimations() - if (animSet.totalDuration > 500) { - throw IllegalStateException("System animation total length exceeds budget. " + - "Expected: 500, actual: ${animSet.totalDuration}") - } - animSet.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { - animationState = RUNNING_CHIP_ANIM - } - }) - animSet.start() - - executor.executeDelayed({ - val animSet2 = collectFinishAnimations() - animationState = ANIMATING_OUT - animSet2.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { - animationState = if (hasPersistentDot) { - SHOWING_PERSISTENT_DOT - } else { - IDLE - } - - statusBarWindowController.setForceStatusBarVisible(false) - } - }) - animSet2.start() - scheduledEvent = null - }, DISPLAY_LENGTH) - } - - private fun collectStartAnimations(): AnimatorSet { - val animators = mutableListOf<Animator>() - listeners.forEach { listener -> - listener.onSystemEventAnimationBegin()?.let { anim -> - animators.add(anim) - } - } - animators.add(chipAnimationController.onSystemEventAnimationBegin()) - val animSet = AnimatorSet().also { - it.playTogether(animators) - } - - return animSet - } - - private fun collectFinishAnimations(): AnimatorSet { - val animators = mutableListOf<Animator>() - listeners.forEach { listener -> - listener.onSystemEventAnimationFinish(hasPersistentDot)?.let { anim -> - animators.add(anim) - } - } - animators.add(chipAnimationController.onSystemEventAnimationFinish(hasPersistentDot)) - if (hasPersistentDot) { - val dotAnim = notifyTransitionToPersistentDot() - if (dotAnim != null) { - animators.add(dotAnim) - } - } - val animSet = AnimatorSet().also { - it.playTogether(animators) - } - - return animSet - } - - private fun notifyTransitionToPersistentDot(): Animator? { - val anims: List<Animator> = listeners.mapNotNull { - it.onSystemStatusAnimationTransitionToPersistentDot(scheduledEvent?.contentDescription) - } - if (anims.isNotEmpty()) { - val aSet = AnimatorSet() - aSet.playTogether(anims) - return aSet - } - - return null - } - - private fun notifyHidePersistentDot(): Animator? { - val anims: List<Animator> = listeners.mapNotNull { - it.onHidePersistentDot() - } - - if (animationState == SHOWING_PERSISTENT_DOT) { - animationState = IDLE - } - - if (anims.isNotEmpty()) { - val aSet = AnimatorSet() - aSet.playTogether(anims) - return aSet - } +interface SystemStatusAnimationScheduler : + CallbackController<SystemStatusAnimationCallback>, Dumpable { - return null - } + @SystemAnimationState fun getAnimationState(): Int - override fun addCallback(listener: SystemStatusAnimationCallback) { - Assert.isMainThread() - - if (listeners.isEmpty()) { - coordinator.startObserving() - } - listeners.add(listener) - } + fun onStatusEvent(event: StatusEvent) - override fun removeCallback(listener: SystemStatusAnimationCallback) { - Assert.isMainThread() - - listeners.remove(listener) - if (listeners.isEmpty()) { - coordinator.stopObserving() - } - } - - override fun dump(pw: PrintWriter, args: Array<out String>) { - pw.println("Scheduled event: $scheduledEvent") - pw.println("Has persistent privacy dot: $hasPersistentDot") - pw.println("Animation state: $animationState") - pw.println("Listeners:") - if (listeners.isEmpty()) { - pw.println("(none)") - } else { - listeners.forEach { - pw.println(" $it") - } - } - } + fun removePersistentDot() } /** @@ -337,6 +56,7 @@ interface SystemStatusAnimationCallback { @JvmDefault fun onHidePersistentDot(): Animator? { return null } } + /** * Animation state IntDef */ @@ -354,7 +74,7 @@ interface SystemStatusAnimationCallback { annotation class SystemAnimationState /** No animation is in progress */ -const val IDLE = 0 +@SystemAnimationState const val IDLE = 0 /** An animation is queued, and awaiting the debounce period */ const val ANIMATION_QUEUED = 1 /** System is animating out, and chip is animating in */ @@ -379,20 +99,16 @@ val STATUS_CHIP_HEIGHT_TO_DOT_KEYFRAME_1 = PathInterpolator(0.4f, 0f, 0.17f, 1f) val STATUS_CHIP_HEIGHT_TO_DOT_KEYFRAME_2 = PathInterpolator(0.3f, 0f, 0f, 1f) val STATUS_CHIP_MOVE_TO_DOT = PathInterpolator(0f, 0f, 0.05f, 1f) -private const val TAG = "SystemStatusAnimationScheduler" -private const val DEBOUNCE_DELAY = 100L +internal const val DEBOUNCE_DELAY = 100L /** * The total time spent on the chip animation is 1500ms, broken up into 3 sections: - * - 500ms to animate the chip in (including animating system icons away) - * - 500ms holding the chip on screen - * - 500ms to animate the chip away (and system icons back) - * - * So DISPLAY_LENGTH should be the sum of the first 2 phases, while the final 500ms accounts for - * the actual animation + * - 500ms to animate the chip in (including animating system icons away) + * - 500ms holding the chip on screen + * - 500ms to animate the chip away (and system icons back) */ -private const val DISPLAY_LENGTH = 1000L - -private const val MIN_UPTIME: Long = 5 * 1000 +internal const val APPEAR_ANIMATION_DURATION = 500L +internal const val DISPLAY_LENGTH = 3000L +internal const val DISAPPEAR_ANIMATION_DURATION = 500L -private const val DEBUG = false +internal const val MIN_UPTIME: Long = 5 * 1000
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt new file mode 100644 index 000000000000..f7a4feafee25 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt @@ -0,0 +1,425 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.events + +import android.os.Process +import android.provider.DeviceConfig +import android.util.Log +import androidx.core.animation.Animator +import androidx.core.animation.AnimatorListenerAdapter +import androidx.core.animation.AnimatorSet +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.Assert +import com.android.systemui.util.time.SystemClock +import java.io.PrintWriter +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeout + +/** + * Scheduler for system status events. Obeys the following principles: + * ``` + * - Waits 100 ms to schedule any event for debouncing/prioritization + * - Simple prioritization: Privacy > Battery > Connectivity (encoded in [StatusEvent]) + * - Only schedules a single event, and throws away lowest priority events + * ``` + * + * There are 4 basic stages of animation at play here: + * ``` + * 1. System chrome animation OUT + * 2. Chip animation IN + * 3. Chip animation OUT; potentially into a dot + * 4. System chrome animation IN + * ``` + * + * Thus we can keep all animations synchronized with two separate ValueAnimators, one for system + * chrome and the other for the chip. These can animate from 0,1 and listeners can parameterize + * their respective views based on the progress of the animator. + */ +@OptIn(FlowPreview::class) +open class SystemStatusAnimationSchedulerImpl +@Inject +constructor( + private val coordinator: SystemEventCoordinator, + private val chipAnimationController: SystemEventChipAnimationController, + private val statusBarWindowController: StatusBarWindowController, + dumpManager: DumpManager, + private val systemClock: SystemClock, + @Application private val coroutineScope: CoroutineScope +) : SystemStatusAnimationScheduler { + + companion object { + private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator" + } + + /** Contains the StatusEvent that is going to be displayed next. */ + private var scheduledEvent = MutableStateFlow<StatusEvent?>(null) + + /** + * The currently displayed status event. (This is null in all states except ANIMATING_IN and + * CHIP_ANIMATION_RUNNING) + */ + private var currentlyDisplayedEvent: StatusEvent? = null + + /** StateFlow holding the current [SystemAnimationState] at any time. */ + private var animationState = MutableStateFlow(IDLE) + + /** True if the persistent privacy dot should be active */ + var hasPersistentDot = false + protected set + + /** Set of currently registered listeners */ + protected val listeners = mutableSetOf<SystemStatusAnimationCallback>() + + /** The job that is controlling the animators of the currently displayed status event. */ + private var currentlyRunningAnimationJob: Job? = null + + /** The job that is controlling the animators when an event is cancelled. */ + private var eventCancellationJob: Job? = null + + init { + coordinator.attachScheduler(this) + dumpManager.registerCriticalDumpable(TAG, this) + + coroutineScope.launch { + // Wait for animationState to become ANIMATION_QUEUED and scheduledEvent to be non null. + // Once this combination is stable for at least DEBOUNCE_DELAY, then start a chip enter + // animation + animationState + .combine(scheduledEvent) { animationState, scheduledEvent -> + Pair(animationState, scheduledEvent) + } + .debounce(DEBOUNCE_DELAY) + .collect { (animationState, event) -> + if (animationState == ANIMATION_QUEUED && event != null) { + startAnimationLifecycle(event) + scheduledEvent.value = null + } + } + } + } + + @SystemAnimationState override fun getAnimationState(): Int = animationState.value + + override fun onStatusEvent(event: StatusEvent) { + Assert.isMainThread() + + // Ignore any updates until the system is up and running + if (isTooEarly() || !isImmersiveIndicatorEnabled()) { + return + } + + if ( + (event.priority > (scheduledEvent.value?.priority ?: -1)) && + (event.priority > (currentlyDisplayedEvent?.priority ?: -1)) && + !hasPersistentDot + ) { + // a event can only be scheduled if no other event is in progress or it has a higher + // priority. If a persistent dot is currently displayed, don't schedule the event. + if (DEBUG) { + Log.d(TAG, "scheduling event $event") + } + + scheduleEvent(event) + } else if (currentlyDisplayedEvent?.shouldUpdateFromEvent(event) == true) { + if (DEBUG) { + Log.d( + TAG, + "updating current event from: $event. animationState=${animationState.value}" + ) + } + currentlyDisplayedEvent?.updateFromEvent(event) + } else if (scheduledEvent.value?.shouldUpdateFromEvent(event) == true) { + if (DEBUG) { + Log.d( + TAG, + "updating scheduled event from: $event. animationState=${animationState.value}" + ) + } + scheduledEvent.value?.updateFromEvent(event) + } else { + if (DEBUG) { + Log.d(TAG, "ignoring event $event") + } + } + } + + override fun removePersistentDot() { + Assert.isMainThread() + + // If there is an event scheduled currently, set its forceVisible flag to false, such that + // it will never transform into a persistent dot + scheduledEvent.value?.forceVisible = false + + // Nothing else to do if hasPersistentDot is already false + if (!hasPersistentDot) return + // Set hasPersistentDot to false. If the animationState is anything before ANIMATING_OUT, + // the disappear animation will not animate into a dot but remove the chip entirely + hasPersistentDot = false + // if we are currently showing a persistent dot, hide it + if (animationState.value == SHOWING_PERSISTENT_DOT) notifyHidePersistentDot() + // if we are currently animating into a dot, wait for the animation to finish and then hide + // the dot + if (animationState.value == ANIMATING_OUT) { + coroutineScope.launch { + withTimeout(DISAPPEAR_ANIMATION_DURATION) { + animationState.first { it == SHOWING_PERSISTENT_DOT || it == ANIMATION_QUEUED } + notifyHidePersistentDot() + } + } + } + } + + protected fun isTooEarly(): Boolean { + return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME + } + + protected fun isImmersiveIndicatorEnabled(): Boolean { + return DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_PRIVACY, + PROPERTY_ENABLE_IMMERSIVE_INDICATOR, + true + ) + } + + /** Clear the scheduled event (if any) and schedule a new one */ + private fun scheduleEvent(event: StatusEvent) { + scheduledEvent.value = event + if (currentlyDisplayedEvent != null && eventCancellationJob?.isActive != true) { + // cancel the currently displayed event. As soon as the event is animated out, the + // scheduled event will be displayed. + cancelCurrentlyDisplayedEvent() + return + } + if (animationState.value == IDLE) { + // If we are in IDLE state, set it to ANIMATION_QUEUED now + animationState.value = ANIMATION_QUEUED + } + } + + /** + * Cancels the currently displayed event by animating it out. This function should only be + * called if the animationState is ANIMATING_IN or RUNNING_CHIP_ANIM, or in other words whenever + * currentlyRunningEvent is not null + */ + private fun cancelCurrentlyDisplayedEvent() { + eventCancellationJob = + coroutineScope.launch { + withTimeout(APPEAR_ANIMATION_DURATION) { + // wait for animationState to become RUNNING_CHIP_ANIM, then cancel the running + // animation job and run the disappear animation immediately + animationState.first { it == RUNNING_CHIP_ANIM } + currentlyRunningAnimationJob?.cancel() + runChipDisappearAnimation() + } + } + } + + /** + * Takes the currently scheduled Event and (using the coroutineScope) animates it in and out + * again after displaying it for DISPLAY_LENGTH ms. This function should only be called if there + * is an event scheduled (and currentlyDisplayedEvent is null) + */ + private fun startAnimationLifecycle(event: StatusEvent) { + Assert.isMainThread() + hasPersistentDot = event.forceVisible + + if (!event.showAnimation && event.forceVisible) { + // If animations are turned off, we'll transition directly to the dot + animationState.value = SHOWING_PERSISTENT_DOT + notifyTransitionToPersistentDot() + return + } + + currentlyDisplayedEvent = event + + chipAnimationController.prepareChipAnimation(event.viewCreator) + currentlyRunningAnimationJob = + coroutineScope.launch { + runChipAppearAnimation() + delay(APPEAR_ANIMATION_DURATION + DISPLAY_LENGTH) + runChipDisappearAnimation() + } + } + + /** + * 1. Define a total budget for the chip animation (1500ms) + * 2. Send out callbacks to listeners so that they can generate animations locally + * 3. Update the scheduler state so that clients know where we are + * 4. Maybe: provide scaffolding such as: dot location, margins, etc + * 5. Maybe: define a maximum animation length and enforce it. Probably only doable if we + * collect all of the animators and run them together. + */ + private fun runChipAppearAnimation() { + Assert.isMainThread() + if (hasPersistentDot) { + statusBarWindowController.setForceStatusBarVisible(true) + } + animationState.value = ANIMATING_IN + + val animSet = collectStartAnimations() + if (animSet.totalDuration > 500) { + throw IllegalStateException( + "System animation total length exceeds budget. " + + "Expected: 500, actual: ${animSet.totalDuration}" + ) + } + animSet.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + animationState.value = RUNNING_CHIP_ANIM + } + } + ) + animSet.start() + } + + private fun runChipDisappearAnimation() { + Assert.isMainThread() + val animSet2 = collectFinishAnimations() + animationState.value = ANIMATING_OUT + animSet2.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + animationState.value = + when { + hasPersistentDot -> SHOWING_PERSISTENT_DOT + scheduledEvent.value != null -> ANIMATION_QUEUED + else -> IDLE + } + statusBarWindowController.setForceStatusBarVisible(false) + } + } + ) + animSet2.start() + + // currentlyDisplayedEvent is set to null before the animation has ended such that new + // events can be scheduled during the disappear animation. We don't want to miss e.g. a new + // privacy event being scheduled during the disappear animation, otherwise we could end up + // with e.g. an active microphone but no privacy dot being displayed. + currentlyDisplayedEvent = null + } + + private fun collectStartAnimations(): AnimatorSet { + val animators = mutableListOf<Animator>() + listeners.forEach { listener -> + listener.onSystemEventAnimationBegin()?.let { anim -> animators.add(anim) } + } + animators.add(chipAnimationController.onSystemEventAnimationBegin()) + + return AnimatorSet().also { it.playTogether(animators) } + } + + private fun collectFinishAnimations(): AnimatorSet { + val animators = mutableListOf<Animator>() + listeners.forEach { listener -> + listener.onSystemEventAnimationFinish(hasPersistentDot)?.let { anim -> + animators.add(anim) + } + } + animators.add(chipAnimationController.onSystemEventAnimationFinish(hasPersistentDot)) + if (hasPersistentDot) { + val dotAnim = notifyTransitionToPersistentDot() + if (dotAnim != null) { + animators.add(dotAnim) + } + } + + return AnimatorSet().also { it.playTogether(animators) } + } + + private fun notifyTransitionToPersistentDot(): Animator? { + val anims: List<Animator> = + listeners.mapNotNull { + it.onSystemStatusAnimationTransitionToPersistentDot( + currentlyDisplayedEvent?.contentDescription + ) + } + if (anims.isNotEmpty()) { + val aSet = AnimatorSet() + aSet.playTogether(anims) + return aSet + } + + return null + } + + private fun notifyHidePersistentDot(): Animator? { + Assert.isMainThread() + val anims: List<Animator> = listeners.mapNotNull { it.onHidePersistentDot() } + + if (animationState.value == SHOWING_PERSISTENT_DOT) { + if (scheduledEvent.value != null) { + animationState.value = ANIMATION_QUEUED + } else { + animationState.value = IDLE + } + } + + if (anims.isNotEmpty()) { + val aSet = AnimatorSet() + aSet.playTogether(anims) + return aSet + } + + return null + } + + override fun addCallback(listener: SystemStatusAnimationCallback) { + Assert.isMainThread() + + if (listeners.isEmpty()) { + coordinator.startObserving() + } + listeners.add(listener) + } + + override fun removeCallback(listener: SystemStatusAnimationCallback) { + Assert.isMainThread() + + listeners.remove(listener) + if (listeners.isEmpty()) { + coordinator.stopObserving() + } + } + + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.println("Scheduled event: ${scheduledEvent.value}") + pw.println("Currently displayed event: $currentlyDisplayedEvent") + pw.println("Has persistent privacy dot: $hasPersistentDot") + pw.println("Animation state: ${animationState.value}") + pw.println("Listeners:") + if (listeners.isEmpty()) { + pw.println("(none)") + } else { + listeners.forEach { pw.println(" $it") } + } + } +} + +private const val DEBUG = false +private const val TAG = "SystemStatusAnimationSchedulerImpl" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt new file mode 100644 index 000000000000..64b7ac9ee0a1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt @@ -0,0 +1,312 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.events + +import android.os.Process +import android.provider.DeviceConfig +import android.util.Log +import androidx.core.animation.Animator +import androidx.core.animation.AnimatorListenerAdapter +import androidx.core.animation.AnimatorSet +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.Assert +import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.time.SystemClock +import java.io.PrintWriter +import javax.inject.Inject + +/** + * Dead-simple scheduler for system status events. Obeys the following principles (all values TBD): + * ``` + * - Avoiding log spam by only allowing 12 events per minute (1event/5s) + * - Waits 100ms to schedule any event for debouncing/prioritization + * - Simple prioritization: Privacy > Battery > connectivity (encoded in [StatusEvent]) + * - Only schedules a single event, and throws away lowest priority events + * ``` + * There are 4 basic stages of animation at play here: + * ``` + * 1. System chrome animation OUT + * 2. Chip animation IN + * 3. Chip animation OUT; potentially into a dot + * 4. System chrome animation IN + * ``` + * Thus we can keep all animations synchronized with two separate ValueAnimators, one for system + * chrome and the other for the chip. These can animate from 0,1 and listeners can parameterize + * their respective views based on the progress of the animator. Interpolation differences TBD + */ +open class SystemStatusAnimationSchedulerLegacyImpl +@Inject +constructor( + private val coordinator: SystemEventCoordinator, + private val chipAnimationController: SystemEventChipAnimationController, + private val statusBarWindowController: StatusBarWindowController, + private val dumpManager: DumpManager, + private val systemClock: SystemClock, + @Main private val executor: DelayableExecutor +) : SystemStatusAnimationScheduler { + + companion object { + private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator" + } + + fun isImmersiveIndicatorEnabled(): Boolean { + return DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_PRIVACY, + PROPERTY_ENABLE_IMMERSIVE_INDICATOR, + true + ) + } + + @SystemAnimationState private var animationState: Int = IDLE + + /** True if the persistent privacy dot should be active */ + var hasPersistentDot = false + protected set + + private var scheduledEvent: StatusEvent? = null + + val listeners = mutableSetOf<SystemStatusAnimationCallback>() + + init { + coordinator.attachScheduler(this) + dumpManager.registerDumpable(TAG, this) + } + + @SystemAnimationState override fun getAnimationState() = animationState + + override fun onStatusEvent(event: StatusEvent) { + // Ignore any updates until the system is up and running + if (isTooEarly() || !isImmersiveIndicatorEnabled()) { + return + } + + // Don't deal with threading for now (no need let's be honest) + Assert.isMainThread() + if ( + (event.priority > (scheduledEvent?.priority ?: -1)) && + animationState != ANIMATING_OUT && + animationState != SHOWING_PERSISTENT_DOT + ) { + // events can only be scheduled if a higher priority or no other event is in progress + if (DEBUG) { + Log.d(TAG, "scheduling event $event") + } + + scheduleEvent(event) + } else if (scheduledEvent?.shouldUpdateFromEvent(event) == true) { + if (DEBUG) { + Log.d(TAG, "updating current event from: $event. animationState=$animationState") + } + scheduledEvent?.updateFromEvent(event) + if (event.forceVisible) { + hasPersistentDot = true + // If we missed the chance to show the persistent dot, do it now + if (animationState == IDLE) { + notifyTransitionToPersistentDot() + } + } + } else { + if (DEBUG) { + Log.d(TAG, "ignoring event $event") + } + } + } + + override fun removePersistentDot() { + if (!hasPersistentDot || !isImmersiveIndicatorEnabled()) { + return + } + + hasPersistentDot = false + notifyHidePersistentDot() + return + } + + fun isTooEarly(): Boolean { + return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME + } + + /** Clear the scheduled event (if any) and schedule a new one */ + private fun scheduleEvent(event: StatusEvent) { + scheduledEvent = event + + if (event.forceVisible) { + hasPersistentDot = true + } + + // If animations are turned off, we'll transition directly to the dot + if (!event.showAnimation && event.forceVisible) { + notifyTransitionToPersistentDot() + scheduledEvent = null + return + } + + chipAnimationController.prepareChipAnimation(scheduledEvent!!.viewCreator) + animationState = ANIMATION_QUEUED + executor.executeDelayed({ runChipAnimation() }, DEBOUNCE_DELAY) + } + + /** + * 1. Define a total budget for the chip animation (1500ms) + * 2. Send out callbacks to listeners so that they can generate animations locally + * 3. Update the scheduler state so that clients know where we are + * 4. Maybe: provide scaffolding such as: dot location, margins, etc + * 5. Maybe: define a maximum animation length and enforce it. Probably only doable if we + * collect all of the animators and run them together. + */ + private fun runChipAnimation() { + statusBarWindowController.setForceStatusBarVisible(true) + animationState = ANIMATING_IN + + val animSet = collectStartAnimations() + if (animSet.totalDuration > 500) { + throw IllegalStateException( + "System animation total length exceeds budget. " + + "Expected: 500, actual: ${animSet.totalDuration}" + ) + } + animSet.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + animationState = RUNNING_CHIP_ANIM + } + } + ) + animSet.start() + + executor.executeDelayed( + { + val animSet2 = collectFinishAnimations() + animationState = ANIMATING_OUT + animSet2.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + animationState = + if (hasPersistentDot) { + SHOWING_PERSISTENT_DOT + } else { + IDLE + } + + statusBarWindowController.setForceStatusBarVisible(false) + } + } + ) + animSet2.start() + scheduledEvent = null + }, + DISPLAY_LENGTH + ) + } + + private fun collectStartAnimations(): AnimatorSet { + val animators = mutableListOf<Animator>() + listeners.forEach { listener -> + listener.onSystemEventAnimationBegin()?.let { anim -> animators.add(anim) } + } + animators.add(chipAnimationController.onSystemEventAnimationBegin()) + val animSet = AnimatorSet().also { it.playTogether(animators) } + + return animSet + } + + private fun collectFinishAnimations(): AnimatorSet { + val animators = mutableListOf<Animator>() + listeners.forEach { listener -> + listener.onSystemEventAnimationFinish(hasPersistentDot)?.let { anim -> + animators.add(anim) + } + } + animators.add(chipAnimationController.onSystemEventAnimationFinish(hasPersistentDot)) + if (hasPersistentDot) { + val dotAnim = notifyTransitionToPersistentDot() + if (dotAnim != null) { + animators.add(dotAnim) + } + } + val animSet = AnimatorSet().also { it.playTogether(animators) } + + return animSet + } + + private fun notifyTransitionToPersistentDot(): Animator? { + val anims: List<Animator> = + listeners.mapNotNull { + it.onSystemStatusAnimationTransitionToPersistentDot( + scheduledEvent?.contentDescription + ) + } + if (anims.isNotEmpty()) { + val aSet = AnimatorSet() + aSet.playTogether(anims) + return aSet + } + + return null + } + + private fun notifyHidePersistentDot(): Animator? { + val anims: List<Animator> = listeners.mapNotNull { it.onHidePersistentDot() } + + if (animationState == SHOWING_PERSISTENT_DOT) { + animationState = IDLE + } + + if (anims.isNotEmpty()) { + val aSet = AnimatorSet() + aSet.playTogether(anims) + return aSet + } + + return null + } + + override fun addCallback(listener: SystemStatusAnimationCallback) { + Assert.isMainThread() + + if (listeners.isEmpty()) { + coordinator.startObserving() + } + listeners.add(listener) + } + + override fun removeCallback(listener: SystemStatusAnimationCallback) { + Assert.isMainThread() + + listeners.remove(listener) + if (listeners.isEmpty()) { + coordinator.stopObserving() + } + } + + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.println("Scheduled event: $scheduledEvent") + pw.println("Has persistent privacy dot: $hasPersistentDot") + pw.println("Animation state: $animationState") + pw.println("Listeners:") + if (listeners.isEmpty()) { + pw.println("(none)") + } else { + listeners.forEach { pw.println(" $it") } + } + } +} + +private const val DEBUG = false +private const val TAG = "SystemStatusAnimationSchedulerLegacyImpl" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index 6ef6165bcbb3..29510d00a8d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -52,18 +52,19 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.plugins.FalsingManager +import com.android.systemui.plugins.WeatherData import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.settings.UserTracker import com.android.systemui.shared.regionsampling.RegionSampler import com.android.systemui.shared.regionsampling.UpdateColorCallback import com.android.systemui.smartspace.dagger.SmartspaceModule.Companion.DATE_SMARTSPACE_DATA_PLUGIN import com.android.systemui.smartspace.dagger.SmartspaceModule.Companion.WEATHER_SMARTSPACE_DATA_PLUGIN -import com.android.systemui.plugins.Weather import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.util.concurrency.Execution import com.android.systemui.util.settings.SecureSettings +import com.android.systemui.util.time.SystemClock import java.io.PrintWriter import java.time.Instant import java.util.Optional @@ -81,6 +82,7 @@ constructor( private val smartspaceManager: SmartspaceManager, private val activityStarter: ActivityStarter, private val falsingManager: FalsingManager, + private val systemClock: SystemClock, private val secureSettings: SecureSettings, private val userTracker: UserTracker, private val contentResolver: ContentResolver, @@ -152,6 +154,18 @@ constructor( // The weather data plugin takes unfiltered targets and performs the filtering internally. weatherPlugin?.onTargetsAvailable(targets) + val now = Instant.ofEpochMilli(systemClock.currentTimeMillis()) + val weatherTarget = targets.find { t -> + t.featureType == SmartspaceTarget.FEATURE_WEATHER && + now.isAfter(Instant.ofEpochMilli(t.creationTimeMillis)) && + now.isBefore(Instant.ofEpochMilli(t.expiryTimeMillis)) + } + if (weatherTarget != null) { + val weatherData = WeatherData.fromBundle(weatherTarget.baseAction.extras) + if (weatherData != null) { + keyguardUpdateMonitor.sendWeatherData(weatherData) + } + } val filteredTargets = targets.filter(::filterSmartspaceTarget) plugin?.onTargetsAvailable(filteredTargets) @@ -173,17 +187,6 @@ constructor( } isContentUpdatedOnce = true } - - val now = Instant.now() - val weatherTarget = targets.find { t -> - t.featureType == SmartspaceTarget.FEATURE_WEATHER && - now.isAfter(Instant.ofEpochMilli(t.creationTimeMillis)) && - now.isBefore(Instant.ofEpochMilli(t.expiryTimeMillis)) - } - if (weatherTarget != null) { - val weatherData = Weather.fromBundle(weatherTarget.baseAction.extras) - keyguardUpdateMonitor.sendWeatherData(weatherData) - } } private val userTrackerCallback = object : UserTracker.Callback { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt index 44645315ca80..88d9ffcdcf3e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt @@ -13,7 +13,7 @@ package com.android.systemui.statusbar.notification -import com.android.systemui.log.dagger.NotificationLog +import com.android.systemui.log.dagger.NotificationLockscreenLog import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogLevel.DEBUG import com.android.systemui.statusbar.StatusBarState @@ -21,7 +21,12 @@ import javax.inject.Inject class NotificationWakeUpCoordinatorLogger @Inject -constructor(@NotificationLog private val buffer: LogBuffer) { +constructor(@NotificationLockscreenLog private val buffer: LogBuffer) { + private var lastSetDozeAmountLogWasFractional = false + private var lastSetDozeAmountLogState = -1 + private var lastSetDozeAmountLogSource = "undefined" + private var lastOnDozeAmountChangedLogWasFractional = false + fun logSetDozeAmount( linear: Float, eased: Float, @@ -29,6 +34,20 @@ constructor(@NotificationLog private val buffer: LogBuffer) { state: Int, changed: Boolean, ) { + // Avoid logging on every frame of the animation if important values are not changing + val isFractional = linear != 1f && linear != 0f + if ( + lastSetDozeAmountLogWasFractional && + isFractional && + lastSetDozeAmountLogState == state && + lastSetDozeAmountLogSource == source + ) { + return + } + lastSetDozeAmountLogWasFractional = isFractional + lastSetDozeAmountLogState = state + lastSetDozeAmountLogSource = source + buffer.log( TAG, DEBUG, @@ -66,6 +85,10 @@ constructor(@NotificationLog private val buffer: LogBuffer) { } fun logOnDozeAmountChanged(linear: Float, eased: Float) { + // Avoid logging on every frame of the animation when values are fractional + val isFractional = linear != 1f && linear != 0f + if (lastOnDozeAmountChangedLogWasFractional && isFractional) return + lastOnDozeAmountChangedLogWasFractional = isFractional buffer.log( TAG, DEBUG, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index aaf9300e7cc8..c6f56d482d43 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -251,13 +251,13 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc || (isFastNonDismissGesture && isAbleToShowMenu); int menuSnapTarget = menuRow.getMenuSnapTarget(); boolean isNonFalseMenuRevealingGesture = - !isFalseGesture() && isMenuRevealingGestureAwayFromMenu; + isMenuRevealingGestureAwayFromMenu && !isFalseGesture(); if ((isNonDismissGestureTowardsMenu || isNonFalseMenuRevealingGesture) && menuSnapTarget != 0) { // Menu has not been snapped to previously and this is menu revealing gesture snapOpen(animView, menuSnapTarget, velocity); menuRow.onSnapOpen(); - } else if (isDismissGesture(ev) && !gestureTowardsMenu) { + } else if (isDismissGesture && !gestureTowardsMenu) { dismiss(animView, velocity); menuRow.onDismiss(); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java index 576df7ac7add..f6d53b3bc9b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java @@ -31,7 +31,7 @@ import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.SettingObserver; import com.android.systemui.qs.external.CustomTile; @@ -75,7 +75,7 @@ public class AutoTileManager implements UserAwareController { private final String mSafetySpec; protected final Context mContext; - protected final QSTileHost mHost; + protected final QSHost mHost; protected final Handler mHandler; protected final SecureSettings mSecureSettings; protected final AutoAddTracker mAutoTracker; @@ -92,7 +92,7 @@ public class AutoTileManager implements UserAwareController { private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>(); public AutoTileManager(Context context, AutoAddTracker.Builder autoAddTrackerBuilder, - QSTileHost host, + QSHost host, @Background Handler handler, SecureSettings secureSettings, HotspotController hotspotController, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 4d0ad405835a..311728fff6aa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -372,8 +372,6 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn void fadeKeyguardAfterLaunchTransition(Runnable beforeFading, Runnable endRunnable, Runnable cancelRunnable); - void animateKeyguardUnoccluding(); - void startLaunchTransitionTimeout(); boolean hideKeyguardImpl(boolean forceStateChange); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index b8ab956b32d3..df850ae42712 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -53,6 +53,7 @@ import com.android.systemui.camera.CameraIntents; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSPanelController; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; @@ -106,6 +107,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba private final SystemBarAttributesListener mSystemBarAttributesListener; private final Lazy<CameraLauncher> mCameraLauncherLazy; private final QuickSettingsController mQsController; + private final QSHost mQSHost; private static final VibrationAttributes HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES = VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK); @@ -138,7 +140,8 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba @DisplayId int displayId, SystemBarAttributesListener systemBarAttributesListener, Lazy<CameraLauncher> cameraLauncherLazy, - UserTracker userTracker) { + UserTracker userTracker, + QSHost qsHost) { mCentralSurfaces = centralSurfaces; mQsController = quickSettingsController; mContext = context; @@ -164,6 +167,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba mDisplayId = displayId; mCameraLauncherLazy = cameraLauncherLazy; mUserTracker = userTracker; + mQSHost = qsHost; mVibrateOnOpening = resources.getBoolean(R.bool.config_vibrateOnIconAnimation); mCameraLaunchGestureVibrationEffect = getCameraGestureVibrationEffect( @@ -184,22 +188,17 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba @Override public void addQsTile(ComponentName tile) { - QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController(); - if (qsPanelController != null && qsPanelController.getHost() != null) { - qsPanelController.getHost().addTile(tile); - } + mQSHost.addTile(tile); } @Override public void remQsTile(ComponentName tile) { - QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController(); - if (qsPanelController != null && qsPanelController.getHost() != null) { - qsPanelController.getHost().removeTileByUser(tile); - } + mQSHost.removeTileByUser(tile); } @Override public void clickTile(ComponentName tile) { + // Can't inject this because it changes with the QS fragment QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController(); if (qsPanelController != null) { qsPanelController.clickTile(tile); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 378b74a62024..f0891f99daa8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -2984,16 +2984,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } /** - * Plays the animation when an activity that was occluding Keyguard goes away. - */ - @Override - public void animateKeyguardUnoccluding() { - mNotificationPanelViewController.setExpandedFraction(0f); - mCommandQueueCallbacks.animateExpandNotificationsPanel(); - mScrimController.setUnocclusionAnimationRunning(true); - } - - /** * Starts the timeout when we try to start the affordances on Keyguard. We usually rely that * Keyguard goes away via fadeKeyguardAfterLaunchTransition, however, that might not happen * because the launched app crashed or something else went wrong. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index cba0897408dd..753032c2ee01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -21,9 +21,6 @@ import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; @@ -36,13 +33,16 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import androidx.core.animation.Animator; +import androidx.core.animation.AnimatorListenerAdapter; +import androidx.core.animation.ValueAnimator; import com.android.keyguard.CarrierTextController; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.R; -import com.android.systemui.animation.Interpolators; +import com.android.systemui.animation.InterpolatorsAndroidX; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.log.LogLevel; @@ -166,7 +166,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat private final ValueAnimator.AnimatorUpdateListener mAnimatorUpdateListener = animation -> { - mKeyguardStatusBarAnimateAlpha = (float) animation.getAnimatedValue(); + mKeyguardStatusBarAnimateAlpha = + (float) ((ValueAnimator) animation).getAnimatedValue(); updateViewState(); }; @@ -434,7 +435,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.addUpdateListener(mAnimatorUpdateListener); anim.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); - anim.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + anim.setInterpolator(InterpolatorsAndroidX.LINEAR_OUT_SLOW_IN); anim.start(); } @@ -445,7 +446,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat anim.addUpdateListener(mAnimatorUpdateListener); anim.setStartDelay(startDelay); anim.setDuration(duration); - anim.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + anim.setInterpolator(InterpolatorsAndroidX.LINEAR_OUT_SLOW_IN); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 80093a3da325..8e0ec284c840 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -138,26 +138,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private boolean mTransitioningToFullShade; /** - * Is there currently an unocclusion animation running. Used to avoid bright flickers - * of the notification scrim. - */ - private boolean mUnOcclusionAnimationRunning; - - /** * The percentage of the bouncer which is hidden. If 1, the bouncer is completely hidden. If * 0, the bouncer is visible. */ @FloatRange(from = 0, to = 1) private float mBouncerHiddenFraction = KeyguardBouncerConstants.EXPANSION_HIDDEN; - /** - * Set whether an unocclusion animation is currently running on the notification panel. Used - * to avoid bright flickers of the notification scrim. - */ - public void setUnocclusionAnimationRunning(boolean unocclusionAnimationRunning) { - mUnOcclusionAnimationRunning = unocclusionAnimationRunning; - } - @IntDef(prefix = {"VISIBILITY_"}, value = { TRANSPARENT, SEMI_TRANSPARENT, @@ -532,10 +518,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } } - public void onExpandingFinished() { - setUnocclusionAnimationRunning(false); - } - @VisibleForTesting protected void onHideWallpaperTimeout() { if (mState != ScrimState.AOD && mState != ScrimState.PULSING) { @@ -875,13 +857,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mKeyguardOccluded || hideNotificationScrim) { mNotificationsAlpha = 0; } - if (mUnOcclusionAnimationRunning && mState == ScrimState.KEYGUARD) { - // We're unoccluding the keyguard and don't want to have a bright flash. - mNotificationsAlpha = ScrimState.KEYGUARD.getNotifAlpha(); - mNotificationsTint = ScrimState.KEYGUARD.getNotifTint(); - mBehindAlpha = ScrimState.KEYGUARD.getBehindAlpha(); - mBehindTint = ScrimState.KEYGUARD.getBehindTint(); - } } if (mState != ScrimState.UNLOCKED) { mAnimatingPanelExpansionOnUnlock = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 39281da09749..3c32131220d7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -66,6 +66,7 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInt import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.navigationbar.TaskbarDelegate; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.ShadeController; @@ -279,7 +280,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mLastScreenOffAnimationPlaying; private float mQsExpansion; final Set<KeyguardViewManagerCallback> mCallbacks = new HashSet<>(); - private boolean mIsUnoccludeTransitionFlagEnabled; private boolean mIsModernAlternateBouncerEnabled; private boolean mIsBackAnimationEnabled; @@ -300,6 +300,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Nullable private KeyguardBypassController mBypassController; @Nullable private OccludingAppBiometricUI mOccludingAppBiometricUI; + @Nullable private TaskbarDelegate mTaskbarDelegate; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -357,7 +358,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mPrimaryBouncerView = primaryBouncerView; mFoldAodAnimationController = sysUIUnfoldComponent .map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null); - mIsUnoccludeTransitionFlagEnabled = featureFlags.isEnabled(Flags.UNOCCLUSION_TRANSITION); mIsModernAlternateBouncerEnabled = featureFlags.isEnabled(Flags.MODERN_ALTERNATE_BOUNCER); mAlternateBouncerInteractor = alternateBouncerInteractor; mIsBackAnimationEnabled = @@ -564,6 +564,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb updateStates(); } + public void setTaskbarDelegate(TaskbarDelegate taskbarDelegate) { + mTaskbarDelegate = taskbarDelegate; + } + /** * Show the keyguard. Will handle creating and attaching to the view manager * lazily. @@ -790,7 +794,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void onFinishedGoingToSleep() { - mPrimaryBouncerInteractor.onScreenTurnedOff(); + mPrimaryBouncerInteractor.hide(); } @Override @@ -874,11 +878,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb // by a FLAG_DISMISS_KEYGUARD_ACTIVITY. reset(isOccluding /* hideBouncerWhenShowing*/); } - if (!mIsUnoccludeTransitionFlagEnabled) { - if (animate && !isOccluded && isShowing && !primaryBouncerIsShowing()) { - mCentralSurfaces.animateKeyguardUnoccluding(); - } - } } @Override @@ -1194,7 +1193,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * Updates the visibility of the nav bar window (which will cause insets changes). */ protected void updateNavigationBarVisibility(boolean navBarVisible) { - if (mCentralSurfaces.getNavigationBarView() != null) { + if (mCentralSurfaces.getNavigationBarView() != null + || (mTaskbarDelegate != null && mTaskbarDelegate.isInitialized())) { if (navBarVisible) { long delay = getNavBarShowDelay(); if (delay == 0) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java index aec196fc90f0..8e59a8b62a05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java @@ -22,11 +22,11 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.android.keyguard.LockIconViewController; import com.android.systemui.biometrics.AuthRippleController; -import com.android.systemui.shade.LargeScreenShadeHeaderController; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.QuickSettingsController; +import com.android.systemui.shade.ShadeHeaderController; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationShelfController; import com.android.systemui.statusbar.core.StatusBarInitializer; @@ -138,9 +138,9 @@ public interface CentralSurfacesComponent { CentralSurfacesCommandQueueCallbacks getCentralSurfacesCommandQueueCallbacks(); /** - * Creates a {@link LargeScreenShadeHeaderController}. + * Creates a {@link ShadeHeaderController}. */ - LargeScreenShadeHeaderController getLargeScreenShadeHeaderController(); + ShadeHeaderController getLargeScreenShadeHeaderController(); /** * Creates a new {@link CollapsedStatusBarFragment} each time it's called. See diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index c1c6c88da822..0929233feb88 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -20,9 +20,10 @@ import android.annotation.Nullable; import android.content.ContentResolver; import android.os.Handler; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewStub; +import androidx.constraintlayout.motion.widget.MotionLayout; + import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.LockIconView; import com.android.systemui.R; @@ -32,7 +33,6 @@ import com.android.systemui.biometrics.AuthRippleView; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.privacy.OngoingPrivacyChip; import com.android.systemui.settings.UserTracker; @@ -85,9 +85,7 @@ import dagger.multibindings.IntoSet; @Module(subcomponents = StatusBarFragmentComponent.class) public abstract class StatusBarViewModule { - public static final String LARGE_SCREEN_SHADE_HEADER = "large_screen_shade_header"; - private static final String SPLIT_SHADE_BATTERY_VIEW = "split_shade_battery_view"; - public static final String LARGE_SCREEN_BATTERY_CONTROLLER = "split_shade_battery_controller"; + public static final String SHADE_HEADER = "large_screen_shade_header"; public static final String STATUS_BAR_FRAGMENT = "status_bar_fragment"; /** */ @@ -171,17 +169,15 @@ public abstract class StatusBarViewModule { /** */ @Provides - @Named(LARGE_SCREEN_SHADE_HEADER) + @Named(SHADE_HEADER) @CentralSurfacesComponent.CentralSurfacesScope - public static View getLargeScreenShadeHeaderBarView( + public static MotionLayout getLargeScreenShadeHeaderBarView( NotificationShadeWindowView notificationShadeWindowView, FeatureFlags featureFlags) { ViewStub stub = notificationShadeWindowView.findViewById(R.id.qs_header_stub); - int layoutId = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS) - ? R.layout.combined_qs_header - : R.layout.large_screen_shade_header; + int layoutId = R.layout.combined_qs_header; stub.setLayoutResource(layoutId); - View v = stub.inflate(); + MotionLayout v = (MotionLayout) stub.inflate(); return v; } @@ -197,7 +193,7 @@ public abstract class StatusBarViewModule { @Provides @CentralSurfacesComponent.CentralSurfacesScope public static OngoingPrivacyChip getSplitShadeOngoingPrivacyChip( - @Named(LARGE_SCREEN_SHADE_HEADER) View header) { + @Named(SHADE_HEADER) MotionLayout header) { return header.findViewById(R.id.privacy_chip); } @@ -205,23 +201,23 @@ public abstract class StatusBarViewModule { @Provides @CentralSurfacesComponent.CentralSurfacesScope static StatusIconContainer providesStatusIconContainer( - @Named(LARGE_SCREEN_SHADE_HEADER) View header) { + @Named(SHADE_HEADER) MotionLayout header) { return header.findViewById(R.id.statusIcons); } /** */ @Provides @CentralSurfacesComponent.CentralSurfacesScope - @Named(SPLIT_SHADE_BATTERY_VIEW) - static BatteryMeterView getBatteryMeterView(@Named(LARGE_SCREEN_SHADE_HEADER) View view) { + @Named(SHADE_HEADER) + static BatteryMeterView getBatteryMeterView(@Named(SHADE_HEADER) MotionLayout view) { return view.findViewById(R.id.batteryRemainingIcon); } @Provides @CentralSurfacesComponent.CentralSurfacesScope - @Named(LARGE_SCREEN_BATTERY_CONTROLLER) + @Named(SHADE_HEADER) static BatteryMeterViewController getBatteryMeterViewController( - @Named(SPLIT_SHADE_BATTERY_VIEW) BatteryMeterView batteryMeterView, + @Named(SHADE_HEADER) BatteryMeterView batteryMeterView, UserTracker userTracker, ConfigurationController configurationController, TunerService tunerService, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index 00fd4ef9a1fc..2fe714533f5a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -23,7 +23,6 @@ import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO; import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.IDLE; import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.SHOWING_PERSISTENT_DOT; -import android.animation.Animator; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.Fragment; @@ -43,6 +42,7 @@ import android.view.ViewStub; import android.widget.LinearLayout; import androidx.annotation.VisibleForTesting; +import androidx.core.animation.Animator; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt index fe69f7507503..c04ea36b3d8d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt @@ -16,9 +16,9 @@ package com.android.systemui.statusbar.phone.fragment -import android.animation.Animator -import android.animation.AnimatorSet -import android.animation.ValueAnimator +import androidx.core.animation.Animator +import androidx.core.animation.AnimatorSet +import androidx.core.animation.ValueAnimator import android.content.res.Resources import android.view.View import com.android.systemui.R @@ -46,15 +46,19 @@ class StatusBarSystemEventAnimator( R.dimen.ongoing_appops_chip_animation_out_status_bar_translation_x) override fun onSystemEventAnimationBegin(): Animator { - val moveOut = ValueAnimator.ofFloat(0f, 1f).setDuration(23.frames) - moveOut.interpolator = STATUS_BAR_X_MOVE_OUT - moveOut.addUpdateListener { animation: ValueAnimator -> - animatedView.translationX = -(translationXIn * animation.animatedValue as Float) + val moveOut = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 23.frames + interpolator = STATUS_BAR_X_MOVE_OUT + addUpdateListener { + animatedView.translationX = -(translationXIn * animatedValue as Float) + } } - val alphaOut = ValueAnimator.ofFloat(1f, 0f).setDuration(8.frames) - alphaOut.interpolator = null - alphaOut.addUpdateListener { animation: ValueAnimator -> - animatedView.alpha = animation.animatedValue as Float + val alphaOut = ValueAnimator.ofFloat(1f, 0f).apply { + duration = 8.frames + interpolator = null + addUpdateListener { + animatedView.alpha = animatedValue as Float + } } val animSet = AnimatorSet() @@ -64,17 +68,21 @@ class StatusBarSystemEventAnimator( override fun onSystemEventAnimationFinish(hasPersistentDot: Boolean): Animator { animatedView.translationX = translationXOut.toFloat() - val moveIn = ValueAnimator.ofFloat(1f, 0f).setDuration(28.frames) - moveIn.startDelay = 2.frames - moveIn.interpolator = STATUS_BAR_X_MOVE_IN - moveIn.addUpdateListener { animation: ValueAnimator -> - animatedView.translationX = translationXOut * animation.animatedValue as Float + val moveIn = ValueAnimator.ofFloat(1f, 0f).apply { + duration = 23.frames + startDelay = 7.frames + interpolator = STATUS_BAR_X_MOVE_IN + addUpdateListener { + animatedView.translationX = translationXOut * animatedValue as Float + } } - val alphaIn = ValueAnimator.ofFloat(0f, 1f).setDuration(10.frames) - alphaIn.startDelay = 4.frames - alphaIn.interpolator = null - alphaIn.addUpdateListener { animation: ValueAnimator -> - animatedView.alpha = animation.animatedValue as Float + val alphaIn = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 5.frames + startDelay = 11.frames + interpolator = null + addUpdateListener { + animatedView.alpha = animatedValue as Float + } } val animatorSet = AnimatorSet() diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index b23d870fb82f..8cfe2eac3d33 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -42,7 +42,7 @@ import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.DemoModeController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -68,7 +68,7 @@ public class TunerServiceImpl extends TunerService { // Things that use the tunable infrastructure but are now real user settings and // shouldn't be reset with tuner settings. private static final String[] RESET_EXCEPTION_LIST = new String[] { - QSTileHost.TILES_SETTING, + QSHost.TILES_SETTING, Settings.Secure.DOZE_ALWAYS_ON, Settings.Secure.MEDIA_CONTROLS_RESUME, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java index 82200c61eeb5..360fc90a2d24 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java @@ -53,6 +53,7 @@ import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; import com.android.systemui.statusbar.NotificationShadeWindowController; +import com.android.systemui.statusbar.events.StatusBarEventsModule; import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider; import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager; import com.android.systemui.statusbar.phone.DozeServiceHost; @@ -93,6 +94,7 @@ import dagger.multibindings.IntoSet; PowerModule.class, QSModule.class, ReferenceScreenshotModule.class, + StatusBarEventsModule.class, VolumeModule.class, } ) diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt index 2683971f852c..981f429d1f8f 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt @@ -61,8 +61,6 @@ class FoldStateLoggingProviderImpl( foldStateProvider.stop() } - override fun onHingeAngleUpdate(angle: Float) {} - override fun onFoldUpdate(@FoldUpdate update: Int) { val now = clock.elapsedRealtime() when (update) { @@ -77,6 +75,10 @@ class FoldStateLoggingProviderImpl( } } + override fun onUnfoldedScreenAvailable() { + Log.d(TAG, "Unfolded screen available") + } + private fun dispatchState(@LoggedFoldedStates current: Int) { val now = clock.elapsedRealtime() val previous = lastState diff --git a/packages/SystemUI/tests/src/com/android/keyguard/EmergencyButtonControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/EmergencyButtonControllerTest.kt new file mode 100644 index 000000000000..30fed0b0316f --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/EmergencyButtonControllerTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard + +import android.app.ActivityTaskManager +import android.content.pm.PackageManager +import android.os.PowerManager +import android.telecom.TelecomManager +import android.telephony.TelephonyManager +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import androidx.test.filters.SmallTest +import com.android.internal.logging.MetricsLogger +import com.android.internal.widget.LockPatternUtils +import com.android.systemui.SysuiTestCase +import com.android.systemui.shade.ShadeController +import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.eq +import com.android.systemui.util.time.FakeSystemClock +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.anyInt +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class EmergencyButtonControllerTest : SysuiTestCase() { + lateinit var underTest: EmergencyButtonController + @Mock lateinit var emergencyButton: EmergencyButton + @Mock lateinit var configurationController: ConfigurationController + @Mock lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock lateinit var telephonyManager: TelephonyManager + @Mock lateinit var powerManager: PowerManager + @Mock lateinit var activityTaskManager: ActivityTaskManager + @Mock lateinit var shadeController: ShadeController + @Mock lateinit var telecomManager: TelecomManager + @Mock lateinit var metricsLogger: MetricsLogger + @Mock lateinit var lockPatternUtils: LockPatternUtils + @Mock lateinit var packageManager: PackageManager + val fakeSystemClock = FakeSystemClock() + val mainExecutor = FakeExecutor(fakeSystemClock) + val backgroundExecutor = FakeExecutor(fakeSystemClock) + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + underTest = + EmergencyButtonController( + emergencyButton, + configurationController, + keyguardUpdateMonitor, + telephonyManager, + powerManager, + activityTaskManager, + shadeController, + telecomManager, + metricsLogger, + lockPatternUtils, + mainExecutor, + backgroundExecutor + ) + context.setMockPackageManager(packageManager) + Mockito.`when`(emergencyButton.context).thenReturn(context) + } + + @Test + fun testUpdateEmergencyButton() { + Mockito.`when`(telecomManager.isInCall).thenReturn(true) + Mockito.`when`(lockPatternUtils.isSecure(anyInt())).thenReturn(true) + Mockito.`when`(packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) + .thenReturn(true) + underTest.updateEmergencyCallButton() + backgroundExecutor.runAllReady() + verify(emergencyButton, never()) + .updateEmergencyCallButton( + /* isInCall= */ any(), + /* hasTelephonyRadio= */ any(), + /* simLocked= */ any(), + /* isSecure= */ any() + ) + mainExecutor.runAllReady() + verify(emergencyButton) + .updateEmergencyCallButton( + /* isInCall= */ eq(true), + /* hasTelephonyRadio= */ eq(true), + /* simLocked= */ any(), + /* isSecure= */ eq(true) + ) + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index bffbe17fb2eb..bbc7bc92e819 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -32,11 +32,9 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -44,7 +42,6 @@ import static org.mockito.Mockito.when; import android.content.res.Configuration; import android.content.res.Resources; import android.hardware.biometrics.BiometricOverlayConstants; -import android.hardware.biometrics.BiometricSourceType; import android.media.AudioManager; import android.telephony.TelephonyManager; import android.testing.AndroidTestingRunner; @@ -53,7 +50,6 @@ import android.testing.TestableResources; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; -import android.view.View; import android.view.WindowInsetsController; import android.widget.FrameLayout; @@ -96,10 +92,8 @@ import java.util.Optional; @TestableLooper.RunWithLooper() public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { private static final int TARGET_USER_ID = 100; - @Rule public MockitoRule mRule = MockitoJUnit.rule(); - @Mock private KeyguardSecurityContainer mView; @Mock @@ -368,134 +362,12 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { } @Test - public void onBouncerVisibilityChanged_allConditionsGood_sideFpsHintShown() { - setupConditionsToEnableSideFpsHint(); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - - verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); - verify(mSideFpsController, never()).hide(any()); - } - - @Test - public void onBouncerVisibilityChanged_fpsSensorNotRunning_sideFpsHintHidden() { - setupConditionsToEnableSideFpsHint(); - setFingerprintDetectionRunning(false); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test - public void onBouncerVisibilityChanged_withoutSidedSecurity_sideFpsHintHidden() { - setupConditionsToEnableSideFpsHint(); - setSideFpsHintEnabledFromResources(false); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test - public void onBouncerVisibilityChanged_unlockingWithFingerprintNotAllowed_sideFpsHintHidden() { - setupConditionsToEnableSideFpsHint(); - setUnlockingWithFingerprintAllowed(false); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test - public void onBouncerVisibilityChanged_sideFpsHintShown_sideFpsHintHidden() { - setupGetSecurityView(); - setupConditionsToEnableSideFpsHint(); - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.INVISIBLE); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test public void onBouncerVisibilityChanged_resetsScale() { - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.INVISIBLE); - + mKeyguardSecurityContainerController.onBouncerVisibilityChanged(false); verify(mView).resetScale(); } @Test - public void onStartingToHide_sideFpsHintShown_sideFpsHintHidden() { - setupGetSecurityView(); - setupConditionsToEnableSideFpsHint(); - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onStartingToHide(); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test - public void onPause_sideFpsHintShown_sideFpsHintHidden() { - setupGetSecurityView(); - setupConditionsToEnableSideFpsHint(); - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onPause(); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test - public void onResume_sideFpsHintShouldBeShown_sideFpsHintShown() { - setupGetSecurityView(); - setupConditionsToEnableSideFpsHint(); - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onResume(0); - - verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER, - BiometricOverlayConstants.REASON_AUTH_KEYGUARD); - verify(mSideFpsController, never()).hide(any()); - } - - @Test - public void onResume_sideFpsHintShouldNotBeShown_sideFpsHintHidden() { - setupGetSecurityView(); - setupConditionsToEnableSideFpsHint(); - setSideFpsHintEnabledFromResources(false); - mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); - reset(mSideFpsController); - - mKeyguardSecurityContainerController.onResume(0); - - verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); - verify(mSideFpsController, never()).show(any(), anyInt()); - } - - @Test public void showNextSecurityScreenOrFinish_setsSecurityScreenToPinAfterSimPinUnlock() { // GIVEN the current security method is SimPin when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false); @@ -719,39 +591,31 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { any(KeyguardSecurityCallback.class)); } + @Test + public void testSideFpsControllerShow() { + mKeyguardSecurityContainerController.updateSideFpsVisibility(/* isVisible= */ true); + verify(mSideFpsController).show( + SideFpsUiRequestSource.PRIMARY_BOUNCER, + BiometricOverlayConstants.REASON_AUTH_KEYGUARD); + } + + @Test + public void testSideFpsControllerHide() { + mKeyguardSecurityContainerController.updateSideFpsVisibility(/* isVisible= */ false); + verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); + } + private KeyguardSecurityContainer.SwipeListener getRegisteredSwipeListener() { mKeyguardSecurityContainerController.onViewAttached(); verify(mView).setSwipeListener(mSwipeListenerArgumentCaptor.capture()); return mSwipeListenerArgumentCaptor.getValue(); } - private void setupConditionsToEnableSideFpsHint() { - attachView(); - setSideFpsHintEnabledFromResources(true); - setFingerprintDetectionRunning(true); - setUnlockingWithFingerprintAllowed(true); - } - private void attachView() { mKeyguardSecurityContainerController.onViewAttached(); verify(mKeyguardUpdateMonitor).registerCallback(mKeyguardUpdateMonitorCallback.capture()); } - private void setFingerprintDetectionRunning(boolean running) { - when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(running); - mKeyguardUpdateMonitorCallback.getValue().onBiometricRunningStateChanged(running, - BiometricSourceType.FINGERPRINT); - } - - private void setSideFpsHintEnabledFromResources(boolean enabled) { - mTestableResources.addOverride(R.bool.config_show_sidefps_hint_on_bouncer, - enabled); - } - - private void setUnlockingWithFingerprintAllowed(boolean allowed) { - when(mKeyguardUpdateMonitor.isUnlockingWithFingerprintAllowed()).thenReturn(allowed); - } - private void setupGetSecurityView() { when(mKeyguardSecurityViewFlipperController.getSecurityView( any(), any(KeyguardSecurityCallback.class))) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java index dfad15d68375..71449145d668 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java @@ -26,7 +26,6 @@ import android.testing.AndroidTestingRunner; import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.SysuiTestCase; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; @@ -61,8 +60,6 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase { @Mock DozeParameters mDozeParameters; @Mock - FeatureFlags mFeatureFlags; - @Mock ScreenOffAnimationController mScreenOffAnimationController; @Captor private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor; @@ -83,7 +80,6 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase { mKeyguardUpdateMonitor, mConfigurationController, mDozeParameters, - mFeatureFlags, mScreenOffAnimationController, mKeyguardLogger); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index dc90e2d0a656..0b0ac14aaa8a 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -604,9 +604,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); - verify(mFingerprintManager, never()).detectFingerprint(any(), any(), anyInt()); + verifyFingerprintAuthenticateCall(); + verifyFingerprintDetectNeverCalled(); } @Test @@ -616,9 +615,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); - verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyInt(), anyInt()); - verify(mFingerprintManager, never()).detectFingerprint(any(), any(), anyInt()); + verifyFingerprintAuthenticateNeverCalled(); + verifyFingerprintDetectNeverCalled(); } @Test @@ -632,8 +630,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); - verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt()); - verify(mFingerprintManager).detectFingerprint(any(), any(), anyInt()); + verifyFingerprintAuthenticateNeverCalled(); + verifyFingerprintDetectCall(); } @Test @@ -722,7 +720,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { public void testTriesToAuthenticate_whenBouncer() { setKeyguardBouncerVisibility(true); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); verify(mFaceManager).isHardwareDetected(); verify(mFaceManager).hasEnrolledTemplates(anyInt()); } @@ -732,8 +730,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.sendPrimaryBouncerChanged( /* bouncerIsOrWillBeShowing */ true, /* bouncerFullyShown */ false); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -741,7 +738,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { keyguardIsVisible(); mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); mTestableLooper.processAllMessages(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + + verifyFaceAuthenticateCall(); verify(mUiEventLogger).logWithInstanceIdAndPosition( eq(FaceAuthUiEvent.FACE_AUTH_UPDATED_STARTED_WAKING_UP), eq(0), @@ -757,8 +755,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -769,8 +766,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -794,9 +790,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); // THEN face detect and authenticate are NOT triggered - verify(mFaceManager, never()).detectFace(any(), any(), anyInt()); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceDetectNeverCalled(); + verifyFaceAuthenticateNeverCalled(); // THEN biometric help message sent to callback verify(keyguardUpdateMonitorCallback).onBiometricHelp( @@ -817,9 +812,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); // FACE detect is triggered, not authenticate - verify(mFaceManager).detectFace(any(), any(), anyInt()); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceDetectCall(); + verifyFaceAuthenticateNeverCalled(); // WHEN bouncer becomes visible setKeyguardBouncerVisibility(true); @@ -827,9 +821,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // THEN face scanning is not run mKeyguardUpdateMonitor.requestFaceAuth(FaceAuthApiRequestReason.UDFPS_POINTER_DOWN); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); - verify(mFaceManager, never()).detectFace(any(), any(), anyInt()); + verifyFaceAuthenticateNeverCalled(); + verifyFaceDetectNeverCalled(); } @Test @@ -844,9 +837,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); // FACE detect and authenticate are NOT triggered - verify(mFaceManager, never()).detectFace(any(), any(), anyInt()); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceDetectNeverCalled(); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -884,7 +876,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.setKeyguardShowing(true, true); mKeyguardUpdateMonitor.setAssistantVisible(true); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); } @Test @@ -892,12 +884,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.setKeyguardShowing(false, true); mKeyguardUpdateMonitor.setAssistantVisible(true); - verify(mFaceManager, never()).authenticate(any(), - any(), - any(), - any(), - anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -908,15 +895,12 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // THEN fingerprint shouldn't listen assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isFalse(); - verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyInt(), anyInt()); - + verifyFingerprintAuthenticateNeverCalled(); // WHEN alternate bouncer is shown mKeyguardUpdateMonitor.setAlternateBouncerShowing(true); // THEN make sure FP listening begins - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); + verifyFingerprintAuthenticateCall(); } @Test @@ -928,7 +912,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */, new ArrayList<>()); keyguardIsVisible(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); } @Test @@ -936,7 +920,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.setKeyguardShowing(true, true); mKeyguardUpdateMonitor.setAssistantVisible(true); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); mTestableLooper.processAllMessages(); clearInvocations(mFaceManager); @@ -949,12 +933,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.handleKeyguardReset(); assertThat(mKeyguardUpdateMonitor.isFaceDetectionRunning()).isFalse(); - verify(mFaceManager, never()).authenticate(any(), - any(), - any(), - any(), - anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -964,8 +943,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, true /* newlyUnlocked */, KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */, new ArrayList<>()); keyguardIsVisible(); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -977,9 +955,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { keyguardIsVisible(); mTestableLooper.processAllMessages(); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); - verify(mFaceManager, never()).detectFace(any(), any(), anyInt()); + verifyFaceAuthenticateNeverCalled(); + verifyFaceDetectNeverCalled(); } @Test @@ -988,16 +965,14 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { .onAuthenticationError(FingerprintManager.BIOMETRIC_ERROR_POWER_PRESSED, ""); // THEN doesn't authenticate immediately - verify(mFingerprintManager, never()).authenticate(any(), - any(), any(), any(), anyInt(), anyInt(), anyInt()); + verifyFingerprintAuthenticateNeverCalled(); // WHEN all messages (with delays) are processed mTestableLooper.moveTimeForward(HAL_POWER_PRESS_TIMEOUT); mTestableLooper.processAllMessages(); // THEN fingerprint manager attempts to authenticate again - verify(mFingerprintManager).authenticate(any(), - any(), any(), any(), anyInt(), anyInt(), anyInt()); + verifyFingerprintAuthenticateCall(); } @Test @@ -1009,8 +984,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { setKeyguardBouncerVisibility(true); mTestableLooper.processAllMessages(); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -1137,9 +1111,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); + verifyFaceAuthenticateCall(); + verifyFingerprintAuthenticateCall(); when(mFingerprintManager.getLockoutModeForUser(eq(FINGERPRINT_SENSOR_ID), eq(newUser))) .thenReturn(fingerprintLockoutMode); @@ -1587,10 +1560,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { public void testFaceDoesNotAuth_afterPinAttempt() { mTestableLooper.processAllMessages(); mKeyguardUpdateMonitor.setCredentialAttempted(); - verify(mFingerprintManager, never()).authenticate(any(), any(), any(), - any(), anyInt()); - verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), - anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -1965,9 +1935,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), - anyInt()); + verifyFaceAuthenticateCall(); + verifyFingerprintAuthenticateCall(); mKeyguardUpdateMonitor.onFaceAuthenticated(0, false); // Make sure keyguard is going away after face auth attempt, and that it calls @@ -1993,8 +1962,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchDreamingStopped(); mTestableLooper.processAllMessages(); - verify(mFaceManager, never()).authenticate( - any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateNeverCalled(); } @Test @@ -2007,15 +1975,14 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); // THEN face auth isn't triggered - verify(mFaceManager, never()).authenticate( - any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateNeverCalled(); // WHEN device wakes up from the power button mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); mTestableLooper.processAllMessages(); // THEN face auth is triggered - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); } @@ -2186,7 +2153,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), anyInt()); @@ -2219,7 +2186,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper.processAllMessages(); keyguardIsVisible(); - verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + verifyFaceAuthenticateCall(); final CancellationSignal faceCancel = spy(mKeyguardUpdateMonitor.mFaceCancelSignal); mKeyguardUpdateMonitor.mFaceCancelSignal = faceCancel; @@ -2445,6 +2412,41 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { eq(false)); } + private void verifyFingerprintAuthenticateNeverCalled() { + verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt(), + anyInt(), anyInt()); + } + + private void verifyFingerprintAuthenticateCall() { + verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt(), + anyInt()); + } + + private void verifyFingerprintDetectNeverCalled() { + verify(mFingerprintManager, never()).detectFingerprint(any(), any(), anyInt()); + } + + private void verifyFingerprintDetectCall() { + verify(mFingerprintManager).detectFingerprint(any(), any(), anyInt()); + } + + private void verifyFaceAuthenticateNeverCalled() { + verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt(), + anyBoolean()); + } + + private void verifyFaceAuthenticateCall() { + verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt(), anyBoolean()); + } + + private void verifyFaceDetectNeverCalled() { + verify(mFaceManager, never()).detectFace(any(), any(), anyInt()); + } + + private void verifyFaceDetectCall() { + verify(mFaceManager).detectFace(any(), any(), anyInt()); + } + private void userDeviceLockDown() { when(mStrongAuthTracker.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(false); when(mStrongAuthTracker.getStrongAuthForUser(mCurrentUserId)) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/mediator/ScreenOnCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/mediator/ScreenOnCoordinatorTest.kt index e9a2789bb5c8..9fe32f1e378b 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/mediator/ScreenOnCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/mediator/ScreenOnCoordinatorTest.kt @@ -32,6 +32,7 @@ import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import java.util.Optional @@ -83,6 +84,33 @@ class ScreenOnCoordinatorTest : SysuiTestCase() { } @Test + fun testTasksReady_onScreenTurningOnAndTurnedOnEventsCalledTogether_callsDrawnCallback() { + screenOnCoordinator.onScreenTurningOn(runnable) + screenOnCoordinator.onScreenTurnedOn() + + onUnfoldOverlayReady() + onFoldAodReady() + waitHandlerIdle(testHandler) + + // Should be called when both unfold overlay and keyguard drawn ready + verify(runnable).run() + } + + @Test + fun testTasksReady_onScreenTurnedOnAndTurnedOffBeforeCompletion_doesNotCallDrawnCallback() { + screenOnCoordinator.onScreenTurningOn(runnable) + screenOnCoordinator.onScreenTurnedOn() + screenOnCoordinator.onScreenTurnedOff() + + onUnfoldOverlayReady() + onFoldAodReady() + waitHandlerIdle(testHandler) + + // Should not be called because this screen turning on call is not valid anymore + verify(runnable, never()).run() + } + + @Test fun testUnfoldTransitionDisabledDrawnTasksReady_onScreenTurningOn_callsDrawnCallback() { // Recreate with empty unfoldComponent screenOnCoordinator = ScreenOnCoordinator( diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt index 777dd4e0b4a3..ca6f42618e2a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogTest.kt @@ -19,7 +19,7 @@ import android.os.Handler import android.provider.Settings import android.testing.AndroidTestingRunner import android.testing.TestableLooper -import android.widget.ImageView +import android.view.ViewGroup import android.widget.SeekBar import androidx.test.filters.SmallTest import com.android.systemui.R @@ -68,14 +68,14 @@ class FontScalingDialogTest : SysuiTestCase() { fun progressIsZero_clickIconEnd_seekBarProgressIncreaseOne_fontSizeScaled() { fontScalingDialog.show() - val iconEnd: ImageView = fontScalingDialog.findViewById(R.id.icon_end)!! + val iconEndFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_end_frame)!! val seekBarWithIconButtonsView: SeekBarWithIconButtonsView = fontScalingDialog.findViewById(R.id.font_scaling_slider)!! val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!! seekBarWithIconButtonsView.setProgress(0) - iconEnd.performClick() + iconEndFrame.performClick() val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f) assertThat(seekBar.getProgress()).isEqualTo(1) @@ -88,14 +88,14 @@ class FontScalingDialogTest : SysuiTestCase() { fun progressIsMax_clickIconStart_seekBarProgressDecreaseOne_fontSizeScaled() { fontScalingDialog.show() - val iconStart: ImageView = fontScalingDialog.findViewById(R.id.icon_start)!! + val iconStartFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_start_frame)!! val seekBarWithIconButtonsView: SeekBarWithIconButtonsView = fontScalingDialog.findViewById(R.id.font_scaling_slider)!! val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!! seekBarWithIconButtonsView.setProgress(fontSizeValueArray.size - 1) - iconStart.performClick() + iconStartFrame.performClick() val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f) assertThat(seekBar.getProgress()).isEqualTo(fontSizeValueArray.size - 2) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt index bce98cf116d4..05748382534f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt @@ -15,27 +15,49 @@ */ package com.android.systemui.biometrics +import android.content.Context import android.hardware.biometrics.BiometricAuthenticator +import android.hardware.biometrics.SensorLocationInternal +import android.hardware.biometrics.SensorProperties +import android.hardware.display.DisplayManagerGlobal +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorProperties +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal import android.os.Bundle import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper +import android.view.Display +import android.view.DisplayAdjustments +import android.view.DisplayInfo +import android.view.Surface import android.view.View +import android.view.ViewGroup import androidx.test.filters.SmallTest +import com.airbnb.lottie.LottieAnimationView import com.android.systemui.R +import com.android.systemui.biometrics.AuthBiometricView.STATE_AUTHENTICATING_ANIMATING_IN import com.android.systemui.SysuiTestCase +import com.android.systemui.SysuiTestableContext import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers.eq import org.mockito.Mock +import org.mockito.Mockito.mock import org.mockito.Mockito.never +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit +import org.mockito.Mockito.`when` as whenEver + +private const val DISPLAY_ID = 2 +private const val SENSOR_ID = 1 @RunWith(AndroidTestingRunner::class) @RunWithLooper(setAsMainLooper = true) @@ -50,9 +72,22 @@ class AuthBiometricFingerprintViewTest : SysuiTestCase() { private lateinit var callback: AuthBiometricView.Callback @Mock + private lateinit var fingerprintManager: FingerprintManager + + @Mock + private lateinit var iconView: LottieAnimationView + + @Mock + private lateinit var iconViewOverlay: LottieAnimationView + + @Mock + private lateinit var iconLayoutParamSize: Pair<Int, Int> + + @Mock private lateinit var panelController: AuthPanelController private lateinit var biometricView: AuthBiometricView + private lateinit var iconController: AuthBiometricFingerprintIconController private fun createView(allowDeviceCredential: Boolean = false): AuthBiometricFingerprintView { val view: AuthBiometricFingerprintView = @@ -277,5 +312,186 @@ class AuthBiometricFingerprintViewTest : SysuiTestCase() { verify(callback).onAction(AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL) } + private fun testWithSfpsDisplay( + isReverseDefaultRotation: Boolean = false, + inRearDisplayMode: Boolean = false, + isFolded: Boolean = false, + initInfo: DisplayInfo.() -> Unit = {}, + block: () -> Unit + ) { + val displayInfo = DisplayInfo() + displayInfo.initInfo() + + val dmGlobal = mock(DisplayManagerGlobal::class.java) + val display = Display(dmGlobal, DISPLAY_ID, displayInfo, + DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS) + + whenEver(dmGlobal.getDisplayInfo(eq(DISPLAY_ID))).thenReturn(displayInfo) + + val iconControllerContext = context.createDisplayContext(display) as SysuiTestableContext + iconControllerContext.orCreateTestableResources.addOverride( + com.android.internal.R.bool.config_reverseDefaultRotation, + isReverseDefaultRotation + ) + + val rearDisplayDeviceStates = if (inRearDisplayMode) intArrayOf(3) else intArrayOf() + iconControllerContext.orCreateTestableResources.addOverride( + com.android.internal.R.array.config_rearDisplayDeviceStates, + rearDisplayDeviceStates + ) + + val layoutParams = mock(ViewGroup.LayoutParams::class.java) + whenEver(iconView.layoutParams).thenReturn(layoutParams) + whenEver(iconViewOverlay.layoutParams).thenReturn(layoutParams) + + var locations = listOf(SensorLocationInternal("", 2500, 0, 0)) + whenEver(fingerprintManager.sensorPropertiesInternal) + .thenReturn( + listOf( + FingerprintSensorPropertiesInternal( + SENSOR_ID, + SensorProperties.STRENGTH_STRONG, + 5 /* maxEnrollmentsPerUser */, + listOf() /* componentInfo */, + FingerprintSensorProperties.TYPE_POWER_BUTTON, + true /* halControlsIllumination */, + true /* resetLockoutRequiresHardwareAuthToken */, + locations + ) + ) + ) + iconControllerContext.addMockSystemService(Context.FINGERPRINT_SERVICE, fingerprintManager) + + iconController = AuthBiometricFingerprintIconController( + iconControllerContext, + iconView, + iconViewOverlay + ) + iconController.onFoldUpdated(isFolded) + + biometricView.mIconController = iconController + block() + } + + @Test + fun sfpsRearDisplay_showsCorrectAnimationAssetsAcrossRotations() { + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = true, + isFolded = false, + { rotation = Surface.ROTATION_0 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = true, + isFolded = false, + { rotation = Surface.ROTATION_90 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = true, + isFolded = false, + { rotation = Surface.ROTATION_180 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = true, + isFolded = false, + { rotation = Surface.ROTATION_270 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + val expectedLottieAssetOrder: List<Int> = listOf( + R.raw.biometricprompt_rear_landscape_base, + R.raw.biometricprompt_rear_portrait_reverse_base, + R.raw.biometricprompt_rear_landscape_base, + R.raw.biometricprompt_rear_portrait_base, + ) + + val lottieAssetCaptor: ArgumentCaptor<Int> = ArgumentCaptor.forClass(Int::class.java) + verify(iconView, times(4)).setAnimation(lottieAssetCaptor.capture()) + val observedLottieAssetOrder: List<Int> = lottieAssetCaptor.getAllValues() + assertThat(observedLottieAssetOrder).containsExactlyElementsIn(expectedLottieAssetOrder) + .inOrder() + } + + @Test + fun sfpsDefaultDisplayFolded_showsAnimationsAssetsCorrectlyAcrossRotations() { + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = true, + { rotation = Surface.ROTATION_0 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = true, + { rotation = Surface.ROTATION_90 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN); } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = true, + { rotation = Surface.ROTATION_180 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN); } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = true, + { rotation = Surface.ROTATION_270 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN); } + val expectedLottieAssetOrder: List<Int> = listOf( + R.raw.biometricprompt_folded_base_default, + R.raw.biometricprompt_folded_base_topleft, + R.raw.biometricprompt_folded_base_default, + R.raw.biometricprompt_folded_base_bottomright, + ) + + val lottieAssetCaptor: ArgumentCaptor<Int> = ArgumentCaptor.forClass(Int::class.java) + verify(iconView, times(4)).setAnimation(lottieAssetCaptor.capture()) + val observedLottieAssetOrder: List<Int> = lottieAssetCaptor.getAllValues() + assertThat(observedLottieAssetOrder).containsExactlyElementsIn(expectedLottieAssetOrder) + .inOrder() + } + + @Test + fun sfpsDefaultDisplayUnfolded_showsAnimationsAssetsCorrectlyAcrossRotations() { + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = false, + { rotation = Surface.ROTATION_0 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = false, + { rotation = Surface.ROTATION_90 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = false, + { rotation = Surface.ROTATION_180 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + testWithSfpsDisplay( + isReverseDefaultRotation = false, + inRearDisplayMode = false, + isFolded = false, + { rotation = Surface.ROTATION_270 } + ) { biometricView.updateState(STATE_AUTHENTICATING_ANIMATING_IN) } + val expectedLottieAssetOrder: List<Int> = listOf( + R.raw.biometricprompt_landscape_base, + R.raw.biometricprompt_portrait_base_topleft, + R.raw.biometricprompt_landscape_base, + R.raw.biometricprompt_portrait_base_bottomright, + ) + + val lottieAssetCaptor: ArgumentCaptor<Int> = ArgumentCaptor.forClass(Int::class.java) + verify(iconView, times(4)).setAnimation(lottieAssetCaptor.capture()) + val observedLottieAssetOrder: List<Int> = lottieAssetCaptor.getAllValues() + assertThat(observedLottieAssetOrder).containsExactlyElementsIn(expectedLottieAssetOrder) + .inOrder() + } + override fun waitForIdleSync() = TestableLooper.get(this).processAllMessages() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt index 612e55732bc1..6333a68bb5e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt @@ -63,6 +63,7 @@ import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintA import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor import com.android.systemui.recents.OverviewProxyService +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat @@ -97,6 +98,7 @@ class SideFpsControllerTest : SysuiTestCase() { @JvmField @Rule var rule = MockitoJUnit.rule() + @Mock lateinit var keyguardStateController: KeyguardStateController @Mock lateinit var layoutInflater: LayoutInflater @Mock lateinit var fingerprintManager: FingerprintManager @Mock lateinit var windowManager: WindowManager @@ -136,6 +138,7 @@ class SideFpsControllerTest : SysuiTestCase() { keyguardBouncerRepository = FakeKeyguardBouncerRepository() alternateBouncerInteractor = AlternateBouncerInteractor( + keyguardStateController, keyguardBouncerRepository, FakeBiometricSettingsRepository(), FakeDeviceEntryFingerprintAuthRepository(), @@ -169,6 +172,7 @@ class SideFpsControllerTest : SysuiTestCase() { isReverseDefaultRotation: Boolean = false, initInfo: DisplayInfo.() -> Unit = {}, windowInsets: WindowInsets = insetsForSmallNavbar(), + inRearDisplayMode: Boolean = false, block: () -> Unit ) { this.deviceConfig = deviceConfig @@ -229,6 +233,12 @@ class SideFpsControllerTest : SysuiTestCase() { isReverseDefaultRotation ) + val rearDisplayDeviceStates = if (inRearDisplayMode) intArrayOf(3) else intArrayOf() + sideFpsControllerContext.orCreateTestableResources.addOverride( + com.android.internal.R.array.config_rearDisplayDeviceStates, + rearDisplayDeviceStates + ) + sideFpsController = SideFpsController( sideFpsControllerContext, @@ -542,10 +552,62 @@ class SideFpsControllerTest : SysuiTestCase() { { rotation = Surface.ROTATION_270 } ) { verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible = true) } + @Test + fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_0() = + testWithDisplay( + deviceConfig = DeviceConfig.Y_ALIGNED, + isReverseDefaultRotation = false, + { rotation = Surface.ROTATION_0 }, + inRearDisplayMode = true, + ) { + verifySfpsIndicator_notAdded_InRearDisplayMode() + } + + @Test + fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_90() = + testWithDisplay( + deviceConfig = DeviceConfig.Y_ALIGNED, + isReverseDefaultRotation = false, + { rotation = Surface.ROTATION_90 }, + inRearDisplayMode = true, + ) { + verifySfpsIndicator_notAdded_InRearDisplayMode() + } + + @Test + fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_180() = + testWithDisplay( + deviceConfig = DeviceConfig.Y_ALIGNED, + isReverseDefaultRotation = false, + { rotation = Surface.ROTATION_180 }, + inRearDisplayMode = true, + ) { + verifySfpsIndicator_notAdded_InRearDisplayMode() + } + + @Test + fun verifiesSfpsIndicatorNotAddedInRearDisplayMode_270() = + testWithDisplay( + deviceConfig = DeviceConfig.Y_ALIGNED, + isReverseDefaultRotation = false, + { rotation = Surface.ROTATION_270 }, + inRearDisplayMode = true, + ) { + verifySfpsIndicator_notAdded_InRearDisplayMode() + } + private fun verifySfpsIndicatorVisibilityOnTaskbarUpdate(sfpsViewVisible: Boolean) { sideFpsController.overlayOffsets = sensorLocation } + private fun verifySfpsIndicator_notAdded_InRearDisplayMode() { + sideFpsController.overlayOffsets = sensorLocation + overlayController.show(SENSOR_ID, REASON_UNKNOWN) + executor.runAllReady() + + verify(windowManager, never()).addView(any(), any()) + } + fun alternateBouncerVisibility_showAndHideSideFpsUI() = testWithDisplay { // WHEN alternate bouncer is visible keyguardBouncerRepository.setAlternateVisible(true) @@ -582,7 +644,7 @@ class SideFpsControllerTest : SysuiTestCase() { * in other rotations have been omitted. */ @Test - fun verifiesIndicatorPlacementForXAlignedSensor_0() { + fun verifiesIndicatorPlacementForXAlignedSensor_0() = testWithDisplay( deviceConfig = DeviceConfig.X_ALIGNED, isReverseDefaultRotation = false, @@ -599,7 +661,6 @@ class SideFpsControllerTest : SysuiTestCase() { assertThat(overlayViewParamsCaptor.value.x).isEqualTo(sensorLocation.sensorLocationX) assertThat(overlayViewParamsCaptor.value.y).isEqualTo(0) } - } /** * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_270 @@ -608,7 +669,7 @@ class SideFpsControllerTest : SysuiTestCase() { * correctly, tests for indicator placement in other rotations have been omitted. */ @Test - fun verifiesIndicatorPlacementForXAlignedSensor_InReverseDefaultRotation_270() { + fun verifiesIndicatorPlacementForXAlignedSensor_InReverseDefaultRotation_270() = testWithDisplay( deviceConfig = DeviceConfig.X_ALIGNED, isReverseDefaultRotation = true, @@ -625,7 +686,6 @@ class SideFpsControllerTest : SysuiTestCase() { assertThat(overlayViewParamsCaptor.value.x).isEqualTo(sensorLocation.sensorLocationX) assertThat(overlayViewParamsCaptor.value.y).isEqualTo(0) } - } /** * {@link SideFpsController#updateOverlayParams} calculates indicator placement for ROTATION_0, diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt index c73ff1dab3d8..86fb279d4ed6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt @@ -37,6 +37,7 @@ import com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.SystemClock import kotlinx.coroutines.Dispatchers @@ -86,11 +87,13 @@ class UdfpsKeyguardViewControllerWithCoroutinesTest : UdfpsKeyguardViewControlle mock(PrimaryBouncerCallbackInteractor::class.java), mock(FalsingCollector::class.java), mock(DismissCallbackRegistry::class.java), + context, + mKeyguardUpdateMonitor, mock(KeyguardBypassController::class.java), - mKeyguardUpdateMonitor ) mAlternateBouncerInteractor = AlternateBouncerInteractor( + mock(KeyguardStateController::class.java), keyguardBouncerRepository, mock(BiometricSettingsRepository::class.java), mock(DeviceEntryFingerprintAuthRepository::class.java), diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java index a61cecbabf30..35039026fe9e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java @@ -20,14 +20,14 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; -import androidx.test.filters.SmallTest; - import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.View; import android.widget.Button; import android.widget.TextView; +import androidx.test.filters.SmallTest; + import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -44,18 +44,21 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper(setAsMainLooper = true) public class BroadcastDialogTest extends SysuiTestCase { - private static final String SWITCH_APP = "Music"; + private static final String CURRENT_BROADCAST_APP = "Music"; + private static final String SWITCH_APP = "Files by Google"; private static final String TEST_PACKAGE = "com.google.android.apps.nbu.files"; private BroadcastDialog mBroadcastDialog; private View mDialogView; + private TextView mTitle; private TextView mSubTitle; + private Button mSwitchBroadcastAppButton; private Button mChangeOutputButton; @Before public void setUp() { MockitoAnnotations.initMocks(this); mBroadcastDialog = new BroadcastDialog(mContext, mock(MediaOutputDialogFactory.class), - SWITCH_APP, TEST_PACKAGE, mock(UiEventLogger.class)); + CURRENT_BROADCAST_APP, TEST_PACKAGE, mock(UiEventLogger.class)); mBroadcastDialog.show(); mDialogView = mBroadcastDialog.mDialogView; } @@ -66,7 +69,15 @@ public class BroadcastDialogTest extends SysuiTestCase { } @Test - public void onCreate_withCurrentApp_checkSwitchAppContent() { + public void onCreate_withCurrentApp_titleIsCurrentAppName() { + mTitle = mDialogView.requireViewById(R.id.dialog_title); + + assertThat(mTitle.getText().toString()).isEqualTo(mContext.getString( + R.string.bt_le_audio_broadcast_dialog_title, CURRENT_BROADCAST_APP)); + } + + @Test + public void onCreate_withCurrentApp_subTitleIsSwitchAppName() { mSubTitle = mDialogView.requireViewById(R.id.dialog_subtitle); assertThat(mSubTitle.getText()).isEqualTo( @@ -74,6 +85,14 @@ public class BroadcastDialogTest extends SysuiTestCase { } @Test + public void onCreate_withCurrentApp_switchBtnIsSwitchAppName() { + mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast); + + assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo( + mContext.getString(R.string.bt_le_audio_broadcast_dialog_switch_app, SWITCH_APP)); + } + + @Test public void onClick_withChangeOutput_dismissBroadcastDialog() { mChangeOutputButton = mDialogView.requireViewById(R.id.change_output); mChangeOutputButton.performClick(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java index 2ed03465c6f0..eafe727ee7dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.SeekBar; @@ -42,6 +43,8 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { private ImageView mIconStart; private ImageView mIconEnd; + private ViewGroup mIconStartFrame; + private ViewGroup mIconEndFrame; private SeekBar mSeekbar; private SeekBarWithIconButtonsView mIconDiscreteSliderLinearLayout; @@ -50,6 +53,8 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { mIconDiscreteSliderLinearLayout = new SeekBarWithIconButtonsView(mContext); mIconStart = mIconDiscreteSliderLinearLayout.findViewById(R.id.icon_start); mIconEnd = mIconDiscreteSliderLinearLayout.findViewById(R.id.icon_end); + mIconStartFrame = mIconDiscreteSliderLinearLayout.findViewById(R.id.icon_start_frame); + mIconEndFrame = mIconDiscreteSliderLinearLayout.findViewById(R.id.icon_end_frame); mSeekbar = mIconDiscreteSliderLinearLayout.findViewById(R.id.seekbar); } @@ -59,6 +64,8 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { assertThat(mIconStart.isEnabled()).isFalse(); assertThat(mIconEnd.isEnabled()).isTrue(); + assertThat(mIconStartFrame.isEnabled()).isFalse(); + assertThat(mIconEndFrame.isEnabled()).isTrue(); } @Test @@ -67,6 +74,8 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { assertThat(mIconEnd.isEnabled()).isFalse(); assertThat(mIconStart.isEnabled()).isTrue(); + assertThat(mIconEndFrame.isEnabled()).isFalse(); + assertThat(mIconStartFrame.isEnabled()).isTrue(); } @Test @@ -77,12 +86,15 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { assertThat(mIconStart.isEnabled()).isTrue(); assertThat(mIconEnd.isEnabled()).isTrue(); + assertThat(mIconStartFrame.isEnabled()).isTrue(); + assertThat(mIconEndFrame.isEnabled()).isTrue(); } @Test public void clickIconEnd_currentProgressIsOneToMax_reachesMax() { mIconDiscreteSliderLinearLayout.setProgress(mSeekbar.getMax() - 1); - mIconEnd.performClick(); + + mIconEndFrame.performClick(); assertThat(mSeekbar.getProgress()).isEqualTo(mSeekbar.getMax()); } @@ -90,7 +102,8 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase { @Test public void clickIconStart_currentProgressIsOne_reachesZero() { mIconDiscreteSliderLinearLayout.setProgress(1); - mIconStart.performClick(); + + mIconStartFrame.performClick(); assertThat(mSeekbar.getProgress()).isEqualTo(0); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java index dfb4d5baeef5..1820f6444fbd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -190,6 +191,31 @@ public class DreamOverlayServiceTest extends SysuiTestCase { verify(mWindowManager).addView(any(), any()); } + // Validates that {@link DreamOverlayService} properly handles the case where the dream's + // window is no longer valid by the time start is called. + @Test + public void testInvalidWindowAddStart() throws Exception { + final IDreamOverlayClient client = getClient(); + + doThrow(new WindowManager.BadTokenException()).when(mWindowManager).addView(any(), any()); + // Inform the overlay service of dream starting. + client.startDream(mWindowParams, mDreamOverlayCallback, DREAM_COMPONENT, + false /*shouldShowComplication*/); + mMainExecutor.runAllReady(); + + verify(mWindowManager).addView(any(), any()); + + verify(mStateController).setOverlayActive(false); + verify(mStateController).setLowLightActive(false); + verify(mStateController).setEntryAnimationsFinished(false); + + verify(mStateController, never()).setOverlayActive(true); + verify(mUiEventLogger, never()).log( + DreamOverlayService.DreamOverlayEvent.DREAM_OVERLAY_COMPLETE_START); + + verify(mDreamOverlayCallbackController, never()).onStartDream(); + } + @Test public void testDreamOverlayContainerViewControllerInitialized() throws Exception { final IDreamOverlayClient client = getClient(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/SmartSpaceComplicationTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/SmartSpaceComplicationTest.java index ef62abfe36de..175da0b7a5c2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/SmartSpaceComplicationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/SmartSpaceComplicationTest.java @@ -33,6 +33,8 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.condition.SelfExecutingMonitor; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dreams.smartspace.DreamSmartspaceController; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.shared.condition.Condition; import com.android.systemui.shared.condition.Monitor; @@ -65,6 +67,9 @@ public class SmartSpaceComplicationTest extends SysuiTestCase { @Mock private View mBcSmartspaceView; + @Mock + private FeatureFlags mFeatureFlags; + private Monitor mMonitor; private final Set<Condition> mPreconditions = new HashSet<>(); @@ -73,6 +78,8 @@ public class SmartSpaceComplicationTest extends SysuiTestCase { public void setup() { MockitoAnnotations.initMocks(this); mMonitor = SelfExecutingMonitor.createInstance(); + + when(mFeatureFlags.isEnabled(Flags.HIDE_SMARTSPACE_ON_DREAM_OVERLAY)).thenReturn(false); } /** @@ -85,12 +92,22 @@ public class SmartSpaceComplicationTest extends SysuiTestCase { verify(mDreamOverlayStateController, never()).addComplication(eq(mComplication)); } - private SmartSpaceComplication.Registrant getRegistrant() { - return new SmartSpaceComplication.Registrant( - mDreamOverlayStateController, - mComplication, - mSmartspaceController, - mMonitor); + @Test + public void testRegistrantStart_featureEnabled_addOverlayStateCallback() { + final SmartSpaceComplication.Registrant registrant = getRegistrant(); + registrant.start(); + + verify(mDreamOverlayStateController).addCallback(any()); + } + + @Test + public void testRegistrantStart_featureDisabled_doesNotAddOverlayStateCallback() { + when(mFeatureFlags.isEnabled(Flags.HIDE_SMARTSPACE_ON_DREAM_OVERLAY)).thenReturn(true); + + final SmartSpaceComplication.Registrant registrant = getRegistrant(); + registrant.start(); + + verify(mDreamOverlayStateController, never()).addCallback(any()); } @Test @@ -188,4 +205,13 @@ public class SmartSpaceComplicationTest extends SysuiTestCase { when(mSmartspaceController.buildAndConnectView(any())).thenReturn(mBcSmartspaceView); assertEquals(viewHolder.getView(), viewHolder.getView()); } + + private SmartSpaceComplication.Registrant getRegistrant() { + return new SmartSpaceComplication.Registrant( + mDreamOverlayStateController, + mComplication, + mSmartspaceController, + mMonitor, + mFeatureFlags); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt new file mode 100644 index 000000000000..f6ff4b214035 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/keyboard/data/repository/KeyboardRepositoryTest.kt @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.systemui.keyboard.data.repository + +import android.hardware.input.InputManager +import android.view.InputDevice +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.nullable +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(JUnit4::class) +class KeyboardRepositoryTest : SysuiTestCase() { + + @Captor + private lateinit var deviceListenerCaptor: ArgumentCaptor<InputManager.InputDeviceListener> + @Mock private lateinit var inputManager: InputManager + + private lateinit var underTest: KeyboardRepository + private lateinit var dispatcher: CoroutineDispatcher + private lateinit var testScope: TestScope + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + whenever(inputManager.inputDeviceIds).thenReturn(intArrayOf()) + whenever(inputManager.getInputDevice(any())).then { invocation -> + val id = invocation.arguments.first() + INPUT_DEVICES_MAP[id] + } + dispatcher = StandardTestDispatcher() + testScope = TestScope(dispatcher) + underTest = KeyboardRepositoryImpl(testScope.backgroundScope, dispatcher, inputManager) + } + + @Test + fun emitsDisconnected_ifNothingIsConnected() = + testScope.runTest { + val initialState = underTest.keyboardConnected.first() + assertThat(initialState).isFalse() + } + + @Test + fun emitsConnected_ifKeyboardAlreadyConnectedAtTheStart() = + testScope.runTest { + whenever(inputManager.inputDeviceIds).thenReturn(intArrayOf(PHYSICAL_FULL_KEYBOARD_ID)) + val initialValue = underTest.keyboardConnected.first() + assertThat(initialValue).isTrue() + } + + @Test + fun emitsConnected_whenNewPhysicalKeyboardConnects() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceAdded(PHYSICAL_FULL_KEYBOARD_ID) + + assertThat(isKeyboardConnected).isTrue() + } + + @Test + fun emitsDisconnected_whenKeyboardDisconnects() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceAdded(PHYSICAL_FULL_KEYBOARD_ID) + assertThat(isKeyboardConnected).isTrue() + + deviceListener.onInputDeviceRemoved(PHYSICAL_FULL_KEYBOARD_ID) + assertThat(isKeyboardConnected).isFalse() + } + + private suspend fun captureDeviceListener(): InputManager.InputDeviceListener { + underTest.keyboardConnected.first() + verify(inputManager).registerInputDeviceListener(deviceListenerCaptor.capture(), nullable()) + return deviceListenerCaptor.value + } + + @Test + fun emitsDisconnected_whenVirtualOrNotFullKeyboardConnects() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceAdded(PHYSICAL_NOT_FULL_KEYBOARD_ID) + assertThat(isKeyboardConnected).isFalse() + + deviceListener.onInputDeviceAdded(VIRTUAL_FULL_KEYBOARD_ID) + assertThat(isKeyboardConnected).isFalse() + } + + @Test + fun emitsDisconnected_whenKeyboardDisconnectsAndWasAlreadyConnectedAtTheStart() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceRemoved(PHYSICAL_FULL_KEYBOARD_ID) + assertThat(isKeyboardConnected).isFalse() + } + + @Test + fun emitsConnected_whenAnotherDeviceDisconnects() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceAdded(PHYSICAL_FULL_KEYBOARD_ID) + deviceListener.onInputDeviceRemoved(VIRTUAL_FULL_KEYBOARD_ID) + + assertThat(isKeyboardConnected).isTrue() + } + + @Test + fun emitsConnected_whenOnePhysicalKeyboardDisconnectsButAnotherRemainsConnected() = + testScope.runTest { + val deviceListener = captureDeviceListener() + val isKeyboardConnected by collectLastValue(underTest.keyboardConnected) + + deviceListener.onInputDeviceAdded(PHYSICAL_FULL_KEYBOARD_ID) + deviceListener.onInputDeviceAdded(ANOTHER_PHYSICAL_FULL_KEYBOARD_ID) + deviceListener.onInputDeviceRemoved(ANOTHER_PHYSICAL_FULL_KEYBOARD_ID) + + assertThat(isKeyboardConnected).isTrue() + } + + @Test + fun passesKeyboardBacklightValues_fromBacklightListener() { + // TODO(b/268645734): implement when implementing backlight listener + } + + private companion object { + private const val PHYSICAL_FULL_KEYBOARD_ID = 1 + private const val VIRTUAL_FULL_KEYBOARD_ID = 2 + private const val PHYSICAL_NOT_FULL_KEYBOARD_ID = 3 + private const val ANOTHER_PHYSICAL_FULL_KEYBOARD_ID = 4 + + private val INPUT_DEVICES_MAP: Map<Int, InputDevice> = + mapOf( + PHYSICAL_FULL_KEYBOARD_ID to inputDevice(virtual = false, fullKeyboard = true), + VIRTUAL_FULL_KEYBOARD_ID to inputDevice(virtual = true, fullKeyboard = true), + PHYSICAL_NOT_FULL_KEYBOARD_ID to inputDevice(virtual = false, fullKeyboard = false), + ANOTHER_PHYSICAL_FULL_KEYBOARD_ID to + inputDevice(virtual = false, fullKeyboard = true) + ) + + private fun inputDevice(virtual: Boolean, fullKeyboard: Boolean): InputDevice = + mock<InputDevice>().also { + whenever(it.isVirtual).thenReturn(virtual) + whenever(it.isFullKeyboard).thenReturn(fullKeyboard) + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index f55b86686152..c93e677071cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -29,7 +29,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -67,7 +66,6 @@ import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.NotificationShadeWindowControllerImpl; @@ -137,7 +135,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock AuthController mAuthController; private @Mock ShadeExpansionStateManager mShadeExpansionStateManager; private @Mock ShadeWindowLogger mShadeWindowLogger; - private @Mock FeatureFlags mFeatureFlags; private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake(); private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -545,7 +542,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mScreenOnCoordinator, mInteractionJankMonitor, mDreamOverlayStateController, - mFeatureFlags, () -> mShadeController, () -> mNotificationShadeWindowController, () -> mActivityLaunchAnimator, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt index 18e80ea40c5c..1365132d6dac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt @@ -28,6 +28,8 @@ import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintA import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepositoryImpl import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.SystemClock import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -50,6 +52,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository private lateinit var deviceEntryFingerprintAuthRepository: FakeDeviceEntryFingerprintAuthRepository + @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var systemClock: SystemClock @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var bouncerLogger: TableLogBuffer @@ -70,6 +73,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { featureFlags = FakeFeatureFlags().apply { this.set(Flags.MODERN_ALTERNATE_BOUNCER, true) } underTest = AlternateBouncerInteractor( + keyguardStateController, bouncerRepository, biometricSettingsRepository, deviceEntryFingerprintAuthRepository, @@ -134,6 +138,14 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { } @Test + fun canShowAlternateBouncerForFingerprint_butCanDismissLockScreen() { + givenCanShowAlternateBouncer() + whenever(keyguardStateController.isUnlocked).thenReturn(true) + + assertFalse(underTest.canShowAlternateBouncerForFingerprint()) + } + + @Test fun show_whenCannotShow() { givenCannotShowAlternateBouncer() @@ -163,6 +175,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { biometricSettingsRepository.setStrongBiometricAllowed(true) biometricSettingsRepository.setFingerprintEnabledByDevicePolicy(true) deviceEntryFingerprintAuthRepository.setLockedOut(false) + whenever(keyguardStateController.isUnlocked).thenReturn(false) } private fun givenCannotShowAlternateBouncer() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt index 46ed829e0574..6b7fd616e678 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorTest.kt @@ -19,11 +19,13 @@ package com.android.systemui.keyguard.domain.interactor import android.os.Looper import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper +import android.testing.TestableResources import android.view.View import androidx.test.filters.SmallTest import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.DejankUtils +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.keyguard.DismissCallbackRegistry @@ -69,6 +71,7 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor private val mainHandler = FakeHandler(Looper.getMainLooper()) private lateinit var underTest: PrimaryBouncerInteractor + private lateinit var resources: TestableResources @Before fun setUp() { @@ -84,18 +87,19 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { mPrimaryBouncerCallbackInteractor, falsingCollector, dismissCallbackRegistry, - keyguardBypassController, + context, keyguardUpdateMonitor, + keyguardBypassController, ) `when`(repository.primaryBouncerStartingDisappearAnimation.value).thenReturn(null) `when`(repository.primaryBouncerShow.value).thenReturn(null) `when`(bouncerView.delegate).thenReturn(bouncerViewDelegate) + resources = context.orCreateTestableResources } @Test fun testShow_isScrimmed() { underTest.show(true) - verify(repository).setOnScreenTurnedOff(false) verify(repository).setKeyguardAuthenticated(null) verify(repository).setPrimaryHide(false) verify(repository).setPrimaryStartingToHide(false) @@ -207,12 +211,6 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { } @Test - fun testOnScreenTurnedOff() { - underTest.onScreenTurnedOff() - verify(repository).setOnScreenTurnedOff(true) - } - - @Test fun testSetKeyguardPosition() { underTest.setKeyguardPosition(0f) verify(repository).setKeyguardPosition(0f) @@ -286,4 +284,98 @@ class PrimaryBouncerInteractorTest : SysuiTestCase() { `when`(bouncerViewDelegate.willDismissWithActions()).thenReturn(false) assertThat(underTest.willDismissWithAction()).isFalse() } + + @Test + fun testSideFpsVisibility() { + updateSideFpsVisibilityParameters( + isVisible = true, + sfpsEnabled = true, + fpsDetectionRunning = true, + isUnlockingWithFpAllowed = true, + isAnimatingAway = false + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(true) + } + + @Test + fun testSideFpsVisibility_notVisible() { + updateSideFpsVisibilityParameters( + isVisible = false, + sfpsEnabled = true, + fpsDetectionRunning = true, + isUnlockingWithFpAllowed = true, + isAnimatingAway = false + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(false) + } + + @Test + fun testSideFpsVisibility_sfpsNotEnabled() { + updateSideFpsVisibilityParameters( + isVisible = true, + sfpsEnabled = false, + fpsDetectionRunning = true, + isUnlockingWithFpAllowed = true, + isAnimatingAway = false + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(false) + } + + @Test + fun testSideFpsVisibility_fpsDetectionNotRunning() { + updateSideFpsVisibilityParameters( + isVisible = true, + sfpsEnabled = true, + fpsDetectionRunning = false, + isUnlockingWithFpAllowed = true, + isAnimatingAway = false + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(false) + } + + @Test + fun testSideFpsVisibility_UnlockingWithFpNotAllowed() { + updateSideFpsVisibilityParameters( + isVisible = true, + sfpsEnabled = true, + fpsDetectionRunning = true, + isUnlockingWithFpAllowed = false, + isAnimatingAway = false + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(false) + } + + @Test + fun testSideFpsVisibility_AnimatingAway() { + updateSideFpsVisibilityParameters( + isVisible = true, + sfpsEnabled = true, + fpsDetectionRunning = true, + isUnlockingWithFpAllowed = true, + isAnimatingAway = true + ) + underTest.updateSideFpsVisibility() + verify(repository).setSideFpsShowing(false) + } + + private fun updateSideFpsVisibilityParameters( + isVisible: Boolean, + sfpsEnabled: Boolean, + fpsDetectionRunning: Boolean, + isUnlockingWithFpAllowed: Boolean, + isAnimatingAway: Boolean + ) { + `when`(repository.primaryBouncerVisible.value).thenReturn(isVisible) + resources.addOverride(R.bool.config_show_sidefps_hint_on_bouncer, sfpsEnabled) + `when`(keyguardUpdateMonitor.isFingerprintDetectionRunning).thenReturn(fpsDetectionRunning) + `when`(keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed) + .thenReturn(isUnlockingWithFpAllowed) + `when`(repository.primaryBouncerStartingDisappearAnimation.value) + .thenReturn(if (isAnimatingAway) Runnable {} else null) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt index 75b74b0cfe28..f675e7997eb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt @@ -26,7 +26,6 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.data.BouncerView -import com.android.systemui.keyguard.data.BouncerViewDelegate import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.KeyguardStateController @@ -44,7 +43,6 @@ import org.mockito.MockitoAnnotations class PrimaryBouncerInteractorWithCoroutinesTest : SysuiTestCase() { private lateinit var repository: FakeKeyguardBouncerRepository @Mock private lateinit var bouncerView: BouncerView - @Mock private lateinit var bouncerViewDelegate: BouncerViewDelegate @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var keyguardSecurityModel: KeyguardSecurityModel @Mock private lateinit var primaryBouncerCallbackInteractor: PrimaryBouncerCallbackInteractor @@ -69,8 +67,9 @@ class PrimaryBouncerInteractorWithCoroutinesTest : SysuiTestCase() { primaryBouncerCallbackInteractor, falsingCollector, dismissCallbackRegistry, - keyguardBypassController, + context, keyguardUpdateMonitor, + keyguardBypassController, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt index 586af626d29e..65e4c10265cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBouncerViewModelTest.kt @@ -16,15 +16,23 @@ package com.android.systemui.keyguard.ui.viewmodel +import android.os.Looper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardSecurityModel +import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.SysuiTestCase +import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.data.BouncerView +import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository +import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInteractor import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel +import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.utils.os.FakeHandler import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.test.runCurrent @@ -33,7 +41,6 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito import org.mockito.MockitoAnnotations @SmallTest @@ -41,31 +48,69 @@ import org.mockito.MockitoAnnotations @kotlinx.coroutines.ExperimentalCoroutinesApi class KeyguardBouncerViewModelTest : SysuiTestCase() { lateinit var underTest: KeyguardBouncerViewModel + lateinit var bouncerInteractor: PrimaryBouncerInteractor @Mock lateinit var bouncerView: BouncerView - @Mock lateinit var bouncerInteractor: PrimaryBouncerInteractor + @Mock private lateinit var keyguardStateController: KeyguardStateController + @Mock private lateinit var keyguardSecurityModel: KeyguardSecurityModel + @Mock private lateinit var primaryBouncerCallbackInteractor: PrimaryBouncerCallbackInteractor + @Mock private lateinit var falsingCollector: FalsingCollector + @Mock private lateinit var dismissCallbackRegistry: DismissCallbackRegistry + @Mock private lateinit var keyguardBypassController: KeyguardBypassController + @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + private val mainHandler = FakeHandler(Looper.getMainLooper()) + val repository = FakeKeyguardBouncerRepository() @Before fun setup() { MockitoAnnotations.initMocks(this) + bouncerInteractor = + PrimaryBouncerInteractor( + repository, + bouncerView, + mainHandler, + keyguardStateController, + keyguardSecurityModel, + primaryBouncerCallbackInteractor, + falsingCollector, + dismissCallbackRegistry, + context, + keyguardUpdateMonitor, + keyguardBypassController, + ) underTest = KeyguardBouncerViewModel(bouncerView, bouncerInteractor) } @Test - fun setMessage() = - runTest { - val flow = MutableStateFlow<BouncerShowMessageModel?>(null) - var message: BouncerShowMessageModel? = null - Mockito.`when`(bouncerInteractor.showMessage) - .thenReturn(flow as Flow<BouncerShowMessageModel>) - // Reinitialize the view model. - underTest = KeyguardBouncerViewModel(bouncerView, bouncerInteractor) + fun setMessage() = runTest { + var message: BouncerShowMessageModel? = null + val job = underTest.bouncerShowMessage.onEach { message = it }.launchIn(this) - flow.value = BouncerShowMessageModel(message = "abc", colorStateList = null) + repository.setShowMessage(BouncerShowMessageModel("abc", null)) + // Run the tasks that are pending at this point of virtual time. + runCurrent() + assertThat(message?.message).isEqualTo("abc") + job.cancel() + } + + @Test + fun shouldUpdateSideFps() = runTest { + var count = 0 + val job = underTest.shouldUpdateSideFps.onEach { count++ }.launchIn(this) + repository.setPrimaryVisible(true) + // Run the tasks that are pending at this point of virtual time. + runCurrent() + assertThat(count).isEqualTo(1) + job.cancel() + } - val job = underTest.bouncerShowMessage.onEach { message = it }.launchIn(this) - // Run the tasks that are pending at this point of virtual time. - runCurrent() - assertThat(message?.message).isEqualTo("abc") - job.cancel() - } + @Test + fun sideFpsShowing() = runTest { + var sideFpsIsShowing = false + val job = underTest.sideFpsShowing.onEach { sideFpsIsShowing = it }.launchIn(this) + repository.setSideFpsShowing(true) + // Run the tasks that are pending at this point of virtual time. + runCurrent() + assertThat(sideFpsIsShowing).isEqualTo(true) + job.cancel() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt index a07a714ebc77..ab0669a28f04 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/pipeline/MediaDataManagerTest.kt @@ -93,6 +93,8 @@ private const val SYSTEM_PACKAGE_NAME = "com.android.systemui" private const val APP_NAME = "SystemUI" private const val SESSION_ARTIST = "artist" private const val SESSION_TITLE = "title" +private const val SESSION_BLANK_TITLE = " " +private const val SESSION_EMPTY_TITLE = "" private const val USER_ID = 0 private val DISMISS_INTENT = Intent().apply { action = "dismiss" } @@ -137,6 +139,7 @@ class MediaDataManagerTest : SysuiTestCase() { @Mock private lateinit var logger: MediaUiEventLogger lateinit var mediaDataManager: MediaDataManager lateinit var mediaNotification: StatusBarNotification + lateinit var remoteCastNotification: StatusBarNotification @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData> private val clock = FakeSystemClock() @Mock private lateinit var tunerService: TunerService @@ -205,6 +208,20 @@ class MediaDataManagerTest : SysuiTestCase() { } build() } + remoteCastNotification = + SbnBuilder().run { + setPkg(SYSTEM_PACKAGE_NAME) + modifyNotification(context).also { + it.setSmallIcon(android.R.drawable.ic_media_pause) + it.setStyle( + MediaStyle().apply { + setMediaSession(session.sessionToken) + setRemotePlaybackInfo("Remote device", 0, null) + } + ) + } + build() + } metadataBuilder = MediaMetadata.Builder().apply { putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST) @@ -214,6 +231,7 @@ class MediaDataManagerTest : SysuiTestCase() { whenever(mediaControllerFactory.create(eq(session.sessionToken))).thenReturn(controller) whenever(controller.transportControls).thenReturn(transportControls) whenever(controller.playbackInfo).thenReturn(playbackInfo) + whenever(controller.metadata).thenReturn(metadataBuilder.build()) whenever(playbackInfo.playbackType) .thenReturn(MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) @@ -244,6 +262,7 @@ class MediaDataManagerTest : SysuiTestCase() { whenever(mediaFlags.isExplicitIndicatorEnabled()).thenReturn(true) whenever(mediaFlags.isRetainingPlayersEnabled()).thenReturn(false) whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(false) + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(false) whenever(logger.getNewInstanceId()).thenReturn(instanceIdSequence.newInstanceId()) whenever(keyguardUpdateMonitor.isUserInLockdown(any())).thenReturn(false) } @@ -318,18 +337,15 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testLoadMetadata_withExplicitIndicator() { - val metadata = - MediaMetadata.Builder().run { - putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST) - putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE) - putLong( - MediaConstants.METADATA_KEY_IS_EXPLICIT, - MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT - ) - build() - } - whenever(mediaControllerFactory.create(anyObject())).thenReturn(controller) - whenever(controller.metadata).thenReturn(metadata) + whenever(controller.metadata) + .thenReturn( + metadataBuilder + .putLong( + MediaConstants.METADATA_KEY_IS_EXPLICIT, + MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT + ) + .build() + ) mediaDataManager.addListener(listener) mediaDataManager.onNotificationAdded(KEY, mediaNotification) @@ -350,9 +366,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnMetaDataLoaded_withoutExplicitIndicator() { - whenever(mediaControllerFactory.create(anyObject())).thenReturn(controller) - whenever(controller.metadata).thenReturn(metadataBuilder.build()) - mediaDataManager.addListener(listener) mediaDataManager.onNotificationAdded(KEY, mediaNotification) @@ -385,7 +398,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnMetaDataLoaded_conservesActiveFlag() { whenever(mediaControllerFactory.create(anyObject())).thenReturn(controller) - whenever(controller.metadata).thenReturn(metadataBuilder.build()) mediaDataManager.addListener(listener) mediaDataManager.onNotificationAdded(KEY, mediaNotification) assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) @@ -404,33 +416,8 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnNotificationAdded_isRcn_markedRemote() { - val rcn = - SbnBuilder().run { - setPkg(SYSTEM_PACKAGE_NAME) - modifyNotification(context).also { - it.setSmallIcon(android.R.drawable.ic_media_pause) - it.setStyle( - MediaStyle().apply { - setMediaSession(session.sessionToken) - setRemotePlaybackInfo("Remote device", 0, null) - } - ) - } - build() - } + addNotificationAndLoad(remoteCastNotification) - mediaDataManager.onNotificationAdded(KEY, rcn) - assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) - assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) - verify(listener) - .onMediaDataLoaded( - eq(KEY), - eq(null), - capture(mediaDataCaptor), - eq(true), - eq(0), - eq(false) - ) assertThat(mediaDataCaptor.value!!.playbackLocation) .isEqualTo(MediaData.PLAYBACK_CAST_REMOTE) verify(logger) @@ -530,9 +517,78 @@ class MediaDataManagerTest : SysuiTestCase() { } @Test + fun testOnNotificationRemoved_emptyTitle_notConverted() { + // GIVEN that the manager has a notification with a resume action and empty title. + whenever(controller.metadata) + .thenReturn( + metadataBuilder + .putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_EMPTY_TITLE) + .build() + ) + addNotificationAndLoad() + val data = mediaDataCaptor.value + val instanceId = data.instanceId + assertThat(data.resumption).isFalse() + mediaDataManager.onMediaDataLoaded(KEY, null, data.copy(resumeAction = Runnable {})) + + // WHEN the notification is removed + reset(listener) + mediaDataManager.onNotificationRemoved(KEY) + + // THEN active media is not converted to resume. + verify(listener, never()) + .onMediaDataLoaded( + eq(PACKAGE_NAME), + eq(KEY), + capture(mediaDataCaptor), + eq(true), + eq(0), + eq(false) + ) + verify(logger, never()) + .logActiveConvertedToResume(anyInt(), eq(PACKAGE_NAME), eq(instanceId)) + verify(logger, never()).logResumeMediaAdded(anyInt(), eq(PACKAGE_NAME), any()) + verify(logger).logMediaRemoved(anyInt(), eq(PACKAGE_NAME), eq(instanceId)) + } + + @Test + fun testOnNotificationRemoved_blankTitle_notConverted() { + // GIVEN that the manager has a notification with a resume action and blank title. + whenever(controller.metadata) + .thenReturn( + metadataBuilder + .putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_BLANK_TITLE) + .build() + ) + addNotificationAndLoad() + val data = mediaDataCaptor.value + val instanceId = data.instanceId + assertThat(data.resumption).isFalse() + mediaDataManager.onMediaDataLoaded(KEY, null, data.copy(resumeAction = Runnable {})) + + // WHEN the notification is removed + reset(listener) + mediaDataManager.onNotificationRemoved(KEY) + + // THEN active media is not converted to resume. + verify(listener, never()) + .onMediaDataLoaded( + eq(PACKAGE_NAME), + eq(KEY), + capture(mediaDataCaptor), + eq(true), + eq(0), + eq(false) + ) + verify(logger, never()) + .logActiveConvertedToResume(anyInt(), eq(PACKAGE_NAME), eq(instanceId)) + verify(logger, never()).logResumeMediaAdded(anyInt(), eq(PACKAGE_NAME), any()) + verify(logger).logMediaRemoved(anyInt(), eq(PACKAGE_NAME), eq(instanceId)) + } + + @Test fun testOnNotificationRemoved_withResumption() { // GIVEN that the manager has a notification with a resume action - whenever(controller.metadata).thenReturn(metadataBuilder.build()) addNotificationAndLoad() val data = mediaDataCaptor.value assertThat(data.resumption).isFalse() @@ -557,7 +613,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnNotificationRemoved_twoWithResumption() { // GIVEN that the manager has two notifications with resume actions - whenever(controller.metadata).thenReturn(metadataBuilder.build()) mediaDataManager.onNotificationAdded(KEY, mediaNotification) mediaDataManager.onNotificationAdded(KEY_2, mediaNotification) assertThat(backgroundExecutor.runAllReady()).isEqualTo(2) @@ -623,7 +678,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnNotificationRemoved_withResumption_butNotLocal() { // GIVEN that the manager has a notification with a resume action, but is not local - whenever(controller.metadata).thenReturn(metadataBuilder.build()) whenever(playbackInfo.playbackType) .thenReturn(MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) addNotificationAndLoad() @@ -647,6 +701,56 @@ class MediaDataManagerTest : SysuiTestCase() { } @Test + fun testOnNotificationRemoved_withResumption_isRemoteAndRemoteAllowed() { + // With the flag enabled to allow remote media to resume + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(true) + + // GIVEN that the manager has a notification with a resume action, but is not local + whenever(controller.metadata).thenReturn(metadataBuilder.build()) + whenever(playbackInfo.playbackType) + .thenReturn(MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) + addNotificationAndLoad() + val data = mediaDataCaptor.value + val dataRemoteWithResume = + data.copy(resumeAction = Runnable {}, playbackLocation = MediaData.PLAYBACK_CAST_LOCAL) + mediaDataManager.onMediaDataLoaded(KEY, null, dataRemoteWithResume) + + // WHEN the notification is removed + mediaDataManager.onNotificationRemoved(KEY) + + // THEN the media data is converted to a resume state + verify(listener) + .onMediaDataLoaded( + eq(PACKAGE_NAME), + eq(KEY), + capture(mediaDataCaptor), + eq(true), + eq(0), + eq(false) + ) + assertThat(mediaDataCaptor.value.resumption).isTrue() + } + + @Test + fun testOnNotificationRemoved_withResumption_isRcnAndRemoteAllowed() { + // With the flag enabled to allow remote media to resume + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(true) + + // GIVEN that the manager has a remote cast notification + addNotificationAndLoad(remoteCastNotification) + val data = mediaDataCaptor.value + assertThat(data.playbackLocation).isEqualTo(MediaData.PLAYBACK_CAST_REMOTE) + val dataRemoteWithResume = data.copy(resumeAction = Runnable {}) + mediaDataManager.onMediaDataLoaded(KEY, null, dataRemoteWithResume) + + // WHEN the RCN is removed + mediaDataManager.onNotificationRemoved(KEY) + + // THEN the media data is removed + verify(listener).onMediaDataRemoved(eq(KEY)) + } + + @Test fun testOnNotificationRemoved_withResumption_tooManyPlayers() { // Given the maximum number of resume controls already val desc = @@ -660,7 +764,6 @@ class MediaDataManagerTest : SysuiTestCase() { } // And an active, resumable notification - whenever(controller.metadata).thenReturn(metadataBuilder.build()) addNotificationAndLoad() val data = mediaDataCaptor.value assertThat(data.resumption).isFalse() @@ -845,6 +948,74 @@ class MediaDataManagerTest : SysuiTestCase() { } @Test + fun testAddResumptionControls_hasEmptyTitle() { + whenever(mediaFlags.isResumeProgressEnabled()).thenReturn(true) + + // WHEN resumption controls are added that have empty title + val desc = + MediaDescription.Builder().run { + setTitle(SESSION_EMPTY_TITLE) + build() + } + mediaDataManager.addResumptionControls( + USER_ID, + desc, + Runnable {}, + session.sessionToken, + APP_NAME, + pendingIntent, + PACKAGE_NAME + ) + + // Resumption controls are not added. + assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) + assertThat(foregroundExecutor.runAllReady()).isEqualTo(0) + verify(listener, never()) + .onMediaDataLoaded( + eq(PACKAGE_NAME), + eq(null), + capture(mediaDataCaptor), + eq(true), + eq(0), + eq(false) + ) + } + + @Test + fun testAddResumptionControls_hasBlankTitle() { + whenever(mediaFlags.isResumeProgressEnabled()).thenReturn(true) + + // WHEN resumption controls are added that have a blank title + val desc = + MediaDescription.Builder().run { + setTitle(SESSION_BLANK_TITLE) + build() + } + mediaDataManager.addResumptionControls( + USER_ID, + desc, + Runnable {}, + session.sessionToken, + APP_NAME, + pendingIntent, + PACKAGE_NAME + ) + + // Resumption controls are not added. + assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) + assertThat(foregroundExecutor.runAllReady()).isEqualTo(0) + verify(listener, never()) + .onMediaDataLoaded( + eq(PACKAGE_NAME), + eq(null), + capture(mediaDataCaptor), + eq(true), + eq(0), + eq(false) + ) + } + + @Test fun testResumptionDisabled_dismissesResumeControls() { // WHEN there are resume controls and resumption is switched off val desc = @@ -1213,7 +1384,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testOnActiveMediaConverted_doesNotUpdateLastActiveTime() { // GIVEN that the manager has a notification with a resume action - whenever(controller.metadata).thenReturn(metadataBuilder.build()) addNotificationAndLoad() val data = mediaDataCaptor.value val instanceId = data.instanceId @@ -1513,7 +1683,6 @@ class MediaDataManagerTest : SysuiTestCase() { val instanceId = mediaDataCaptor.value.instanceId // Location is updated to local cast - whenever(controller.metadata).thenReturn(metadataBuilder.build()) whenever(playbackInfo.playbackType) .thenReturn(MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) addNotificationAndLoad() @@ -1526,22 +1695,7 @@ class MediaDataManagerTest : SysuiTestCase() { ) // update to remote cast - val rcn = - SbnBuilder().run { - setPkg(SYSTEM_PACKAGE_NAME) // System package - modifyNotification(context).also { - it.setSmallIcon(android.R.drawable.ic_media_pause) - it.setStyle( - MediaStyle().apply { - setMediaSession(session.sessionToken) - setRemotePlaybackInfo("Remote device", 0, null) - } - ) - } - build() - } - - mediaDataManager.onNotificationAdded(KEY, rcn) + mediaDataManager.onNotificationAdded(KEY, remoteCastNotification) assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(logger) @@ -1589,7 +1743,6 @@ class MediaDataManagerTest : SysuiTestCase() { @Test fun testPlaybackStateChange_keyHasNullToken_doesNothing() { // When we get an update that sets the data's token to null - whenever(controller.metadata).thenReturn(metadataBuilder.build()) addNotificationAndLoad() val data = mediaDataCaptor.value assertThat(data.resumption).isFalse() @@ -1911,9 +2064,14 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener).onMediaDataRemoved(eq(KEY)) } - /** Helper function to add a media notification and capture the resulting MediaData */ + /** Helper function to add a basic media notification and capture the resulting MediaData */ private fun addNotificationAndLoad() { - mediaDataManager.onNotificationAdded(KEY, mediaNotification) + addNotificationAndLoad(mediaNotification) + } + + /** Helper function to add the given notification and capture the resulting MediaData */ + private fun addNotificationAndLoad(sbn: StatusBarNotification) { + mediaDataManager.onNotificationAdded(KEY, sbn) assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt index 136ace173795..4dfa6261b868 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/resume/MediaResumeListenerTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.media.controls.models.player.MediaData import com.android.systemui.media.controls.models.player.MediaDeviceData import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.pipeline.RESUME_MEDIA_TIMEOUT +import com.android.systemui.media.controls.util.MediaFlags import com.android.systemui.settings.UserTracker import com.android.systemui.tuner.TunerService import com.android.systemui.util.concurrency.FakeExecutor @@ -92,6 +93,7 @@ class MediaResumeListenerTest : SysuiTestCase() { @Mock private lateinit var mockContext: Context @Mock private lateinit var pendingIntent: PendingIntent @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var mediaFlags: MediaFlags @Captor lateinit var callbackCaptor: ArgumentCaptor<ResumeMediaBrowser.Callback> @Captor lateinit var actionCaptor: ArgumentCaptor<Runnable> @@ -134,6 +136,7 @@ class MediaResumeListenerTest : SysuiTestCase() { whenever(mockContext.packageManager).thenReturn(context.packageManager) whenever(mockContext.contentResolver).thenReturn(context.contentResolver) whenever(mockContext.userId).thenReturn(context.userId) + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(false) executor = FakeExecutor(clock) resumeListener = @@ -146,7 +149,8 @@ class MediaResumeListenerTest : SysuiTestCase() { tunerService, resumeBrowserFactory, dumpManager, - clock + clock, + mediaFlags, ) resumeListener.setManager(mediaDataManager) mediaDataManager.addListener(resumeListener) @@ -188,7 +192,8 @@ class MediaResumeListenerTest : SysuiTestCase() { tunerService, resumeBrowserFactory, dumpManager, - clock + clock, + mediaFlags, ) listener.setManager(mediaDataManager) verify(broadcastDispatcher, never()) @@ -244,6 +249,32 @@ class MediaResumeListenerTest : SysuiTestCase() { } @Test + fun testOnLoad_localCast_remoteResumeAllowed_doesCheck() { + // If local cast media is allowed to resume + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(true) + + // When media data is loaded that has not been checked yet, and is a local cast + val dataCast = data.copy(playbackLocation = MediaData.PLAYBACK_CAST_LOCAL) + resumeListener.onMediaDataLoaded(KEY, null, dataCast) + + // Then we report back to the manager + verify(mediaDataManager).setResumeAction(KEY, null) + } + + @Test + fun testOnLoad_remoteCast_remoteResumeAllowed_doesCheck() { + // If local cast media is allowed to resume + whenever(mediaFlags.isRemoteResumeAllowed()).thenReturn(true) + + // When media data is loaded that has not been checked yet, and is a remote cast + val dataRcn = data.copy(playbackLocation = MediaData.PLAYBACK_CAST_REMOTE) + resumeListener.onMediaDataLoaded(KEY, null, dataRcn) + + // Then we do not take action + verify(mediaDataManager, never()).setResumeAction(any(), any()) + } + + @Test fun testOnLoad_checksForResume_hasService() { setUpMbsWithValidResolveInfo() @@ -389,7 +420,8 @@ class MediaResumeListenerTest : SysuiTestCase() { tunerService, resumeBrowserFactory, dumpManager, - clock + clock, + mediaFlags, ) resumeListener.setManager(mediaDataManager) mediaDataManager.addListener(resumeListener) @@ -421,7 +453,8 @@ class MediaResumeListenerTest : SysuiTestCase() { tunerService, resumeBrowserFactory, dumpManager, - clock + clock, + mediaFlags, ) resumeListener.setManager(mediaDataManager) mediaDataManager.addListener(resumeListener) @@ -463,7 +496,8 @@ class MediaResumeListenerTest : SysuiTestCase() { tunerService, resumeBrowserFactory, dumpManager, - clock + clock, + mediaFlags, ) resumeListener.setManager(mediaDataManager) mediaDataManager.addListener(resumeListener) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt index a72634bcb807..7f5707722b9c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.controls.ui import android.app.PendingIntent +import android.content.res.ColorStateList import android.content.res.Configuration import android.testing.AndroidTestingRunner import android.testing.TestableLooper @@ -26,9 +27,9 @@ import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector -import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor @@ -49,7 +50,7 @@ import com.android.systemui.qs.PageIndicator import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider import com.android.systemui.statusbar.policy.ConfigurationController -import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock @@ -89,7 +90,6 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager @Mock lateinit var mediaHostState: MediaHostState @Mock lateinit var activityStarter: ActivityStarter - @Mock @Main private lateinit var executor: DelayableExecutor @Mock lateinit var mediaDataManager: MediaDataManager @Mock lateinit var configurationController: ConfigurationController @Mock lateinit var falsingCollector: FalsingCollector @@ -113,11 +113,15 @@ class MediaCarouselControllerTest : SysuiTestCase() { private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController + private lateinit var mainExecutor: FakeExecutor + private lateinit var backgroundExecutor: FakeExecutor @Before fun setup() { MockitoAnnotations.initMocks(this) transitionRepository = FakeKeyguardTransitionRepository() + mainExecutor = FakeExecutor(clock) + backgroundExecutor = FakeExecutor(clock) mediaCarouselController = MediaCarouselController( context, @@ -126,7 +130,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { mediaHostStatesManager, activityStarter, clock, - executor, + mainExecutor, + backgroundExecutor, mediaDataManager, configurationController, falsingCollector, @@ -401,6 +406,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = true ) ) + runAllReady() assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), @@ -510,6 +516,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { false ) mediaCarouselController.shouldScrollToKey = true + runAllReady() + // switching between media players. listener.value.onMediaDataLoaded( "playing local", @@ -531,6 +539,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) + runAllReady() assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), @@ -555,6 +564,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) + runAllReady() var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") assertEquals( @@ -577,6 +587,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { packageName = "PACKAGE_NAME" ) ) + runAllReady() + playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") assertEquals(playerIndex, 0) } @@ -674,6 +686,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Test fun testOnConfigChanged_playersAreAddedBack() { + mediaCarouselController.pageIndicator = pageIndicator + listener.value.onMediaDataLoaded( "playing local", null, @@ -694,11 +708,15 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false ) ) + runAllReady() val playersSize = MediaPlayerData.players().size configListener.value.onConfigChanged(Configuration()) + runAllReady() + verify(pageIndicator).tintList = + ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) assertEquals(playersSize, MediaPlayerData.players().size) assertEquals( MediaPlayerData.getMediaPlayerIndex("playing local"), @@ -707,6 +725,93 @@ class MediaCarouselControllerTest : SysuiTestCase() { } @Test + fun testOnUiModeChanged_playersAreAddedBack() { + mediaCarouselController.pageIndicator = pageIndicator + + listener.value.onMediaDataLoaded( + "paused local", + null, + DATA.copy( + active = true, + isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, + resumption = false + ) + ) + runAllReady() + + val playersSize = MediaPlayerData.players().size + configListener.value.onUiModeChanged() + runAllReady() + + verify(pageIndicator).tintList = + ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) + assertEquals(playersSize, MediaPlayerData.players().size) + assertEquals( + MediaPlayerData.getMediaPlayerIndex("paused local"), + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + } + + @Test + fun testOnDensityOrFontScaleChanged_playersAreAddedBack() { + mediaCarouselController.pageIndicator = pageIndicator + + listener.value.onMediaDataLoaded( + "paused local", + null, + DATA.copy( + active = true, + isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, + resumption = false + ) + ) + runAllReady() + + val playersSize = MediaPlayerData.players().size + configListener.value.onDensityOrFontScaleChanged() + runAllReady() + + verify(pageIndicator).tintList = + ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) + assertEquals(playersSize, MediaPlayerData.players().size) + assertEquals( + MediaPlayerData.getMediaPlayerIndex("paused local"), + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + } + + @Test + fun testOnThemeChanged_playersAreAddedBack() { + mediaCarouselController.pageIndicator = pageIndicator + + listener.value.onMediaDataLoaded( + "paused local", + null, + DATA.copy( + active = true, + isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, + resumption = false + ) + ) + runAllReady() + + val playersSize = MediaPlayerData.players().size + configListener.value.onThemeChanged() + runAllReady() + + verify(pageIndicator).tintList = + ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) + assertEquals(playersSize, MediaPlayerData.players().size) + assertEquals( + MediaPlayerData.getMediaPlayerIndex("paused local"), + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + } + + @Test fun testRecommendation_persistentEnabled_newSmartspaceLoaded_updatesSort() { testRecommendation_persistentEnabled_inactiveSmartspaceDataLoaded_isAdded() @@ -832,4 +937,9 @@ class MediaCarouselControllerTest : SysuiTestCase() { // Verify that seekbar listening attribute in media control panel is set to false. verify(panel, times(MediaPlayerData.players().size)).listening = false } + + private fun runAllReady() { + backgroundExecutor.runAllReady() + mainExecutor.runAllReady() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt index 537dfb821fef..1c9336a3fc66 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt @@ -13,6 +13,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.phone.AutoHideController import com.android.systemui.statusbar.phone.LightBarController import com.android.systemui.statusbar.phone.LightBarTransitionsController +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.wm.shell.back.BackAnimation import com.android.wm.shell.pip.Pip import org.junit.Before @@ -66,6 +67,8 @@ class TaskbarDelegateTest : SysuiTestCase() { lateinit var mBackAnimation: BackAnimation @Mock lateinit var mCurrentSysUiState: NavBarHelper.CurrentSysuiState + @Mock + lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager @Before fun setup() { @@ -76,7 +79,7 @@ class TaskbarDelegateTest : SysuiTestCase() { `when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState) mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance() mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory, - mLightBarControllerFactory) + mLightBarControllerFactory, mStatusBarKeyguardViewManager) mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper, mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController, mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners) diff --git a/packages/SystemUI/tests/src/com/android/systemui/process/condition/UserProcessConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/process/condition/SystemProcessConditionTest.java index 2293fc577029..fb7197706ddc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/process/condition/UserProcessConditionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/process/condition/SystemProcessConditionTest.java @@ -26,7 +26,6 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.process.ProcessWrapper; -import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.condition.Condition; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.concurrency.FakeExecutor; @@ -41,10 +40,7 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper @SmallTest -public class UserProcessConditionTest extends SysuiTestCase { - @Mock - UserTracker mUserTracker; - +public class SystemProcessConditionTest extends SysuiTestCase { @Mock ProcessWrapper mProcessWrapper; @@ -59,15 +55,14 @@ public class UserProcessConditionTest extends SysuiTestCase { } /** - * Verifies condition reports false when tracker reports a different user id than the - * identifier from the process handle. + * Verifies condition reports false when tracker reports the process is being ran by the + * system user. */ @Test - public void testConditionFailsWithDifferentIds() { + public void testConditionFailsWithNonSystemProcess() { - final Condition condition = new UserProcessCondition(mProcessWrapper, mUserTracker); - when(mProcessWrapper.getUserHandleIdentifier()).thenReturn(0); - when(mUserTracker.getUserId()).thenReturn(1); + final Condition condition = new SystemProcessCondition(mProcessWrapper); + when(mProcessWrapper.isSystemUser()).thenReturn(false); final Monitor monitor = new Monitor(mExecutor); @@ -81,15 +76,14 @@ public class UserProcessConditionTest extends SysuiTestCase { } /** - * Verifies condition reports false when tracker reports a different user id than the - * identifier from the process handle. + * Verifies condition reports true when tracker reports the process is being ran by the + * system user. */ @Test - public void testConditionSucceedsWithSameIds() { + public void testConditionSucceedsWithSystemProcess() { - final Condition condition = new UserProcessCondition(mProcessWrapper, mUserTracker); - when(mProcessWrapper.getUserHandleIdentifier()).thenReturn(0); - when(mUserTracker.getUserId()).thenReturn(0); + final Condition condition = new SystemProcessCondition(mProcessWrapper); + when(mProcessWrapper.isSystemUser()).thenReturn(true); final Monitor monitor = new Monitor(mExecutor); @@ -101,5 +95,4 @@ public class UserProcessConditionTest extends SysuiTestCase { verify(mCallback).onConditionsChanged(true); } - } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index 5058373e39b0..3d55c5131b40 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -71,7 +71,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { @Mock private QSPanel mQSPanel; @Mock - private QSTileHost mQSTileHost; + private QSHost mQSHost; @Mock private QSCustomizerController mQSCustomizerController; @Mock @@ -105,7 +105,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { /** Implementation needed to ensure we have a reflectively-available class name. */ private class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> { - protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, + protected TestableQSPanelControllerBase(QSPanel view, QSHost host, QSCustomizerController qsCustomizerController, MediaHost mediaHost, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager) { @@ -130,8 +130,8 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout); when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout); when(mQSTile.getTileSpec()).thenReturn("dnd"); - when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); - when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); + when(mQSHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); + when(mQSHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); when(mQSTileRevealControllerFactory.create(any(), any())) .thenReturn(mQSTileRevealController); when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters()); @@ -142,7 +142,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { return null; }).when(mQSPanel).setListening(anyBoolean()); - mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, + mController = new TestableQSPanelControllerBase(mQSPanel, mQSHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); @@ -155,7 +155,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { mController.onViewDetached(); QSPanelControllerBase<QSPanel> controller = new TestableQSPanelControllerBase(mQSPanel, - mQSTileHost, mQSCustomizerController, mMediaHost, + mQSHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager) { @Override protected QSTileRevealController createTileRevealController() { @@ -250,7 +250,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(false); when(mQSPanel.getDumpableTag()).thenReturn("QSPanelLandscape"); - mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, + mController = new TestableQSPanelControllerBase(mQSPanel, mQSHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); mController.init(); @@ -259,7 +259,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true); when(mQSPanel.getDumpableTag()).thenReturn("QSPanelPortrait"); - mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, + mController = new TestableQSPanelControllerBase(mQSPanel, mQSHost, mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); mController.init(); @@ -291,7 +291,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { @Test public void testRefreshAllTilesDoesntRefreshListeningTiles() { - when(mQSTileHost.getTiles()).thenReturn(List.of(mQSTile, mOtherTile)); + when(mQSHost.getTiles()).thenReturn(List.of(mQSTile, mOtherTile)); mController.setTiles(); when(mQSTile.isListening()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt index 09156d6d6752..a0d8f98a4ad1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -9,7 +9,6 @@ import com.android.internal.logging.UiEventLogger import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FeatureFlags import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.media.controls.ui.MediaHostState import com.android.systemui.plugins.FalsingManager @@ -41,7 +40,7 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var qsPanel: QSPanel @Mock private lateinit var tunerService: TunerService - @Mock private lateinit var qsTileHost: QSTileHost + @Mock private lateinit var qsHost: QSHost @Mock private lateinit var qsCustomizerController: QSCustomizerController @Mock private lateinit var qsTileRevealControllerFactory: QSTileRevealController.Factory @Mock private lateinit var dumpManager: DumpManager @@ -57,7 +56,6 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var tile: QSTile @Mock private lateinit var otherTile: QSTile @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager - @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var configuration: Configuration @Mock private lateinit var pagedTileLayout: PagedTileLayout @@ -81,7 +79,7 @@ class QSPanelControllerTest : SysuiTestCase() { controller = QSPanelController( qsPanel, tunerService, - qsTileHost, + qsHost, qsCustomizerController, /* usingMediaPlayer= */ true, mediaHost, @@ -93,8 +91,7 @@ class QSPanelControllerTest : SysuiTestCase() { brightnessControllerFactory, brightnessSliderFactory, falsingManager, - statusBarKeyguardViewManager, - featureFlags + statusBarKeyguardViewManager ) } @@ -112,7 +109,7 @@ class QSPanelControllerTest : SysuiTestCase() { @Test fun testSetListeningDoesntRefreshListeningTiles() { - whenever(qsTileHost.getTiles()).thenReturn(listOf(tile, otherTile)) + whenever(qsHost.getTiles()).thenReturn(listOf(tile, otherTile)) controller.setTiles() whenever(tile.isListening()).thenReturn(false) whenever(otherTile.isListening()).thenReturn(true) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt index a8cfb256bc7c..93cebe2bcd16 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt @@ -165,26 +165,11 @@ class QSPanelTest : SysuiTestCase() { } @Test - fun testTopPadding_notCombinedHeaders() { - qsPanel.setUsingCombinedHeaders(false) + fun testTopPadding() { val padding = 10 val paddingCombined = 100 context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, padding) - context.orCreateTestableResources.addOverride( - R.dimen.qs_panel_padding_top_combined_headers, paddingCombined) - - qsPanel.updatePadding() - assertThat(qsPanel.paddingTop).isEqualTo(padding) - } - - @Test - fun testTopPadding_combinedHeaders() { - qsPanel.setUsingCombinedHeaders(true) - val padding = 10 - val paddingCombined = 100 - context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, padding) - context.orCreateTestableResources.addOverride( - R.dimen.qs_panel_padding_top_combined_headers, paddingCombined) + context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, paddingCombined) qsPanel.updatePadding() assertThat(qsPanel.paddingTop).isEqualTo(paddingCombined) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index fb1a720b82f6..34d2b14d46a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -69,7 +69,6 @@ import com.android.systemui.settings.UserFileManager; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.CentralSurfaces; -import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.FakeSharedPreferences; import com.android.systemui.util.concurrency.FakeExecutor; @@ -100,11 +99,9 @@ public class QSTileHostTest extends SysuiTestCase { private static ComponentName CUSTOM_TILE = ComponentName.unflattenFromString("TEST_PKG/.TEST_CLS"); private static final String CUSTOM_TILE_SPEC = CustomTile.toSpec(CUSTOM_TILE); - private static final String SETTING = QSTileHost.TILES_SETTING; + private static final String SETTING = QSHost.TILES_SETTING; @Mock - private StatusBarIconController mIconController; - @Mock private QSFactory mDefaultFactory; @Mock private PluginManager mPluginManager; @@ -167,7 +164,7 @@ public class QSTileHostTest extends SysuiTestCase { mSecureSettings = new FakeSettings(); saveSetting(""); - mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mMainExecutor, + mQSTileHost = new TestQSTileHost(mContext, mDefaultFactory, mMainExecutor, mPluginManager, mTunerService, mAutoTiles, mDumpManager, mCentralSurfaces, mQSLogger, mUiEventLogger, mUserTracker, mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder, mTileLifecycleManagerFactory, @@ -248,44 +245,44 @@ public class QSTileHostTest extends SysuiTestCase { public void testRemoveWifiAndCellularWithoutInternet() { saveSetting("wifi, spec1, cell, spec2"); - assertEquals("internet", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(1)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(2)); + assertEquals("internet", mQSTileHost.getSpecs().get(0)); + assertEquals("spec1", mQSTileHost.getSpecs().get(1)); + assertEquals("spec2", mQSTileHost.getSpecs().get(2)); } @Test public void testRemoveWifiAndCellularWithInternet() { saveSetting("wifi, spec1, cell, spec2, internet"); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(1)); - assertEquals("internet", mQSTileHost.mTileSpecs.get(2)); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec2", mQSTileHost.getSpecs().get(1)); + assertEquals("internet", mQSTileHost.getSpecs().get(2)); } @Test public void testRemoveWifiWithoutInternet() { saveSetting("spec1, wifi, spec2"); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("internet", mQSTileHost.mTileSpecs.get(1)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(2)); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("internet", mQSTileHost.getSpecs().get(1)); + assertEquals("spec2", mQSTileHost.getSpecs().get(2)); } @Test public void testRemoveCellWithInternet() { saveSetting("spec1, spec2, cell, internet"); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(1)); - assertEquals("internet", mQSTileHost.mTileSpecs.get(2)); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec2", mQSTileHost.getSpecs().get(1)); + assertEquals("internet", mQSTileHost.getSpecs().get(2)); } @Test public void testNoWifiNoCellularNoInternet() { saveSetting("spec1,spec2"); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(1)); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec2", mQSTileHost.getSpecs().get(1)); } @Test @@ -332,9 +329,9 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile("spec1"); - assertEquals(2, mQSTileHost.mTileSpecs.size()); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(1)); + assertEquals(2, mQSTileHost.getSpecs().size()); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec2", mQSTileHost.getSpecs().get(1)); } @Test @@ -346,10 +343,10 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile("spec2", 1); mMainExecutor.runAllReady(); - assertEquals(3, mQSTileHost.mTileSpecs.size()); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(1)); - assertEquals("spec3", mQSTileHost.mTileSpecs.get(2)); + assertEquals(3, mQSTileHost.getSpecs().size()); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec2", mQSTileHost.getSpecs().get(1)); + assertEquals("spec3", mQSTileHost.getSpecs().get(2)); } @Test @@ -361,10 +358,10 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile("spec2", 100); mMainExecutor.runAllReady(); - assertEquals(3, mQSTileHost.mTileSpecs.size()); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec3", mQSTileHost.mTileSpecs.get(1)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(2)); + assertEquals(3, mQSTileHost.getSpecs().size()); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec3", mQSTileHost.getSpecs().get(1)); + assertEquals("spec2", mQSTileHost.getSpecs().get(2)); } @Test @@ -376,10 +373,10 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile("spec2", QSTileHost.POSITION_AT_END); mMainExecutor.runAllReady(); - assertEquals(3, mQSTileHost.mTileSpecs.size()); - assertEquals("spec1", mQSTileHost.mTileSpecs.get(0)); - assertEquals("spec3", mQSTileHost.mTileSpecs.get(1)); - assertEquals("spec2", mQSTileHost.mTileSpecs.get(2)); + assertEquals(3, mQSTileHost.getSpecs().size()); + assertEquals("spec1", mQSTileHost.getSpecs().get(0)); + assertEquals("spec3", mQSTileHost.getSpecs().get(1)); + assertEquals("spec2", mQSTileHost.getSpecs().get(2)); } @Test @@ -389,8 +386,8 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile(CUSTOM_TILE, /* end */ false); mMainExecutor.runAllReady(); - assertEquals(1, mQSTileHost.mTileSpecs.size()); - assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); + assertEquals(1, mQSTileHost.getSpecs().size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.getSpecs().get(0)); } @Test @@ -400,8 +397,8 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile(CUSTOM_TILE); mMainExecutor.runAllReady(); - assertEquals(2, mQSTileHost.mTileSpecs.size()); - assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); + assertEquals(2, mQSTileHost.getSpecs().size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.getSpecs().get(0)); } @Test @@ -411,8 +408,8 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile(CUSTOM_TILE, /* end */ false); mMainExecutor.runAllReady(); - assertEquals(2, mQSTileHost.mTileSpecs.size()); - assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); + assertEquals(2, mQSTileHost.getSpecs().size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.getSpecs().get(0)); } @Test @@ -422,8 +419,8 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.addTile(CUSTOM_TILE, /* end */ true); mMainExecutor.runAllReady(); - assertEquals(2, mQSTileHost.mTileSpecs.size()); - assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(1)); + assertEquals(2, mQSTileHost.getSpecs().size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.getSpecs().get(1)); } @Test @@ -478,7 +475,7 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.removeTiles(List.of("spec1", "spec2")); mMainExecutor.runAllReady(); - assertEquals(List.of("spec3"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec3"), mQSTileHost.getSpecs()); } @Test @@ -488,7 +485,7 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.removeTile("spec3"); mMainExecutor.runAllReady(); - assertEquals(List.of("spec2"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec2"), mQSTileHost.getSpecs()); assertEquals("spec2", getSetting()); } @@ -497,10 +494,10 @@ public class QSTileHostTest extends SysuiTestCase { saveSetting("spec1,spec2"); mQSTileHost.addTile("spec3"); - assertEquals(List.of("spec1", "spec2"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1", "spec2"), mQSTileHost.getSpecs()); mMainExecutor.runAllReady(); - assertEquals(List.of("spec1", "spec2", "spec3"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1", "spec2", "spec3"), mQSTileHost.getSpecs()); } @Test @@ -508,10 +505,10 @@ public class QSTileHostTest extends SysuiTestCase { saveSetting("spec1,spec2"); mQSTileHost.removeTile("spec1"); - assertEquals(List.of("spec1", "spec2"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1", "spec2"), mQSTileHost.getSpecs()); mMainExecutor.runAllReady(); - assertEquals(List.of("spec2"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec2"), mQSTileHost.getSpecs()); } @Test @@ -519,10 +516,10 @@ public class QSTileHostTest extends SysuiTestCase { saveSetting("spec1,spec2,spec3"); mQSTileHost.removeTiles(List.of("spec3", "spec1")); - assertEquals(List.of("spec1", "spec2", "spec3"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1", "spec2", "spec3"), mQSTileHost.getSpecs()); mMainExecutor.runAllReady(); - assertEquals(List.of("spec2"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec2"), mQSTileHost.getSpecs()); } @Test @@ -530,17 +527,17 @@ public class QSTileHostTest extends SysuiTestCase { saveSetting("spec1," + CUSTOM_TILE_SPEC); mQSTileHost.removeTileByUser(CUSTOM_TILE); - assertEquals(List.of("spec1", CUSTOM_TILE_SPEC), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1", CUSTOM_TILE_SPEC), mQSTileHost.getSpecs()); mMainExecutor.runAllReady(); - assertEquals(List.of("spec1"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1"), mQSTileHost.getSpecs()); } @Test public void testNonValidTileNotStoredInSettings() { saveSetting("spec1,not-valid"); - assertEquals(List.of("spec1"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1"), mQSTileHost.getSpecs()); assertEquals("spec1", getSetting()); } @@ -548,14 +545,14 @@ public class QSTileHostTest extends SysuiTestCase { public void testNotAvailableTileNotStoredInSettings() { saveSetting("spec1,na"); - assertEquals(List.of("spec1"), mQSTileHost.mTileSpecs); + assertEquals(List.of("spec1"), mQSTileHost.getSpecs()); assertEquals("spec1", getSetting()); } @Test public void testIsTileAdded_true() { int user = mUserTracker.getUserId(); - getSharedPreferenecesForUser(user) + getSharedPreferencesForUser(user) .edit() .putBoolean(CUSTOM_TILE.flattenToString(), true) .apply(); @@ -566,7 +563,7 @@ public class QSTileHostTest extends SysuiTestCase { @Test public void testIsTileAdded_false() { int user = mUserTracker.getUserId(); - getSharedPreferenecesForUser(user) + getSharedPreferencesForUser(user) .edit() .putBoolean(CUSTOM_TILE.flattenToString(), false) .apply(); @@ -597,7 +594,7 @@ public class QSTileHostTest extends SysuiTestCase { int user = mUserTracker.getUserId(); mQSTileHost.setTileAdded(CUSTOM_TILE, user, true); - assertTrue(getSharedPreferenecesForUser(user) + assertTrue(getSharedPreferencesForUser(user) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -606,7 +603,7 @@ public class QSTileHostTest extends SysuiTestCase { int user = mUserTracker.getUserId(); mQSTileHost.setTileAdded(CUSTOM_TILE, user, false); - assertFalse(getSharedPreferenecesForUser(user) + assertFalse(getSharedPreferencesForUser(user) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -615,7 +612,7 @@ public class QSTileHostTest extends SysuiTestCase { int user = mUserTracker.getUserId(); mQSTileHost.setTileAdded(CUSTOM_TILE, user, true); - assertFalse(getSharedPreferenecesForUser(user + 1) + assertFalse(getSharedPreferencesForUser(user + 1) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -627,8 +624,8 @@ public class QSTileHostTest extends SysuiTestCase { // This will be done by TileServiceManager mQSTileHost.setTileAdded(CUSTOM_TILE, user, true); - mQSTileHost.changeTilesByUser(mQSTileHost.mTileSpecs, List.of("spec1")); - assertFalse(getSharedPreferenecesForUser(user) + mQSTileHost.changeTilesByUser(mQSTileHost.getSpecs(), List.of("spec1")); + assertFalse(getSharedPreferencesForUser(user) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -642,7 +639,7 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.removeTileByUser(CUSTOM_TILE); mMainExecutor.runAllReady(); - assertFalse(getSharedPreferenecesForUser(user) + assertFalse(getSharedPreferencesForUser(user) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -656,7 +653,7 @@ public class QSTileHostTest extends SysuiTestCase { mQSTileHost.removeTile(CUSTOM_TILE_SPEC); mMainExecutor.runAllReady(); - assertFalse(getSharedPreferenecesForUser(user) + assertFalse(getSharedPreferencesForUser(user) .getBoolean(CUSTOM_TILE.flattenToString(), false)); } @@ -681,12 +678,12 @@ public class QSTileHostTest extends SysuiTestCase { assertEquals(CUSTOM_TILE.getClassName(), proto.tiles[1].getComponentName().className); } - private SharedPreferences getSharedPreferenecesForUser(int user) { + private SharedPreferences getSharedPreferencesForUser(int user) { return mUserFileManager.getSharedPreferences(QSTileHost.TILES, 0, user); } private class TestQSTileHost extends QSTileHost { - TestQSTileHost(Context context, StatusBarIconController iconController, + TestQSTileHost(Context context, QSFactory defaultFactory, Executor mainExecutor, PluginManager pluginManager, TunerService tunerService, Provider<AutoTileManager> autoTiles, DumpManager dumpManager, @@ -696,7 +693,7 @@ public class QSTileHostTest extends SysuiTestCase { TileServiceRequestController.Builder tileServiceRequestControllerBuilder, TileLifecycleManager.Factory tileLifecycleManagerFactory, UserFileManager userFileManager) { - super(context, iconController, defaultFactory, mainExecutor, pluginManager, + super(context, defaultFactory, mainExecutor, pluginManager, tunerService, autoTiles, dumpManager, Optional.of(centralSurfaces), qsLogger, uiEventLogger, userTracker, secureSettings, customTileStatePersister, tileServiceRequestControllerBuilder, tileLifecycleManagerFactory, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt index f53e997a331c..71ea831e0f92 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt @@ -50,7 +50,7 @@ import org.mockito.MockitoAnnotations class QuickQSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var quickQSPanel: QuickQSPanel - @Mock private lateinit var qsTileHost: QSTileHost + @Mock private lateinit var qsHost: QSHost @Mock private lateinit var qsCustomizerController: QSCustomizerController @Mock private lateinit var mediaHost: MediaHost @Mock private lateinit var metricsLogger: MetricsLogger @@ -75,12 +75,12 @@ class QuickQSPanelControllerTest : SysuiTestCase() { whenever(quickQSPanel.isAttachedToWindow).thenReturn(true) whenever(quickQSPanel.dumpableTag).thenReturn("") whenever(quickQSPanel.resources).thenReturn(mContext.resources) - whenever(qsTileHost.createTileView(any(), any(), anyBoolean())).thenReturn(tileView) + whenever(qsHost.createTileView(any(), any(), anyBoolean())).thenReturn(tileView) controller = TestQuickQSPanelController( quickQSPanel, - qsTileHost, + qsHost, qsCustomizerController, /* usingMediaPlayer = */ false, mediaHost, @@ -102,7 +102,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { fun testTileSublistWithFewerTiles_noCrash() { whenever(quickQSPanel.numQuickTiles).thenReturn(3) - whenever(qsTileHost.tiles).thenReturn(listOf(tile, tile)) + whenever(qsHost.tiles).thenReturn(listOf(tile, tile)) controller.setTiles() } @@ -111,7 +111,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { fun testTileSublistWithTooManyTiles() { val limit = 3 whenever(quickQSPanel.numQuickTiles).thenReturn(limit) - whenever(qsTileHost.tiles).thenReturn(listOf(tile, tile, tile, tile)) + whenever(qsHost.tiles).thenReturn(listOf(tile, tile, tile, tile)) controller.setTiles() @@ -147,7 +147,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { class TestQuickQSPanelController( view: QuickQSPanel, - qsTileHost: QSTileHost, + qsHost: QSHost, qsCustomizerController: QSCustomizerController, usingMediaPlayer: Boolean, mediaHost: MediaHost, @@ -159,7 +159,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { ) : QuickQSPanelController( view, - qsTileHost, + qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt index 39d89bf99af2..555484cc17f8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt @@ -18,37 +18,16 @@ package com.android.systemui.qs import android.content.Context import android.testing.AndroidTestingRunner -import android.view.View import androidx.test.filters.SmallTest -import com.android.systemui.R import com.android.systemui.SysuiTestCase -import com.android.systemui.battery.BatteryMeterViewController -import com.android.systemui.colorextraction.SysuiColorExtractor -import com.android.systemui.demomode.DemoModeController -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.qs.carrier.QSCarrierGroup -import com.android.systemui.qs.carrier.QSCarrierGroupController -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider -import com.android.systemui.statusbar.phone.StatusBarIconController -import com.android.systemui.statusbar.phone.StatusIconContainer -import com.android.systemui.statusbar.policy.Clock -import com.android.systemui.statusbar.policy.VariableDateView -import com.android.systemui.statusbar.policy.VariableDateViewController -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.argumentCaptor -import com.android.systemui.util.mockito.capture -import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Answers -import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock -import org.mockito.Mockito.anyBoolean -import org.mockito.Mockito.reset -import org.mockito.Mockito.verify import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @SmallTest @@ -58,78 +37,21 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var view: QuickStatusBarHeader @Mock - private lateinit var privacyIconsController: HeaderPrivacyIconsController - @Mock - private lateinit var statusBarIconController: StatusBarIconController - @Mock - private lateinit var demoModeController: DemoModeController - @Mock private lateinit var quickQSPanelController: QuickQSPanelController - @Mock(answer = Answers.RETURNS_SELF) - private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder - @Mock - private lateinit var qsCarrierGroupController: QSCarrierGroupController - @Mock - private lateinit var colorExtractor: SysuiColorExtractor - @Mock - private lateinit var iconContainer: StatusIconContainer - @Mock - private lateinit var qsCarrierGroup: QSCarrierGroup - @Mock - private lateinit var variableDateViewControllerFactory: VariableDateViewController.Factory - @Mock - private lateinit var variableDateViewController: VariableDateViewController - @Mock - private lateinit var batteryMeterViewController: BatteryMeterViewController - @Mock - private lateinit var clock: Clock - @Mock - private lateinit var variableDateView: VariableDateView - @Mock - private lateinit var mockView: View + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var context: Context - @Mock - private lateinit var featureFlags: FeatureFlags - @Mock - private lateinit var insetsProvider: StatusBarContentInsetsProvider - @Mock - private lateinit var iconManagerFactory: StatusBarIconController.TintedIconManager.Factory - @Mock - private lateinit var iconManager: StatusBarIconController.TintedIconManager - - private val qsExpansionPathInterpolator = QSExpansionPathInterpolator() private lateinit var controller: QuickStatusBarHeaderController @Before fun setUp() { MockitoAnnotations.initMocks(this) - stubViews() - `when`(iconContainer.context).thenReturn(context) - `when`(qsCarrierGroupControllerBuilder.build()).thenReturn(qsCarrierGroupController) - `when`(variableDateViewControllerFactory.create(any())) - .thenReturn(variableDateViewController) - `when`(iconManagerFactory.create(any(), any())).thenReturn(iconManager) `when`(view.resources).thenReturn(mContext.resources) `when`(view.isAttachedToWindow).thenReturn(true) `when`(view.context).thenReturn(context) - controller = QuickStatusBarHeaderController( - view, - privacyIconsController, - statusBarIconController, - demoModeController, - quickQSPanelController, - qsCarrierGroupControllerBuilder, - colorExtractor, - qsExpansionPathInterpolator, - featureFlags, - variableDateViewControllerFactory, - batteryMeterViewController, - insetsProvider, - iconManagerFactory, - ) + controller = QuickStatusBarHeaderController(view, quickQSPanelController) } @After @@ -138,74 +60,11 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { } @Test - fun testClockNotClickable() { - assertThat(clock.isClickable).isFalse() - } - - @Test - fun testSingleCarrierListenerAttachedOnInit() { - controller.init() - - verify(qsCarrierGroupController).setOnSingleCarrierChangedListener(any()) - } - - @Test - fun testSingleCarrierSetOnViewOnInit_false() { - `when`(qsCarrierGroupController.isSingleCarrier).thenReturn(false) - controller.init() - - verify(view).setIsSingleCarrier(false) - } - - @Test - fun testSingleCarrierSetOnViewOnInit_true() { - `when`(qsCarrierGroupController.isSingleCarrier).thenReturn(true) - controller.init() - - verify(view).setIsSingleCarrier(true) - } - - @Test - fun testRSSISlot_notCombined() { - controller.init() - - val captor = argumentCaptor<List<String>>() - verify(view).onAttach(any(), any(), capture(captor), any(), anyBoolean()) - - assertThat(captor.value).containsExactly( - mContext.getString(com.android.internal.R.string.status_bar_mobile) - ) - } - - @Test - fun testSingleCarrierCallback() { - controller.init() - reset(view) - - val captor = argumentCaptor<QSCarrierGroupController.OnSingleCarrierChangedListener>() - verify(qsCarrierGroupController).setOnSingleCarrierChangedListener(capture(captor)) - - captor.value.onSingleCarrierChanged(true) - verify(view).setIsSingleCarrier(true) - - captor.value.onSingleCarrierChanged(false) - verify(view).setIsSingleCarrier(false) - } - - @Test - fun testAlarmIconIgnored() { - controller.init() - - verify(iconContainer).addIgnoredSlot( - mContext.getString(com.android.internal.R.string.status_bar_alarm_clock)) - } + fun testListeningStatus() { + controller.setListening(true) + verify(quickQSPanelController).setListening(true) - private fun stubViews() { - `when`(view.findViewById<View>(anyInt())).thenReturn(mockView) - `when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup) - `when`(view.findViewById<StatusIconContainer>(R.id.statusIcons)).thenReturn(iconContainer) - `when`(view.findViewById<Clock>(R.id.clock)).thenReturn(clock) - `when`(view.requireViewById<VariableDateView>(R.id.date)).thenReturn(variableDateView) - `when`(view.requireViewById<VariableDateView>(R.id.date_clock)).thenReturn(variableDateView) + controller.setListening(false) + verify(quickQSPanelController).setListening(false) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java index d42cbe3b698a..c041cb6d0b1f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java @@ -25,7 +25,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.SysuiTestCase; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import org.junit.Before; import org.junit.Test; @@ -42,19 +42,19 @@ public class TileAdapterTest extends SysuiTestCase { private TileAdapter mTileAdapter; @Mock - private QSTileHost mQSTileHost; + private QSHost mQSHost; @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); TestableLooper.get(this).runWithLooper(() -> mTileAdapter = - new TileAdapter(mContext, mQSTileHost, new UiEventLoggerFake())); + new TileAdapter(mContext, mQSHost, new UiEventLoggerFake())); } @Test public void testResetNotifiesHost() { mTileAdapter.resetTileSpecs(Collections.emptyList()); - verify(mQSTileHost).changeTilesByUser(any(), any()); + verify(mQSHost).changeTilesByUser(any(), any()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 040af70f2077..78a02584c40a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -55,7 +55,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -102,7 +102,7 @@ public class TileQueryHelperTest extends SysuiTestCase { @Mock private TileQueryHelper.TileStateListener mListener; @Mock - private QSTileHost mQSTileHost; + private QSHost mQSHost; @Mock private PackageManager mPackageManager; @Mock @@ -131,7 +131,7 @@ public class TileQueryHelperTest extends SysuiTestCase { return null; } } - ).when(mQSTileHost).createTile(anyString()); + ).when(mQSHost).createTile(anyString()); FakeSystemClock clock = new FakeSystemClock(); mMainExecutor = new FakeExecutor(clock); mBgExecutor = new FakeExecutor(clock); @@ -147,7 +147,7 @@ public class TileQueryHelperTest extends SysuiTestCase { @Test public void testIsFinished_trueAfterQuerying() { - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -156,7 +156,7 @@ public class TileQueryHelperTest extends SysuiTestCase { @Test public void testQueryTiles_callsListenerTwice() { - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -170,7 +170,7 @@ public class TileQueryHelperTest extends SysuiTestCase { return null; }).when(mListener).onTilesChanged(any()); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -184,7 +184,7 @@ public class TileQueryHelperTest extends SysuiTestCase { mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, STOCK_TILES); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -204,7 +204,7 @@ public class TileQueryHelperTest extends SysuiTestCase { mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, STOCK_TILES); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -224,7 +224,7 @@ public class TileQueryHelperTest extends SysuiTestCase { mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, STOCK_TILES); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); @@ -240,9 +240,9 @@ public class TileQueryHelperTest extends SysuiTestCase { public void testCustomTileNotCreated() { Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, CUSTOM_TILE); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); - verify(mQSTileHost, never()).createTile(CUSTOM_TILE); + verify(mQSHost, never()).createTile(CUSTOM_TILE); } @Test @@ -264,7 +264,7 @@ public class TileQueryHelperTest extends SysuiTestCase { mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, ""); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mListener, atLeastOnce()).onTilesChanged(mCaptor.capture()); @@ -278,7 +278,7 @@ public class TileQueryHelperTest extends SysuiTestCase { Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, null); mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, STOCK_TILES); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); } @Test @@ -286,12 +286,12 @@ public class TileQueryHelperTest extends SysuiTestCase { Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, null); QSTile t = mock(QSTile.class); - when(mQSTileHost.createTile("hotspot")).thenReturn(t); + when(mQSHost.createTile("hotspot")).thenReturn(t); mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, "hotspot"); - mTileQueryHelper.queryTiles(mQSTileHost); + mTileQueryHelper.queryTiles(mQSHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); InOrder verifier = inOrder(t); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java index 8aa625a7ea20..46af89e00db4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java @@ -39,7 +39,7 @@ import android.test.suitebuilder.annotation.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import org.junit.After; @@ -61,7 +61,7 @@ public class TileServiceManagerTest extends SysuiTestCase { @Mock private UserTracker mUserTracker; @Mock - private QSTileHost mQSTileHost; + private QSHost mQSHost; @Mock private Context mMockContext; @@ -80,7 +80,7 @@ public class TileServiceManagerTest extends SysuiTestCase { when(mUserTracker.getUserHandle()).thenReturn(UserHandle.SYSTEM); when(mTileServices.getContext()).thenReturn(mMockContext); - when(mTileServices.getHost()).thenReturn(mQSTileHost); + when(mTileServices.getHost()).thenReturn(mQSHost); when(mTileLifecycle.getUserId()).thenAnswer(invocation -> mUserTracker.getUserId()); when(mTileLifecycle.isActiveTile()).thenReturn(false); @@ -98,28 +98,28 @@ public class TileServiceManagerTest extends SysuiTestCase { @Test public void testSetTileAddedIfNotAdded() { - when(mQSTileHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false); + when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false); mTileServiceManager.startLifecycleManagerAndAddTile(); - verify(mQSTileHost).setTileAdded(mComponentName, mUserTracker.getUserId(), true); + verify(mQSHost).setTileAdded(mComponentName, mUserTracker.getUserId(), true); } @Test public void testNotSetTileAddedIfAdded() { - when(mQSTileHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(true); + when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(true); mTileServiceManager.startLifecycleManagerAndAddTile(); - verify(mQSTileHost, never()).setTileAdded(eq(mComponentName), anyInt(), eq(true)); + verify(mQSHost, never()).setTileAdded(eq(mComponentName), anyInt(), eq(true)); } @Test public void testSetTileAddedCorrectUser() { int user = 10; when(mUserTracker.getUserId()).thenReturn(user); - when(mQSTileHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false); + when(mQSHost.isTileAdded(eq(mComponentName), anyInt())).thenReturn(false); mTileServiceManager.startLifecycleManagerAndAddTile(); - verify(mQSTileHost).setTileAdded(mComponentName, user, true); + verify(mQSHost).setTileAdded(mComponentName, user, true); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt index bdfbca47e569..ccfb5cf8959a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt @@ -27,27 +27,27 @@ import com.android.internal.logging.InstanceId import com.android.internal.statusbar.IAddTileResultCallback import com.android.systemui.InstanceIdSequenceFake import com.android.systemui.SysuiTestCase -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.google.common.truth.Truth.assertThat +import java.util.function.Consumer import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Mock -import org.mockito.Mockito.`when` import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyString import org.mockito.Mockito.atLeastOnce import org.mockito.Mockito.never import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations -import java.util.function.Consumer @SmallTest @RunWith(AndroidTestingRunner::class) @@ -62,7 +62,7 @@ class TileServiceRequestControllerTest : SysuiTestCase() { @Mock private lateinit var tileRequestDialog: TileRequestDialog @Mock - private lateinit var qsTileHost: QSTileHost + private lateinit var qsHost: QSHost @Mock private lateinit var commandRegistry: CommandRegistry @Mock @@ -82,10 +82,10 @@ class TileServiceRequestControllerTest : SysuiTestCase() { `when`(logger.newInstanceId()).thenReturn(instanceIdSequence.newInstanceId()) // Tile not present by default - `when`(qsTileHost.indexOf(anyString())).thenReturn(-1) + `when`(qsHost.indexOf(anyString())).thenReturn(-1) controller = TileServiceRequestController( - qsTileHost, + qsHost, commandQueue, commandRegistry, logger @@ -107,18 +107,18 @@ class TileServiceRequestControllerTest : SysuiTestCase() { @Test fun tileAlreadyAdded_correctResult() { - `when`(qsTileHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) + `when`(qsHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) val callback = Callback() controller.requestTileAdd(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon, callback) assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.TILE_ALREADY_ADDED) - verify(qsTileHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) + verify(qsHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) } @Test fun tileAlreadyAdded_logged() { - `when`(qsTileHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) + `when`(qsHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) controller.requestTileAdd(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon) {} @@ -157,7 +157,7 @@ class TileServiceRequestControllerTest : SysuiTestCase() { cancelListenerCaptor.value.onCancel(tileRequestDialog) assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.DISMISSED) - verify(qsTileHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) + verify(qsHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) } @Test @@ -191,7 +191,7 @@ class TileServiceRequestControllerTest : SysuiTestCase() { clickListenerCaptor.value.onClick(tileRequestDialog, DialogInterface.BUTTON_POSITIVE) assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.ADD_TILE) - verify(qsTileHost).addTile(TEST_COMPONENT, /* end */ true) + verify(qsHost).addTile(TEST_COMPONENT, /* end */ true) } @Test @@ -225,7 +225,7 @@ class TileServiceRequestControllerTest : SysuiTestCase() { clickListenerCaptor.value.onClick(tileRequestDialog, DialogInterface.BUTTON_NEGATIVE) assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.DONT_ADD_TILE) - verify(qsTileHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) + verify(qsHost, never()).addTile(any(ComponentName::class.java), anyBoolean()) } @Test @@ -266,7 +266,7 @@ class TileServiceRequestControllerTest : SysuiTestCase() { @Test fun commandQueueCallback_callbackCalled() { - `when`(qsTileHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) + `when`(qsHost.indexOf(CustomTile.toSpec(TEST_COMPONENT))).thenReturn(2) val captor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java) verify(commandQueue, atLeastOnce()).addCallback(capture(captor)) val c = Callback() @@ -365,4 +365,4 @@ class TileServiceRequestControllerTest : SysuiTestCase() { accept(r) } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index 172c87f0c50b..64e9a3e58bd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -30,7 +30,6 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Intent; import android.os.Handler; -import android.os.HandlerExecutor; import android.os.RemoteException; import android.os.UserHandle; import android.service.quicksettings.IQSTileService; @@ -39,24 +38,13 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; -import com.android.internal.logging.UiEventLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.dump.DumpManager; -import com.android.systemui.plugins.PluginManager; -import com.android.systemui.qs.QSTileHost; -import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.qs.tileimpl.QSFactoryImpl; -import com.android.systemui.settings.UserFileManager; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.phone.AutoTileManager; -import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.StatusBarIconController; -import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.tuner.TunerService; -import com.android.systemui.util.settings.SecureSettings; import org.junit.After; import org.junit.Assert; @@ -68,8 +56,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; -import java.util.Optional; -import java.util.concurrent.Executor; import javax.inject.Provider; @@ -92,26 +78,8 @@ public class TileServicesTest extends SysuiTestCase { @Mock private StatusBarIconController mStatusBarIconController; @Mock - private QSFactoryImpl mQSFactory; - @Mock - private PluginManager mPluginManager; - @Mock - private TunerService mTunerService; - @Mock - private AutoTileManager mAutoTileManager; - @Mock - private DumpManager mDumpManager; - @Mock - private CentralSurfaces mCentralSurfaces; - @Mock - private QSLogger mQSLogger; - @Mock - private UiEventLogger mUiEventLogger; - @Mock private UserTracker mUserTracker; @Mock - private SecureSettings mSecureSettings; - @Mock private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder; @Mock private TileServiceRequestController mTileServiceRequestController; @@ -122,12 +90,11 @@ public class TileServicesTest extends SysuiTestCase { @Mock private TileLifecycleManager mTileLifecycleManager; @Mock - private UserFileManager mUserFileManager; + private QSHost mQSHost; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mDependency.injectMockDependency(BluetoothController.class); mManagers = new ArrayList<>(); mTestableLooper = TestableLooper.get(this); @@ -135,34 +102,16 @@ public class TileServicesTest extends SysuiTestCase { .thenReturn(mTileServiceRequestController); when(mTileLifecycleManagerFactory.create(any(Intent.class), any(UserHandle.class))) .thenReturn(mTileLifecycleManager); + when(mQSHost.getContext()).thenReturn(mContext); Provider<Handler> provider = () -> new Handler(mTestableLooper.getLooper()); - Executor executor = new HandlerExecutor(provider.get()); - - QSTileHost host = new QSTileHost(mContext, - mStatusBarIconController, - mQSFactory, - executor, - mPluginManager, - mTunerService, - () -> mAutoTileManager, - mDumpManager, - Optional.of(mCentralSurfaces), - mQSLogger, - mUiEventLogger, - mUserTracker, - mSecureSettings, - mock(CustomTileStatePersister.class), - mTileServiceRequestControllerBuilder, - mTileLifecycleManagerFactory, - mUserFileManager); - mTileService = new TestTileServices(host, provider, mBroadcastDispatcher, - mUserTracker, mKeyguardStateController, mCommandQueue); + + mTileService = new TestTileServices(mQSHost, provider, mBroadcastDispatcher, + mUserTracker, mKeyguardStateController, mCommandQueue, mStatusBarIconController); } @After public void tearDown() throws Exception { - mTileService.getHost().destroy(); mTileService.destroy(); TestableLooper.get(this).processAllMessages(); } @@ -274,11 +223,12 @@ public class TileServicesTest extends SysuiTestCase { } private class TestTileServices extends TileServices { - TestTileServices(QSTileHost host, Provider<Handler> handlerProvider, + TestTileServices(QSHost host, Provider<Handler> handlerProvider, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker, - KeyguardStateController keyguardStateController, CommandQueue commandQueue) { + KeyguardStateController keyguardStateController, CommandQueue commandQueue, + StatusBarIconController statusBarIconController) { super(host, handlerProvider, broadcastDispatcher, userTracker, keyguardStateController, - commandQueue); + commandQueue, statusBarIconController); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index ba49f3fa66ee..36549fb826ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -69,7 +69,6 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSEvent; import com.android.systemui.qs.QSHost; -import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.statusbar.StatusBarState; @@ -97,7 +96,7 @@ public class QSTileImplTest extends SysuiTestCase { private TestableLooper mTestableLooper; private TileImpl mTile; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; private final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt index d65901777a73..bf172f12a07f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt @@ -17,7 +17,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.BluetoothController @@ -40,7 +40,7 @@ class BluetoothTileTest : SysuiTestCase() { @Mock private lateinit var qsLogger: QSLogger @Mock - private lateinit var qsHost: QSTileHost + private lateinit var qsHost: QSHost @Mock private lateinit var metricsLogger: MetricsLogger private val falsingManager = FalsingManagerFake() @@ -135,7 +135,7 @@ class BluetoothTileTest : SysuiTestCase() { } private class FakeBluetoothTile( - qsTileHost: QSTileHost, + qsHost: QSHost, backgroundLooper: Looper, mainHandler: Handler, falsingManager: FalsingManager, @@ -145,7 +145,7 @@ class BluetoothTileTest : SysuiTestCase() { qsLogger: QSLogger, bluetoothController: BluetoothController ) : BluetoothTile( - qsTileHost, + qsHost, backgroundLooper, mainHandler, falsingManager, @@ -187,4 +187,4 @@ class BluetoothTileTest : SysuiTestCase() { `when`(bluetoothController.isBluetoothConnected).thenReturn(false) `when`(bluetoothController.isBluetoothConnecting).thenReturn(true) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java index b40a20c27820..18f891c5ea58 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java @@ -42,7 +42,7 @@ import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.NetworkController; @@ -78,7 +78,7 @@ public class CastTileTest extends SysuiTestCase { @Mock private NetworkController mNetworkController; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock SignalCallback mSignalCallback; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java index debe41c756bd..fdb63cacef2a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorCorrectionTileTest.java @@ -37,7 +37,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.UserTracker; import com.android.systemui.util.settings.FakeSettings; @@ -56,7 +56,7 @@ import org.mockito.MockitoAnnotations; public class ColorCorrectionTileTest extends SysuiTestCase { @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java index 3fd25019e2a5..60c1a33d70e3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ColorInversionTileTest.java @@ -39,7 +39,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.settings.UserTracker; @@ -61,7 +61,7 @@ public class ColorInversionTileTest extends SysuiTestCase { private static final Integer COLOR_INVERSION_ENABLED = 1; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java index a13bece4b489..2782c674a68c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java @@ -47,7 +47,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.settings.UserTracker; @@ -69,7 +69,7 @@ public class DreamTileTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt index d0f851bded75..c7aba1a9f59f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FlashlightTileTest.kt @@ -13,7 +13,7 @@ import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.FlashlightController @@ -34,7 +34,7 @@ class FlashlightTileTest : SysuiTestCase() { @Mock private lateinit var qsLogger: QSLogger - @Mock private lateinit var qsHost: QSTileHost + @Mock private lateinit var qsHost: QSHost @Mock private lateinit var metricsLogger: MetricsLogger diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HotspotTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HotspotTileTest.java index 451e9119f297..4a2ac96e1df0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HotspotTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HotspotTileTest.java @@ -37,7 +37,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.DataSaverController; @@ -60,7 +60,7 @@ public class HotspotTileTest extends SysuiTestCase { @Rule public MockitoRule mRule = MockitoJUnit.rule(); @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private HotspotController mHotspotController; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/InternetTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/InternetTileTest.java index addca9d28d1a..abd9094f2c35 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/InternetTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/InternetTileTest.java @@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - import android.os.Handler; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; @@ -35,7 +34,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; @@ -56,7 +55,7 @@ import org.mockito.MockitoAnnotations; public class InternetTileTest extends SysuiTestCase { @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private NetworkController mNetworkController; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/LocationTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/LocationTileTest.kt index d2bbc8cfac39..08d10fda0538 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/LocationTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/LocationTileTest.kt @@ -29,7 +29,7 @@ import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.KeyguardStateController @@ -52,7 +52,7 @@ class LocationTileTest : SysuiTestCase() { @Mock private lateinit var qsLogger: QSLogger @Mock - private lateinit var qsHost: QSTileHost + private lateinit var qsHost: QSHost @Mock private lateinit var metricsLogger: MetricsLogger private val falsingManager = FalsingManagerFake() diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/NfcTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/NfcTileTest.java index cfd37358dcff..9638a45396a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/NfcTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/NfcTileTest.java @@ -36,7 +36,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import org.junit.Before; @@ -60,7 +60,7 @@ public class NfcTileTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/OneHandedModeTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/OneHandedModeTileTest.java index 803187545a18..3344a17064e4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/OneHandedModeTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/OneHandedModeTileTest.java @@ -32,7 +32,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.UserTracker; import com.android.systemui.util.settings.SecureSettings; @@ -53,7 +53,7 @@ public class OneHandedModeTileTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QRCodeScannerTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QRCodeScannerTileTest.java index a1be2f3ac8de..24287eae8a03 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QRCodeScannerTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QRCodeScannerTileTest.java @@ -39,7 +39,7 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qrcodescanner.controller.QRCodeScannerController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; @@ -54,7 +54,7 @@ import org.mockito.MockitoAnnotations; @SmallTest public class QRCodeScannerTileTest extends SysuiTestCase { @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java index 4f6475f0148b..4722c8d4208f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java @@ -66,7 +66,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -99,7 +99,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity")); @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java index 04b372c4a361..99e5564051e1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java @@ -38,7 +38,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; @@ -57,7 +57,7 @@ import org.mockito.MockitoAnnotations; @Ignore("b/269171747") public class ReduceBrightColorsTileTest extends SysuiTestCase { @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RotationLockTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RotationLockTileTest.java index e9dfd3ed182b..c7eb2f1c39c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RotationLockTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/RotationLockTileTest.java @@ -38,7 +38,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.BatteryController; @@ -71,7 +71,7 @@ public class RotationLockTileTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private MetricsLogger mMetricsLogger; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java index 30debdf4b744..21acc08ba143 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java @@ -43,7 +43,7 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.screenrecord.RecordingController; @@ -65,7 +65,7 @@ public class ScreenRecordTileTest extends SysuiTestCase { @Mock private RecordingController mController; @Mock - private QSTileHost mHost; + private QSHost mHost; @Mock private KeyguardDismissUtil mKeyguardDismissUtil; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt index 0c070da1fcb9..3d9f6506e7e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UiModeNightTileTest.kt @@ -32,7 +32,7 @@ import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.BatteryController @@ -55,7 +55,7 @@ class UiModeNightTileTest : SysuiTestCase() { @Mock private lateinit var uiModeManager: UiModeManager @Mock private lateinit var resources: Resources @Mock private lateinit var qsLogger: QSLogger - @Mock private lateinit var qsHost: QSTileHost + @Mock private lateinit var qsHost: QSHost @Mock private lateinit var metricsLogger: MetricsLogger @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var activityStarter: ActivityStarter diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt deleted file mode 100644 index e684007cb7c1..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt +++ /dev/null @@ -1,319 +0,0 @@ -package com.android.systemui.shade - -import android.animation.Animator -import android.app.StatusBarManager -import android.content.Context -import android.testing.AndroidTestingRunner -import android.view.View -import android.view.ViewPropertyAnimator -import android.widget.TextView -import androidx.test.filters.SmallTest -import com.android.systemui.R -import com.android.systemui.SysuiTestCase -import com.android.systemui.animation.Interpolators -import com.android.systemui.animation.ShadeInterpolation -import com.android.systemui.battery.BatteryMeterView -import com.android.systemui.battery.BatteryMeterViewController -import com.android.systemui.demomode.DemoMode -import com.android.systemui.demomode.DemoModeController -import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags -import com.android.systemui.qs.HeaderPrivacyIconsController -import com.android.systemui.qs.carrier.QSCarrierGroup -import com.android.systemui.qs.carrier.QSCarrierGroupController -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider -import com.android.systemui.statusbar.phone.StatusBarIconController -import com.android.systemui.statusbar.phone.StatusIconContainer -import com.android.systemui.statusbar.policy.Clock -import com.android.systemui.statusbar.policy.FakeConfigurationController -import com.android.systemui.statusbar.policy.VariableDateViewController -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.argumentCaptor -import com.android.systemui.util.mockito.capture -import com.android.systemui.util.mockito.mock -import com.google.common.truth.Truth.assertThat -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Answers -import org.mockito.ArgumentMatchers.anyFloat -import org.mockito.ArgumentMatchers.anyInt -import org.mockito.Mock -import org.mockito.Mockito.mock -import org.mockito.Mockito.reset -import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.junit.MockitoJUnit -import org.mockito.Mockito.`when` as whenever - -@SmallTest -@RunWith(AndroidTestingRunner::class) -class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { - - @Mock private lateinit var view: View - @Mock private lateinit var statusIcons: StatusIconContainer - @Mock private lateinit var statusBarIconController: StatusBarIconController - @Mock private lateinit var iconManagerFactory: StatusBarIconController.TintedIconManager.Factory - @Mock private lateinit var iconManager: StatusBarIconController.TintedIconManager - @Mock private lateinit var qsCarrierGroupController: QSCarrierGroupController - @Mock private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder - @Mock private lateinit var featureFlags: FeatureFlags - @Mock private lateinit var clock: Clock - @Mock private lateinit var date: TextView - @Mock private lateinit var carrierGroup: QSCarrierGroup - @Mock private lateinit var batteryMeterView: BatteryMeterView - @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController - @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController - @Mock private lateinit var insetsProvider: StatusBarContentInsetsProvider - @Mock private lateinit var variableDateViewControllerFactory: VariableDateViewController.Factory - @Mock private lateinit var variableDateViewController: VariableDateViewController - @Mock private lateinit var dumpManager: DumpManager - @Mock private lateinit var combinedShadeHeadersConstraintManager: - CombinedShadeHeadersConstraintManager - - @Mock private lateinit var mockedContext: Context - @Mock private lateinit var demoModeController: DemoModeController - @Mock private lateinit var qsBatteryModeController: QsBatteryModeController - - @JvmField @Rule val mockitoRule = MockitoJUnit.rule() - var viewVisibility = View.GONE - var viewAlpha = 1f - - private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController - private lateinit var carrierIconSlots: List<String> - private val configurationController = FakeConfigurationController() - - @Before - fun setup() { - whenever<Clock>(view.findViewById(R.id.clock)).thenReturn(clock) - whenever(clock.context).thenReturn(mockedContext) - whenever<TextView>(view.findViewById(R.id.date)).thenReturn(date) - whenever(date.context).thenReturn(mockedContext) - whenever<QSCarrierGroup>(view.findViewById(R.id.carrier_group)).thenReturn(carrierGroup) - whenever<BatteryMeterView>(view.findViewById(R.id.batteryRemainingIcon)) - .thenReturn(batteryMeterView) - whenever<StatusIconContainer>(view.findViewById(R.id.statusIcons)).thenReturn(statusIcons) - whenever(view.context).thenReturn(context) - whenever(view.resources).thenReturn(context.resources) - whenever(statusIcons.context).thenReturn(context) - whenever(qsCarrierGroupControllerBuilder.setQSCarrierGroup(any())) - .thenReturn(qsCarrierGroupControllerBuilder) - whenever(qsCarrierGroupControllerBuilder.build()).thenReturn(qsCarrierGroupController) - whenever(view.setVisibility(anyInt())).then { - viewVisibility = it.arguments[0] as Int - null - } - whenever(view.visibility).thenAnswer { _ -> viewVisibility } - - whenever(view.setAlpha(anyFloat())).then { - viewAlpha = it.arguments[0] as Float - null - } - whenever(view.alpha).thenAnswer { _ -> viewAlpha } - - whenever(variableDateViewControllerFactory.create(any())) - .thenReturn(variableDateViewController) - whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager) - whenever(featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)).thenReturn(false) - mLargeScreenShadeHeaderController = LargeScreenShadeHeaderController( - view, - statusBarIconController, - iconManagerFactory, - privacyIconsController, - insetsProvider, - configurationController, - variableDateViewControllerFactory, - batteryMeterViewController, - dumpManager, - featureFlags, - qsCarrierGroupControllerBuilder, - combinedShadeHeadersConstraintManager, - demoModeController, - qsBatteryModeController, - ) - whenever(view.isAttachedToWindow).thenReturn(true) - mLargeScreenShadeHeaderController.init() - carrierIconSlots = listOf( - context.getString(com.android.internal.R.string.status_bar_mobile)) - } - - @After - fun verifyEveryTest() { - verifyZeroInteractions(combinedShadeHeadersConstraintManager) - } - - @Test - fun setVisible_onlyWhenActive() { - makeShadeVisible() - assertThat(viewVisibility).isEqualTo(View.VISIBLE) - - mLargeScreenShadeHeaderController.largeScreenActive = false - assertThat(viewVisibility).isEqualTo(View.GONE) - } - - @Test - fun updateListeners_registersWhenVisible() { - makeShadeVisible() - verify(qsCarrierGroupController).setListening(true) - } - - @Test - fun statusIconsAddedWhenAttached() { - verify(statusBarIconController).addIconGroup(any()) - } - - @Test - fun statusIconsRemovedWhenDettached() { - mLargeScreenShadeHeaderController.simulateViewDetached() - verify(statusBarIconController).removeIconGroup(any()) - } - - @Test - fun shadeExpandedFraction_updatesAlpha() { - makeShadeVisible() - mLargeScreenShadeHeaderController.shadeExpandedFraction = 0.5f - verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f)) - } - - @Test - fun singleCarrier_enablesCarrierIconsInStatusIcons() { - whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(true) - - makeShadeVisible() - - verify(statusIcons).removeIgnoredSlots(carrierIconSlots) - } - - @Test - fun dualCarrier_disablesCarrierIconsInStatusIcons() { - whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(false) - - makeShadeVisible() - - verify(statusIcons).addIgnoredSlots(carrierIconSlots) - } - - @Test - fun disableQS_notDisabled_visible() { - makeShadeVisible() - mLargeScreenShadeHeaderController.disable(0, 0, false) - - assertThat(viewVisibility).isEqualTo(View.VISIBLE) - } - - @Test - fun disableQS_disabled_gone() { - makeShadeVisible() - mLargeScreenShadeHeaderController.disable(0, StatusBarManager.DISABLE2_QUICK_SETTINGS, - false) - - assertThat(viewVisibility).isEqualTo(View.GONE) - } - - private fun makeShadeVisible() { - mLargeScreenShadeHeaderController.largeScreenActive = true - mLargeScreenShadeHeaderController.qsVisible = true - } - - @Test - fun updateConfig_changesFontStyle() { - configurationController.notifyDensityOrFontScaleChanged() - - verify(clock).setTextAppearance(R.style.TextAppearance_QS_Status) - verify(date).setTextAppearance(R.style.TextAppearance_QS_Status) - verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers) - } - - @Test - fun alarmIconIgnored() { - verify(statusIcons).addIgnoredSlot( - context.getString(com.android.internal.R.string.status_bar_alarm_clock) - ) - } - - @Test - fun animateOutOnStartCustomizing() { - val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - val duration = 1000L - whenever(view.animate()).thenReturn(animator) - - mLargeScreenShadeHeaderController.startCustomizingAnimation(show = true, duration) - - verify(animator).setDuration(duration) - verify(animator).alpha(0f) - verify(animator).setInterpolator(Interpolators.ALPHA_OUT) - verify(animator).start() - } - - @Test - fun animateInOnEndCustomizing() { - val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - val duration = 1000L - whenever(view.animate()).thenReturn(animator) - - mLargeScreenShadeHeaderController.startCustomizingAnimation(show = false, duration) - - verify(animator).setDuration(duration) - verify(animator).alpha(1f) - verify(animator).setInterpolator(Interpolators.ALPHA_IN) - verify(animator).start() - } - - @Test - fun customizerAnimatorChangesViewVisibility() { - makeShadeVisible() - - val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - val duration = 1000L - whenever(view.animate()).thenReturn(animator) - val listenerCaptor = argumentCaptor<Animator.AnimatorListener>() - - mLargeScreenShadeHeaderController.startCustomizingAnimation(show = true, duration) - verify(animator).setListener(capture(listenerCaptor)) - // Start and end the animation - listenerCaptor.value.onAnimationStart(mock()) - listenerCaptor.value.onAnimationEnd(mock()) - assertThat(viewVisibility).isEqualTo(View.INVISIBLE) - - reset(animator) - mLargeScreenShadeHeaderController.startCustomizingAnimation(show = false, duration) - verify(animator).setListener(capture(listenerCaptor)) - // Start and end the animation - listenerCaptor.value.onAnimationStart(mock()) - listenerCaptor.value.onAnimationEnd(mock()) - assertThat(viewVisibility).isEqualTo(View.VISIBLE) - } - - @Test - fun animatorListenerClearedAtEnd() { - val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - whenever(view.animate()).thenReturn(animator) - - mLargeScreenShadeHeaderController.startCustomizingAnimation(show = true, 0L) - val listenerCaptor = argumentCaptor<Animator.AnimatorListener>() - verify(animator).setListener(capture(listenerCaptor)) - - listenerCaptor.value.onAnimationEnd(mock()) - verify(animator).setListener(null) - } - - @Test - fun demoMode_attachDemoMode() { - val cb = argumentCaptor<DemoMode>() - verify(demoModeController).addCallback(capture(cb)) - cb.value.onDemoModeStarted() - verify(clock).onDemoModeStarted() - } - - @Test - fun demoMode_detachDemoMode() { - mLargeScreenShadeHeaderController.simulateViewDetached() - val cb = argumentCaptor<DemoMode>() - verify(demoModeController).removeCallback(capture(cb)) - cb.value.onDemoModeFinished() - verify(clock).onDemoModeFinished() - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java new file mode 100644 index 000000000000..52b0b6abda1d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -0,0 +1,753 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shade; + +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; + +import static com.android.keyguard.KeyguardClockSwitch.LARGE; + +import static com.google.common.truth.Truth.assertThat; + +import static kotlinx.coroutines.flow.FlowKt.emptyFlow; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.annotation.IdRes; +import android.content.ContentResolver; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.os.UserManager; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.ViewPropertyAnimator; +import android.view.ViewStub; +import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityManager; + +import androidx.constraintlayout.widget.ConstraintSet; + +import com.android.internal.jank.InteractionJankMonitor; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.logging.testing.UiEventLoggerFake; +import com.android.internal.util.LatencyTracker; +import com.android.keyguard.KeyguardClockSwitch; +import com.android.keyguard.KeyguardClockSwitchController; +import com.android.keyguard.KeyguardStatusView; +import com.android.keyguard.KeyguardStatusViewController; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.LockIconViewController; +import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent; +import com.android.keyguard.dagger.KeyguardStatusBarViewComponent; +import com.android.keyguard.dagger.KeyguardStatusViewComponent; +import com.android.keyguard.dagger.KeyguardUserSwitcherComponent; +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.biometrics.AuthController; +import com.android.systemui.classifier.FalsingCollectorFake; +import com.android.systemui.classifier.FalsingManagerFake; +import com.android.systemui.common.ui.view.LongPressHandlingView; +import com.android.systemui.doze.DozeLog; +import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.fragments.FragmentHostManager; +import com.android.systemui.fragments.FragmentService; +import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository; +import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; +import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; +import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor; +import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; +import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; +import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel; +import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel; +import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel; +import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel; +import com.android.systemui.keyguard.ui.viewmodel.LockscreenToOccludedTransitionViewModel; +import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel; +import com.android.systemui.media.controls.pipeline.MediaDataManager; +import com.android.systemui.media.controls.ui.KeyguardMediaController; +import com.android.systemui.media.controls.ui.MediaHierarchyManager; +import com.android.systemui.model.SysUiState; +import com.android.systemui.navigationbar.NavigationBarController; +import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.plugins.FalsingManager; +import com.android.systemui.plugins.qs.QS; +import com.android.systemui.qs.QSFragment; +import com.android.systemui.screenrecord.RecordingController; +import com.android.systemui.shade.transition.ShadeTransitionController; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.KeyguardIndicationController; +import com.android.systemui.statusbar.LockscreenShadeTransitionController; +import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; +import com.android.systemui.statusbar.NotificationShadeWindowController; +import com.android.systemui.statusbar.NotificationShelfController; +import com.android.systemui.statusbar.PulseExpansionHandler; +import com.android.systemui.statusbar.QsFrameTranslateController; +import com.android.systemui.statusbar.StatusBarStateControllerImpl; +import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.VibratorHelper; +import com.android.systemui.statusbar.notification.ConversationNotificationManager; +import com.android.systemui.statusbar.notification.DynamicPrivacyController; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger; +import com.android.systemui.statusbar.notification.row.NotificationGutsManager; +import com.android.systemui.statusbar.notification.stack.AmbientState; +import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; +import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; +import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator; +import com.android.systemui.statusbar.phone.CentralSurfaces; +import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; +import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; +import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; +import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; +import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; +import com.android.systemui.statusbar.phone.KeyguardStatusBarView; +import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController; +import com.android.systemui.statusbar.phone.LockscreenGestureLogger; +import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.phone.ScrimController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; +import com.android.systemui.statusbar.phone.TapAgainViewController; +import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; +import com.android.systemui.statusbar.policy.KeyguardStateController; +import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController; +import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView; +import com.android.systemui.statusbar.window.StatusBarWindowStateController; +import com.android.systemui.unfold.SysUIUnfoldComponent; +import com.android.systemui.util.time.FakeSystemClock; +import com.android.systemui.util.time.SystemClock; +import com.android.wm.shell.animation.FlingAnimationUtils; + +import org.junit.After; +import org.junit.Before; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import java.util.List; +import java.util.Optional; + +import dagger.Lazy; +import kotlinx.coroutines.CoroutineDispatcher; + +public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { + + protected static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; + protected static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50; + protected static final int PANEL_WIDTH = 500; // Random value just for the test. + + @Mock protected CentralSurfaces mCentralSurfaces; + @Mock protected NotificationStackScrollLayout mNotificationStackScrollLayout; + @Mock protected KeyguardBottomAreaView mKeyguardBottomArea; + @Mock protected KeyguardBottomAreaViewController mKeyguardBottomAreaViewController; + @Mock protected KeyguardBottomAreaView mQsFrame; + @Mock protected HeadsUpManagerPhone mHeadsUpManager; + @Mock protected NotificationShelfController mNotificationShelfController; + @Mock protected NotificationGutsManager mGutsManager; + @Mock protected KeyguardStatusBarView mKeyguardStatusBar; + @Mock protected KeyguardUserSwitcherView mUserSwitcherView; + @Mock protected ViewStub mUserSwitcherStubView; + @Mock protected HeadsUpTouchHelper.Callback mHeadsUpCallback; + @Mock protected KeyguardUpdateMonitor mUpdateMonitor; + @Mock protected KeyguardBypassController mKeyguardBypassController; + @Mock protected DozeParameters mDozeParameters; + @Mock protected ScreenOffAnimationController mScreenOffAnimationController; + @Mock protected NotificationPanelView mView; + @Mock protected LayoutInflater mLayoutInflater; + @Mock protected FeatureFlags mFeatureFlags; + @Mock protected DynamicPrivacyController mDynamicPrivacyController; + @Mock protected StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; + @Mock protected KeyguardStateController mKeyguardStateController; + @Mock protected DozeLog mDozeLog; + @Mock protected ShadeLogger mShadeLog; + @Mock protected ShadeHeightLogger mShadeHeightLogger; + @Mock protected CommandQueue mCommandQueue; + @Mock protected VibratorHelper mVibratorHelper; + @Mock protected LatencyTracker mLatencyTracker; + @Mock protected PowerManager mPowerManager; + @Mock protected AccessibilityManager mAccessibilityManager; + @Mock protected MetricsLogger mMetricsLogger; + @Mock protected Resources mResources; + @Mock protected Configuration mConfiguration; + @Mock protected KeyguardClockSwitch mKeyguardClockSwitch; + @Mock protected MediaHierarchyManager mMediaHierarchyManager; + @Mock protected ConversationNotificationManager mConversationNotificationManager; + @Mock protected StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + @Mock protected KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; + @Mock protected KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory; + @Mock protected KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent; + @Mock protected KeyguardQsUserSwitchController mKeyguardQsUserSwitchController; + @Mock protected KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory; + @Mock protected KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent; + @Mock protected KeyguardUserSwitcherController mKeyguardUserSwitcherController; + @Mock protected KeyguardStatusViewComponent mKeyguardStatusViewComponent; + @Mock protected KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory; + @Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent; + @Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController; + @Mock protected KeyguardStatusViewController mKeyguardStatusViewController; + @Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController; + @Mock protected NotificationStackScrollLayoutController + mNotificationStackScrollLayoutController; + @Mock protected NotificationShadeDepthController mNotificationShadeDepthController; + @Mock protected LockscreenShadeTransitionController mLockscreenShadeTransitionController; + @Mock protected AuthController mAuthController; + @Mock protected ScrimController mScrimController; + @Mock protected MediaDataManager mMediaDataManager; + @Mock protected AmbientState mAmbientState; + @Mock protected UserManager mUserManager; + @Mock protected UiEventLogger mUiEventLogger; + @Mock protected LockIconViewController mLockIconViewController; + @Mock protected KeyguardMediaController mKeyguardMediaController; + @Mock protected NavigationModeController mNavigationModeController; + @Mock protected NavigationBarController mNavigationBarController; + @Mock protected QuickSettingsController mQsController; + @Mock protected ShadeHeaderController mShadeHeaderController; + @Mock protected ContentResolver mContentResolver; + @Mock protected TapAgainViewController mTapAgainViewController; + @Mock protected KeyguardIndicationController mKeyguardIndicationController; + @Mock protected FragmentService mFragmentService; + @Mock protected FragmentHostManager mFragmentHostManager; + @Mock protected NotificationRemoteInputManager mNotificationRemoteInputManager; + @Mock protected RecordingController mRecordingController; + @Mock protected LockscreenGestureLogger mLockscreenGestureLogger; + @Mock protected DumpManager mDumpManager; + @Mock protected InteractionJankMonitor mInteractionJankMonitor; + @Mock protected NotificationsQSContainerController mNotificationsQSContainerController; + @Mock protected QsFrameTranslateController mQsFrameTranslateController; + @Mock protected StatusBarWindowStateController mStatusBarWindowStateController; + @Mock protected KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock protected NotificationShadeWindowController mNotificationShadeWindowController; + @Mock protected SysUiState mSysUiState; + @Mock protected NotificationListContainer mNotificationListContainer; + @Mock protected NotificationStackSizeCalculator mNotificationStackSizeCalculator; + @Mock protected UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + @Mock protected ShadeTransitionController mShadeTransitionController; + @Mock protected QS mQs; + @Mock protected QSFragment mQSFragment; + @Mock protected ViewGroup mQsHeader; + @Mock protected ViewParent mViewParent; + @Mock protected ViewTreeObserver mViewTreeObserver; + @Mock protected KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel; + @Mock protected DreamingToLockscreenTransitionViewModel + mDreamingToLockscreenTransitionViewModel; + @Mock protected OccludedToLockscreenTransitionViewModel + mOccludedToLockscreenTransitionViewModel; + @Mock protected LockscreenToDreamingTransitionViewModel + mLockscreenToDreamingTransitionViewModel; + @Mock protected LockscreenToOccludedTransitionViewModel + mLockscreenToOccludedTransitionViewModel; + @Mock protected GoneToDreamingTransitionViewModel mGoneToDreamingTransitionViewModel; + + @Mock protected KeyguardTransitionInteractor mKeyguardTransitionInteractor; + @Mock protected KeyguardLongPressViewModel mKeyuardLongPressViewModel; + @Mock protected AlternateBouncerInteractor mAlternateBouncerInteractor; + @Mock protected MotionEvent mDownMotionEvent; + @Mock protected CoroutineDispatcher mMainDispatcher; + @Captor + protected ArgumentCaptor<NotificationStackScrollLayout.OnEmptySpaceClickListener> + mEmptySpaceClickListenerCaptor; + + protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; + protected KeyguardInteractor mKeyguardInteractor; + protected NotificationPanelViewController.TouchHandler mTouchHandler; + protected ConfigurationController mConfigurationController; + protected SysuiStatusBarStateController mStatusBarStateController; + protected NotificationPanelViewController mNotificationPanelViewController; + protected View.AccessibilityDelegate mAccessibilityDelegate; + protected NotificationsQuickSettingsContainer mNotificationContainerParent; + protected List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners; + protected Handler mMainHandler; + protected View.OnLayoutChangeListener mLayoutChangeListener; + + protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); + protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); + protected final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); + protected final ShadeExpansionStateManager mShadeExpansionStateManager = + new ShadeExpansionStateManager(); + + protected QuickSettingsController mQuickSettingsController; + @Mock protected Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy; + + protected FragmentHostManager.FragmentListener mFragmentListener; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mMainDispatcher = getMainDispatcher(); + mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor( + new FakeKeyguardRepository()); + mKeyguardInteractor = new KeyguardInteractor(new FakeKeyguardRepository(), mCommandQueue, + mFeatureFlags, new FakeKeyguardBouncerRepository()); + SystemClock systemClock = new FakeSystemClock(); + mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager, + mInteractionJankMonitor, mShadeExpansionStateManager); + + KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext); + keyguardStatusView.setId(R.id.keyguard_status_view); + + when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); + when(mHeadsUpCallback.getContext()).thenReturn(mContext); + when(mView.getResources()).thenReturn(mResources); + when(mView.getWidth()).thenReturn(PANEL_WIDTH); + when(mResources.getConfiguration()).thenReturn(mConfiguration); + mConfiguration.orientation = ORIENTATION_PORTRAIT; + when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); + mDisplayMetrics.density = 100; + when(mResources.getBoolean(R.bool.config_enableNotificationShadeDrag)).thenReturn(true); + when(mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade)) + .thenReturn(NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE); + when(mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal)) + .thenReturn(10); + when(mResources.getDimensionPixelSize(R.dimen.split_shade_full_transition_distance)) + .thenReturn(SPLIT_SHADE_FULL_TRANSITION_DISTANCE); + when(mView.getContext()).thenReturn(getContext()); + when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar); + when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(mUserSwitcherView); + when(mView.findViewById(R.id.keyguard_user_switcher_stub)).thenReturn( + mUserSwitcherStubView); + when(mView.findViewById(R.id.keyguard_clock_container)).thenReturn(mKeyguardClockSwitch); + when(mView.findViewById(R.id.notification_stack_scroller)) + .thenReturn(mNotificationStackScrollLayout); + when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000); + when(mNotificationStackScrollLayoutController.getHeadsUpCallback()) + .thenReturn(mHeadsUpCallback); + when(mKeyguardBottomAreaViewController.getView()).thenReturn(mKeyguardBottomArea); + when(mView.findViewById(R.id.keyguard_bottom_area)).thenReturn(mKeyguardBottomArea); + when(mKeyguardBottomArea.animate()).thenReturn(mock(ViewPropertyAnimator.class)); + when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame); + when(mView.findViewById(R.id.keyguard_status_view)) + .thenReturn(mock(KeyguardStatusView.class)); + mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null); + mNotificationContainerParent.addView(keyguardStatusView); + mNotificationContainerParent.onFinishInflate(); + when(mView.findViewById(R.id.notification_container_parent)) + .thenReturn(mNotificationContainerParent); + when(mFragmentService.getFragmentHostManager(mView)).thenReturn(mFragmentHostManager); + FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder( + mDisplayMetrics); + when(mKeyguardQsUserSwitchComponentFactory.build(any())) + .thenReturn(mKeyguardQsUserSwitchComponent); + when(mKeyguardQsUserSwitchComponent.getKeyguardQsUserSwitchController()) + .thenReturn(mKeyguardQsUserSwitchController); + when(mKeyguardUserSwitcherComponentFactory.build(any())) + .thenReturn(mKeyguardUserSwitcherComponent); + when(mKeyguardUserSwitcherComponent.getKeyguardUserSwitcherController()) + .thenReturn(mKeyguardUserSwitcherController); + when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(true); + when(mQs.getView()).thenReturn(mView); + when(mQSFragment.getView()).thenReturn(mView); + doAnswer(invocation -> { + mFragmentListener = invocation.getArgument(1); + return null; + }).when(mFragmentHostManager).addTagListener(eq(QS.TAG), any()); + doAnswer((Answer<Void>) invocation -> { + mTouchHandler = invocation.getArgument(0); + return null; + }).when(mView).setOnTouchListener(any(NotificationPanelViewController.TouchHandler.class)); + + // Dreaming->Lockscreen + when(mKeyguardTransitionInteractor.getDreamingToLockscreenTransition()) + .thenReturn(emptyFlow()); + when(mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha()) + .thenReturn(emptyFlow()); + when(mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt())) + .thenReturn(emptyFlow()); + + // Occluded->Lockscreen + when(mKeyguardTransitionInteractor.getOccludedToLockscreenTransition()) + .thenReturn(emptyFlow()); + when(mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha()) + .thenReturn(emptyFlow()); + when(mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt())) + .thenReturn(emptyFlow()); + + // Lockscreen->Dreaming + when(mKeyguardTransitionInteractor.getLockscreenToDreamingTransition()) + .thenReturn(emptyFlow()); + when(mLockscreenToDreamingTransitionViewModel.getLockscreenAlpha()) + .thenReturn(emptyFlow()); + when(mLockscreenToDreamingTransitionViewModel.lockscreenTranslationY(anyInt())) + .thenReturn(emptyFlow()); + + // Gone->Dreaming + when(mKeyguardTransitionInteractor.getGoneToDreamingTransition()) + .thenReturn(emptyFlow()); + when(mGoneToDreamingTransitionViewModel.getLockscreenAlpha()) + .thenReturn(emptyFlow()); + when(mGoneToDreamingTransitionViewModel.lockscreenTranslationY(anyInt())) + .thenReturn(emptyFlow()); + + // Lockscreen->Occluded + when(mKeyguardTransitionInteractor.getLockscreenToOccludedTransition()) + .thenReturn(emptyFlow()); + when(mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha()) + .thenReturn(emptyFlow()); + when(mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(anyInt())) + .thenReturn(emptyFlow()); + + NotificationWakeUpCoordinator coordinator = + new NotificationWakeUpCoordinator( + mDumpManager, + mock(HeadsUpManagerPhone.class), + new StatusBarStateControllerImpl(new UiEventLoggerFake(), mDumpManager, + mInteractionJankMonitor, mShadeExpansionStateManager), + mKeyguardBypassController, + mDozeParameters, + mScreenOffAnimationController, + mock(NotificationWakeUpCoordinatorLogger.class)); + mConfigurationController = new ConfigurationControllerImpl(mContext); + PulseExpansionHandler expansionHandler = new PulseExpansionHandler( + mContext, + coordinator, + mKeyguardBypassController, mHeadsUpManager, + mock(NotificationRoundnessManager.class), + mConfigurationController, + mStatusBarStateController, + mFalsingManager, + mShadeExpansionStateManager, + mLockscreenShadeTransitionController, + new FalsingCollectorFake(), + mDumpManager); + when(mKeyguardStatusViewComponentFactory.build(any())) + .thenReturn(mKeyguardStatusViewComponent); + when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController()) + .thenReturn(mKeyguardClockSwitchController); + when(mKeyguardStatusViewComponent.getKeyguardStatusViewController()) + .thenReturn(mKeyguardStatusViewController); + when(mKeyguardStatusBarViewComponentFactory.build(any(), any())) + .thenReturn(mKeyguardStatusBarViewComponent); + when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController()) + .thenReturn(mKeyguardStatusBarViewController); + when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean())) + .thenReturn(keyguardStatusView); + when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean())) + .thenReturn(mUserSwitcherView); + when(mLayoutInflater.inflate(eq(R.layout.keyguard_bottom_area), any(), anyBoolean())) + .thenReturn(mKeyguardBottomArea); + when(mNotificationRemoteInputManager.isRemoteInputActive()) + .thenReturn(false); + when(mInteractionJankMonitor.begin(any(), anyInt())) + .thenReturn(true); + when(mInteractionJankMonitor.end(anyInt())) + .thenReturn(true); + doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any()); + doAnswer(invocation -> { + mLayoutChangeListener = invocation.getArgument(0); + return null; + }).when(mView).addOnLayoutChangeListener(any()); + + when(mView.getViewTreeObserver()).thenReturn(mViewTreeObserver); + when(mView.getParent()).thenReturn(mViewParent); + when(mQs.getHeader()).thenReturn(mQsHeader); + when(mDownMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN); + when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState); + + mMainHandler = new Handler(Looper.getMainLooper()); + + when(mView.requireViewById(R.id.keyguard_long_press)) + .thenReturn(mock(LongPressHandlingView.class)); + + mNotificationPanelViewController = new NotificationPanelViewController( + mView, + mMainHandler, + mLayoutInflater, + mFeatureFlags, + coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController, + mFalsingManager, new FalsingCollectorFake(), + mKeyguardStateController, + mStatusBarStateController, + mStatusBarWindowStateController, + mNotificationShadeWindowController, + mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper, + mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor, + mMetricsLogger, + mShadeLog, + mShadeHeightLogger, + mConfigurationController, + () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, + mConversationNotificationManager, mMediaHierarchyManager, + mStatusBarKeyguardViewManager, + mGutsManager, + mNotificationsQSContainerController, + mNotificationStackScrollLayoutController, + mKeyguardStatusViewComponentFactory, + mKeyguardQsUserSwitchComponentFactory, + mKeyguardUserSwitcherComponentFactory, + mKeyguardStatusBarViewComponentFactory, + mLockscreenShadeTransitionController, + mAuthController, + mScrimController, + mUserManager, + mMediaDataManager, + mNotificationShadeDepthController, + mAmbientState, + mLockIconViewController, + mKeyguardMediaController, + mTapAgainViewController, + mNavigationModeController, + mNavigationBarController, + mQsController, + mFragmentService, + mContentResolver, + mRecordingController, + mShadeHeaderController, + mScreenOffAnimationController, + mLockscreenGestureLogger, + mShadeExpansionStateManager, + mNotificationRemoteInputManager, + mSysUIUnfoldComponent, + mSysUiState, + () -> mKeyguardBottomAreaViewController, + mKeyguardUnlockAnimationController, + mKeyguardIndicationController, + mNotificationListContainer, + mNotificationStackSizeCalculator, + mUnlockedScreenOffAnimationController, + mShadeTransitionController, + systemClock, + mKeyguardBottomAreaViewModel, + mKeyguardBottomAreaInteractor, + mAlternateBouncerInteractor, + mDreamingToLockscreenTransitionViewModel, + mOccludedToLockscreenTransitionViewModel, + mLockscreenToDreamingTransitionViewModel, + mGoneToDreamingTransitionViewModel, + mLockscreenToOccludedTransitionViewModel, + mMainDispatcher, + mKeyguardTransitionInteractor, + mDumpManager, + mKeyuardLongPressViewModel, + mKeyguardInteractor); + mNotificationPanelViewController.initDependencies( + mCentralSurfaces, + null, + () -> {}, + mNotificationShelfController); + mNotificationPanelViewController.setTrackingStartedListener(() -> {}); + mNotificationPanelViewController.setOpenCloseListener( + new NotificationPanelViewController.OpenCloseListener() { + @Override + public void onClosingFinished() {} + + @Override + public void onOpenStarted() {} + }); + mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); + ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor = + ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class); + verify(mView, atLeast(1)).addOnAttachStateChangeListener( + onAttachStateChangeListenerArgumentCaptor.capture()); + mOnAttachStateChangeListeners = onAttachStateChangeListenerArgumentCaptor.getAllValues(); + + ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor = + ArgumentCaptor.forClass(View.AccessibilityDelegate.class); + verify(mView).setAccessibilityDelegate(accessibilityDelegateArgumentCaptor.capture()); + mAccessibilityDelegate = accessibilityDelegateArgumentCaptor.getValue(); + mNotificationPanelViewController.getStatusBarStateController() + .addCallback(mNotificationPanelViewController.getStatusBarStateListener()); + mNotificationPanelViewController + .setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class)); + verify(mNotificationStackScrollLayoutController) + .setOnEmptySpaceClickListener(mEmptySpaceClickListenerCaptor.capture()); + verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true); + reset(mKeyguardStatusViewController); + + when(mNotificationPanelViewControllerLazy.get()) + .thenReturn(mNotificationPanelViewController); + mQuickSettingsController = new QuickSettingsController( + mNotificationPanelViewControllerLazy, + mView, + mQsFrameTranslateController, + mShadeTransitionController, + expansionHandler, + mNotificationRemoteInputManager, + mShadeExpansionStateManager, + mStatusBarKeyguardViewManager, + mNotificationStackScrollLayoutController, + mLockscreenShadeTransitionController, + mNotificationShadeDepthController, + mShadeHeaderController, + mStatusBarTouchableRegionManager, + mKeyguardStateController, + mKeyguardBypassController, + mUpdateMonitor, + mScrimController, + mMediaDataManager, + mMediaHierarchyManager, + mAmbientState, + mRecordingController, + mFalsingManager, + new FalsingCollectorFake(), + mAccessibilityManager, + mLockscreenGestureLogger, + mMetricsLogger, + mFeatureFlags, + mInteractionJankMonitor, + mShadeLog + ); + } + + @After + public void tearDown() { + mNotificationPanelViewController.mBottomAreaShadeAlphaAnimator.cancel(); + mNotificationPanelViewController.cancelHeightAnimator(); + mMainHandler.removeCallbacksAndMessages(null); + } + + protected void setBottomPadding(int stackBottom, int lockIconPadding, int indicationPadding, + int ambientPadding) { + + when(mNotificationStackScrollLayoutController.getTop()).thenReturn(0); + when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(stackBottom); + when(mNotificationStackScrollLayoutController.getBottom()).thenReturn(stackBottom); + when(mLockIconViewController.getTop()).thenReturn((float) (stackBottom - lockIconPadding)); + + when(mResources.getDimensionPixelSize(R.dimen.keyguard_indication_bottom_padding)) + .thenReturn(indicationPadding); + mNotificationPanelViewController.loadDimens(); + + mNotificationPanelViewController.setAmbientIndicationTop( + /* ambientIndicationTop= */ stackBottom - ambientPadding, + /* ambientTextVisible= */ true); + } + + protected void triggerPositionClockAndNotifications() { + mNotificationPanelViewController.onQsSetExpansionHeightCalled(false); + } + + protected FalsingManager.FalsingTapListener getFalsingTapListener() { + for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { + listener.onViewAttachedToWindow(mView); + } + assertThat(mFalsingManager.getTapListeners().size()).isEqualTo(1); + return mFalsingManager.getTapListeners().get(0); + } + + protected void givenViewAttached() { + for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { + listener.onViewAttachedToWindow(mView); + } + } + + protected ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) { + ConstraintSet constraintSet = new ConstraintSet(); + constraintSet.clone(mNotificationContainerParent); + return constraintSet.getConstraint(id).layout; + } + + protected void enableSplitShade(boolean enabled) { + when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(enabled); + mNotificationPanelViewController.updateResources(); + } + + protected void updateMultiUserSetting(boolean enabled) { + when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false); + when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(enabled); + final ArgumentCaptor<ContentObserver> observerCaptor = + ArgumentCaptor.forClass(ContentObserver.class); + verify(mContentResolver) + .registerContentObserver(any(), anyBoolean(), observerCaptor.capture()); + observerCaptor.getValue().onChange(/* selfChange */ false); + } + + protected void updateSmallestScreenWidth(int smallestScreenWidthDp) { + Configuration configuration = new Configuration(); + configuration.smallestScreenWidthDp = smallestScreenWidthDp; + mConfigurationController.onConfigurationChanged(configuration); + } + + protected void onTouchEvent(MotionEvent ev) { + mTouchHandler.onTouch(mView, ev); + } + + protected void setDozing(boolean dozing, boolean dozingAlwaysOn) { + when(mDozeParameters.getAlwaysOn()).thenReturn(dozingAlwaysOn); + mNotificationPanelViewController.setDozing( + /* dozing= */ dozing, + /* animate= */ false + ); + } + + protected void assertKeyguardStatusViewCentered() { + mNotificationPanelViewController.updateResources(); + assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf( + ConstraintSet.PARENT_ID, ConstraintSet.UNSET); + } + + protected void assertKeyguardStatusViewNotCentered() { + mNotificationPanelViewController.updateResources(); + assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( + R.id.qs_edge_guideline); + } + + protected void setIsFullWidth(boolean fullWidth) { + float nsslWidth = fullWidth ? PANEL_WIDTH : PANEL_WIDTH / 2f; + when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(nsslWidth); + triggerLayoutChange(); + } + + protected void triggerLayoutChange() { + mLayoutChangeListener.onLayoutChange( + mView, + /* left= */ 0, + /* top= */ 0, + /* right= */ 0, + /* bottom= */ 0, + /* oldLeft= */ 0, + /* oldTop= */ 0, + /* oldRight= */ 0, + /* oldBottom= */ 0 + ); + } + + protected CoroutineDispatcher getMainDispatcher() { + return mMainDispatcher; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 996d9fb5bfb8..abcde3dca4e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -16,8 +16,6 @@ package com.android.systemui.shade; -import static android.content.res.Configuration.ORIENTATION_PORTRAIT; - import static com.android.keyguard.FaceAuthApiRequestReason.NOTIFICATION_PANEL_CLICKED; import static com.android.keyguard.KeyguardClockSwitch.LARGE; import static com.android.keyguard.KeyguardClockSwitch.SMALL; @@ -31,592 +29,53 @@ import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.annotation.IdRes; -import android.content.ContentResolver; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.database.ContentObserver; -import android.os.Handler; -import android.os.Looper; -import android.os.PowerManager; -import android.os.UserManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.ViewPropertyAnimator; -import android.view.ViewStub; -import android.view.ViewTreeObserver; -import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import androidx.constraintlayout.widget.ConstraintSet; import androidx.test.filters.SmallTest; -import com.android.internal.jank.InteractionJankMonitor; -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.UiEventLogger; -import com.android.internal.logging.testing.UiEventLoggerFake; -import com.android.internal.util.CollectionUtils; -import com.android.internal.util.LatencyTracker; import com.android.keyguard.FaceAuthApiRequestReason; -import com.android.keyguard.KeyguardClockSwitch; -import com.android.keyguard.KeyguardClockSwitchController; -import com.android.keyguard.KeyguardStatusView; -import com.android.keyguard.KeyguardStatusViewController; -import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.LockIconViewController; -import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent; -import com.android.keyguard.dagger.KeyguardStatusBarViewComponent; -import com.android.keyguard.dagger.KeyguardStatusViewComponent; -import com.android.keyguard.dagger.KeyguardUserSwitcherComponent; import com.android.systemui.DejankUtils; import com.android.systemui.R; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.biometrics.AuthController; -import com.android.systemui.classifier.FalsingCollectorFake; -import com.android.systemui.classifier.FalsingManagerFake; -import com.android.systemui.common.ui.view.LongPressHandlingView; -import com.android.systemui.doze.DozeLog; -import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.fragments.FragmentHostManager; -import com.android.systemui.fragments.FragmentService; -import com.android.systemui.keyguard.KeyguardUnlockAnimationController; -import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; -import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor; -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; -import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; -import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; -import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel; -import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel; -import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel; -import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel; -import com.android.systemui.keyguard.ui.viewmodel.LockscreenToOccludedTransitionViewModel; -import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel; -import com.android.systemui.media.controls.pipeline.MediaDataManager; -import com.android.systemui.media.controls.ui.KeyguardMediaController; -import com.android.systemui.media.controls.ui.MediaHierarchyManager; -import com.android.systemui.model.SysUiState; -import com.android.systemui.navigationbar.NavigationBarController; -import com.android.systemui.navigationbar.NavigationModeController; -import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.qs.QSFragment; -import com.android.systemui.screenrecord.RecordingController; -import com.android.systemui.shade.transition.ShadeTransitionController; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.KeyguardIndicationController; -import com.android.systemui.statusbar.LockscreenShadeTransitionController; -import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.NotificationShadeDepthController; -import com.android.systemui.statusbar.NotificationShadeWindowController; -import com.android.systemui.statusbar.NotificationShelfController; -import com.android.systemui.statusbar.PulseExpansionHandler; -import com.android.systemui.statusbar.QsFrameTranslateController; -import com.android.systemui.statusbar.StatusBarStateControllerImpl; -import com.android.systemui.statusbar.SysuiStatusBarStateController; -import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.notification.ConversationNotificationManager; -import com.android.systemui.statusbar.notification.DynamicPrivacyController; -import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; -import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger; import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener; -import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.stack.AmbientState; -import com.android.systemui.statusbar.notification.stack.NotificationListContainer; -import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator; -import com.android.systemui.statusbar.phone.CentralSurfaces; -import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; -import com.android.systemui.statusbar.phone.DozeParameters; -import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; -import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; -import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; -import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; -import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController; -import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.phone.KeyguardStatusBarView; -import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController; -import com.android.systemui.statusbar.phone.LockscreenGestureLogger; -import com.android.systemui.statusbar.phone.ScreenOffAnimationController; -import com.android.systemui.statusbar.phone.ScrimController; -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; -import com.android.systemui.statusbar.phone.TapAgainViewController; -import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; -import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController; -import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView; -import com.android.systemui.statusbar.window.StatusBarWindowStateController; -import com.android.systemui.unfold.SysUIUnfoldComponent; -import com.android.systemui.util.time.FakeSystemClock; -import com.android.systemui.util.time.SystemClock; -import com.android.wm.shell.animation.FlingAnimationUtils; - -import org.junit.After; + import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.stubbing.Answer; import java.util.List; -import java.util.Optional; - -import dagger.Lazy; -import kotlinx.coroutines.CoroutineDispatcher; @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) -public class NotificationPanelViewControllerTest extends SysuiTestCase { - - private static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; - private static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50; - private static final int PANEL_WIDTH = 500; // Random value just for the test. - - @Mock private CentralSurfaces mCentralSurfaces; - @Mock private NotificationStackScrollLayout mNotificationStackScrollLayout; - @Mock private KeyguardBottomAreaView mKeyguardBottomArea; - @Mock private KeyguardBottomAreaViewController mKeyguardBottomAreaViewController; - @Mock private KeyguardBottomAreaView mQsFrame; - @Mock private HeadsUpManagerPhone mHeadsUpManager; - @Mock private NotificationShelfController mNotificationShelfController; - @Mock private NotificationGutsManager mGutsManager; - @Mock private KeyguardStatusBarView mKeyguardStatusBar; - @Mock private KeyguardUserSwitcherView mUserSwitcherView; - @Mock private ViewStub mUserSwitcherStubView; - @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; - @Mock private KeyguardUpdateMonitor mUpdateMonitor; - @Mock private KeyguardBypassController mKeyguardBypassController; - @Mock private DozeParameters mDozeParameters; - @Mock private ScreenOffAnimationController mScreenOffAnimationController; - @Mock private NotificationPanelView mView; - @Mock private LayoutInflater mLayoutInflater; - @Mock private FeatureFlags mFeatureFlags; - @Mock private DynamicPrivacyController mDynamicPrivacyController; - @Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; - @Mock private KeyguardStateController mKeyguardStateController; - @Mock private DozeLog mDozeLog; - @Mock private ShadeLogger mShadeLog; - @Mock private ShadeHeightLogger mShadeHeightLogger; - @Mock private CommandQueue mCommandQueue; - @Mock private VibratorHelper mVibratorHelper; - @Mock private LatencyTracker mLatencyTracker; - @Mock private PowerManager mPowerManager; - @Mock private AccessibilityManager mAccessibilityManager; - @Mock private MetricsLogger mMetricsLogger; - @Mock private Resources mResources; - @Mock private Configuration mConfiguration; - @Mock private KeyguardClockSwitch mKeyguardClockSwitch; - @Mock private MediaHierarchyManager mMediaHierarchyManager; - @Mock private ConversationNotificationManager mConversationNotificationManager; - @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; - @Mock private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; - @Mock private KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory; - @Mock private KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent; - @Mock private KeyguardQsUserSwitchController mKeyguardQsUserSwitchController; - @Mock private KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory; - @Mock private KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent; - @Mock private KeyguardUserSwitcherController mKeyguardUserSwitcherController; - @Mock private KeyguardStatusViewComponent mKeyguardStatusViewComponent; - @Mock private KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory; - @Mock private KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent; - @Mock private KeyguardClockSwitchController mKeyguardClockSwitchController; - @Mock private KeyguardStatusViewController mKeyguardStatusViewController; - @Mock private KeyguardStatusBarViewController mKeyguardStatusBarViewController; - @Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; - @Mock private NotificationShadeDepthController mNotificationShadeDepthController; - @Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController; - @Mock private AuthController mAuthController; - @Mock private ScrimController mScrimController; - @Mock private MediaDataManager mMediaDataManager; - @Mock private AmbientState mAmbientState; - @Mock private UserManager mUserManager; - @Mock private UiEventLogger mUiEventLogger; - @Mock private LockIconViewController mLockIconViewController; - @Mock private KeyguardMediaController mKeyguardMediaController; - @Mock private NavigationModeController mNavigationModeController; - @Mock private NavigationBarController mNavigationBarController; - @Mock private QuickSettingsController mQsController; - @Mock private LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; - @Mock private ContentResolver mContentResolver; - @Mock private TapAgainViewController mTapAgainViewController; - @Mock private KeyguardIndicationController mKeyguardIndicationController; - @Mock private FragmentService mFragmentService; - @Mock private FragmentHostManager mFragmentHostManager; - @Mock private NotificationRemoteInputManager mNotificationRemoteInputManager; - @Mock private RecordingController mRecordingController; - @Mock private LockscreenGestureLogger mLockscreenGestureLogger; - @Mock private DumpManager mDumpManager; - @Mock private InteractionJankMonitor mInteractionJankMonitor; - @Mock private NotificationsQSContainerController mNotificationsQSContainerController; - @Mock private QsFrameTranslateController mQsFrameTranslateController; - @Mock private StatusBarWindowStateController mStatusBarWindowStateController; - @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; - @Mock private NotificationShadeWindowController mNotificationShadeWindowController; - @Mock private SysUiState mSysUiState; - @Mock private NotificationListContainer mNotificationListContainer; - @Mock private NotificationStackSizeCalculator mNotificationStackSizeCalculator; - @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; - @Mock private ShadeTransitionController mShadeTransitionController; - @Mock private QS mQs; - @Mock private QSFragment mQSFragment; - @Mock private ViewGroup mQsHeader; - @Mock private ViewParent mViewParent; - @Mock private ViewTreeObserver mViewTreeObserver; - @Mock private KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel; - @Mock private KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; - @Mock private DreamingToLockscreenTransitionViewModel mDreamingToLockscreenTransitionViewModel; - @Mock private OccludedToLockscreenTransitionViewModel mOccludedToLockscreenTransitionViewModel; - @Mock private LockscreenToDreamingTransitionViewModel mLockscreenToDreamingTransitionViewModel; - @Mock private LockscreenToOccludedTransitionViewModel mLockscreenToOccludedTransitionViewModel; - @Mock private GoneToDreamingTransitionViewModel mGoneToDreamingTransitionViewModel; - - @Mock private KeyguardTransitionInteractor mKeyguardTransitionInteractor; - @Mock private KeyguardInteractor mKeyguardInteractor; - @Mock private KeyguardLongPressViewModel mKeyuardLongPressViewModel; - @Mock private CoroutineDispatcher mMainDispatcher; - @Mock private AlternateBouncerInteractor mAlternateBouncerInteractor; - @Mock private MotionEvent mDownMotionEvent; - @Captor - private ArgumentCaptor<NotificationStackScrollLayout.OnEmptySpaceClickListener> - mEmptySpaceClickListenerCaptor; - - private NotificationPanelViewController.TouchHandler mTouchHandler; - private ConfigurationController mConfigurationController; - private SysuiStatusBarStateController mStatusBarStateController; - private NotificationPanelViewController mNotificationPanelViewController; - private View.AccessibilityDelegate mAccessibilityDelegate; - private NotificationsQuickSettingsContainer mNotificationContainerParent; - private List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners; - private Handler mMainHandler; - private View.OnLayoutChangeListener mLayoutChangeListener; - - private final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); - private final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); - private final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); - private final ShadeExpansionStateManager mShadeExpansionStateManager = - new ShadeExpansionStateManager(); - - private QuickSettingsController mQuickSettingsController; - @Mock private Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy; - - private FragmentHostManager.FragmentListener mFragmentListener; +public class NotificationPanelViewControllerTest extends NotificationPanelViewControllerBaseTest { @Before - public void setup() { - MockitoAnnotations.initMocks(this); - SystemClock systemClock = new FakeSystemClock(); - mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager, - mInteractionJankMonitor, mShadeExpansionStateManager); - - KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext); - keyguardStatusView.setId(R.id.keyguard_status_view); + public void before() { DejankUtils.setImmediate(true); - - when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); - when(mHeadsUpCallback.getContext()).thenReturn(mContext); - when(mView.getResources()).thenReturn(mResources); - when(mView.getWidth()).thenReturn(PANEL_WIDTH); - when(mResources.getConfiguration()).thenReturn(mConfiguration); - mConfiguration.orientation = ORIENTATION_PORTRAIT; - when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); - mDisplayMetrics.density = 100; - when(mResources.getBoolean(R.bool.config_enableNotificationShadeDrag)).thenReturn(true); - when(mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade)) - .thenReturn(NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE); - when(mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal)) - .thenReturn(10); - when(mResources.getDimensionPixelSize(R.dimen.split_shade_full_transition_distance)) - .thenReturn(SPLIT_SHADE_FULL_TRANSITION_DISTANCE); - when(mView.getContext()).thenReturn(getContext()); - when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar); - when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(mUserSwitcherView); - when(mView.findViewById(R.id.keyguard_user_switcher_stub)).thenReturn( - mUserSwitcherStubView); - when(mView.findViewById(R.id.keyguard_clock_container)).thenReturn(mKeyguardClockSwitch); - when(mView.findViewById(R.id.notification_stack_scroller)) - .thenReturn(mNotificationStackScrollLayout); - when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000); - when(mNotificationStackScrollLayoutController.getHeadsUpCallback()) - .thenReturn(mHeadsUpCallback); - when(mKeyguardBottomAreaViewController.getView()).thenReturn(mKeyguardBottomArea); - when(mView.findViewById(R.id.keyguard_bottom_area)).thenReturn(mKeyguardBottomArea); - when(mKeyguardBottomArea.animate()).thenReturn(mock(ViewPropertyAnimator.class)); - when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame); - when(mView.findViewById(R.id.keyguard_status_view)) - .thenReturn(mock(KeyguardStatusView.class)); - mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null); - mNotificationContainerParent.addView(keyguardStatusView); - mNotificationContainerParent.onFinishInflate(); - when(mView.findViewById(R.id.notification_container_parent)) - .thenReturn(mNotificationContainerParent); - when(mFragmentService.getFragmentHostManager(mView)).thenReturn(mFragmentHostManager); - FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder( - mDisplayMetrics); - when(mKeyguardQsUserSwitchComponentFactory.build(any())) - .thenReturn(mKeyguardQsUserSwitchComponent); - when(mKeyguardQsUserSwitchComponent.getKeyguardQsUserSwitchController()) - .thenReturn(mKeyguardQsUserSwitchController); - when(mKeyguardUserSwitcherComponentFactory.build(any())) - .thenReturn(mKeyguardUserSwitcherComponent); - when(mKeyguardUserSwitcherComponent.getKeyguardUserSwitcherController()) - .thenReturn(mKeyguardUserSwitcherController); - when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(true); - when(mQs.getView()).thenReturn(mView); - when(mQSFragment.getView()).thenReturn(mView); - doAnswer(invocation -> { - mFragmentListener = invocation.getArgument(1); - return null; - }).when(mFragmentHostManager).addTagListener(eq(QS.TAG), any()); - doAnswer((Answer<Void>) invocation -> { - mTouchHandler = invocation.getArgument(0); - return null; - }).when(mView).setOnTouchListener(any(NotificationPanelViewController.TouchHandler.class)); - - NotificationWakeUpCoordinator coordinator = - new NotificationWakeUpCoordinator( - mDumpManager, - mock(HeadsUpManagerPhone.class), - new StatusBarStateControllerImpl(new UiEventLoggerFake(), mDumpManager, - mInteractionJankMonitor, mShadeExpansionStateManager), - mKeyguardBypassController, - mDozeParameters, - mScreenOffAnimationController, - mock(NotificationWakeUpCoordinatorLogger.class)); - mConfigurationController = new ConfigurationControllerImpl(mContext); - PulseExpansionHandler expansionHandler = new PulseExpansionHandler( - mContext, - coordinator, - mKeyguardBypassController, mHeadsUpManager, - mock(NotificationRoundnessManager.class), - mConfigurationController, - mStatusBarStateController, - mFalsingManager, - mShadeExpansionStateManager, - mLockscreenShadeTransitionController, - new FalsingCollectorFake(), - mDumpManager); - when(mKeyguardStatusViewComponentFactory.build(any())) - .thenReturn(mKeyguardStatusViewComponent); - when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController()) - .thenReturn(mKeyguardClockSwitchController); - when(mKeyguardStatusViewComponent.getKeyguardStatusViewController()) - .thenReturn(mKeyguardStatusViewController); - when(mKeyguardStatusBarViewComponentFactory.build(any(), any())) - .thenReturn(mKeyguardStatusBarViewComponent); - when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController()) - .thenReturn(mKeyguardStatusBarViewController); - when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean())) - .thenReturn(keyguardStatusView); - when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean())) - .thenReturn(mUserSwitcherView); - when(mLayoutInflater.inflate(eq(R.layout.keyguard_bottom_area), any(), anyBoolean())) - .thenReturn(mKeyguardBottomArea); - when(mNotificationRemoteInputManager.isRemoteInputActive()) - .thenReturn(false); - when(mInteractionJankMonitor.begin(any(), anyInt())) - .thenReturn(true); - when(mInteractionJankMonitor.end(anyInt())) - .thenReturn(true); - doAnswer(invocation -> { - ((Runnable) invocation.getArgument(0)).run(); - return null; - }).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any()); - doAnswer(invocation -> { - mLayoutChangeListener = invocation.getArgument(0); - return null; - }).when(mView).addOnLayoutChangeListener(any()); - - when(mView.getViewTreeObserver()).thenReturn(mViewTreeObserver); - when(mView.getParent()).thenReturn(mViewParent); - when(mQs.getHeader()).thenReturn(mQsHeader); - when(mDownMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN); - when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState); - - mMainHandler = new Handler(Looper.getMainLooper()); - - when(mView.requireViewById(R.id.keyguard_long_press)) - .thenReturn(mock(LongPressHandlingView.class)); - - mNotificationPanelViewController = new NotificationPanelViewController( - mView, - mMainHandler, - mLayoutInflater, - mFeatureFlags, - coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController, - mFalsingManager, new FalsingCollectorFake(), - mKeyguardStateController, - mStatusBarStateController, - mStatusBarWindowStateController, - mNotificationShadeWindowController, - mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper, - mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor, - mMetricsLogger, - mShadeLog, - mShadeHeightLogger, - mConfigurationController, - () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, - mConversationNotificationManager, mMediaHierarchyManager, - mStatusBarKeyguardViewManager, - mGutsManager, - mNotificationsQSContainerController, - mNotificationStackScrollLayoutController, - mKeyguardStatusViewComponentFactory, - mKeyguardQsUserSwitchComponentFactory, - mKeyguardUserSwitcherComponentFactory, - mKeyguardStatusBarViewComponentFactory, - mLockscreenShadeTransitionController, - mAuthController, - mScrimController, - mUserManager, - mMediaDataManager, - mNotificationShadeDepthController, - mAmbientState, - mLockIconViewController, - mKeyguardMediaController, - mTapAgainViewController, - mNavigationModeController, - mNavigationBarController, - mQsController, - mFragmentService, - mContentResolver, - mRecordingController, - mLargeScreenShadeHeaderController, - mScreenOffAnimationController, - mLockscreenGestureLogger, - mShadeExpansionStateManager, - mNotificationRemoteInputManager, - mSysUIUnfoldComponent, - mSysUiState, - () -> mKeyguardBottomAreaViewController, - mKeyguardUnlockAnimationController, - mKeyguardIndicationController, - mNotificationListContainer, - mNotificationStackSizeCalculator, - mUnlockedScreenOffAnimationController, - mShadeTransitionController, - systemClock, - mKeyguardBottomAreaViewModel, - mKeyguardBottomAreaInteractor, - mAlternateBouncerInteractor, - mDreamingToLockscreenTransitionViewModel, - mOccludedToLockscreenTransitionViewModel, - mLockscreenToDreamingTransitionViewModel, - mGoneToDreamingTransitionViewModel, - mLockscreenToOccludedTransitionViewModel, - mMainDispatcher, - mKeyguardTransitionInteractor, - mDumpManager, - mKeyuardLongPressViewModel, - mKeyguardInteractor); - mNotificationPanelViewController.initDependencies( - mCentralSurfaces, - null, - () -> {}, - mNotificationShelfController); - mNotificationPanelViewController.setTrackingStartedListener(() -> {}); - mNotificationPanelViewController.setOpenCloseListener( - new NotificationPanelViewController.OpenCloseListener() { - @Override - public void onClosingFinished() {} - - @Override - public void onOpenStarted() {} - }); - mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); - ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor = - ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class); - verify(mView, atLeast(1)).addOnAttachStateChangeListener( - onAttachStateChangeListenerArgumentCaptor.capture()); - mOnAttachStateChangeListeners = onAttachStateChangeListenerArgumentCaptor.getAllValues(); - - ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor = - ArgumentCaptor.forClass(View.AccessibilityDelegate.class); - verify(mView).setAccessibilityDelegate(accessibilityDelegateArgumentCaptor.capture()); - mAccessibilityDelegate = accessibilityDelegateArgumentCaptor.getValue(); - mNotificationPanelViewController.getStatusBarStateController() - .addCallback(mNotificationPanelViewController.getStatusBarStateListener()); - mNotificationPanelViewController - .setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class)); - verify(mNotificationStackScrollLayoutController) - .setOnEmptySpaceClickListener(mEmptySpaceClickListenerCaptor.capture()); - verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true); - reset(mKeyguardStatusViewController); - - when(mNotificationPanelViewControllerLazy.get()) - .thenReturn(mNotificationPanelViewController); - mQuickSettingsController = new QuickSettingsController( - mNotificationPanelViewControllerLazy, - mView, - mQsFrameTranslateController, - mShadeTransitionController, - expansionHandler, - mNotificationRemoteInputManager, - mShadeExpansionStateManager, - mStatusBarKeyguardViewManager, - mNotificationStackScrollLayoutController, - mLockscreenShadeTransitionController, - mNotificationShadeDepthController, - mLargeScreenShadeHeaderController, - mStatusBarTouchableRegionManager, - mKeyguardStateController, - mKeyguardBypassController, - mUpdateMonitor, - mScrimController, - mMediaDataManager, - mMediaHierarchyManager, - mAmbientState, - mRecordingController, - mFalsingManager, - new FalsingCollectorFake(), - mAccessibilityManager, - mLockscreenGestureLogger, - mMetricsLogger, - mFeatureFlags, - mInteractionJankMonitor, - mShadeLog - ); - } - - @After - public void tearDown() { - mNotificationPanelViewController.cancelHeightAnimator(); - mMainHandler.removeCallbacksAndMessages(null); } @Test @@ -671,23 +130,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { .isNotEqualTo(-1); } - private void setBottomPadding(int stackBottom, int lockIconPadding, int indicationPadding, - int ambientPadding) { - - when(mNotificationStackScrollLayoutController.getTop()).thenReturn(0); - when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(stackBottom); - when(mNotificationStackScrollLayoutController.getBottom()).thenReturn(stackBottom); - when(mLockIconViewController.getTop()).thenReturn((float) (stackBottom - lockIconPadding)); - - when(mResources.getDimensionPixelSize(R.dimen.keyguard_indication_bottom_padding)) - .thenReturn(indicationPadding); - mNotificationPanelViewController.loadDimens(); - - mNotificationPanelViewController.setAmbientIndicationTop( - /* ambientIndicationTop= */ stackBottom - ambientPadding, - /* ambientTextVisible= */ true); - } - @Test @Ignore("b/261472011 - Test appears inconsistent across environments") public void getVerticalSpaceForLockscreenNotifications_useLockIconBottomPadding_returnsSpaceAvailable() { @@ -992,68 +434,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test - public void testDisableUserSwitcherAfterEnabling_returnsViewStubToTheViewHierarchy() { - givenViewAttached(); - when(mResources.getBoolean( - com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true); - updateMultiUserSetting(true); - clearInvocations(mView); - - updateMultiUserSetting(false); - - ArgumentCaptor<View> captor = ArgumentCaptor.forClass(View.class); - verify(mView, atLeastOnce()).addView(captor.capture(), anyInt()); - final View userSwitcherStub = CollectionUtils.find(captor.getAllValues(), - view -> view.getId() == R.id.keyguard_user_switcher_stub); - assertThat(userSwitcherStub).isNotNull(); - assertThat(userSwitcherStub).isInstanceOf(ViewStub.class); - } - - @Test - public void testChangeSmallestScreenWidthAndUserSwitchEnabled_inflatesUserSwitchView() { - givenViewAttached(); - when(mView.findViewById(R.id.keyguard_user_switcher_view)).thenReturn(null); - updateSmallestScreenWidth(300); - when(mResources.getBoolean( - com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true); - when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false); - when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(true); - - updateSmallestScreenWidth(800); - - verify(mUserSwitcherStubView).inflate(); - } - - @Test - public void testFinishInflate_userSwitcherDisabled_doNotInflateUserSwitchView_initClock() { - givenViewAttached(); - when(mResources.getBoolean( - com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true); - when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false); - when(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */)) - .thenReturn(false); - - mNotificationPanelViewController.onFinishInflate(); - - verify(mUserSwitcherStubView, never()).inflate(); - verify(mKeyguardStatusViewController, times(3)).displayClock(LARGE, /* animate */ true); - } - - @Test - public void testReInflateViews_userSwitcherDisabled_doNotInflateUserSwitchView() { - givenViewAttached(); - when(mResources.getBoolean( - com.android.internal.R.bool.config_keyguardUserSwitcher)).thenReturn(true); - when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false); - when(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */)) - .thenReturn(false); - - mNotificationPanelViewController.reInflateViews(); - - verify(mUserSwitcherStubView, never()).inflate(); - } - - @Test public void testCanCollapsePanelOnTouch_trueForKeyGuard() { mStatusBarStateController.setState(KEYGUARD); @@ -1129,26 +509,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test - public void testDoubleTapRequired_Keyguard() { - FalsingManager.FalsingTapListener listener = getFalsingTapListener(); - mStatusBarStateController.setState(KEYGUARD); - - listener.onAdditionalTapRequired(); - - verify(mKeyguardIndicationController).showTransientIndication(anyInt()); - } - - @Test - public void testDoubleTapRequired_ShadeLocked() { - FalsingManager.FalsingTapListener listener = getFalsingTapListener(); - mStatusBarStateController.setState(SHADE_LOCKED); - - listener.onAdditionalTapRequired(); - - verify(mTapAgainViewController).show(); - } - - @Test public void testRotatingToSplitShadeWithQsExpanded_transitionsToShadeLocked() { mStatusBarStateController.setState(KEYGUARD); when(mQsController.getExpanded()).thenReturn(true); @@ -1423,19 +783,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test - public void testOnAttachRefreshStatusBarState() { - mStatusBarStateController.setState(KEYGUARD); - when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(false); - for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { - listener.onViewAttachedToWindow(mView); - } - verify(mKeyguardStatusViewController).setKeyguardStatusViewVisibility( - KEYGUARD/*statusBarState*/, - false/*keyguardFadingAway*/, - false/*goingToFullShade*/, SHADE/*oldStatusBarState*/); - } - - @Test public void getMaxPanelTransitionDistance_expanding_inSplitShade_returnsSplitShadeFullTransitionDistance() { enableSplitShade(true); mNotificationPanelViewController.expandWithQs(); @@ -1635,98 +982,4 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(SHADE_LOCKED); assertThat(mNotificationPanelViewController.isShadeFullyOpen()).isTrue(); } - - private static MotionEvent createMotionEvent(int x, int y, int action) { - return MotionEvent.obtain( - /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); - } - - private void triggerPositionClockAndNotifications() { - mNotificationPanelViewController.onQsSetExpansionHeightCalled(false); - } - - private FalsingManager.FalsingTapListener getFalsingTapListener() { - for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { - listener.onViewAttachedToWindow(mView); - } - assertThat(mFalsingManager.getTapListeners().size()).isEqualTo(1); - return mFalsingManager.getTapListeners().get(0); - } - - private void givenViewAttached() { - for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { - listener.onViewAttachedToWindow(mView); - } - } - - private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) { - ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.clone(mNotificationContainerParent); - return constraintSet.getConstraint(id).layout; - } - - private void enableSplitShade(boolean enabled) { - when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(enabled); - mNotificationPanelViewController.updateResources(); - } - - private void updateMultiUserSetting(boolean enabled) { - when(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)).thenReturn(false); - when(mUserManager.isUserSwitcherEnabled(false)).thenReturn(enabled); - final ArgumentCaptor<ContentObserver> observerCaptor = - ArgumentCaptor.forClass(ContentObserver.class); - verify(mContentResolver) - .registerContentObserver(any(), anyBoolean(), observerCaptor.capture()); - observerCaptor.getValue().onChange(/* selfChange */ false); - } - - private void updateSmallestScreenWidth(int smallestScreenWidthDp) { - Configuration configuration = new Configuration(); - configuration.smallestScreenWidthDp = smallestScreenWidthDp; - mConfigurationController.onConfigurationChanged(configuration); - } - - private void onTouchEvent(MotionEvent ev) { - mTouchHandler.onTouch(mView, ev); - } - - private void setDozing(boolean dozing, boolean dozingAlwaysOn) { - when(mDozeParameters.getAlwaysOn()).thenReturn(dozingAlwaysOn); - mNotificationPanelViewController.setDozing( - /* dozing= */ dozing, - /* animate= */ false - ); - } - - private void assertKeyguardStatusViewCentered() { - mNotificationPanelViewController.updateResources(); - assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf( - ConstraintSet.PARENT_ID, ConstraintSet.UNSET); - } - - private void assertKeyguardStatusViewNotCentered() { - mNotificationPanelViewController.updateResources(); - assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( - R.id.qs_edge_guideline); - } - - private void setIsFullWidth(boolean fullWidth) { - float nsslWidth = fullWidth ? PANEL_WIDTH : PANEL_WIDTH / 2f; - when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(nsslWidth); - triggerLayoutChange(); - } - - private void triggerLayoutChange() { - mLayoutChangeListener.onLayoutChange( - mView, - /* left= */ 0, - /* top= */ 0, - /* right= */ 0, - /* bottom= */ 0, - /* oldLeft= */ 0, - /* oldTop= */ 0, - /* oldRight= */ 0, - /* oldBottom= */ 0 - ); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt new file mode 100644 index 000000000000..0c046e93ee20 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shade + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.View +import android.view.ViewStub +import androidx.test.filters.SmallTest +import com.android.internal.util.CollectionUtils +import com.android.keyguard.KeyguardClockSwitch.LARGE +import com.android.systemui.R +import com.android.systemui.statusbar.StatusBarState.KEYGUARD +import com.android.systemui.statusbar.StatusBarState.SHADE +import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Captor +import org.mockito.Mockito.atLeastOnce +import org.mockito.Mockito.clearInvocations +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +@SmallTest +class NotificationPanelViewControllerWithCoroutinesTest : + NotificationPanelViewControllerBaseTest() { + + @Captor private lateinit var viewCaptor: ArgumentCaptor<View> + + override fun getMainDispatcher() = Dispatchers.Main.immediate + + @Test + fun testDisableUserSwitcherAfterEnabling_returnsViewStubToTheViewHierarchy() = runTest { + launch(Dispatchers.Main.immediate) { givenViewAttached() } + advanceUntilIdle() + + whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher)) + .thenReturn(true) + updateMultiUserSetting(true) + clearInvocations(mView) + + updateMultiUserSetting(false) + + verify(mView, atLeastOnce()).addView(viewCaptor.capture(), anyInt()) + val userSwitcherStub = + CollectionUtils.find( + viewCaptor.getAllValues(), + { view -> view.getId() == R.id.keyguard_user_switcher_stub } + ) + assertThat(userSwitcherStub).isNotNull() + assertThat(userSwitcherStub).isInstanceOf(ViewStub::class.java) + } + + @Test + fun testChangeSmallestScreenWidthAndUserSwitchEnabled_inflatesUserSwitchView() = runTest { + launch(Dispatchers.Main.immediate) { givenViewAttached() } + advanceUntilIdle() + + whenever(mView.findViewById<View>(R.id.keyguard_user_switcher_view)).thenReturn(null) + updateSmallestScreenWidth(300) + whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher)) + .thenReturn(true) + whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)) + .thenReturn(false) + whenever(mUserManager.isUserSwitcherEnabled(false)).thenReturn(true) + + updateSmallestScreenWidth(800) + + verify(mUserSwitcherStubView).inflate() + } + + @Test + fun testFinishInflate_userSwitcherDisabled_doNotInflateUserSwitchView_initClock() = runTest { + launch(Dispatchers.Main.immediate) { givenViewAttached() } + advanceUntilIdle() + + whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher)) + .thenReturn(true) + whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)) + .thenReturn(false) + whenever(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */)) + .thenReturn(false) + + mNotificationPanelViewController.onFinishInflate() + + verify(mUserSwitcherStubView, never()).inflate() + verify(mKeyguardStatusViewController, times(3)).displayClock(LARGE, /* animate */ true) + + coroutineContext.cancelChildren() + } + + @Test + fun testReInflateViews_userSwitcherDisabled_doNotInflateUserSwitchView() = runTest { + launch(Dispatchers.Main.immediate) { givenViewAttached() } + advanceUntilIdle() + + whenever(mResources.getBoolean(com.android.internal.R.bool.config_keyguardUserSwitcher)) + .thenReturn(true) + whenever(mResources.getBoolean(R.bool.qs_show_user_switcher_for_single_user)) + .thenReturn(false) + whenever(mUserManager.isUserSwitcherEnabled(false /* showEvenIfNotActionable */)) + .thenReturn(false) + + mNotificationPanelViewController.reInflateViews() + + verify(mUserSwitcherStubView, never()).inflate() + + coroutineContext.cancelChildren() + } + + @Test + fun testDoubleTapRequired_Keyguard() = runTest { + launch(Dispatchers.Main.immediate) { + val listener = getFalsingTapListener() + mStatusBarStateController.setState(KEYGUARD) + + listener.onAdditionalTapRequired() + + verify(mKeyguardIndicationController).showTransientIndication(anyInt()) + } + advanceUntilIdle() + } + + @Test + fun testDoubleTapRequired_ShadeLocked() = runTest { + launch(Dispatchers.Main.immediate) { + val listener = getFalsingTapListener() + mStatusBarStateController.setState(SHADE_LOCKED) + + listener.onAdditionalTapRequired() + + verify(mTapAgainViewController).show() + } + advanceUntilIdle() + } + + @Test + fun testOnAttachRefreshStatusBarState() = runTest { + launch(Dispatchers.Main.immediate) { + mStatusBarStateController.setState(KEYGUARD) + whenever(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(false) + mOnAttachStateChangeListeners.forEach { it.onViewAttachedToWindow(mView) } + verify(mKeyguardStatusViewController) + .setKeyguardStatusViewVisibility( + KEYGUARD /*statusBarState*/, + false /*keyguardFadingAway*/, + false /*goingToFullShade*/, + SHADE /*oldStatusBarState*/ + ) + } + advanceUntilIdle() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt index c915502ad42e..dfb1bce20ff8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt @@ -12,7 +12,6 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase -import com.android.systemui.flags.FeatureFlags import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.fragments.FragmentService import com.android.systemui.navigationbar.NavigationModeController @@ -40,8 +39,8 @@ import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @@ -68,12 +67,10 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { @Mock private lateinit var notificationsQSContainer: NotificationsQuickSettingsContainer @Mock - private lateinit var largeScreenShadeHeaderController: LargeScreenShadeHeaderController + private lateinit var mShadeHeaderController: ShadeHeaderController @Mock private lateinit var shadeExpansionStateManager: ShadeExpansionStateManager @Mock - private lateinit var featureFlags: FeatureFlags - @Mock private lateinit var fragmentService: FragmentService @Mock private lateinit var fragmentHostManager: FragmentHostManager @@ -109,9 +106,8 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { notificationsQSContainer, navigationModeController, overviewProxyService, - largeScreenShadeHeaderController, + mShadeHeaderController, shadeExpansionStateManager, - featureFlags, fragmentService, delayableExecutor ) @@ -396,9 +392,8 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { container, navigationModeController, overviewProxyService, - largeScreenShadeHeaderController, + mShadeHeaderController, shadeExpansionStateManager, - featureFlags, fragmentService, delayableExecutor ) @@ -429,16 +424,16 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { @Test fun testStartCustomizingWithDuration() { controller.setCustomizerShowing(true, 100L) - verify(largeScreenShadeHeaderController).startCustomizingAnimation(true, 100L) + verify(mShadeHeaderController).startCustomizingAnimation(true, 100L) } @Test fun testEndCustomizingWithDuration() { controller.setCustomizerShowing(true, 0L) // Only tracks changes - reset(largeScreenShadeHeaderController) + reset(mShadeHeaderController) controller.setCustomizerShowing(false, 100L) - verify(largeScreenShadeHeaderController).startCustomizingAnimation(false, 100L) + verify(mShadeHeaderController).startCustomizingAnimation(false, 100L) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt index d229a08ad7c4..0a401b09b6cf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -28,10 +28,10 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.dock.DockManager -import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.KeyguardUnlockAnimationController import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler import com.android.systemui.statusbar.LockscreenShadeTransitionController @@ -47,6 +47,7 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.window.StatusBarWindowStateController import com.android.systemui.util.mockito.any import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.flow.emptyFlow import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -81,8 +82,6 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { @Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController @Mock - private lateinit var featureFlags: FeatureFlags - @Mock private lateinit var ambientState: AmbientState @Mock private lateinit var keyguardBouncerViewModel: KeyguardBouncerViewModel @@ -124,6 +123,8 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { .thenReturn(keyguardBouncerComponent) whenever(keyguardBouncerComponent.securityContainerController) .thenReturn(keyguardSecurityContainerController) + whenever(keyguardTransitionInteractor.lockscreenToDreamingTransition) + .thenReturn(emptyFlow<TransitionStep>()) underTest = NotificationShadeWindowViewController( lockscreenShadeTransitionController, FalsingCollectorFake(), @@ -143,7 +144,6 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { notificationInsetsController, ambientState, pulsingGestureListener, - featureFlags, keyguardBouncerViewModel, keyguardBouncerComponentFactory, alternateBouncerInteractor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java index 5e9c2199897d..5d719790386a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.java @@ -25,6 +25,8 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static kotlinx.coroutines.flow.FlowKt.emptyFlow; + import android.os.SystemClock; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -40,7 +42,6 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.dock.DockManager; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; @@ -93,7 +94,6 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; @Mock private AmbientState mAmbientState; @Mock private PulsingGestureListener mPulsingGestureListener; - @Mock private FeatureFlags mFeatureFlags; @Mock private KeyguardBouncerViewModel mKeyguardBouncerViewModel; @Mock private KeyguardBouncerComponent.Factory mKeyguardBouncerComponentFactory; @Mock private KeyguardBouncerComponent mKeyguardBouncerComponent; @@ -125,6 +125,9 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { when(mDockManager.isDocked()).thenReturn(false); + when(mKeyguardTransitionInteractor.getLockscreenToDreamingTransition()) + .thenReturn(emptyFlow()); + mController = new NotificationShadeWindowViewController( mLockscreenShadeTransitionController, new FalsingCollectorFake(), @@ -144,7 +147,6 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { mNotificationInsetsController, mAmbientState, mPulsingGestureListener, - mFeatureFlags, mKeyguardBouncerViewModel, mKeyguardBouncerComponentFactory, mAlternateBouncerInteractor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java index c2fca6f2120b..e3a3678fd91e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java @@ -16,6 +16,13 @@ package com.android.systemui.shade; +import static android.view.MotionEvent.ACTION_DOWN; +import static android.view.MotionEvent.ACTION_MOVE; +import static android.view.MotionEvent.ACTION_POINTER_DOWN; +import static android.view.MotionEvent.ACTION_UP; +import static android.view.MotionEvent.BUTTON_SECONDARY; +import static android.view.MotionEvent.BUTTON_STYLUS_PRIMARY; + import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; @@ -70,13 +77,11 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; -import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; @@ -97,6 +102,11 @@ import dagger.Lazy; public class QuickSettingsControllerTest extends SysuiTestCase { private static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400; + private static final float QS_FRAME_START_X = 0f; + private static final int QS_FRAME_WIDTH = 1000; + private static final int QS_FRAME_TOP = 0; + private static final int QS_FRAME_BOTTOM = 1000; + private QuickSettingsController mQsController; @@ -119,7 +129,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; @Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController; @Mock private NotificationShadeDepthController mNotificationShadeDepthController; - @Mock private LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; + @Mock private ShadeHeaderController mShadeHeaderController; @Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; @Mock private KeyguardStateController mKeyguardStateController; @Mock private KeyguardBypassController mKeyguardBypassController; @@ -139,8 +149,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private ShadeLogger mShadeLogger; @Mock private DumpManager mDumpManager; - @Mock private DozeParameters mDozeParameters; - @Mock private ScreenOffAnimationController mScreenOffAnimationController; + @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private UiEventLogger mUiEventLogger; @@ -169,6 +178,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { when(mPanelView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar); when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000); when(mPanelView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame); + when(mQsFrame.getX()).thenReturn(QS_FRAME_START_X); + when(mQsFrame.getWidth()).thenReturn(QS_FRAME_WIDTH); + when(mQsHeader.getTop()).thenReturn(QS_FRAME_TOP); + when(mQsHeader.getBottom()).thenReturn(QS_FRAME_BOTTOM); + when(mPanelView.getY()).thenReturn((float) QS_FRAME_TOP); + when(mPanelView.getHeight()).thenReturn(QS_FRAME_BOTTOM); when(mPanelView.findViewById(R.id.keyguard_status_view)) .thenReturn(mock(KeyguardStatusView.class)); when(mQs.getView()).thenReturn(mPanelView); @@ -204,7 +219,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { mNotificationStackScrollLayoutController, mLockscreenShadeTransitionController, mNotificationShadeDepthController, - mLargeScreenShadeHeaderController, + mShadeHeaderController, mStatusBarTouchableRegionManager, mKeyguardStateController, mKeyguardBypassController, @@ -229,21 +244,10 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @After public void tearDown() { - mNotificationPanelViewController.cancelHeightAnimator(); mMainHandler.removeCallbacksAndMessages(null); } @Test - public void testOnTouchEvent_isConflictingExpansionGestureSet() { - assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); - mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); - mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, - 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, - 0 /* metaState */), false, false); - assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); - } - - @Test public void testCloseQsSideEffects() { enableSplitShade(true); mQsController.setExpandImmediate(true); @@ -259,18 +263,18 @@ public class QuickSettingsControllerTest extends SysuiTestCase { mStatusBarStateController.setState(SHADE); when(mResources.getBoolean(R.bool.config_use_large_screen_shade_header)).thenReturn(true); mQsController.updateResources(); - verify(mLargeScreenShadeHeaderController).setLargeScreenActive(true); + verify(mShadeHeaderController).setLargeScreenActive(true); when(mResources.getBoolean(R.bool.config_use_large_screen_shade_header)).thenReturn(false); mQsController.updateResources(); - verify(mLargeScreenShadeHeaderController).setLargeScreenActive(false); + verify(mShadeHeaderController).setLargeScreenActive(false); } @Test public void testPanelStaysOpenWhenClosingQs() { mShadeExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1, /* expanded= */ true, /* tracking= */ false, /* dragDownPxAmount= */ 0); - mNotificationPanelViewController.setExpandedFraction(1f); + mQsController.setShadeExpandedHeight(1); float shadeExpandedHeight = mQsController.getShadeExpandedHeight(); mQsController.animateCloseQs(false); @@ -281,16 +285,12 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Test public void interceptTouchEvent_withinQs_shadeExpanded_startsQsTracking() { mQsController.setQs(mQs); - when(mQsFrame.getX()).thenReturn(0f); - when(mQsFrame.getWidth()).thenReturn(1000); - when(mQsHeader.getTop()).thenReturn(0); - when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( - createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); + createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( - createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); + createMotionEvent(0, 500, ACTION_MOVE)); assertThat(mQsController.isTracking()).isTrue(); } @@ -299,21 +299,124 @@ public class QuickSettingsControllerTest extends SysuiTestCase { public void interceptTouchEvent_withinQs_shadeExpanded_inSplitShade_doesNotStartQsTracking() { enableSplitShade(true); mQsController.setQs(mQs); - when(mQsFrame.getX()).thenReturn(0f); - when(mQsFrame.getWidth()).thenReturn(1000); - when(mQsHeader.getTop()).thenReturn(0); - when(mQsHeader.getBottom()).thenReturn(1000); mQsController.setShadeExpandedHeight(1f); mQsController.onIntercept( - createMotionEvent(0, 0, MotionEvent.ACTION_DOWN)); + createMotionEvent(0, 0, ACTION_DOWN)); mQsController.onIntercept( - createMotionEvent(0, 500, MotionEvent.ACTION_MOVE)); + createMotionEvent(0, 500, ACTION_MOVE)); + + assertThat(mQsController.isTracking()).isFalse(); + } + + @Test + public void interceptTouch_downBetweenFullyCollapsedAndExpanded() { + mQsController.setQs(mQs); + when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); + mQsController.onHeightChanged(); + mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); + + assertThat(mQsController.onIntercept( + createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_DOWN))).isTrue(); + } + + @Test + public void onTouch_moveActionSetsCorrectExpansionHeight() { + mQsController.setQs(mQs); + when(mQs.getDesiredHeight()).thenReturn(QS_FRAME_BOTTOM); + mQsController.onHeightChanged(); + mQsController.setExpansionHeight(QS_FRAME_BOTTOM / 2f); + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_BOTTOM / 4, ACTION_DOWN), false, false); + assertThat(mQsController.isTracking()).isTrue(); + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_BOTTOM / 4 + 1, ACTION_MOVE), false, false); + assertThat(mQsController.getExpansionHeight()).isEqualTo(QS_FRAME_BOTTOM / 2 + 1); + } + + @Test + public void handleTouch_downActionInQsArea() { + mQsController.setQs(mQs); + mQsController.setBarState(SHADE); + mQsController.onPanelExpansionChanged( + new ShadeExpansionChangeEvent( + 0.5f, + true, + true, + 0 + )); + MotionEvent event = + createMotionEvent(QS_FRAME_WIDTH / 2, QS_FRAME_BOTTOM / 2, ACTION_DOWN); + mQsController.handleTouch(event, false, false); + + assertThat(mQsController.isTracking()).isTrue(); + assertThat(mQsController.getInitialTouchY()).isEqualTo(QS_FRAME_BOTTOM / 2); + } + + @Test + public void handleTouch_qsTouchedWhileCollapsingDisablesTracking() { + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_BOTTOM, ACTION_DOWN), false, false); + mQsController.setLastShadeFlingWasExpanding(false); + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, true); + MotionEvent secondTouch = createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN); + mQsController.handleTouch(secondTouch, false, true); assertThat(mQsController.isTracking()).isFalse(); } @Test + public void handleTouch_qsTouchedWhileExpanding() { + mQsController.setQs(mQs); + mQsController.handleTouch( + createMotionEvent(100, 100, ACTION_DOWN), false, false); + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_BOTTOM / 2, ACTION_MOVE), false, false); + mQsController.setLastShadeFlingWasExpanding(true); + mQsController.handleTouch( + createMotionEvent(0, QS_FRAME_TOP, ACTION_DOWN), false, false); + assertThat(mQsController.isTracking()).isTrue(); + } + + @Test + public void handleTouch_isConflictingExpansionGestureSet() { + assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); + mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); + mQsController.handleTouch(MotionEvent.obtain(0L /* downTime */, + 0L /* eventTime */, ACTION_DOWN, 0f /* x */, 0f /* y */, + 0 /* metaState */), false, false); + assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); + } + + @Test + public void handleTouch_isConflictingExpansionGestureSet_cancel() { + mShadeExpansionStateManager.onPanelExpansionChanged(1f, true, false, 0f); + mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), false, false); + assertThat(mQsController.isConflictingExpansionGesture()).isTrue(); + mQsController.handleTouch(createMotionEvent(0, 0, ACTION_UP), true, true); + assertThat(mQsController.isConflictingExpansionGesture()).isFalse(); + } + + @Test + public void handleTouch_twoFingerExpandPossibleConditions() { + assertThat(mQsController.isTwoFingerExpandPossible()).isFalse(); + mQsController.handleTouch(createMotionEvent(0, 0, ACTION_DOWN), true, false); + assertThat(mQsController.isTwoFingerExpandPossible()).isTrue(); + } + + @Test + public void handleTouch_twoFingerDrag() { + mQsController.setQs(mQs); + mQsController.setStatusBarMinHeight(1); + mQsController.setTwoFingerExpandPossible(true); + mQsController.handleTouch( + createMultitouchMotionEvent(ACTION_POINTER_DOWN), false, false); + assertThat(mQsController.isExpandImmediate()).isTrue(); + verify(mQs).setListening(true); + } + + @Test public void onQsFragmentAttached_fullWidth_setsFullWidthTrueOnQS() { setIsFullWidth(true); mFragmentListener.onFragmentViewCreated(QS.TAG, mQSFragment); @@ -330,19 +433,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { } @Test - public void getMaxPanelTransitionDistance_inSplitShade_withHeadsUp_returnsBiggerValue() { - enableSplitShade(true); - mNotificationPanelViewController.expandWithQs(); - when(mHeadsUpManager.isTrackingHeadsUp()).thenReturn(true); - - mNotificationPanelViewController.setHeadsUpDraggingStartingHeight( - SPLIT_SHADE_FULL_TRANSITION_DISTANCE); - - assertThat(mQsController.calculatePanelHeightExpanded(0)) - .isGreaterThan(SPLIT_SHADE_FULL_TRANSITION_DISTANCE); - } - - @Test public void setQsExpansion_lockscreenShadeTransitionInProgress_usesLockscreenSquishiness() { float squishinessFraction = 0.456f; mQsController.setQs(mQs); @@ -379,6 +469,21 @@ public class QuickSettingsControllerTest extends SysuiTestCase { } @Test + public void updateExpansion_expandImmediateOrAlreadyExpanded_usesFullSquishiness() { + mQsController.setQs(mQs); + when(mQs.getDesiredHeight()).thenReturn(100); + mQsController.onHeightChanged(); + + mQsController.setExpandImmediate(true); + mQsController.setExpanded(false); + mQsController.updateExpansion(); + mQsController.setExpandImmediate(false); + mQsController.setExpanded(true); + mQsController.updateExpansion(); + verify(mQs, times(2)).setQsExpansion(0, 0, 0, 1); + } + + @Test public void shadeExpanded_onKeyguard() { mStatusBarStateController.setState(KEYGUARD); // set maxQsExpansion in NPVC @@ -393,9 +498,52 @@ public class QuickSettingsControllerTest extends SysuiTestCase { assertThat(mQsController.computeExpansionFraction()).isEqualTo(1f); } + @Test + public void handleTouch_splitShadeAndtouchXOutsideQs() { + enableSplitShade(true); + + assertThat(mQsController.handleTouch(createMotionEvent( + QS_FRAME_WIDTH + 1, QS_FRAME_BOTTOM - 1, ACTION_DOWN), + false, false)).isFalse(); + } + + @Test + public void isOpenQsEvent_twoFingerDrag() { + assertThat(mQsController.isOpenQsEvent( + createMultitouchMotionEvent(ACTION_POINTER_DOWN))).isTrue(); + } + + @Test + public void isOpenQsEvent_stylusButtonClickDrag() { + MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); + event.setButtonState(BUTTON_STYLUS_PRIMARY); + + assertThat(mQsController.isOpenQsEvent(event)).isTrue(); + } + + @Test + public void isOpenQsEvent_mouseButtonClickDrag() { + MotionEvent event = createMotionEvent(0, 0, ACTION_DOWN); + event.setButtonState(BUTTON_SECONDARY); + + assertThat(mQsController.isOpenQsEvent(event)).isTrue(); + } + private static MotionEvent createMotionEvent(int x, int y, int action) { - return MotionEvent.obtain( - /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); + return MotionEvent.obtain(0, 0, action, x, y, 0); + } + + // Creates an empty multitouch event for now + private static MotionEvent createMultitouchMotionEvent(int action) { + return MotionEvent.obtain(0, 0, action, 2, + new MotionEvent.PointerProperties[] { + new MotionEvent.PointerProperties(), + new MotionEvent.PointerProperties() + }, + new MotionEvent.PointerCoords[] { + new MotionEvent.PointerCoords(), + new MotionEvent.PointerCoords() + }, 0, 0, 0, 0, 0, 0, 0, 0); } private void enableSplitShade(boolean enabled) { @@ -412,4 +560,6 @@ public class QuickSettingsControllerTest extends SysuiTestCase { int oldMaxHeight = mQsController.updateHeightsOnShadeLayoutChange(); mQsController.handleShadeLayoutChanged(oldMaxHeight); } + + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt index ee5f61c835da..d5308298202d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.android.systemui.shade +import android.animation.Animator +import android.app.StatusBarManager import android.content.Context import android.content.res.Resources import android.content.res.XmlResourceParser @@ -39,16 +40,13 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.HEADER_TRANSITION_ID -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT -import com.android.systemui.shade.LargeScreenShadeHeaderController.Companion.QS_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT +import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONSTRAINT import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusIconContainer @@ -68,136 +66,106 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Answers import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers +import org.mockito.ArgumentMatchers.anyFloat +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito -import org.mockito.Mockito.anyBoolean -import org.mockito.Mockito.anyFloat -import org.mockito.Mockito.anyInt -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.inOrder -import org.mockito.Mockito.never +import org.mockito.Mockito.mock import org.mockito.Mockito.reset -import org.mockito.Mockito.same -import org.mockito.Mockito.spy import org.mockito.Mockito.verify -import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever +import org.mockito.junit.MockitoJUnit private val EMPTY_CHANGES = ConstraintsChanges() -/** - * Tests for [LargeScreenShadeHeaderController] when [Flags.COMBINED_QS_HEADERS] is `true`. - * - * Once that flag is removed, this class will be combined with - * [LargeScreenShadeHeaderControllerTest]. - */ @SmallTest @RunWith(AndroidTestingRunner::class) -class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { - - @Mock - private lateinit var statusIcons: StatusIconContainer - @Mock - private lateinit var statusBarIconController: StatusBarIconController - @Mock - private lateinit var iconManagerFactory: StatusBarIconController.TintedIconManager.Factory - @Mock - private lateinit var iconManager: StatusBarIconController.TintedIconManager - @Mock - private lateinit var qsCarrierGroupController: QSCarrierGroupController - @Mock - private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder - @Mock - private lateinit var featureFlags: FeatureFlags - @Mock - private lateinit var clock: Clock - @Mock - private lateinit var date: VariableDateView - @Mock - private lateinit var carrierGroup: QSCarrierGroup - @Mock - private lateinit var batteryMeterView: BatteryMeterView - @Mock - private lateinit var batteryMeterViewController: BatteryMeterViewController - @Mock - private lateinit var privacyIconsController: HeaderPrivacyIconsController - @Mock - private lateinit var insetsProvider: StatusBarContentInsetsProvider - @Mock - private lateinit var variableDateViewControllerFactory: VariableDateViewController.Factory - @Mock - private lateinit var variableDateViewController: VariableDateViewController - @Mock - private lateinit var dumpManager: DumpManager +class ShadeHeaderControllerTest : SysuiTestCase() { + + @Mock(answer = Answers.RETURNS_MOCKS) private lateinit var view: MotionLayout + @Mock private lateinit var statusIcons: StatusIconContainer + @Mock private lateinit var statusBarIconController: StatusBarIconController + @Mock private lateinit var iconManagerFactory: StatusBarIconController.TintedIconManager.Factory + @Mock private lateinit var iconManager: StatusBarIconController.TintedIconManager + @Mock private lateinit var qsCarrierGroupController: QSCarrierGroupController + @Mock private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder + @Mock private lateinit var clock: Clock + @Mock private lateinit var date: VariableDateView + @Mock private lateinit var carrierGroup: QSCarrierGroup + @Mock private lateinit var batteryMeterView: BatteryMeterView + @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController + @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController + @Mock private lateinit var insetsProvider: StatusBarContentInsetsProvider + @Mock private lateinit var variableDateViewControllerFactory: VariableDateViewController.Factory + @Mock private lateinit var variableDateViewController: VariableDateViewController + @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager - @Mock - private lateinit var mockedContext: Context + @Mock private lateinit var mockedContext: Context private lateinit var viewContext: Context - @Mock(answer = Answers.RETURNS_MOCKS) - private lateinit var view: MotionLayout - @Mock - private lateinit var qqsConstraints: ConstraintSet - @Mock - private lateinit var qsConstraints: ConstraintSet - @Mock - private lateinit var largeScreenConstraints: ConstraintSet + @Mock private lateinit var qqsConstraints: ConstraintSet + @Mock private lateinit var qsConstraints: ConstraintSet + @Mock private lateinit var largeScreenConstraints: ConstraintSet + @Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var qsBatteryModeController: QsBatteryModeController - @JvmField @Rule - val mockitoRule = MockitoJUnit.rule() + @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE + var viewAlpha = 1f - private lateinit var controller: LargeScreenShadeHeaderController + private lateinit var shadeHeaderController: ShadeHeaderController private lateinit var carrierIconSlots: List<String> private val configurationController = FakeConfigurationController() - private lateinit var demoModeControllerCapture: ArgumentCaptor<DemoMode> + @Captor private lateinit var demoModeControllerCapture: ArgumentCaptor<DemoMode> @Before - fun setUp() { - demoModeControllerCapture = argumentCaptor<DemoMode>() + fun setup() { whenever<Clock>(view.findViewById(R.id.clock)).thenReturn(clock) whenever(clock.context).thenReturn(mockedContext) whenever<TextView>(view.findViewById(R.id.date)).thenReturn(date) whenever(date.context).thenReturn(mockedContext) - whenever(variableDateViewControllerFactory.create(any())) - .thenReturn(variableDateViewController) whenever<QSCarrierGroup>(view.findViewById(R.id.carrier_group)).thenReturn(carrierGroup) + whenever<BatteryMeterView>(view.findViewById(R.id.batteryRemainingIcon)) .thenReturn(batteryMeterView) whenever<StatusIconContainer>(view.findViewById(R.id.statusIcons)).thenReturn(statusIcons) - whenever(statusIcons.context).thenReturn(context) + viewContext = Mockito.spy(context) + whenever(view.context).thenReturn(viewContext) + whenever(view.resources).thenReturn(context.resources) + whenever(statusIcons.context).thenReturn(context) whenever(qsCarrierGroupControllerBuilder.setQSCarrierGroup(any())) .thenReturn(qsCarrierGroupControllerBuilder) whenever(qsCarrierGroupControllerBuilder.build()).thenReturn(qsCarrierGroupController) - - viewContext = spy(context) - whenever(view.context).thenReturn(viewContext) - whenever(view.resources).thenReturn(context.resources) - whenever(view.setVisibility(ArgumentMatchers.anyInt())).then { + whenever(view.setVisibility(anyInt())).then { viewVisibility = it.arguments[0] as Int null } whenever(view.visibility).thenAnswer { _ -> viewVisibility } - whenever(view.alpha).thenReturn(1f) - whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager) + whenever(view.setAlpha(anyFloat())).then { + viewAlpha = it.arguments[0] as Float + null + } + whenever(view.alpha).thenAnswer { _ -> viewAlpha } - whenever(featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)).thenReturn(true) + whenever(variableDateViewControllerFactory.create(any())) + .thenReturn(variableDateViewController) + whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager) setUpDefaultInsets() setUpMotionLayout(view) - controller = LargeScreenShadeHeaderController( + shadeHeaderController = + ShadeHeaderController( view, statusBarIconController, iconManagerFactory, @@ -207,16 +175,171 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { variableDateViewControllerFactory, batteryMeterViewController, dumpManager, - featureFlags, qsCarrierGroupControllerBuilder, combinedShadeHeadersConstraintManager, demoModeController, qsBatteryModeController, - ) + ) whenever(view.isAttachedToWindow).thenReturn(true) - controller.init() - carrierIconSlots = listOf( - context.getString(com.android.internal.R.string.status_bar_mobile)) + shadeHeaderController.init() + carrierIconSlots = + listOf(context.getString(com.android.internal.R.string.status_bar_mobile)) + } + + @Test + fun updateListeners_registersWhenVisible() { + makeShadeVisible() + verify(qsCarrierGroupController).setListening(true) + verify(statusBarIconController).addIconGroup(any()) + } + + @Test + fun statusIconsAddedWhenAttached() { + verify(statusBarIconController).addIconGroup(any()) + } + + @Test + fun statusIconsRemovedWhenDettached() { + shadeHeaderController.simulateViewDetached() + verify(statusBarIconController).removeIconGroup(any()) + } + + @Test + fun shadeExpandedFraction_updatesAlpha() { + makeShadeVisible() + shadeHeaderController.shadeExpandedFraction = 0.5f + verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f)) + } + + @Test + fun singleCarrier_enablesCarrierIconsInStatusIcons() { + whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(true) + + makeShadeVisible() + + verify(statusIcons).removeIgnoredSlots(carrierIconSlots) + } + + @Test + fun dualCarrier_disablesCarrierIconsInStatusIcons() { + whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(false) + + makeShadeVisible() + + verify(statusIcons).addIgnoredSlots(carrierIconSlots) + } + + @Test + fun disableQS_notDisabled_visible() { + makeShadeVisible() + shadeHeaderController.disable(0, 0, false) + + assertThat(viewVisibility).isEqualTo(View.VISIBLE) + } + + @Test + fun disableQS_disabled_gone() { + makeShadeVisible() + shadeHeaderController.disable(0, StatusBarManager.DISABLE2_QUICK_SETTINGS, false) + + assertThat(viewVisibility).isEqualTo(View.GONE) + } + + private fun makeShadeVisible() { + shadeHeaderController.largeScreenActive = true + shadeHeaderController.qsVisible = true + } + + @Test + fun updateConfig_changesFontStyle() { + configurationController.notifyDensityOrFontScaleChanged() + + verify(clock).setTextAppearance(R.style.TextAppearance_QS_Status) + verify(date).setTextAppearance(R.style.TextAppearance_QS_Status) + verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers) + } + + @Test + fun animateOutOnStartCustomizing() { + val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) + val duration = 1000L + whenever(view.animate()).thenReturn(animator) + + shadeHeaderController.startCustomizingAnimation(show = true, duration) + + verify(animator).setDuration(duration) + verify(animator).alpha(0f) + verify(animator).setInterpolator(Interpolators.ALPHA_OUT) + verify(animator).start() + } + + @Test + fun animateInOnEndCustomizing() { + val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) + val duration = 1000L + whenever(view.animate()).thenReturn(animator) + + shadeHeaderController.startCustomizingAnimation(show = false, duration) + + verify(animator).setDuration(duration) + verify(animator).alpha(1f) + verify(animator).setInterpolator(Interpolators.ALPHA_IN) + verify(animator).start() + } + + @Test + fun customizerAnimatorChangesViewVisibility() { + makeShadeVisible() + + val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) + val duration = 1000L + whenever(view.animate()).thenReturn(animator) + val listenerCaptor = argumentCaptor<Animator.AnimatorListener>() + + shadeHeaderController.startCustomizingAnimation(show = true, duration) + verify(animator).setListener(capture(listenerCaptor)) + // Start and end the animation + listenerCaptor.value.onAnimationStart(mock()) + listenerCaptor.value.onAnimationEnd(mock()) + assertThat(viewVisibility).isEqualTo(View.INVISIBLE) + + reset(animator) + shadeHeaderController.startCustomizingAnimation(show = false, duration) + verify(animator).setListener(capture(listenerCaptor)) + // Start and end the animation + listenerCaptor.value.onAnimationStart(mock()) + listenerCaptor.value.onAnimationEnd(mock()) + assertThat(viewVisibility).isEqualTo(View.VISIBLE) + } + + @Test + fun animatorListenersClearedAtEnd() { + val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) + whenever(view.animate()).thenReturn(animator) + + shadeHeaderController.startCustomizingAnimation(show = true, 0L) + val listenerCaptor = argumentCaptor<Animator.AnimatorListener>() + verify(animator).setListener(capture(listenerCaptor)) + + listenerCaptor.value.onAnimationEnd(mock()) + verify(animator).setListener(null) + } + + @Test + fun demoMode_attachDemoMode() { + val cb = argumentCaptor<DemoMode>() + verify(demoModeController).addCallback(capture(cb)) + cb.value.onDemoModeStarted() + verify(clock).onDemoModeStarted() + } + + @Test + fun demoMode_detachDemoMode() { + shadeHeaderController.simulateViewDetached() + val cb = argumentCaptor<DemoMode>() + verify(demoModeController).removeCallback(capture(cb)) + cb.value.onDemoModeFinished() + verify(clock).onDemoModeFinished() } @Test @@ -226,23 +349,21 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { verify(batteryMeterViewController).init() verify(batteryMeterViewController).ignoreTunerUpdates() - val inOrder = inOrder(qsCarrierGroupControllerBuilder) + val inOrder = Mockito.inOrder(qsCarrierGroupControllerBuilder) inOrder.verify(qsCarrierGroupControllerBuilder).setQSCarrierGroup(carrierGroup) inOrder.verify(qsCarrierGroupControllerBuilder).build() } @Test fun `battery mode controller called when qsExpandedFraction changes`() { - whenever(qsBatteryModeController.getBatteryMode(same(null), eq(0f))) - .thenReturn(BatteryMeterView.MODE_ON) - whenever(qsBatteryModeController.getBatteryMode(same(null), eq(1f))) - .thenReturn(BatteryMeterView.MODE_ESTIMATE) - controller.qsVisible = true + whenever(qsBatteryModeController.getBatteryMode(Mockito.same(null), eq(0f))) + .thenReturn(BatteryMeterView.MODE_ON) + whenever(qsBatteryModeController.getBatteryMode(Mockito.same(null), eq(1f))) + .thenReturn(BatteryMeterView.MODE_ESTIMATE) + shadeHeaderController.qsVisible = true val times = 10 - repeat(times) { - controller.qsExpandedFraction = it / (times - 1).toFloat() - } + repeat(times) { shadeHeaderController.qsExpandedFraction = it / (times - 1).toFloat() } verify(batteryMeterView).setPercentShowMode(BatteryMeterView.MODE_ON) verify(batteryMeterView).setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) @@ -277,89 +398,89 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { @Test fun testShadeExpanded_true() { // When shade is expanded, view should be visible regardless of largeScreenActive - controller.largeScreenActive = false - controller.qsVisible = true + shadeHeaderController.largeScreenActive = false + shadeHeaderController.qsVisible = true assertThat(viewVisibility).isEqualTo(View.VISIBLE) - controller.largeScreenActive = true + shadeHeaderController.largeScreenActive = true assertThat(viewVisibility).isEqualTo(View.VISIBLE) } @Test fun testShadeExpanded_false() { // When shade is not expanded, view should be invisible regardless of largeScreenActive - controller.largeScreenActive = false - controller.qsVisible = false + shadeHeaderController.largeScreenActive = false + shadeHeaderController.qsVisible = false assertThat(viewVisibility).isEqualTo(View.INVISIBLE) - controller.largeScreenActive = true + shadeHeaderController.largeScreenActive = true assertThat(viewVisibility).isEqualTo(View.INVISIBLE) } @Test fun testLargeScreenActive_false() { - controller.largeScreenActive = true // Make sure there's a change - clearInvocations(view) + shadeHeaderController.largeScreenActive = true // Make sure there's a change + Mockito.clearInvocations(view) - controller.largeScreenActive = false + shadeHeaderController.largeScreenActive = false - verify(view).setTransition(HEADER_TRANSITION_ID) + verify(view).setTransition(ShadeHeaderController.HEADER_TRANSITION_ID) } @Test fun testShadeExpandedFraction() { // View needs to be visible for this to actually take effect - controller.qsVisible = true + shadeHeaderController.qsVisible = true - clearInvocations(view) - controller.shadeExpandedFraction = 0.3f + Mockito.clearInvocations(view) + shadeHeaderController.shadeExpandedFraction = 0.3f verify(view).alpha = ShadeInterpolation.getContentAlpha(0.3f) - clearInvocations(view) - controller.shadeExpandedFraction = 1f + Mockito.clearInvocations(view) + shadeHeaderController.shadeExpandedFraction = 1f verify(view).alpha = ShadeInterpolation.getContentAlpha(1f) - clearInvocations(view) - controller.shadeExpandedFraction = 0f + Mockito.clearInvocations(view) + shadeHeaderController.shadeExpandedFraction = 0f verify(view).alpha = ShadeInterpolation.getContentAlpha(0f) } @Test fun testQsExpandedFraction_headerTransition() { - controller.qsVisible = true - controller.largeScreenActive = false + shadeHeaderController.qsVisible = true + shadeHeaderController.largeScreenActive = false - clearInvocations(view) - controller.qsExpandedFraction = 0.3f + Mockito.clearInvocations(view) + shadeHeaderController.qsExpandedFraction = 0.3f verify(view).progress = 0.3f } @Test fun testQsExpandedFraction_largeScreen() { - controller.qsVisible = true - controller.largeScreenActive = true + shadeHeaderController.qsVisible = true + shadeHeaderController.largeScreenActive = true - clearInvocations(view) - controller.qsExpandedFraction = 0.3f - verify(view, never()).progress = anyFloat() + Mockito.clearInvocations(view) + shadeHeaderController.qsExpandedFraction = 0.3f + verify(view, Mockito.never()).progress = anyFloat() } @Test fun testScrollY_headerTransition() { - controller.largeScreenActive = false + shadeHeaderController.largeScreenActive = false - clearInvocations(view) - controller.qsScrollY = 20 + Mockito.clearInvocations(view) + shadeHeaderController.qsScrollY = 20 verify(view).scrollY = 20 } @Test fun testScrollY_largeScreen() { - controller.largeScreenActive = true + shadeHeaderController.largeScreenActive = true - clearInvocations(view) - controller.qsScrollY = 20 - verify(view, never()).scrollY = anyInt() + Mockito.clearInvocations(view) + shadeHeaderController.qsScrollY = 20 + verify(view, Mockito.never()).scrollY = anyInt() } @Test @@ -381,9 +502,9 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { verify(chipVisibleChanges.qsConstraintsChanges)!!.invoke(qsConstraints) verify(chipVisibleChanges.largeScreenConstraintsChanges)!!.invoke(largeScreenConstraints) - verify(chipNotVisibleChanges.qqsConstraintsChanges, never())!!.invoke(any()) - verify(chipNotVisibleChanges.qsConstraintsChanges, never())!!.invoke(any()) - verify(chipNotVisibleChanges.largeScreenConstraintsChanges, never())!!.invoke(any()) + verify(chipNotVisibleChanges.qqsConstraintsChanges, Mockito.never())!!.invoke(any()) + verify(chipNotVisibleChanges.qsConstraintsChanges, Mockito.never())!!.invoke(any()) + verify(chipNotVisibleChanges.largeScreenConstraintsChanges, Mockito.never())!!.invoke(any()) } @Test @@ -401,10 +522,11 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { captor.value.onChipVisibilityRefreshed(false) - verify(chipVisibleChanges.qqsConstraintsChanges, never())!!.invoke(qqsConstraints) - verify(chipVisibleChanges.qsConstraintsChanges, never())!!.invoke(qsConstraints) - verify(chipVisibleChanges.largeScreenConstraintsChanges, never())!! - .invoke(largeScreenConstraints) + verify(chipVisibleChanges.qqsConstraintsChanges, Mockito.never())!!.invoke(qqsConstraints) + verify(chipVisibleChanges.qsConstraintsChanges, Mockito.never())!!.invoke(qsConstraints) + verify(chipVisibleChanges.largeScreenConstraintsChanges, Mockito.never())!!.invoke( + largeScreenConstraints + ) verify(chipNotVisibleChanges.qqsConstraintsChanges)!!.invoke(any()) verify(chipNotVisibleChanges.qsConstraintsChanges)!!.invoke(any()) @@ -425,9 +547,15 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { mockInsetsProvider(insetLeft to insetRight, false) - whenever(combinedShadeHeadersConstraintManager - .edgesGuidelinesConstraints(anyInt(), anyInt(), anyInt(), anyInt()) - ).thenReturn(mockConstraintsChanges) + whenever( + combinedShadeHeadersConstraintManager.edgesGuidelinesConstraints( + anyInt(), + anyInt(), + anyInt(), + anyInt() + ) + ) + .thenReturn(mockConstraintsChanges) captor.value.onApplyWindowInsets(view, createWindowInsets()) @@ -453,9 +581,15 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { mockInsetsProvider(insetLeft to insetRight, false) - whenever(combinedShadeHeadersConstraintManager - .edgesGuidelinesConstraints(anyInt(), anyInt(), anyInt(), anyInt()) - ).thenReturn(mockConstraintsChanges) + whenever( + combinedShadeHeadersConstraintManager.edgesGuidelinesConstraints( + anyInt(), + anyInt(), + anyInt(), + anyInt() + ) + ) + .thenReturn(mockConstraintsChanges) captor.value.onApplyWindowInsets(view, createWindowInsets()) @@ -479,8 +613,8 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { captor.value.onApplyWindowInsets(view, createWindowInsets(null)) verify(combinedShadeHeadersConstraintManager).emptyCutoutConstraints() - verify(combinedShadeHeadersConstraintManager, never()) - .centerCutoutConstraints(anyBoolean(), anyInt()) + verify(combinedShadeHeadersConstraintManager, Mockito.never()) + .centerCutoutConstraints(Mockito.anyBoolean(), anyInt()) verify(mockConstraintsChanges.qqsConstraintsChanges)!!.invoke(any()) verify(mockConstraintsChanges.qsConstraintsChanges)!!.invoke(any()) @@ -499,8 +633,8 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { captor.value.onApplyWindowInsets(view, createWindowInsets()) verify(combinedShadeHeadersConstraintManager).emptyCutoutConstraints() - verify(combinedShadeHeadersConstraintManager, never()) - .centerCutoutConstraints(anyBoolean(), anyInt()) + verify(combinedShadeHeadersConstraintManager, Mockito.never()) + .centerCutoutConstraints(Mockito.anyBoolean(), anyInt()) verify(mockConstraintsChanges.qqsConstraintsChanges)!!.invoke(any()) verify(mockConstraintsChanges.qsConstraintsChanges)!!.invoke(any()) @@ -521,8 +655,8 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { captor.value.onApplyWindowInsets(view, createWindowInsets()) verify(combinedShadeHeadersConstraintManager).emptyCutoutConstraints() - verify(combinedShadeHeadersConstraintManager, never()) - .centerCutoutConstraints(anyBoolean(), anyInt()) + verify(combinedShadeHeadersConstraintManager, Mockito.never()) + .centerCutoutConstraints(Mockito.anyBoolean(), anyInt()) verify(mockConstraintsChanges.qqsConstraintsChanges)!!.invoke(any()) verify(mockConstraintsChanges.qsConstraintsChanges)!!.invoke(any()) @@ -543,8 +677,8 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { captor.value.onApplyWindowInsets(view, createWindowInsets(Rect(1, 2, 3, 4))) verify(combinedShadeHeadersConstraintManager).emptyCutoutConstraints() - verify(combinedShadeHeadersConstraintManager, never()) - .centerCutoutConstraints(anyBoolean(), anyInt()) + verify(combinedShadeHeadersConstraintManager, Mockito.never()) + .centerCutoutConstraints(Mockito.anyBoolean(), anyInt()) verify(mockConstraintsChanges.qqsConstraintsChanges)!!.invoke(any()) verify(mockConstraintsChanges.qsConstraintsChanges)!!.invoke(any()) @@ -569,13 +703,17 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { mockInsetsProvider(0 to 0, false) - whenever(combinedShadeHeadersConstraintManager - .centerCutoutConstraints(anyBoolean(), anyInt()) - ).thenReturn(mockConstraintsChanges) + whenever( + combinedShadeHeadersConstraintManager.centerCutoutConstraints( + Mockito.anyBoolean(), + anyInt() + ) + ) + .thenReturn(mockConstraintsChanges) captor.value.onApplyWindowInsets(view, createWindowInsets(Rect(0, 0, cutoutWidth, 1))) - verify(combinedShadeHeadersConstraintManager, never()).emptyCutoutConstraints() + verify(combinedShadeHeadersConstraintManager, Mockito.never()).emptyCutoutConstraints() val offset = (width - paddingLeft - paddingRight - cutoutWidth) / 2 verify(combinedShadeHeadersConstraintManager).centerCutoutConstraints(false, offset) @@ -602,13 +740,17 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { mockInsetsProvider(0 to 0, false) - whenever(combinedShadeHeadersConstraintManager - .centerCutoutConstraints(anyBoolean(), anyInt()) - ).thenReturn(mockConstraintsChanges) + whenever( + combinedShadeHeadersConstraintManager.centerCutoutConstraints( + Mockito.anyBoolean(), + anyInt() + ) + ) + .thenReturn(mockConstraintsChanges) captor.value.onApplyWindowInsets(view, createWindowInsets(Rect(0, 0, cutoutWidth, 1))) - verify(combinedShadeHeadersConstraintManager, never()).emptyCutoutConstraints() + verify(combinedShadeHeadersConstraintManager, Mockito.never()).emptyCutoutConstraints() val offset = (width - paddingLeft - paddingRight - cutoutWidth) / 2 verify(combinedShadeHeadersConstraintManager).centerCutoutConstraints(true, offset) @@ -619,52 +761,8 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { @Test fun alarmIconNotIgnored() { - verify(statusIcons, never()).addIgnoredSlot( - context.getString(com.android.internal.R.string.status_bar_alarm_clock) - ) - } - - @Test - fun demoMode_attachDemoMode() { - verify(demoModeController).addCallback(capture(demoModeControllerCapture)) - demoModeControllerCapture.value.onDemoModeStarted() - verify(clock).onDemoModeStarted() - } - - @Test - fun demoMode_detachDemoMode() { - controller.simulateViewDetached() - verify(demoModeController).removeCallback(capture(demoModeControllerCapture)) - demoModeControllerCapture.value.onDemoModeFinished() - verify(clock).onDemoModeFinished() - } - - @Test - fun animateOutOnStartCustomizing() { - val animator = Mockito.mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - val duration = 1000L - whenever(view.animate()).thenReturn(animator) - - controller.startCustomizingAnimation(show = true, duration) - - verify(animator).setDuration(duration) - verify(animator).alpha(0f) - verify(animator).setInterpolator(Interpolators.ALPHA_OUT) - verify(animator).start() - } - - @Test - fun animateInOnEndCustomizing() { - val animator = Mockito.mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF) - val duration = 1000L - whenever(view.animate()).thenReturn(animator) - - controller.startCustomizingAnimation(show = false, duration) - - verify(animator).setDuration(duration) - verify(animator).alpha(1f) - verify(animator).setInterpolator(Interpolators.ALPHA_IN) - verify(animator).start() + verify(statusIcons, Mockito.never()) + .addIgnoredSlot(context.getString(com.android.internal.R.string.status_bar_alarm_clock)) } @Test @@ -674,11 +772,11 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { @Test fun privacyChipParentVisibleAlways() { - controller.largeScreenActive = true - controller.largeScreenActive = false - controller.largeScreenActive = true + shadeHeaderController.largeScreenActive = true + shadeHeaderController.largeScreenActive = false + shadeHeaderController.largeScreenActive = true - verify(privacyIconsController, never()).onParentInvisible() + verify(privacyIconsController, Mockito.never()).onParentInvisible() } @Test @@ -700,9 +798,9 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { fun onDensityOrFontScaleChanged_reloadConstraints() { // After density or font scale change, constraints need to be reloaded to reflect new // dimensions. - reset(qqsConstraints) - reset(qsConstraints) - reset(largeScreenConstraints) + Mockito.reset(qqsConstraints) + Mockito.reset(qsConstraints) + Mockito.reset(largeScreenConstraints) configurationController.notifyDensityOrFontScaleChanged() @@ -729,11 +827,11 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { } private fun View.executeLayoutChange( - left: Int, - top: Int, - right: Int, - bottom: Int, - listener: View.OnLayoutChangeListener + left: Int, + top: Int, + right: Int, + bottom: Int, + listener: View.OnLayoutChangeListener ) { val oldLeft = this.left val oldTop = this.top @@ -746,21 +844,19 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { whenever(this.height).thenReturn(bottom - top) whenever(this.width).thenReturn(right - left) listener.onLayoutChange( - this, - oldLeft, - oldTop, - oldRight, - oldBottom, - left, - top, - right, - bottom + this, + oldLeft, + oldTop, + oldRight, + oldBottom, + left, + top, + right, + bottom ) } - private fun createWindowInsets( - topCutout: Rect? = Rect() - ): WindowInsets { + private fun createWindowInsets(topCutout: Rect? = Rect()): WindowInsets { val windowInsets: WindowInsets = mock() val displayCutout: DisplayCutout = mock() whenever(windowInsets.displayCutout) @@ -795,17 +891,30 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { } private fun setUpDefaultInsets() { - whenever(combinedShadeHeadersConstraintManager - .edgesGuidelinesConstraints(anyInt(), anyInt(), anyInt(), anyInt()) - ).thenReturn(EMPTY_CHANGES) + whenever( + combinedShadeHeadersConstraintManager.edgesGuidelinesConstraints( + anyInt(), + anyInt(), + anyInt(), + anyInt() + ) + ) + .thenReturn(EMPTY_CHANGES) whenever(combinedShadeHeadersConstraintManager.emptyCutoutConstraints()) .thenReturn(EMPTY_CHANGES) - whenever(combinedShadeHeadersConstraintManager - .centerCutoutConstraints(anyBoolean(), anyInt()) - ).thenReturn(EMPTY_CHANGES) - whenever(combinedShadeHeadersConstraintManager - .privacyChipVisibilityConstraints(anyBoolean()) - ).thenReturn(EMPTY_CHANGES) + whenever( + combinedShadeHeadersConstraintManager.centerCutoutConstraints( + Mockito.anyBoolean(), + anyInt() + ) + ) + .thenReturn(EMPTY_CHANGES) + whenever( + combinedShadeHeadersConstraintManager.privacyChipVisibilityConstraints( + Mockito.anyBoolean() + ) + ) + .thenReturn(EMPTY_CHANGES) whenever(insetsProvider.getStatusBarContentInsetsForCurrentRotation()) .thenReturn(Pair(0, 0).toAndroidPair()) whenever(insetsProvider.currentRotationHasCornerCutout()).thenReturn(false) @@ -814,11 +923,11 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { private fun setupCurrentInsets(cutout: DisplayCutout?) { val mockedDisplay = - mock<Display>().also { display -> whenever(display.cutout).thenReturn(cutout) } + mock<Display>().also { display -> whenever(display.cutout).thenReturn(cutout) } whenever(viewContext.display).thenReturn(mockedDisplay) } - private fun<T, U> Pair<T, U>.toAndroidPair(): android.util.Pair<T, U> { + private fun <T, U> Pair<T, U>.toAndroidPair(): android.util.Pair<T, U> { return android.util.Pair(first, second) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt index 7cac854c0853..d5a1f804e6a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt @@ -2,37 +2,24 @@ package com.android.systemui.shade.transition import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest -import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager -import com.android.systemui.plugins.qs.QS -import com.android.systemui.shade.NotificationPanelViewController import com.android.systemui.shade.STATE_OPENING import com.android.systemui.shade.ShadeExpansionChangeEvent import com.android.systemui.shade.ShadeExpansionStateManager -import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.SysuiStatusBarStateController -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.policy.FakeConfigurationController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @SmallTest class ShadeTransitionControllerTest : SysuiTestCase() { - @Mock private lateinit var npvc: NotificationPanelViewController - @Mock private lateinit var nsslController: NotificationStackScrollLayoutController - @Mock private lateinit var qs: QS - @Mock private lateinit var noOpOverScroller: NoOpOverScroller - @Mock private lateinit var splitShadeOverScroller: SplitShadeOverScroller @Mock private lateinit var scrimShadeTransitionController: ScrimShadeTransitionController @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController @@ -52,119 +39,19 @@ class ShadeTransitionControllerTest : SysuiTestCase() { shadeExpansionStateManager, dumpManager, context, - splitShadeOverScrollerFactory = { _, _ -> splitShadeOverScroller }, - noOpOverScroller, scrimShadeTransitionController, statusBarStateController, ) - - // Resetting as they are notified upon initialization. - reset(noOpOverScroller, splitShadeOverScroller) - } - - @Test - fun onPanelExpansionChanged_inSplitShade_forwardsToSplitShadeOverScroller() { - initLateProperties() - enableSplitShade() - - startPanelExpansion() - - verify(splitShadeOverScroller).onPanelStateChanged(STATE_OPENING) - verify(splitShadeOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(noOpOverScroller) - } - - @Test - fun onPanelStateChanged_inSplitShade_propertiesNotInitialized_forwardsToNoOpOverScroller() { - enableSplitShade() - - startPanelExpansion() - - verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) - verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(splitShadeOverScroller) - } - - @Test - fun onPanelStateChanged_inSplitShade_onKeyguard_forwardsToNoOpOverScroller() { - initLateProperties() - enableSplitShade() - setOnKeyguard() - - startPanelExpansion() - - verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) - verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(splitShadeOverScroller) - } - - @Test - fun onPanelStateChanged_inSplitShade_onLockedShade_forwardsToNoOpOverScroller() { - initLateProperties() - enableSplitShade() - setOnLockedShade() - - startPanelExpansion() - - verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) - verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(splitShadeOverScroller) - } - - @Test - fun onPanelExpansionChanged_inSplitShade_onUnlockedShade_forwardsToSplitShadeOverScroller() { - initLateProperties() - enableSplitShade() - setOnUnlockedShade() - - startPanelExpansion() - - verify(splitShadeOverScroller).onPanelStateChanged(STATE_OPENING) - verify(splitShadeOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(noOpOverScroller) - } - - @Test - fun onPanelStateChanged_notInSplitShade_forwardsToNoOpOverScroller() { - initLateProperties() - disableSplitShade() - - startPanelExpansion() - - verify(noOpOverScroller).onPanelStateChanged(STATE_OPENING) - verify(noOpOverScroller).onDragDownAmountChanged(DEFAULT_DRAG_DOWN_AMOUNT) - verifyZeroInteractions(splitShadeOverScroller) } @Test fun onPanelStateChanged_forwardsToScrimTransitionController() { - initLateProperties() - startPanelExpansion() verify(scrimShadeTransitionController).onPanelStateChanged(STATE_OPENING) verify(scrimShadeTransitionController).onPanelExpansionChanged(DEFAULT_EXPANSION_EVENT) } - private fun initLateProperties() { - controller.qs = qs - controller.notificationStackScrollLayoutController = nsslController - controller.notificationPanelViewController = npvc - } - - private fun disableSplitShade() { - setSplitShadeEnabled(false) - } - - private fun enableSplitShade() { - setSplitShadeEnabled(true) - } - - private fun setSplitShadeEnabled(enabled: Boolean) { - overrideResource(R.bool.config_use_split_notification_shade, enabled) - configurationController.notifyConfigurationChanged() - } - private fun startPanelExpansion() { shadeExpansionStateManager.onPanelExpansionChanged( DEFAULT_EXPANSION_EVENT.fraction, @@ -174,23 +61,6 @@ class ShadeTransitionControllerTest : SysuiTestCase() { ) } - private fun setOnKeyguard() { - setShadeState(StatusBarState.KEYGUARD) - } - - private fun setOnLockedShade() { - setShadeState(StatusBarState.SHADE_LOCKED) - } - - private fun setOnUnlockedShade() { - setShadeState(StatusBarState.SHADE) - } - - private fun setShadeState(state: Int) { - whenever(statusBarStateController.state).thenReturn(state) - whenever(statusBarStateController.currentOrUpcomingState).thenReturn(state) - } - companion object { private const val DEFAULT_DRAG_DOWN_AMOUNT = 123f private val DEFAULT_EXPANSION_EVENT = diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/SplitShadeOverScrollerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/SplitShadeOverScrollerTest.kt deleted file mode 100644 index 0e48b4835dfe..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/SplitShadeOverScrollerTest.kt +++ /dev/null @@ -1,112 +0,0 @@ -package com.android.systemui.shade.transition - -import android.testing.AndroidTestingRunner -import android.testing.TestableLooper -import androidx.test.filters.SmallTest -import com.android.systemui.R -import com.android.systemui.SysuiTestCase -import com.android.systemui.dump.DumpManager -import com.android.systemui.plugins.qs.QS -import com.android.systemui.shade.STATE_CLOSED -import com.android.systemui.shade.STATE_OPEN -import com.android.systemui.shade.STATE_OPENING -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController -import com.android.systemui.statusbar.phone.ScrimController -import com.android.systemui.statusbar.policy.FakeConfigurationController -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.Mockito.atLeastOnce -import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.Mockito.`when` as whenever -import org.mockito.MockitoAnnotations - -@RunWith(AndroidTestingRunner::class) -@TestableLooper.RunWithLooper(setAsMainLooper = true) -@SmallTest -class SplitShadeOverScrollerTest : SysuiTestCase() { - - @Mock private lateinit var dumpManager: DumpManager - @Mock private lateinit var scrimController: ScrimController - @Mock private lateinit var qs: QS - @Mock private lateinit var nsslController: NotificationStackScrollLayoutController - - private val configurationController = FakeConfigurationController() - private lateinit var overScroller: SplitShadeOverScroller - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - - whenever(nsslController.height).thenReturn(1000) - overScroller = - SplitShadeOverScroller( - configurationController, - dumpManager, - context, - scrimController, - { qs }, - { nsslController }) - } - - @Test - fun onDragDownAmountChanged_panelOpening_overScrolls_basedOnHeightAndMaxAmount() { - val maxOverScrollAmount = 50 - val dragDownAmount = 100f - overrideResource(R.dimen.shade_max_over_scroll_amount, maxOverScrollAmount) - configurationController.notifyConfigurationChanged() - - overScroller.onPanelStateChanged(STATE_OPENING) - overScroller.onDragDownAmountChanged(dragDownAmount) - - val expectedOverScrollAmount = - (dragDownAmount / nsslController.height * maxOverScrollAmount).toInt() - verify(qs).setOverScrollAmount(expectedOverScrollAmount) - verify(nsslController).setOverScrollAmount(expectedOverScrollAmount) - verify(scrimController).setNotificationsOverScrollAmount(expectedOverScrollAmount) - } - - @Test - fun onDragDownAmountChanged_panelClosed_doesNotOverScroll() { - overScroller.onPanelStateChanged(STATE_CLOSED) - overScroller.onDragDownAmountChanged(100f) - - verifyZeroInteractions(qs, scrimController, nsslController) - } - - @Test - fun onDragDownAmountChanged_panelOpen_doesNotOverScroll() { - overScroller.onPanelStateChanged(STATE_OPEN) - overScroller.onDragDownAmountChanged(100f) - - verifyZeroInteractions(qs, scrimController, nsslController) - } - - @Test - fun onPanelStateChanged_opening_thenOpen_releasesOverScroll() { - overScroller.onPanelStateChanged(STATE_OPENING) - overScroller.onDragDownAmountChanged(100f) - - overScroller.onPanelStateChanged(STATE_OPEN) - overScroller.finishAnimations() - - verify(qs, atLeastOnce()).setOverScrollAmount(0) - verify(scrimController, atLeastOnce()).setNotificationsOverScrollAmount(0) - verify(nsslController, atLeastOnce()).setOverScrollAmount(0) - } - - @Test - fun onPanelStateChanged_opening_thenClosed_releasesOverScroll() { - overScroller.onPanelStateChanged(STATE_OPENING) - overScroller.onDragDownAmountChanged(100f) - - overScroller.onPanelStateChanged(STATE_CLOSED) - overScroller.finishAnimations() - - verify(qs, atLeastOnce()).setOverScrollAmount(0) - verify(scrimController, atLeastOnce()).setNotificationsOverScrollAmount(0) - verify(nsslController, atLeastOnce()).setOverScrollAmount(0) - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt index 26eff61066ee..1fdb3647fcb2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt @@ -35,7 +35,6 @@ import junit.framework.Assert.fail import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope -import org.json.JSONException import org.junit.Before import org.junit.Rule import org.junit.Test @@ -271,10 +270,14 @@ class ClockRegistryTest : SysuiTestCase() { @Test fun jsonDeserialization_gotExpectedObject() { - val expected = ClockSettings("ID", null).apply { _applied_timestamp = 500 } + val expected = ClockSettings("ID", null).apply { + metadata.put("appliedTimestamp", 500) + } val actual = ClockSettings.deserialize("""{ "clockId":"ID", - "_applied_timestamp":500 + "metadata": { + "appliedTimestamp":500 + } }""") assertEquals(expected, actual) } @@ -291,29 +294,32 @@ class ClockRegistryTest : SysuiTestCase() { val expected = ClockSettings("ID", null) val actual = ClockSettings.deserialize("""{ "clockId":"ID", - "_applied_timestamp":null + "metadata":null }""") assertEquals(expected, actual) } - @Test(expected = JSONException::class) - fun jsonDeserialization_noId_threwException() { - val expected = ClockSettings(null, null).apply { _applied_timestamp = 500 } - val actual = ClockSettings.deserialize("{\"_applied_timestamp\":500}") + @Test + fun jsonDeserialization_noId_deserializedEmpty() { + val expected = ClockSettings(null, null).apply { + metadata.put("appliedTimestamp", 500) + } + val actual = ClockSettings.deserialize("{\"metadata\":{\"appliedTimestamp\":500}}") assertEquals(expected, actual) } @Test fun jsonSerialization_gotExpectedString() { - val expected = "{\"clockId\":\"ID\",\"_applied_timestamp\":500}" - val actual = ClockSettings.serialize(ClockSettings("ID", null) - .apply { _applied_timestamp = 500 }) + val expected = "{\"clockId\":\"ID\",\"metadata\":{\"appliedTimestamp\":500}}" + val actual = ClockSettings.serialize(ClockSettings("ID", null).apply { + metadata.put("appliedTimestamp", 500) + }) assertEquals(expected, actual) } @Test fun jsonSerialization_noTimestamp_gotExpectedString() { - val expected = "{\"clockId\":\"ID\"}" + val expected = "{\"clockId\":\"ID\",\"metadata\":{}}" val actual = ClockSettings.serialize(ClockSettings("ID", null)) assertEquals(expected, actual) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt index cd2efc061b72..7fa27f34cd9f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt @@ -26,6 +26,7 @@ import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase +import com.android.systemui.plugins.ClockSettings import com.android.systemui.shared.clocks.DefaultClockController.Companion.DOZE_COLOR import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq @@ -40,7 +41,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyFloat -import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.notNull import org.mockito.Mock import org.mockito.Mockito.never @@ -97,13 +97,14 @@ class DefaultClockProviderTest : SysuiTestCase() { @Test fun defaultClock_initialize() { val clock = provider.createClock(DEFAULT_CLOCK_ID) - verify(mockSmallClockView).setColors(Color.MAGENTA, Color.MAGENTA) - verify(mockLargeClockView).setColors(Color.MAGENTA, Color.MAGENTA) + verify(mockSmallClockView).setColors(DOZE_COLOR, Color.MAGENTA) + verify(mockLargeClockView).setColors(DOZE_COLOR, Color.MAGENTA) clock.initialize(resources, 0f, 0f) - verify(mockSmallClockView).setColors(eq(DOZE_COLOR), anyInt()) - verify(mockLargeClockView).setColors(eq(DOZE_COLOR), anyInt()) + val expectedColor = 0 + verify(mockSmallClockView).setColors(DOZE_COLOR, expectedColor) + verify(mockLargeClockView).setColors(DOZE_COLOR, expectedColor) verify(mockSmallClockView).onTimeZoneChanged(notNull()) verify(mockLargeClockView).onTimeZoneChanged(notNull()) verify(mockSmallClockView).refreshTime() @@ -159,15 +160,31 @@ class DefaultClockProviderTest : SysuiTestCase() { @Test fun defaultClock_events_onColorPaletteChanged() { + val expectedColor = 0 val clock = provider.createClock(DEFAULT_CLOCK_ID) - verify(mockSmallClockView).setColors(Color.MAGENTA, Color.MAGENTA) - verify(mockLargeClockView).setColors(Color.MAGENTA, Color.MAGENTA) + verify(mockSmallClockView).setColors(DOZE_COLOR, Color.MAGENTA) + verify(mockLargeClockView).setColors(DOZE_COLOR, Color.MAGENTA) clock.events.onColorPaletteChanged(resources) - verify(mockSmallClockView).setColors(eq(DOZE_COLOR), anyInt()) - verify(mockLargeClockView).setColors(eq(DOZE_COLOR), anyInt()) + verify(mockSmallClockView).setColors(DOZE_COLOR, expectedColor) + verify(mockLargeClockView).setColors(DOZE_COLOR, expectedColor) + } + + @Test + fun defaultClock_events_onSeedColorChanged() { + val initSeedColor = 10 + val newSeedColor = 20 + val clock = provider.createClock(ClockSettings(DEFAULT_CLOCK_ID, initSeedColor)) + + verify(mockSmallClockView).setColors(DOZE_COLOR, initSeedColor) + verify(mockLargeClockView).setColors(DOZE_COLOR, initSeedColor) + + clock.events.onSeedColorChanged(newSeedColor) + + verify(mockSmallClockView).setColors(DOZE_COLOR, newSeedColor) + verify(mockLargeClockView).setColors(DOZE_COLOR, newSeedColor) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 452606dfcca4..8ee1ea8a9916 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -44,6 +44,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; +import com.android.internal.widget.LockPatternUtils; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; @@ -354,7 +355,8 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { mDeviceProvisionedController, mKeyguardStateController, mSettings, - mock(DumpManager.class)); + mock(DumpManager.class), + mock(LockPatternUtils.class)); } public BroadcastReceiver getBaseBroadcastReceiverForTest() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/FakeStatusEvent.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/FakeStatusEvent.kt new file mode 100644 index 000000000000..cd0646543e69 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/FakeStatusEvent.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.events + +/** + * This is a freely configurable implementation of [StatusEvent]. It is intended to be used in + * tests. + */ +class FakeStatusEvent( + override val viewCreator: ViewCreator, + override val priority: Int = 50, + override var forceVisible: Boolean = false, + override val showAnimation: Boolean = true, + override var contentDescription: String? = "", +) : StatusEvent diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt new file mode 100644 index 000000000000..08a9f3139d71 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt @@ -0,0 +1,470 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.events + +import android.graphics.Rect +import android.os.Process +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper +import android.view.View +import android.widget.FrameLayout +import androidx.core.animation.AnimatorTestRule +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.dump.DumpManager +import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.privacy.OngoingPrivacyChip +import com.android.systemui.statusbar.BatteryStatusChip +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.whenever +import com.android.systemui.util.time.FakeSystemClock +import junit.framework.Assert.assertEquals +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.anyBoolean +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper(setAsMainLooper = true) +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { + + @Mock private lateinit var systemEventCoordinator: SystemEventCoordinator + @Mock private lateinit var statusBarWindowController: StatusBarWindowController + @Mock private lateinit var statusBarContentInsetProvider: StatusBarContentInsetsProvider + @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var listener: SystemStatusAnimationCallback + + private lateinit var systemClock: FakeSystemClock + private lateinit var chipAnimationController: SystemEventChipAnimationController + private lateinit var systemStatusAnimationScheduler: SystemStatusAnimationScheduler + private val fakeFeatureFlags = FakeFeatureFlags() + + @get:Rule val animatorTestRule = AnimatorTestRule() + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + + fakeFeatureFlags.set(Flags.PLUG_IN_STATUS_BAR_CHIP, true) + + systemClock = FakeSystemClock() + chipAnimationController = + SystemEventChipAnimationController( + mContext, + statusBarWindowController, + statusBarContentInsetProvider, + fakeFeatureFlags + ) + + // ensure that isTooEarly() check in SystemStatusAnimationScheduler does not return true + systemClock.advanceTime(Process.getStartUptimeMillis() + MIN_UPTIME) + + // StatusBarContentInsetProvider is mocked. Ensure that it returns some mocked values. + whenever(statusBarContentInsetProvider.getStatusBarContentInsetsForCurrentRotation()) + .thenReturn(android.util.Pair(10, 10)) + whenever(statusBarContentInsetProvider.getStatusBarContentAreaForCurrentRotation()) + .thenReturn(Rect(10, 0, 990, 100)) + + // StatusBarWindowController is mocked. The addViewToWindow function needs to be mocked to + // ensure that the chip view is added to a parent view + whenever(statusBarWindowController.addViewToWindow(any(), any())).then { + val statusbarFake = FrameLayout(mContext) + statusbarFake.layout(0, 0, 1000, 100) + statusbarFake.addView( + it.arguments[0] as View, + it.arguments[1] as FrameLayout.LayoutParams + ) + } + } + + @Test + fun testBatteryStatusEvent_standardAnimationLifecycle() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + val batteryChip = createAndScheduleFakeBatteryEvent() + + // assert that animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // skip debounce delay + advanceTimeBy(DEBOUNCE_DELAY + 1) + // status chip starts animating in after debounce delay + assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(0f, batteryChip.contentView.alpha) + assertEquals(0f, batteryChip.view.alpha) + verify(listener, times(1)).onSystemEventAnimationBegin() + + // skip appear animation + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + advanceTimeBy(APPEAR_ANIMATION_DURATION) + // assert that status chip is visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, batteryChip.contentView.alpha) + assertEquals(1f, batteryChip.view.alpha) + + // skip status chip display time + advanceTimeBy(DISPLAY_LENGTH + 1) + // assert that it is still visible but switched to the ANIMATING_OUT state + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, batteryChip.contentView.alpha) + assertEquals(1f, batteryChip.view.alpha) + verify(listener, times(1)).onSystemEventAnimationFinish(false) + + // skip disappear animation + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + // assert that it is not visible anymore + assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(0f, batteryChip.contentView.alpha) + assertEquals(0f, batteryChip.view.alpha) + } + + @Test + fun testPrivacyStatusEvent_standardAnimationLifecycle() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + val privacyChip = createAndScheduleFakePrivacyEvent() + + // assert that animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // skip debounce delay + advanceTimeBy(DEBOUNCE_DELAY + 1) + // status chip starts animating in after debounce delay + assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(0f, privacyChip.view.alpha) + verify(listener, times(1)).onSystemEventAnimationBegin() + + // skip appear animation + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + advanceTimeBy(APPEAR_ANIMATION_DURATION + 1) + // assert that status chip is visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + + // skip status chip display time + advanceTimeBy(DISPLAY_LENGTH + 1) + // assert that it is still visible but switched to the ANIMATING_OUT state + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + verify(listener, times(1)).onSystemEventAnimationFinish(true) + verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) + + // skip transition to persistent dot + advanceTimeBy(DISAPPEAR_ANIMATION_DURATION + 1) + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + // assert that it the dot is now visible + assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + + // notify SystemStatusAnimationScheduler to remove persistent dot + systemStatusAnimationScheduler.removePersistentDot() + // assert that IDLE state is entered + assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onHidePersistentDot() + } + + @Test + fun testHighPriorityEvent_takesPrecedenceOverScheduledLowPriorityEvent() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule low priority event + val batteryChip = createAndScheduleFakeBatteryEvent() + batteryChip.view.alpha = 0f + + // assert that animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // create and schedule high priority event + val privacyChip = createAndScheduleFakePrivacyEvent() + + // assert that animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // skip debounce delay and appear animation duration + fastForwardAnimationToState(RUNNING_CHIP_ANIM) + + // high priority status chip is visible while low priority status chip is not visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + assertEquals(0f, batteryChip.view.alpha) + } + + @Test + fun testHighPriorityEvent_cancelsCurrentlyDisplayedLowPriorityEvent() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule low priority event + val batteryChip = createAndScheduleFakeBatteryEvent() + + // fast forward to RUNNING_CHIP_ANIM state + fastForwardAnimationToState(RUNNING_CHIP_ANIM) + + // assert that chip is displayed + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, batteryChip.view.alpha) + + // create and schedule high priority event + val privacyChip = createAndScheduleFakePrivacyEvent() + + // ensure that the event cancellation coroutine is started by the test scope + testScheduler.runCurrent() + + // assert that currently displayed chip is immediately animated out + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + + // skip disappear animation + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + + // assert that high priority privacy chip animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // skip debounce delay and appear animation + advanceTimeBy(DEBOUNCE_DELAY + APPEAR_ANIMATION_DURATION + 1) + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + + // high priority status chip is visible while low priority status chip is not visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + assertEquals(0f, batteryChip.view.alpha) + } + + @Test + fun testHighPriorityEvent_cancelsCurrentlyAnimatedLowPriorityEvent() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule low priority event + val batteryChip = createAndScheduleFakeBatteryEvent() + + // skip debounce delay + advanceTimeBy(DEBOUNCE_DELAY + 1) + + // assert that chip is animated in + assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + + // create and schedule high priority event + val privacyChip = createAndScheduleFakePrivacyEvent() + + // ensure that the event cancellation coroutine is started by the test scope + testScheduler.runCurrent() + + // assert that currently animated chip keeps animating + assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + + // skip appear animation + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + advanceTimeBy(APPEAR_ANIMATION_DURATION + 1) + + // assert that low priority chip is animated out immediately after finishing the appear + // animation + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + + // skip disappear animation + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + + // assert that high priority privacy chip animation is queued + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + + // skip debounce delay and appear animation + advanceTimeBy(DEBOUNCE_DELAY + APPEAR_ANIMATION_DURATION + 1) + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + + // high priority status chip is visible while low priority status chip is not visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + assertEquals(0f, batteryChip.view.alpha) + } + + @Test + fun testHighPriorityEvent_isNotReplacedByLowPriorityEvent() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule high priority event + val privacyChip = createAndScheduleFakePrivacyEvent() + + // create and schedule low priority event + val batteryChip = createAndScheduleFakeBatteryEvent() + batteryChip.view.alpha = 0f + + // skip debounce delay and appear animation + advanceTimeBy(DEBOUNCE_DELAY + APPEAR_ANIMATION_DURATION + 1) + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + + // high priority status chip is visible while low priority status chip is not visible + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(1f, privacyChip.view.alpha) + assertEquals(0f, batteryChip.view.alpha) + } + + @Test + fun testPrivacyDot_isRemoved() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule high priority event + createAndScheduleFakePrivacyEvent() + + // skip chip animation lifecycle and fast forward to SHOWING_PERSISTENT_DOT state + fastForwardAnimationToState(SHOWING_PERSISTENT_DOT) + assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) + + // remove persistent dot and verify that animationState changes to IDLE + systemStatusAnimationScheduler.removePersistentDot() + assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onHidePersistentDot() + } + + @Test + fun testPrivacyDot_isRemovedDuringChipAnimation() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule high priority event + createAndScheduleFakePrivacyEvent() + + // skip chip animation lifecycle and fast forward to RUNNING_CHIP_ANIM state + fastForwardAnimationToState(RUNNING_CHIP_ANIM) + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + + // request removal of persistent dot + systemStatusAnimationScheduler.removePersistentDot() + + // skip display time and verify that disappear animation is run + advanceTimeBy(DISPLAY_LENGTH + 1) + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + + // skip disappear animation and verify that animationState changes to IDLE instead of + // SHOWING_PERSISTENT_DOT + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + // verify that the persistent dot callbacks are not invoked + verify(listener, never()).onSystemStatusAnimationTransitionToPersistentDot(any()) + verify(listener, never()).onHidePersistentDot() + } + + @Test + fun testNewEvent_isScheduled_whenPostedDuringRemovalAnimation() = runTest { + // Instantiate class under test with TestScope from runTest + initializeSystemStatusAnimationScheduler(testScope = this) + + // create and schedule high priority event + createAndScheduleFakePrivacyEvent() + + // skip chip animation lifecycle and fast forward to ANIMATING_OUT state + fastForwardAnimationToState(ANIMATING_OUT) + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) + + // request removal of persistent dot + systemStatusAnimationScheduler.removePersistentDot() + testScheduler.runCurrent() + + // schedule another high priority event while the event is animating out + createAndScheduleFakePrivacyEvent() + + // verify that the state is still ANIMATING_OUT + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + + // skip disappear animation duration and verify that new state is ANIMATION_QUEUED + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + testScheduler.runCurrent() + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + // also verify that onHidePersistentDot callback is called + verify(listener, times(1)).onHidePersistentDot() + } + + private fun TestScope.fastForwardAnimationToState(@SystemAnimationState animationState: Int) { + // this function should only be called directly after posting a status event + assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + if (animationState == IDLE || animationState == ANIMATION_QUEUED) return + // skip debounce delay + advanceTimeBy(DEBOUNCE_DELAY + 1) + + // status chip starts animating in after debounce delay + assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onSystemEventAnimationBegin() + if (animationState == ANIMATING_IN) return + + // skip appear animation + animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) + advanceTimeBy(APPEAR_ANIMATION_DURATION) + assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + if (animationState == RUNNING_CHIP_ANIM) return + + // skip status chip display time + advanceTimeBy(DISPLAY_LENGTH + 1) + assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + verify(listener, times(1)).onSystemEventAnimationFinish(anyBoolean()) + if (animationState == ANIMATING_OUT) return + + // skip disappear animation + animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) + } + + private fun createAndScheduleFakePrivacyEvent(): OngoingPrivacyChip { + val privacyChip = OngoingPrivacyChip(mContext) + val fakePrivacyStatusEvent = + FakeStatusEvent(viewCreator = { privacyChip }, priority = 100, forceVisible = true) + systemStatusAnimationScheduler.onStatusEvent(fakePrivacyStatusEvent) + return privacyChip + } + + private fun createAndScheduleFakeBatteryEvent(): BatteryStatusChip { + val batteryChip = BatteryStatusChip(mContext) + val fakeBatteryEvent = + FakeStatusEvent(viewCreator = { batteryChip }, priority = 50, forceVisible = false) + systemStatusAnimationScheduler.onStatusEvent(fakeBatteryEvent) + return batteryChip + } + + private fun initializeSystemStatusAnimationScheduler(testScope: TestScope) { + systemStatusAnimationScheduler = + SystemStatusAnimationSchedulerImpl( + systemEventCoordinator, + chipAnimationController, + statusBarWindowController, + dumpManager, + systemClock, + CoroutineScope(StandardTestDispatcher(testScope.testScheduler)) + ) + // add a mock listener + systemStatusAnimationScheduler.addCallback(listener) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index 7fdcfb210804..2de57051d4f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.lockscreen +import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceManager import android.app.smartspace.SmartspaceSession import android.app.smartspace.SmartspaceSession.OnTargetsAvailableListener @@ -26,6 +27,7 @@ import android.content.pm.UserInfo import android.database.ContentObserver import android.graphics.drawable.Drawable import android.net.Uri +import android.os.Bundle import android.os.Handler import android.os.UserHandle import android.provider.Settings @@ -43,6 +45,7 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.plugins.FalsingManager +import com.android.systemui.plugins.WeatherData import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener import com.android.systemui.settings.UserTracker @@ -54,6 +57,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceP import com.android.systemui.util.concurrency.FakeExecution import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.argThat import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.settings.SecureSettings @@ -69,6 +73,7 @@ import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.spy +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import java.util.Optional @@ -76,6 +81,13 @@ import java.util.concurrent.Executor @SmallTest class LockscreenSmartspaceControllerTest : SysuiTestCase() { + companion object { + const val SMARTSPACE_TIME_TOO_EARLY = 1000L + const val SMARTSPACE_TIME_JUST_RIGHT = 4000L + const val SMARTSPACE_TIME_TOO_LATE = 9000L + const val SMARTSPACE_CREATION_TIME = 1234L + const val SMARTSPACE_EXPIRY_TIME = 5678L + } @Mock private lateinit var featureFlags: FeatureFlags @Mock @@ -224,6 +236,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { smartspaceManager, activityStarter, falsingManager, + clock, secureSettings, userTracker, contentResolver, @@ -529,6 +542,190 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { } @Test + fun testSessionListener_ifWeatherExtraMissing_thenWeatherDataNotSent() { + connectSession() + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeTarget(1, userHandlePrimary, isSensitive = true), + makeTarget(2, userHandlePrimary, featureType = SmartspaceTarget.FEATURE_WEATHER) + + ) + sessionListener.onTargetsAvailable(targets) + verify(keyguardUpdateMonitor, times(0)).sendWeatherData(any()) + } + + @Test + fun testSessionListener_ifWeatherExtraIsMissingValues_thenWeatherDataNotSent() { + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeTarget(1, userHandlePrimary, isSensitive = true), + makeWeatherTargetWithExtras( + id = 2, + userHandle = userHandlePrimary, + description = null, + state = WeatherData.WeatherStateIcon.SUNNY.id, + temperature = "32", + useCelsius = null) + + ) + + sessionListener.onTargetsAvailable(targets) + + verify(keyguardUpdateMonitor, times(0)).sendWeatherData(any()) + } + + @Test + fun testSessionListener_ifTooEarly_thenWeatherDataNotSent() { + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_TOO_EARLY) + // WHEN we receive a list of targets + val targets = listOf( + makeWeatherTargetWithExtras( + id = 1, + userHandle = userHandleManaged, + description = "Sunny", + state = WeatherData.WeatherStateIcon.SUNNY.id, + temperature = "32", + useCelsius = false) + ) + sessionListener.onTargetsAvailable(targets) + verify(keyguardUpdateMonitor, times(0)).sendWeatherData(any()) + } + + @Test + fun testSessionListener_ifOnTime_thenWeatherDataSent() { + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeWeatherTargetWithExtras( + id = 1, + userHandle = userHandleManaged, + description = "Snow Showers", + state = WeatherData.WeatherStateIcon.SNOW_SHOWERS_SNOW.id, + temperature = "-1", + useCelsius = false) + ) + sessionListener.onTargetsAvailable(targets) + verify(keyguardUpdateMonitor).sendWeatherData(argThat { w -> + w.description == "Snow Showers" && + w.state == WeatherData.WeatherStateIcon.SNOW_SHOWERS_SNOW && + w.temperature == -1 && !w.useCelsius + }) + } + + @Test + fun testSessionListener_ifTooLate_thenWeatherDataNotSent() { + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_TOO_LATE) + // WHEN we receive a list of targets + val targets = listOf( + makeWeatherTargetWithExtras( + id = 1, + userHandle = userHandleManaged, + description = "Sunny", + state = WeatherData.WeatherStateIcon.SUNNY.id, + temperature = "72", + useCelsius = false) + ) + sessionListener.onTargetsAvailable(targets) + verify(keyguardUpdateMonitor, times(0)).sendWeatherData(any()) + } + + @Test + fun testSessionListener_onlyFirstWeatherDataSent() { + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeWeatherTargetWithExtras( + id = 1, + userHandle = userHandleManaged, + description = "Sunny", + state = WeatherData.WeatherStateIcon.SUNNY.id, + temperature = "72", + useCelsius = false), + makeWeatherTargetWithExtras( + id = 2, + userHandle = userHandleManaged, + description = "Showers", + state = WeatherData.WeatherStateIcon.SHOWERS_RAIN.id, + temperature = "62", + useCelsius = true) + ) + sessionListener.onTargetsAvailable(targets) + verify(keyguardUpdateMonitor).sendWeatherData(argThat { w -> + w.description == "Sunny" && + w.state == WeatherData.WeatherStateIcon.SUNNY && + w.temperature == 72 && !w.useCelsius + }) + } + + @Test + fun testSessionListener_ifDecouplingEnabled_weatherDataUpdates() { + `when`(featureFlags.isEnabled(Flags.SMARTSPACE_DATE_WEATHER_DECOUPLED)).thenReturn(true) + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeTarget(1, userHandlePrimary, isSensitive = true), + makeTarget(2, userHandlePrimary), + makeTarget(3, userHandleManaged), + makeWeatherTargetWithExtras( + id = 4, + userHandle = userHandlePrimary, + description = "Flurries", + state = WeatherData.WeatherStateIcon.FLURRIES.id, + temperature = "0", + useCelsius = true) + ) + + sessionListener.onTargetsAvailable(targets) + + verify(keyguardUpdateMonitor).sendWeatherData(argThat { w -> + w.description == "Flurries" && + w.state == WeatherData.WeatherStateIcon.FLURRIES && + w.temperature == 0 && w.useCelsius + }) + } + + @Test + fun testSessionListener_ifDecouplingDisabled_weatherDataUpdates() { + `when`(featureFlags.isEnabled(Flags.SMARTSPACE_DATE_WEATHER_DECOUPLED)).thenReturn(false) + connectSession() + + clock.setCurrentTimeMillis(SMARTSPACE_TIME_JUST_RIGHT) + // WHEN we receive a list of targets + val targets = listOf( + makeWeatherTargetWithExtras( + id = 1, + userHandle = userHandlePrimary, + description = "Sunny", + state = WeatherData.WeatherStateIcon.SUNNY.id, + temperature = "32", + useCelsius = false), + makeTarget(2, userHandlePrimary, isSensitive = true) + ) + + sessionListener.onTargetsAvailable(targets) + + verify(keyguardUpdateMonitor).sendWeatherData(argThat { w -> + w.description == "Sunny" && + w.state == WeatherData.WeatherStateIcon.SUNNY && + w.temperature == 32 && !w.useCelsius + }) + } + + @Test fun testSettingsAreReloaded() { // GIVEN a connected session where the privacy settings later flip to false connectSession() @@ -740,7 +937,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { return userInfo } - fun makeTarget( + private fun makeTarget( id: Int, userHandle: UserHandle, isSensitive: Boolean = false, @@ -755,6 +952,38 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { .build() } + private fun makeWeatherTargetWithExtras( + id: Int, + userHandle: UserHandle, + description: String?, + state: Int?, + temperature: String?, + useCelsius: Boolean? + ): SmartspaceTarget { + val mockWeatherBundle = mock(Bundle::class.java).apply { + `when`(getString(WeatherData.DESCRIPTION_KEY)).thenReturn(description) + if (state != null) + `when`(getInt(eq(WeatherData.STATE_KEY), any())).thenReturn(state) + `when`(getString(WeatherData.TEMPERATURE_KEY)).thenReturn(temperature) + `when`(containsKey(WeatherData.USE_CELSIUS_KEY)).thenReturn(useCelsius != null) + if (useCelsius != null) + `when`(getBoolean(WeatherData.USE_CELSIUS_KEY)).thenReturn(useCelsius) + } + + val mockBaseAction = mock(SmartspaceAction::class.java) + `when`(mockBaseAction.extras).thenReturn(mockWeatherBundle) + return SmartspaceTarget.Builder( + "targetWithWeatherExtras$id", + ComponentName("testpackage", "testclass$id"), + userHandle) + .setSensitive(false) + .setFeatureType(SmartspaceTarget.FEATURE_WEATHER) + .setBaseAction(mockBaseAction) + .setExpiryTimeMillis(SMARTSPACE_EXPIRY_TIME) + .setCreationTimeMillis(SMARTSPACE_CREATION_TIME) + .build() + } + private fun setAllowPrivateNotifications(user: UserHandle, value: Boolean) { `when`(secureSettings.getIntForUser( eq(PRIVATE_LOCKSCREEN_SETTING), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt new file mode 100644 index 000000000000..7a6779684fc5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.statusbar.StatusBarState +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class NotificationWakeUpCoordinatorLoggerTest : SysuiTestCase() { + + private val logBufferCounter = LogBufferCounter() + private lateinit var logger: NotificationWakeUpCoordinatorLogger + + private fun verifyDidLog(times: Int) { + logBufferCounter.verifyDidLog(times) + } + + @Before + fun setup() { + logger = NotificationWakeUpCoordinatorLogger(logBufferCounter.logBuffer) + } + + @Test + fun setDozeAmountWillThrottleFractionalUpdates() { + logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false) + verifyDidLog(1) + logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(1) + logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(0) + logger.logSetDozeAmount(1f, 1f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(1) + } + + @Test + fun setDozeAmountWillIncludeFractionalUpdatesWhenStateChanges() { + logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false) + verifyDidLog(1) + logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(1) + logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(0) + logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.KEYGUARD, changed = false) + verifyDidLog(1) + } + + @Test + fun setDozeAmountWillIncludeFractionalUpdatesWhenSourceChanges() { + logger.logSetDozeAmount(0f, 0f, "source1", StatusBarState.SHADE, changed = false) + verifyDidLog(1) + logger.logSetDozeAmount(0.1f, 0.1f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(1) + logger.logSetDozeAmount(0.2f, 0.2f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.3f, 0.3f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.4f, 0.4f, "source1", StatusBarState.SHADE, changed = true) + logger.logSetDozeAmount(0.5f, 0.5f, "source1", StatusBarState.SHADE, changed = true) + verifyDidLog(0) + logger.logSetDozeAmount(0.5f, 0.5f, "source2", StatusBarState.SHADE, changed = false) + verifyDidLog(1) + } + + class LogBufferCounter { + val recentLogs = mutableListOf<Pair<String, LogLevel>>() + val tracker = + object : LogcatEchoTracker { + override val logInBackgroundThread: Boolean = false + override fun isBufferLoggable(bufferName: String, level: LogLevel): Boolean = false + override fun isTagLoggable(tagName: String, level: LogLevel): Boolean { + recentLogs.add(tagName to level) + return true + } + } + val logBuffer = + LogBuffer(name = "test", maxSize = 1, logcatEchoTracker = tracker, systrace = false) + + fun verifyDidLog(times: Int) { + assertThat(recentLogs).hasSize(times) + recentLogs.clear() + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java index 680a32375988..78da78269ac4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java @@ -20,6 +20,7 @@ import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -227,14 +228,154 @@ public class NotificationSwipeHelperTest extends SysuiTestCase { } @Test - public void testHandleUpEvent_menuRow() { - when(mSwipeHelper.getCurrentMenuRow()).thenReturn(mMenuRow); - doNothing().when(mSwipeHelper).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow); + public void testHandleUpEvent_menuRowWithoutMenu_dismiss() { + doNothing().when(mSwipeHelper).dismiss(any(), anyFloat()); + doReturn(true).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).dismiss(mView, 0); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testHandleUpEvent_menuRowWithoutMenu_snapback() { + doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat()); + doReturn(false).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).snapClosed(mView, 0); + verify(mMenuRow, times(1)).onSnapClosed(); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testHandleUpEvent_menuRowWithOpenMenu_dismissed() { + doNothing().when(mSwipeHelper).dismiss(any(), anyFloat()); + doReturn(true).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(true); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).dismiss(mView, 0); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testHandleUpEvent_menuRowWithOpenMenu_snapback() { + doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat()); + doReturn(false).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(true); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).snapClosed(mView, 0); + verify(mMenuRow, times(1)).onSnapClosed(); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testHandleUpEvent_menuRowWithClosedMenu_dismissed() { + doNothing().when(mSwipeHelper).dismiss(any(), anyFloat()); + doReturn(true).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(false); + mSwipeHelper.setCurrentMenuRow(mMenuRow); assertTrue("Menu row exists", mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); verify(mMenuRow, times(1)).onTouchEnd(); - verify(mSwipeHelper, times(1)).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).dismiss(mView, 0); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testHandleUpEvent_menuRowWithClosedMenu_snapback() { + doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat()); + doReturn(false).when(mSwipeHelper).isDismissGesture(any()); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + when(mMenuRow.shouldShowMenu()).thenReturn(true); + when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(false); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).isDismissGesture(mEvent); + verify(mSwipeHelper, times(1)).snapClosed(mView, 0); + verify(mMenuRow, times(1)).onSnapClosed(); + verify(mSwipeHelper, never()).isFalseGesture(); + } + + @Test + public void testIsDismissGesture() { + doReturn(false).when(mSwipeHelper).isFalseGesture(); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + doReturn(true).when(mSwipeHelper).swipedFastEnough(); + when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true); + when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP); + + assertTrue("Should be a dismiss gesture", mSwipeHelper.isDismissGesture(mEvent)); + verify(mSwipeHelper, times(1)).isFalseGesture(); + } + + @Test + public void testIsDismissGesture_falseGesture() { + doReturn(true).when(mSwipeHelper).isFalseGesture(); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + doReturn(true).when(mSwipeHelper).swipedFastEnough(); + when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true); + when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP); + + assertFalse("False gesture should stop dismissal", mSwipeHelper.isDismissGesture(mEvent)); + verify(mSwipeHelper, times(1)).isFalseGesture(); + } + + @Test + public void testIsDismissGesture_farEnough() { + doReturn(false).when(mSwipeHelper).isFalseGesture(); + doReturn(true).when(mSwipeHelper).swipedFarEnough(); + doReturn(false).when(mSwipeHelper).swipedFastEnough(); + when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true); + when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP); + + assertTrue("Should be a dismissal", mSwipeHelper.isDismissGesture(mEvent)); + verify(mSwipeHelper, times(1)).isFalseGesture(); + } + + @Test + public void testIsDismissGesture_notFarOrFastEnough() { + doReturn(false).when(mSwipeHelper).isFalseGesture(); + doReturn(false).when(mSwipeHelper).swipedFarEnough(); + doReturn(false).when(mSwipeHelper).swipedFastEnough(); + when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true); + when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP); + + assertFalse("Should not be a dismissal", mSwipeHelper.isDismissGesture(mEvent)); + verify(mSwipeHelper, times(1)).isFalseGesture(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java index f568547d3b59..e680a4ec19d1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java @@ -53,7 +53,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.AutoAddTracker; -import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.QSHost; import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.SettingObserver; import com.android.systemui.qs.external.CustomTile; @@ -104,7 +104,7 @@ public class AutoTileManagerTest extends SysuiTestCase { private static final int USER = 0; - @Mock private QSTileHost mQsTileHost; + @Mock private QSHost mQsHost; @Mock private AutoAddTracker mAutoAddTracker; @Mock private CastController mCastController; @Mock private HotspotController mHotspotController; @@ -144,7 +144,7 @@ public class AutoTileManagerTest extends SysuiTestCase { R.string.safety_quick_settings_tile_class, TEST_CUSTOM_SAFETY_CLASS); when(mAutoAddTrackerBuilder.build()).thenReturn(mAutoAddTracker); - when(mQsTileHost.getUserContext()).thenReturn(mUserContext); + when(mQsHost.getUserContext()).thenReturn(mUserContext); when(mUserContext.getUser()).thenReturn(UserHandle.of(USER)); mPackageManager = Mockito.spy(mContext.getPackageManager()); when(mPackageManager.getPermissionControllerPackageName()) @@ -174,7 +174,7 @@ public class AutoTileManagerTest extends SysuiTestCase { WalletController walletController, SafetyController safetyController, @Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) { - return new AutoTileManager(context, autoAddTrackerBuilder, mQsTileHost, + return new AutoTileManager(context, autoAddTrackerBuilder, mQsHost, Handler.createAsync(TestableLooper.get(this).getLooper()), mSecureSettings, hotspotController, @@ -359,7 +359,7 @@ public class AutoTileManagerTest extends SysuiTestCase { return; } mAutoTileManager.mNightDisplayCallback.onActivated(true); - verify(mQsTileHost).addTile("night"); + verify(mQsHost).addTile("night"); } @Test @@ -368,7 +368,7 @@ public class AutoTileManagerTest extends SysuiTestCase { return; } mAutoTileManager.mNightDisplayCallback.onActivated(false); - verify(mQsTileHost, never()).addTile("night"); + verify(mQsHost, never()).addTile("night"); } @Test @@ -378,7 +378,7 @@ public class AutoTileManagerTest extends SysuiTestCase { } mAutoTileManager.mNightDisplayCallback.onAutoModeChanged( ColorDisplayManager.AUTO_MODE_TWILIGHT); - verify(mQsTileHost).addTile("night"); + verify(mQsHost).addTile("night"); } @Test @@ -388,7 +388,7 @@ public class AutoTileManagerTest extends SysuiTestCase { } mAutoTileManager.mNightDisplayCallback.onAutoModeChanged( ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); - verify(mQsTileHost).addTile("night"); + verify(mQsHost).addTile("night"); } @Test @@ -398,19 +398,19 @@ public class AutoTileManagerTest extends SysuiTestCase { } mAutoTileManager.mNightDisplayCallback.onAutoModeChanged( ColorDisplayManager.AUTO_MODE_DISABLED); - verify(mQsTileHost, never()).addTile("night"); + verify(mQsHost, never()).addTile("night"); } @Test public void reduceBrightColorsTileAdded_whenActivated() { mAutoTileManager.mReduceBrightColorsCallback.onActivated(true); - verify(mQsTileHost).addTile("reduce_brightness"); + verify(mQsHost).addTile("reduce_brightness"); } @Test public void reduceBrightColorsTileNotAdded_whenDeactivated() { mAutoTileManager.mReduceBrightColorsCallback.onActivated(false); - verify(mQsTileHost, never()).addTile("reduce_brightness"); + verify(mQsHost, never()).addTile("reduce_brightness"); } private static List<CastDevice> buildFakeCastDevice(boolean isCasting) { @@ -423,28 +423,28 @@ public class AutoTileManagerTest extends SysuiTestCase { public void castTileAdded_whenDeviceIsCasting() { doReturn(buildFakeCastDevice(true)).when(mCastController).getCastDevices(); mAutoTileManager.mCastCallback.onCastDevicesChanged(); - verify(mQsTileHost).addTile("cast"); + verify(mQsHost).addTile("cast"); } @Test public void castTileNotAdded_whenDeviceIsNotCasting() { doReturn(buildFakeCastDevice(false)).when(mCastController).getCastDevices(); mAutoTileManager.mCastCallback.onCastDevicesChanged(); - verify(mQsTileHost, never()).addTile("cast"); + verify(mQsHost, never()).addTile("cast"); } @Test public void testSettingTileAdded_onChanged() { changeValue(TEST_SETTING, 1); verify(mAutoAddTracker).setTileAdded(TEST_SPEC); - verify(mQsTileHost).addTile(TEST_SPEC); + verify(mQsHost).addTile(TEST_SPEC); } @Test public void testSettingTileAddedComponentAtEnd_onChanged() { changeValue(TEST_SETTING_COMPONENT, 1); verify(mAutoAddTracker).setTileAdded(TEST_CUSTOM_SPEC); - verify(mQsTileHost).addTile(ComponentName.unflattenFromString(TEST_COMPONENT) + verify(mQsHost).addTile(ComponentName.unflattenFromString(TEST_COMPONENT) , /* end */ true); } @@ -453,14 +453,14 @@ public class AutoTileManagerTest extends SysuiTestCase { changeValue(TEST_SETTING, 1); changeValue(TEST_SETTING, 2); verify(mAutoAddTracker).setTileAdded(TEST_SPEC); - verify(mQsTileHost).addTile(TEST_SPEC); + verify(mQsHost).addTile(TEST_SPEC); } @Test public void testSettingTileNotAdded_onChangedTo0() { changeValue(TEST_SETTING, 0); verify(mAutoAddTracker, never()).setTileAdded(TEST_SPEC); - verify(mQsTileHost, never()).addTile(TEST_SPEC); + verify(mQsHost, never()).addTile(TEST_SPEC); } @Test @@ -469,27 +469,27 @@ public class AutoTileManagerTest extends SysuiTestCase { changeValue(TEST_SETTING, 1); verify(mAutoAddTracker, never()).setTileAdded(TEST_SPEC); - verify(mQsTileHost, never()).addTile(TEST_SPEC); + verify(mQsHost, never()).addTile(TEST_SPEC); } @Test public void testSafetyTileNotAdded_ifPreviouslyAdded() { ComponentName safetyComponent = CustomTile.getComponentFromSpec(TEST_CUSTOM_SAFETY_SPEC); mAutoTileManager.init(); - verify(mQsTileHost, times(1)).addTile(safetyComponent, true); + verify(mQsHost, times(1)).addTile(safetyComponent, true); when(mAutoAddTracker.isAdded(TEST_CUSTOM_SAFETY_SPEC)).thenReturn(true); mAutoTileManager.init(); - verify(mQsTileHost, times(1)).addTile(safetyComponent, true); + verify(mQsHost, times(1)).addTile(safetyComponent, true); } @Test public void testSafetyTileAdded_onUserChange() { ComponentName safetyComponent = CustomTile.getComponentFromSpec(TEST_CUSTOM_SAFETY_SPEC); mAutoTileManager.init(); - verify(mQsTileHost, times(1)).addTile(safetyComponent, true); + verify(mQsHost, times(1)).addTile(safetyComponent, true); when(mAutoAddTracker.isAdded(TEST_CUSTOM_SAFETY_SPEC)).thenReturn(false); mAutoTileManager.changeUser(UserHandle.of(USER + 1)); - verify(mQsTileHost, times(2)).addTile(safetyComponent, true); + verify(mQsHost, times(2)).addTile(safetyComponent, true); } @Test @@ -498,17 +498,17 @@ public class AutoTileManagerTest extends SysuiTestCase { mAutoTileManager.init(); when(mAutoAddTracker.isAdded(TEST_CUSTOM_SAFETY_SPEC)).thenReturn(true); mAutoTileManager.mSafetyCallback.onSafetyCenterEnableChanged(false); - verify(mQsTileHost, times(1)).removeTile(TEST_CUSTOM_SAFETY_SPEC); + verify(mQsHost, times(1)).removeTile(TEST_CUSTOM_SAFETY_SPEC); } @Test public void testSafetyTileAdded_onSafetyCenterEnable() { ComponentName safetyComponent = CustomTile.getComponentFromSpec(TEST_CUSTOM_SAFETY_SPEC); mAutoTileManager.init(); - verify(mQsTileHost, times(1)).addTile(safetyComponent, true); + verify(mQsHost, times(1)).addTile(safetyComponent, true); mAutoTileManager.mSafetyCallback.onSafetyCenterEnableChanged(false); mAutoTileManager.mSafetyCallback.onSafetyCenterEnableChanged(true); - verify(mQsTileHost, times(2)).addTile(safetyComponent, true); + verify(mQsHost, times(2)).addTile(safetyComponent, true); } @Test @@ -525,7 +525,7 @@ public class AutoTileManagerTest extends SysuiTestCase { mManagedProfileCallback.onManagedProfileChanged(); - verify(mQsTileHost, times(1)).addTile(eq("work"), eq(2)); + verify(mQsHost, times(1)).addTile(eq("work"), eq(2)); verify(mAutoAddTracker, times(1)).setTileAdded(eq("work")); } @@ -542,7 +542,7 @@ public class AutoTileManagerTest extends SysuiTestCase { mManagedProfileCallback.onManagedProfileChanged(); - verify(mQsTileHost, times(1)).removeTile(eq("work")); + verify(mQsHost, times(1)).removeTile(eq("work")); verify(mAutoAddTracker, times(1)).setTileRemoved(eq("work")); } @@ -550,7 +550,7 @@ public class AutoTileManagerTest extends SysuiTestCase { public void testAddControlsTileIfNotPresent() { String spec = DEVICE_CONTROLS; when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(false); - when(mQsTileHost.getTiles()).thenReturn(new ArrayList<>()); + when(mQsHost.getTiles()).thenReturn(new ArrayList<>()); mAutoTileManager.init(); ArgumentCaptor<DeviceControlsController.Callback> captor = @@ -559,7 +559,7 @@ public class AutoTileManagerTest extends SysuiTestCase { verify(mDeviceControlsController).setCallback(captor.capture()); captor.getValue().onControlsUpdate(3); - verify(mQsTileHost).addTile(spec, 3); + verify(mQsHost).addTile(spec, 3); verify(mAutoAddTracker).setTileAdded(spec); } @@ -567,7 +567,7 @@ public class AutoTileManagerTest extends SysuiTestCase { public void testDontAddControlsTileIfPresent() { String spec = DEVICE_CONTROLS; when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(false); - when(mQsTileHost.getTiles()).thenReturn(new ArrayList<>()); + when(mQsHost.getTiles()).thenReturn(new ArrayList<>()); mAutoTileManager.init(); ArgumentCaptor<DeviceControlsController.Callback> captor = @@ -576,7 +576,7 @@ public class AutoTileManagerTest extends SysuiTestCase { verify(mDeviceControlsController).setCallback(captor.capture()); captor.getValue().removeControlsAutoTracker(); - verify(mQsTileHost, never()).addTile(spec, 3); + verify(mQsHost, never()).addTile(spec, 3); verify(mAutoAddTracker, never()).setTileAdded(spec); verify(mAutoAddTracker).setTileRemoved(spec); } @@ -587,7 +587,7 @@ public class AutoTileManagerTest extends SysuiTestCase { when(mAutoAddTracker.isAdded(eq(spec))).thenReturn(true); QSTile mockTile = mock(QSTile.class); when(mockTile.getTileSpec()).thenReturn(spec); - when(mQsTileHost.getTiles()).thenReturn(List.of(mockTile)); + when(mQsHost.getTiles()).thenReturn(List.of(mockTile)); mAutoTileManager.init(); ArgumentCaptor<DeviceControlsController.Callback> captor = @@ -596,7 +596,7 @@ public class AutoTileManagerTest extends SysuiTestCase { verify(mDeviceControlsController).setCallback(captor.capture()); captor.getValue().onControlsUpdate(3); - verify(mQsTileHost, never()).addTile(spec, 3); + verify(mQsHost, never()).addTile(spec, 3); verify(mAutoAddTracker, never()).setTileAdded(spec); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java index 48573c63d728..2e6f62c2314e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java @@ -43,6 +43,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.assist.AssistManager; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; import com.android.systemui.shade.NotificationPanelViewController; @@ -94,6 +95,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Mock private SystemBarAttributesListener mSystemBarAttributesListener; @Mock private Lazy<CameraLauncher> mCameraLauncherLazy; @Mock private UserTracker mUserTracker; + @Mock private QSHost mQSHost; CentralSurfacesCommandQueueCallbacks mSbcqCallbacks; @@ -128,7 +130,8 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { DEFAULT_DISPLAY, mSystemBarAttributesListener, mCameraLauncherLazy, - mUserTracker); + mUserTracker, + mQSHost); when(mUserTracker.getUserHandle()).thenReturn( UserHandle.of(ActivityManager.getCurrentUser())); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index c0537a6dc4cf..dc5a0472f49e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -1356,33 +1356,10 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test - public void notificationAlpha_unnocclusionAnimating_bouncerActive_usesKeyguardNotifAlpha() { - when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(true); - mScrimController.setClipsQsScrim(true); - - mScrimController.transitionTo(ScrimState.KEYGUARD); - mScrimController.setUnocclusionAnimationRunning(true); - - assertAlphaAfterExpansion( - mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0f); - assertAlphaAfterExpansion( - mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0.4f); - assertAlphaAfterExpansion( - mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 1.0f); - - // Verify normal behavior after - mScrimController.setUnocclusionAnimationRunning(false); - float expansion = 0.4f; - float alpha = 1 - BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(expansion); - assertAlphaAfterExpansion(mNotificationsScrim, alpha, expansion); - } - - @Test public void notificationAlpha_unnocclusionAnimating_bouncerNotActive_usesKeyguardNotifAlpha() { when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false); mScrimController.transitionTo(ScrimState.KEYGUARD); - mScrimController.setUnocclusionAnimationRunning(true); assertAlphaAfterExpansion( mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 0f); @@ -1392,7 +1369,6 @@ public class ScrimControllerTest extends SysuiTestCase { mNotificationsScrim, ScrimState.KEYGUARD.getNotifAlpha(), /* expansion */ 1.0f); // Verify normal behavior after - mScrimController.setUnocclusionAnimationRunning(false); float expansion = 0.4f; float alpha = 1 - ShadeInterpolation.getNotificationScrimAlpha(expansion); assertAlphaAfterExpansion(mNotificationsScrim, alpha, expansion); @@ -1598,7 +1574,6 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void setUnOccludingAnimationKeyguard() { - mScrimController.setUnocclusionAnimationRunning(true); mScrimController.transitionTo(ScrimState.KEYGUARD); finishAnimationsImmediately(); assertThat(mNotificationsScrim.getViewAlpha()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index d8446f4721b3..158e9adcff43 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -38,6 +38,8 @@ import android.testing.TestableLooper; import android.view.View; import android.view.ViewGroup; import android.view.ViewRootImpl; +import android.view.WindowInsets; +import android.view.WindowInsetsController; import android.window.BackEvent; import android.window.OnBackAnimationCallback; import android.window.OnBackInvokedCallback; @@ -65,8 +67,10 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInt import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInteractor.PrimaryBouncerExpansionCallback; import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.navigationbar.TaskbarDelegate; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.shade.NotificationPanelViewController; +import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.shade.ShadeExpansionStateManager; @@ -123,6 +127,9 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private BouncerView mBouncerView; @Mock private BouncerViewDelegate mBouncerViewDelegate; @Mock private OnBackAnimationCallback mBouncerViewDelegateBackCallback; + @Mock private NotificationShadeWindowView mNotificationShadeWindowView; + @Mock private WindowInsetsController mWindowInsetsController; + @Mock private TaskbarDelegate mTaskbarDelegate; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private PrimaryBouncerCallbackInteractor.PrimaryBouncerExpansionCallback @@ -151,6 +158,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { .isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_BOUNCER_ANIM)) .thenReturn(true); + when(mCentralSurfaces.getNotificationShadeWindowView()) + .thenReturn(mNotificationShadeWindowView); + when(mNotificationShadeWindowView.getWindowInsetsController()) + .thenReturn(mWindowInsetsController); + mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( getContext(), @@ -356,17 +368,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test - public void setOccluded_animatesPanelExpansion_onlyIfBouncerHidden() { - mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */); - verify(mCentralSurfaces).animateKeyguardUnoccluding(); - - when(mPrimaryBouncerInteractor.isFullyShowing()).thenReturn(true); - clearInvocations(mCentralSurfaces); - mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */); - verify(mCentralSurfaces, never()).animateKeyguardUnoccluding(); - } - - @Test public void setOccluded_onKeyguardOccludedChangedCalled() { clearInvocations(mKeyguardStateController); clearInvocations(mKeyguardUpdateMonitor); @@ -640,6 +641,14 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { } @Test + public void testHideTaskbar() { + when(mTaskbarDelegate.isInitialized()).thenReturn(true); + mStatusBarKeyguardViewManager.setTaskbarDelegate(mTaskbarDelegate); + mStatusBarKeyguardViewManager.updateNavigationBarVisibility(false); + verify(mWindowInsetsController).hide(WindowInsets.Type.navigationBars()); + } + + @Test public void hideAlternateBouncer_beforeCentralSurfacesRegistered() { mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 07e8d3c19518..1e5782b91be8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -32,7 +32,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.animation.Animator; import android.app.Fragment; import android.app.StatusBarManager; import android.content.Context; @@ -45,6 +44,7 @@ import android.view.View; import android.view.ViewPropertyAnimator; import android.widget.FrameLayout; +import androidx.core.animation.Animator; import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardUpdateMonitor; diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt index 5288608a202d..0413d92b6abb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProviderTest.kt @@ -25,7 +25,6 @@ import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING -import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.util.TestFoldStateProvider import org.junit.Before import org.junit.Test @@ -50,7 +49,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, - { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, + { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, @@ -67,7 +66,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, { foldStateProvider.sendHingeAngleUpdate(10f) }, - { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, + { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, @@ -84,7 +83,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendHingeAngleUpdate(180f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) }, - { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, + { foldStateProvider.sendUnfoldedScreenAvailable() }, ) with(listener.ensureTransitionFinished()) { @@ -113,7 +112,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testUnfoldAndStopUnfolding_finishesTheUnfoldTransition() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, - { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, + { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN) }, @@ -129,7 +128,7 @@ class PhysicsBasedUnfoldTransitionProgressProviderTest : SysuiTestCase() { fun testFoldImmediatelyAfterUnfold_runsFoldAnimation() { runOnMainThreadWithInterval( { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_START_OPENING) }, - { foldStateProvider.sendFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) }, + { foldStateProvider.sendUnfoldedScreenAvailable() }, { foldStateProvider.sendHingeAngleUpdate(10f) }, { foldStateProvider.sendHingeAngleUpdate(90f) }, { diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt index 6086e16fb49a..8476d0d45603 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt @@ -26,6 +26,7 @@ import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.system.ActivityManagerActivityTypeProvider import com.android.systemui.unfold.updates.FoldProvider.FoldCallback import com.android.systemui.unfold.updates.RotationChangeProvider.RotationListener +import com.android.systemui.unfold.updates.hinge.FULLY_OPEN_DEGREES import com.android.systemui.unfold.updates.hinge.HingeAngleProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider.ScreenListener @@ -71,6 +72,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { private val foldUpdates: MutableList<Int> = arrayListOf() private val hingeAngleUpdates: MutableList<Float> = arrayListOf() + private val unfoldedScreenAvailabilityUpdates: MutableList<Unit> = arrayListOf() private var scheduledRunnable: Runnable? = null private var scheduledRunnableDelay: Long? = null @@ -106,6 +108,10 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { override fun onFoldUpdate(update: Int) { foldUpdates.add(update) } + + override fun onUnfoldedScreenAvailable() { + unfoldedScreenAvailabilityUpdates.add(Unit) + } }) foldStateProvider.start() @@ -156,8 +162,8 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(10) screenOnStatusProvider.notifyScreenTurnedOn() - assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) + assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING) + assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test @@ -174,8 +180,9 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { sendHingeAngleEvent(40) sendHingeAngleEvent(10) - assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_OPENING, - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_START_CLOSING) + assertThat(foldUpdates) + .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) + assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test @@ -223,7 +230,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fireScreenOnEvent() - assertThat(foldUpdates).containsExactly(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) + assertThat(unfoldedScreenAvailabilityUpdates).hasSize(1) } @Test @@ -277,7 +284,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_afterTimeout_finishHalfOpenEventEmitted() { - sendHingeAngleEvent(90) + setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS) @@ -288,7 +295,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_beforeTimeout_abortNotEmitted() { - sendHingeAngleEvent(90) + setInitialHingeAngle(90) sendHingeAngleEvent(80) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) @@ -298,7 +305,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_eventBeforeTimeout_oneEventEmitted() { - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(90) simulateTimeout(HALF_OPENED_TIMEOUT_MILLIS - 1) @@ -309,7 +316,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_timeoutAfterTimeoutRescheduled_finishHalfOpenStateEmitted() { - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(90) // The timeout should not trigger here. @@ -323,7 +330,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_shortTimeBetween_emitsOnlyOneEvents() { - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(90) sendHingeAngleEvent(80) @@ -334,20 +341,19 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileClosing_emittedDespiteInitialAngle() { val maxAngle = 180 - FULLY_OPEN_THRESHOLD_DEGREES.toInt() - for (i in 1..maxAngle) { - foldUpdates.clear() - - simulateFolding(startAngle = i) + val minAngle = Math.ceil(HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toDouble()).toInt() + 1 + for (startAngle in minAngle..maxAngle) { + setInitialHingeAngle(startAngle) + sendHingeAngleEvent(startAngle - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) - simulateTimeout() // Timeout to set the state to aborted. } } @Test fun startClosingEvent_whileNotOnLauncher_doesNotTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = false) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -357,7 +363,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileActivityTypeNotAvailable_triggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = null) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -367,7 +373,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileOnLauncher_doesTriggerBeforeThreshold() { setupForegroundActivityType(isHomeActivity = true) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -377,9 +383,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnLauncher_triggersAfterThreshold() { setupForegroundActivityType(isHomeActivity = false) - sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) + setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) - sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) + sendHingeAngleEvent( + START_CLOSING_ON_APPS_THRESHOLD_DEGREES - + HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @@ -388,7 +396,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { fun startClosingEvent_whileNotOnKeyguardAndNotOnLauncher_doesNotTriggerBeforeThreshold() { setKeyguardVisibility(visible = false) setupForegroundActivityType(isHomeActivity = false) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -398,7 +406,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileKeyguardStateNotAvailable_triggerBeforeThreshold() { setKeyguardVisibility(visible = null) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -408,7 +416,7 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileonKeyguard_doesTriggerBeforeThreshold() { setKeyguardVisibility(visible = true) - sendHingeAngleEvent(180) + setInitialHingeAngle(180) sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES + 1) @@ -418,9 +426,59 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { @Test fun startClosingEvent_whileNotOnKeyguard_triggersAfterThreshold() { setKeyguardVisibility(visible = false) - sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) + setInitialHingeAngle(START_CLOSING_ON_APPS_THRESHOLD_DEGREES) - sendHingeAngleEvent(START_CLOSING_ON_APPS_THRESHOLD_DEGREES - 1) + sendHingeAngleEvent( + START_CLOSING_ON_APPS_THRESHOLD_DEGREES - + HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES.toInt() - 1) + + assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) + } + + @Test + fun startClosingEvent_doesNotTriggerBelowThreshold() { + val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() + setInitialHingeAngle(180) + sendHingeAngleEvent(thresholdAngle + 1) + + assertThat(foldUpdates).isEmpty() + } + + @Test + fun startClosingEvent_triggersAfterThreshold() { + val thresholdAngle = (FULLY_OPEN_DEGREES - FULLY_OPEN_THRESHOLD_DEGREES).toInt() + setInitialHingeAngle(180) + sendHingeAngleEvent(thresholdAngle + 1) + sendHingeAngleEvent(thresholdAngle - 1) + + assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) + } + + @Test + fun startClosingEvent_triggersAfterThreshold_fromHalfOpen() { + setInitialHingeAngle(120) + sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES + 1).toInt()) + assertThat(foldUpdates).isEmpty() + sendHingeAngleEvent((120 - HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES - 1).toInt()) + + assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) + } + + @Test + fun startOpeningAndClosingEvents_triggerWithOpenAndClose() { + setInitialHingeAngle(120) + sendHingeAngleEvent(130) + sendHingeAngleEvent(120) + assertThat(foldUpdates) + .containsExactly(FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING) + } + + @Test + fun startClosingEvent_notInterrupted_whenAngleIsSlightlyIncreased() { + setInitialHingeAngle(120) + sendHingeAngleEvent(110) + sendHingeAngleEvent(111) + sendHingeAngleEvent(100) assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) } @@ -504,11 +562,6 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { } } - private fun simulateFolding(startAngle: Int) { - sendHingeAngleEvent(startAngle) - sendHingeAngleEvent(startAngle - 1) - } - private fun setFoldState(folded: Boolean) { foldProvider.notifyFolded(folded) } @@ -521,6 +574,17 @@ class DeviceFoldStateProviderTest : SysuiTestCase() { testHingeAngleProvider.notifyAngle(angle.toFloat()) } + private fun setInitialHingeAngle(angle: Int) { + setFoldState(angle == 0) + sendHingeAngleEvent(angle) + if (scheduledRunnableDelay != null) { + simulateTimeout() + } + hingeAngleUpdates.clear() + foldUpdates.clear() + unfoldedScreenAvailabilityUpdates.clear() + } + private class TestFoldProvider : FoldProvider { private val callbacks = arrayListOf<FoldCallback>() diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt index a064e8c81076..fbb0e5a72cd1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/util/TestFoldStateProvider.kt @@ -57,4 +57,8 @@ class TestFoldStateProvider : FoldStateProvider { fun sendHingeAngleUpdate(angle: Float) { listeners.forEach { it.onHingeAngleUpdate(angle) } } + + fun sendUnfoldedScreenAvailable() { + listeners.forEach { it.onUnfoldedScreenAvailable() } + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt index 337421974562..9cdce20bbf1e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardBouncerRepository.kt @@ -21,6 +21,7 @@ import com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants.E import com.android.systemui.keyguard.shared.model.BouncerShowMessageModel import com.android.systemui.keyguard.shared.model.KeyguardBouncerModel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow /** Fake implementation of [KeyguardRepository] */ @@ -44,8 +45,6 @@ class FakeKeyguardBouncerRepository : KeyguardBouncerRepository { override val panelExpansionAmount = _panelExpansionAmount.asStateFlow() private val _keyguardPosition = MutableStateFlow(0f) override val keyguardPosition = _keyguardPosition.asStateFlow() - private val _onScreenTurnedOff = MutableStateFlow(false) - override val onScreenTurnedOff = _onScreenTurnedOff.asStateFlow() private val _isBackButtonEnabled = MutableStateFlow<Boolean?>(null) override val isBackButtonEnabled = _isBackButtonEnabled.asStateFlow() private val _keyguardAuthenticated = MutableStateFlow<Boolean?>(null) @@ -61,6 +60,8 @@ class FakeKeyguardBouncerRepository : KeyguardBouncerRepository { override var lastAlternateBouncerVisibleTime: Long = 0L private val _isAlternateBouncerUIAvailable = MutableStateFlow<Boolean>(false) override val alternateBouncerUIAvailable = _isAlternateBouncerUIAvailable.asStateFlow() + private val _sideFpsShowing: MutableStateFlow<Boolean> = MutableStateFlow(false) + override val sideFpsShowing: StateFlow<Boolean> = _sideFpsShowing.asStateFlow() override fun setPrimaryScrimmed(isScrimmed: Boolean) { _primaryBouncerScrimmed.value = isScrimmed @@ -122,7 +123,7 @@ class FakeKeyguardBouncerRepository : KeyguardBouncerRepository { _isBackButtonEnabled.value = isBackButtonEnabled } - override fun setOnScreenTurnedOff(onScreenTurnedOff: Boolean) { - _onScreenTurnedOff.value = onScreenTurnedOff + override fun setSideFpsShowing(isShowing: Boolean) { + _sideFpsShowing.value = isShowing } } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt index 4622464b204d..c437e5c23d1b 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/FixedTimingTransitionProgressProvider.kt @@ -21,7 +21,6 @@ import android.util.FloatProperty import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED -import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import javax.inject.Inject @@ -59,12 +58,15 @@ constructor(private val foldStateProvider: FoldStateProvider) : } override fun onFoldUpdate(@FoldUpdate update: Int) { - when (update) { - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> animator.start() - FOLD_UPDATE_FINISH_CLOSED -> animator.cancel() + if (update == FOLD_UPDATE_FINISH_CLOSED) { + animator.cancel() } } + override fun onUnfoldedScreenAvailable() { + animator.start() + } + override fun addCallback(listener: TransitionProgressListener) { listeners.add(listener) } @@ -73,8 +75,6 @@ constructor(private val foldStateProvider: FoldStateProvider) : listeners.remove(listener) } - override fun onHingeAngleUpdate(angle: Float) {} - private object AnimationProgressProperty : FloatProperty<FixedTimingTransitionProgressProvider>("animation_progress") { diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt index 6ffbe5aa25c0..d19b414cb963 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt @@ -28,7 +28,6 @@ import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING -import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener @@ -78,21 +77,11 @@ class PhysicsBasedUnfoldTransitionProgressProvider @Inject constructor( override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> { - startTransition(startValue = 0f) - - // Stop the animation if the device has already opened by the time when - // the display is available as we won't receive the full open event anymore - if (foldStateProvider.isFinishedOpening) { - cancelTransition(endValue = 1f, animate = true) - } - } FOLD_UPDATE_FINISH_FULL_OPEN, FOLD_UPDATE_FINISH_HALF_OPEN -> { // Do not cancel if we haven't started the transition yet. // This could happen when we fully unfolded the device before the screen // became available. In this case we start and immediately cancel the animation - // in FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE event handler, so we don't need to - // cancel it here. + // in onUnfoldedScreenAvailable event handler, so we don't need to cancel it here. if (isTransitionRunning) { cancelTransition(endValue = 1f, animate = true) } @@ -125,6 +114,16 @@ class PhysicsBasedUnfoldTransitionProgressProvider @Inject constructor( } } + override fun onUnfoldedScreenAvailable() { + startTransition(startValue = 0f) + + // Stop the animation if the device has already opened by the time when + // the display is available as we won't receive the full open event anymore + if (foldStateProvider.isFinishedOpening) { + cancelTransition(endValue = 1f, animate = true) + } + } + private fun cancelTransition(endValue: Float, animate: Boolean) { if (isTransitionRunning && animate) { if (endValue == 1.0f && !isAnimatedCancelRunning) { diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt index 97c9ba99f096..82fd2258120a 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt @@ -54,6 +54,7 @@ constructor( @FoldUpdate private var lastFoldUpdate: Int? = null @FloatRange(from = 0.0, to = 180.0) private var lastHingeAngle: Float = 0f + @FloatRange(from = 0.0, to = 180.0) private var lastHingeAngleBeforeTransition: Float = 0f private val hingeAngleListener = HingeAngleListener() private val screenListener = ScreenStatusListener() @@ -112,29 +113,45 @@ constructor( private fun onHingeAngle(angle: Float) { if (DEBUG) { - Log.d(TAG, "Hinge angle: $angle, lastHingeAngle: $lastHingeAngle") + Log.d( + TAG, + "Hinge angle: $angle, " + + "lastHingeAngle: $lastHingeAngle, " + + "lastHingeAngleBeforeTransition: $lastHingeAngleBeforeTransition" + ) Trace.traceCounter(Trace.TRACE_TAG_APP, "hinge_angle", angle.toInt()) } - val isClosing = angle < lastHingeAngle + val currentDirection = + if (angle < lastHingeAngle) FOLD_UPDATE_START_CLOSING else FOLD_UPDATE_START_OPENING + if (isTransitionInProgress && currentDirection != lastFoldUpdate) { + lastHingeAngleBeforeTransition = lastHingeAngle + } + + val isClosing = angle < lastHingeAngleBeforeTransition + val transitionUpdate = + if (isClosing) FOLD_UPDATE_START_CLOSING else FOLD_UPDATE_START_OPENING + val angleChangeSurpassedThreshold = + Math.abs(angle - lastHingeAngleBeforeTransition) > HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES val isFullyOpened = FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES - val closingEventDispatched = lastFoldUpdate == FOLD_UPDATE_START_CLOSING + val eventNotAlreadyDispatched = lastFoldUpdate != transitionUpdate val screenAvailableEventSent = isUnfoldHandled - if (isClosing // hinge angle should be decreasing since last update - && !closingEventDispatched // we haven't sent closing event already - && !isFullyOpened // do not send closing event if we are in fully opened hinge + if ( + angleChangeSurpassedThreshold && // Do not react immediately to small changes in angle + eventNotAlreadyDispatched && // we haven't sent transition event already + !isFullyOpened && // do not send transition event if we are in fully opened hinge // angle range as closing threshold could overlap this range - && screenAvailableEventSent // do not send closing event if we are still in - // the process of turning on the inner display - && isClosingThresholdMet(angle) // hinge angle is below certain threshold. + screenAvailableEventSent && // do not send transition event if we are still in the + // process of turning on the inner display + isClosingThresholdMet(angle) // hinge angle is below certain threshold. ) { - notifyFoldUpdate(FOLD_UPDATE_START_CLOSING) + notifyFoldUpdate(transitionUpdate, lastHingeAngle) } if (isTransitionInProgress) { if (isFullyOpened) { - notifyFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) + notifyFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN, angle) cancelTimeout() } else { // The timeout will trigger some constant time after the last angle update. @@ -146,7 +163,7 @@ constructor( outputListeners.forEach { it.onHingeAngleUpdate(angle) } } - private fun isClosingThresholdMet(currentAngle: Float) : Boolean { + private fun isClosingThresholdMet(currentAngle: Float): Boolean { val closingThreshold = getClosingThreshold() return closingThreshold == null || currentAngle < closingThreshold } @@ -179,23 +196,29 @@ constructor( if (isFolded) { hingeAngleProvider.stop() - notifyFoldUpdate(FOLD_UPDATE_FINISH_CLOSED) + notifyFoldUpdate(FOLD_UPDATE_FINISH_CLOSED, lastHingeAngle) cancelTimeout() isUnfoldHandled = false } else { - notifyFoldUpdate(FOLD_UPDATE_START_OPENING) + notifyFoldUpdate(FOLD_UPDATE_START_OPENING, lastHingeAngle) rescheduleAbortAnimationTimeout() hingeAngleProvider.start() } } } - private fun notifyFoldUpdate(@FoldUpdate update: Int) { + private fun notifyFoldUpdate(@FoldUpdate update: Int, angle: Float) { if (DEBUG) { Log.d(TAG, update.name()) } + val previouslyTransitioning = isTransitionInProgress + outputListeners.forEach { it.onFoldUpdate(update) } lastFoldUpdate = update + + if (previouslyTransitioning != isTransitionInProgress) { + lastHingeAngleBeforeTransition = angle + } } private fun rescheduleAbortAnimationTimeout() { @@ -209,7 +232,8 @@ constructor( handler.removeCallbacks(timeoutRunnable) } - private fun cancelAnimation(): Unit = notifyFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN) + private fun cancelAnimation(): Unit = + notifyFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN, lastHingeAngle) private inner class ScreenStatusListener : ScreenStatusProvider.ScreenListener { @@ -221,7 +245,7 @@ constructor( // receive 'folded' event. If SystemUI started when device is already folded it will // still receive 'folded' event on startup. if (!isFolded && !isUnfoldHandled) { - outputListeners.forEach { it.onFoldUpdate(FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE) } + outputListeners.forEach { it.onUnfoldedScreenAvailable() } isUnfoldHandled = true } } @@ -257,7 +281,6 @@ fun @receiver:FoldUpdate Int.name() = when (this) { FOLD_UPDATE_START_OPENING -> "START_OPENING" FOLD_UPDATE_START_CLOSING -> "START_CLOSING" - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> "UNFOLDED_SCREEN_AVAILABLE" FOLD_UPDATE_FINISH_HALF_OPEN -> "FINISH_HALF_OPEN" FOLD_UPDATE_FINISH_FULL_OPEN -> "FINISH_FULL_OPEN" FOLD_UPDATE_FINISH_CLOSED -> "FINISH_CLOSED" @@ -270,5 +293,8 @@ private val DEBUG = Log.isLoggable(TAG, Log.DEBUG) /** Threshold after which we consider the device fully unfolded. */ @VisibleForTesting const val FULLY_OPEN_THRESHOLD_DEGREES = 15f +/** Threshold after which hinge angle updates are considered. This is to eliminate noise. */ +@VisibleForTesting const val HINGE_ANGLE_CHANGE_THRESHOLD_DEGREES = 7.5f + /** Fold animation on top of apps only when the angle exceeds this threshold. */ @VisibleForTesting const val START_CLOSING_ON_APPS_THRESHOLD_DEGREES = 60 diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt index c7a8bf336777..0af372f9da24 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt @@ -31,8 +31,9 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> { val isFinishedOpening: Boolean interface FoldUpdatesListener { - fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) - fun onFoldUpdate(@FoldUpdate update: Int) + @JvmDefault fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) {} + @JvmDefault fun onFoldUpdate(@FoldUpdate update: Int) {} + @JvmDefault fun onUnfoldedScreenAvailable() {} } @IntDef( @@ -40,7 +41,6 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> { [ FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING, - FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE, FOLD_UPDATE_FINISH_HALF_OPEN, FOLD_UPDATE_FINISH_FULL_OPEN, FOLD_UPDATE_FINISH_CLOSED]) @@ -50,7 +50,6 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> { const val FOLD_UPDATE_START_OPENING = 0 const val FOLD_UPDATE_START_CLOSING = 1 -const val FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE = 2 -const val FOLD_UPDATE_FINISH_HALF_OPEN = 3 -const val FOLD_UPDATE_FINISH_FULL_OPEN = 4 -const val FOLD_UPDATE_FINISH_CLOSED = 5 +const val FOLD_UPDATE_FINISH_HALF_OPEN = 2 +const val FOLD_UPDATE_FINISH_FULL_OPEN = 3 +const val FOLD_UPDATE_FINISH_CLOSED = 4 diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 29194c58bd0c..3818a884c94a 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1848,6 +1848,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub AccessibilityServiceInfo accessibilityServiceInfo; try { accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); + if (!accessibilityServiceInfo.isWithinParcelableSize()) { + Slog.e(LOG_TAG, "Skipping service " + + accessibilityServiceInfo.getResolveInfo().getComponentInfo() + + " because service info size is larger than safe parcelable limits."); + continue; + } if (userState.mCrashedServices.contains(serviceInfo.getComponentName())) { // Restore the crashed attribute. accessibilityServiceInfo.crashed = true; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 207c10c44c9b..2f95716639f0 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -21,6 +21,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED; import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE; import android.annotation.NonNull; +import android.app.AlarmManager; import android.app.StatsManager; import android.app.usage.NetworkStatsManager; import android.bluetooth.BluetoothActivityEnergyInfo; @@ -356,6 +357,16 @@ public final class BatteryStatsService extends IBatteryStats.Stub mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger( com.android.internal.R.integer.config_radioScanningTimeout) * 1000L); mStats.setPowerProfileLocked(mPowerProfile); + + final boolean resetOnUnplugHighBatteryLevel = context.getResources().getBoolean( + com.android.internal.R.bool.config_batteryStatsResetOnUnplugHighBatteryLevel); + final boolean resetOnUnplugAfterSignificantCharge = context.getResources().getBoolean( + com.android.internal.R.bool.config_batteryStatsResetOnUnplugAfterSignificantCharge); + mStats.setBatteryStatsConfig( + new BatteryStatsImpl.BatteryStatsConfig.Builder() + .setResetOnUnplugHighBatteryLevel(resetOnUnplugHighBatteryLevel) + .setResetOnUnplugAfterSignificantCharge(resetOnUnplugAfterSignificantCharge) + .build()); mStats.startTrackingSystemServerCpuTime(); if (BATTERY_USAGE_STORE_ENABLED) { @@ -386,6 +397,18 @@ public final class BatteryStatsService extends IBatteryStats.Stub Slog.e(TAG, "Could not register INetworkManagement event observer " + e); } + final AlarmManager am = mContext.getSystemService(AlarmManager.class); + mHandler.post(() -> { + synchronized (mStats) { + mStats.setLongPlugInAlarmInterface(new AlarmInterface(am, () -> { + synchronized (mStats) { + if (mStats.isOnBattery()) return; + mStats.maybeResetWhilePluggedInLocked(); + } + })); + } + }); + synchronized (mPowerStatsLock) { mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class); if (mPowerStatsInternal != null) { @@ -2259,6 +2282,32 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + final class AlarmInterface implements BatteryStatsImpl.AlarmInterface, + AlarmManager.OnAlarmListener { + private AlarmManager mAm; + private Runnable mOnAlarm; + + AlarmInterface(AlarmManager am, Runnable onAlarm) { + mAm = am; + mOnAlarm = onAlarm; + } + + @Override + public void schedule(long rtcTimeMs, long windowLengthMs) { + mAm.setWindow(AlarmManager.RTC, rtcTimeMs, windowLengthMs, TAG, this, mHandler); + } + + @Override + public void cancel() { + mAm.cancel(this); + } + + @Override + public void onAlarm() { + mOnAlarm.run(); + } + } + private static native int nativeWaitWakeup(ByteBuffer outBuffer); private void dumpHelp(PrintWriter pw) { @@ -2445,7 +2494,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub } else if ("--reset-all".equals(arg)) { awaitCompletion(); synchronized (mStats) { - mStats.resetAllStatsCmdLocked(); + mStats.resetAllStatsAndHistoryLocked( + BatteryStatsImpl.RESET_REASON_ADB_COMMAND); mBatteryUsageStatsStore.removeAllSnapshots(); pw.println("Battery stats and history reset."); noOutput = true; @@ -2453,7 +2503,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub } else if ("--reset".equals(arg)) { awaitCompletion(); synchronized (mStats) { - mStats.resetAllStatsCmdLocked(); + mStats.resetAllStatsAndHistoryLocked( + BatteryStatsImpl.RESET_REASON_ADB_COMMAND); pw.println("Battery stats reset."); noOutput = true; } diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index 97ab58764e1e..f74356debd0f 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -42,7 +42,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; -import java.util.Objects; /** * Internal controller for starting and stopping the current dream and managing related state. @@ -120,20 +119,10 @@ final class DreamController { + ", isPreviewMode=" + isPreviewMode + ", canDoze=" + canDoze + ", userId=" + userId + ", reason='" + reason + "'"); - final DreamRecord oldDream = mCurrentDream; - mCurrentDream = new DreamRecord(token, name, isPreviewMode, canDoze, userId, wakeLock); - if (oldDream != null) { - if (!oldDream.mWakingGently) { - // We will stop these previous dreams once the new dream is started. - mPreviousDreams.add(oldDream); - } else if (Objects.equals(oldDream.mName, mCurrentDream.mName)) { - // We are attempting to start a dream that is currently waking up gently. - // Let's silently stop the old instance here to clear the dream state. - // This should happen after the new mCurrentDream is set to avoid announcing - // a "dream stopped" state. - stopDreamInstance(/* immediately */ true, "restarting same dream", oldDream); - } + if (mCurrentDream != null) { + mPreviousDreams.add(mCurrentDream); } + mCurrentDream = new DreamRecord(token, name, isPreviewMode, canDoze, userId, wakeLock); mCurrentDream.mDreamStartTime = SystemClock.elapsedRealtime(); MetricsLogger.visible(mContext, diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 632a34e4470d..921233132931 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -430,6 +430,7 @@ class ShortcutPackage extends ShortcutPackageItem { @NonNull List<ShortcutInfo> changedShortcuts) { Preconditions.checkArgument(newShortcut.isEnabled(), "pushDynamicShortcuts() cannot publish disabled shortcuts"); + ensureShortcutCountBeforePush(); newShortcut.addFlags(ShortcutInfo.FLAG_DYNAMIC); @@ -437,7 +438,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutInfo oldShortcut = findShortcutById(newShortcut.getId()); boolean deleted = false; - if (oldShortcut == null) { + if (oldShortcut == null || !oldShortcut.isDynamic()) { final ShortcutService service = mShortcutUser.mService; final int maxShortcuts = service.getMaxActivityShortcuts(); @@ -446,18 +447,12 @@ class ShortcutPackage extends ShortcutPackageItem { final ArrayList<ShortcutInfo> activityShortcuts = all.get(newShortcut.getActivity()); if (activityShortcuts != null && activityShortcuts.size() > maxShortcuts) { - Slog.e(TAG, "Error pushing shortcut. There are already " - + activityShortcuts.size() + " shortcuts, exceeding the " + maxShortcuts - + " shortcuts limit when pushing the new shortcut " + newShortcut - + ". Id of shortcuts currently available in system memory are " - + activityShortcuts.stream().map(ShortcutInfo::getId) - .collect(Collectors.joining(",", "[", "]"))); - // TODO: This should not have happened. If it does, identify the root cause where - // possible, otherwise bail-out early to prevent memory issue. + // Root cause was discovered in b/233155034, so this should not be happening. + service.wtf("Error pushing shortcut. There are already " + + activityShortcuts.size() + " shortcuts."); } if (activityShortcuts != null && activityShortcuts.size() == maxShortcuts) { // Max has reached. Delete the shortcut with lowest rank. - // Sort by isManifestShortcut() and getRank(). Collections.sort(activityShortcuts, mShortcutTypeAndRankComparator); @@ -473,7 +468,8 @@ class ShortcutPackage extends ShortcutPackageItem { deleted = deleteDynamicWithId(shortcut.getId(), /* ignoreInvisible =*/ true, /*ignorePersistedShortcuts=*/ true) != null; } - } else { + } + if (oldShortcut != null) { // It's an update case. // Make sure the target is updatable. (i.e. should be mutable.) oldShortcut.ensureUpdatableWith(newShortcut, /*isUpdating=*/ false); @@ -505,6 +501,32 @@ class ShortcutPackage extends ShortcutPackageItem { return deleted; } + private void ensureShortcutCountBeforePush() { + final ShortcutService service = mShortcutUser.mService; + // Ensure the total number of shortcuts doesn't exceed the hard limit per app. + final int maxShortcutPerApp = service.getMaxAppShortcuts(); + synchronized (mLock) { + final List<ShortcutInfo> appShortcuts = mShortcuts.values().stream().filter(si -> + !si.isPinned()).collect(Collectors.toList()); + if (appShortcuts.size() >= maxShortcutPerApp) { + // Max has reached. Removes shortcuts until they fall within the hard cap. + // Sort by isManifestShortcut(), isDynamic() and getLastChangedTimestamp(). + Collections.sort(appShortcuts, mShortcutTypeRankAndTimeComparator); + + while (appShortcuts.size() >= maxShortcutPerApp) { + final ShortcutInfo shortcut = appShortcuts.remove(appShortcuts.size() - 1); + if (shortcut.isDeclaredInManifest()) { + // All shortcuts are manifest shortcuts and cannot be removed. + throw new IllegalArgumentException(getPackageName() + " has published " + + appShortcuts.size() + " manifest shortcuts across different" + + " activities."); + } + forceDeleteShortcutInner(shortcut.getId()); + } + } + } + } + /** * Remove all shortcuts that aren't pinned, cached nor dynamic. * @@ -1371,6 +1393,61 @@ class ShortcutPackage extends ShortcutPackageItem { }; /** + * To sort by isManifestShortcut(), isDynamic(), getRank() and + * getLastChangedTimestamp(). i.e. manifest shortcuts come before non-manifest shortcuts, + * dynamic shortcuts come before floating shortcuts, then sort by last changed timestamp. + * + * This is used to decide which shortcuts to remove when the total number of shortcuts retained + * for the app exceeds the limit defined in {@link ShortcutService#getMaxAppShortcuts()}. + * + * (Note the number of manifest shortcuts is always <= the max number, because if there are + * more, ShortcutParser would ignore the rest.) + */ + final Comparator<ShortcutInfo> mShortcutTypeRankAndTimeComparator = (ShortcutInfo a, + ShortcutInfo b) -> { + if (a.isDeclaredInManifest() && !b.isDeclaredInManifest()) { + return -1; + } + if (!a.isDeclaredInManifest() && b.isDeclaredInManifest()) { + return 1; + } + if (a.isDynamic() && b.isDynamic()) { + return Integer.compare(a.getRank(), b.getRank()); + } + if (a.isDynamic()) { + return -1; + } + if (b.isDynamic()) { + return 1; + } + if (a.isCached() && b.isCached()) { + // if both shortcuts are cached, prioritize shortcuts cached by people tile, + if (a.hasFlags(ShortcutInfo.FLAG_CACHED_PEOPLE_TILE) + && !b.hasFlags(ShortcutInfo.FLAG_CACHED_PEOPLE_TILE)) { + return -1; + } else if (!a.hasFlags(ShortcutInfo.FLAG_CACHED_PEOPLE_TILE) + && b.hasFlags(ShortcutInfo.FLAG_CACHED_PEOPLE_TILE)) { + return 1; + } + // followed by bubbles. + if (a.hasFlags(ShortcutInfo.FLAG_CACHED_BUBBLES) + && !b.hasFlags(ShortcutInfo.FLAG_CACHED_BUBBLES)) { + return -1; + } else if (!a.hasFlags(ShortcutInfo.FLAG_CACHED_BUBBLES) + && b.hasFlags(ShortcutInfo.FLAG_CACHED_BUBBLES)) { + return 1; + } + } + if (a.isCached()) { + return -1; + } + if (b.isCached()) { + return 1; + } + return Long.compare(b.getLastChangedTimestamp(), a.getLastChangedTimestamp()); + }; + + /** * Build a list of shortcuts for each target activity and return as a map. The result won't * contain "floating" shortcuts because they don't belong on any activities. */ diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 49831d75db49..7fc46fd6f757 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -181,6 +181,9 @@ public class ShortcutService extends IShortcutService.Stub { static final int DEFAULT_MAX_SHORTCUTS_PER_ACTIVITY = 15; @VisibleForTesting + static final int DEFAULT_MAX_SHORTCUTS_PER_APP = 100; + + @VisibleForTesting static final int DEFAULT_MAX_ICON_DIMENSION_DP = 96; @VisibleForTesting @@ -257,6 +260,11 @@ public class ShortcutService extends IShortcutService.Stub { String KEY_MAX_SHORTCUTS = "max_shortcuts"; /** + * Key name for the max shortcuts can be retained in system ram per app. (int) + */ + String KEY_MAX_SHORTCUTS_PER_APP = "max_shortcuts_per_app"; + + /** * Key name for icon compression quality, 0-100. */ String KEY_ICON_QUALITY = "icon_quality"; @@ -329,11 +337,16 @@ public class ShortcutService extends IShortcutService.Stub { new SparseArray<>(); /** - * Max number of dynamic + manifest shortcuts that each application can have at a time. + * Max number of dynamic + manifest shortcuts that each activity can have at a time. */ private int mMaxShortcuts; /** + * Max number of shortcuts that can exists in system ram for each application. + */ + private int mMaxShortcutsPerApp; + + /** * Max number of updating API calls that each application can make during the interval. */ int mMaxUpdatesPerInterval; @@ -807,6 +820,9 @@ public class ShortcutService extends IShortcutService.Stub { mMaxShortcuts = Math.max(0, (int) parser.getLong( ConfigConstants.KEY_MAX_SHORTCUTS, DEFAULT_MAX_SHORTCUTS_PER_ACTIVITY)); + mMaxShortcutsPerApp = Math.max(0, (int) parser.getLong( + ConfigConstants.KEY_MAX_SHORTCUTS_PER_APP, DEFAULT_MAX_SHORTCUTS_PER_APP)); + final int iconDimensionDp = Math.max(1, injectIsLowRamDevice() ? (int) parser.getLong( ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM, @@ -1759,6 +1775,13 @@ public class ShortcutService extends IShortcutService.Stub { } /** + * Return the max number of shortcuts can be retaiend in system ram for each application. + */ + int getMaxAppShortcuts() { + return mMaxShortcutsPerApp; + } + + /** * - Sends a notification to LauncherApps * - Write to file */ diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 8aca912999cc..5f8e01e583c4 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -341,6 +341,7 @@ import android.window.TransitionInfo.AnimationOptions; import android.window.WindowContainerToken; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ResolverActivity; import com.android.internal.content.ReferrerIntent; @@ -503,7 +504,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private RemoteTransition mPendingRemoteTransition; ActivityOptions returningOptions; // options that are coming back via convertToTranslucent AppTimeTracker appTimeTracker; // set if we are tracking the time in this app/task/activity + @GuardedBy("this") ActivityServiceConnectionsHolder mServiceConnectionsHolder; // Service connections. + /** @see android.content.Context#BIND_ADJUST_WITH_ACTIVITY */ + volatile boolean mVisibleForServiceConnection; UriPermissionOwner uriPermissions; // current special URI access perms. WindowProcessController app; // if non-null, hosting application private State mState; // current state we are in @@ -553,7 +557,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A long lastLaunchTime; // time of last launch of this activity ComponentName requestedVrComponent; // the requested component for handling VR mode. - boolean inHistory; // are we in the history task? + /** Whether this activity is reachable from hierarchy. */ + volatile boolean inHistory; final ActivityTaskSupervisor mTaskSupervisor; final RootWindowContainer mRootWindowContainer; @@ -1904,7 +1909,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } - static @Nullable ActivityRecord forTokenLocked(IBinder token) { + /** Gets the corresponding record by the token. Note that it may not exist in the hierarchy. */ + @Nullable + static ActivityRecord forToken(IBinder token) { if (token == null) return null; final Token activityToken; try { @@ -1913,7 +1920,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A Slog.w(TAG, "Bad activity token: " + token, e); return null; } - final ActivityRecord r = activityToken.mActivityRef.get(); + return activityToken.mActivityRef.get(); + } + + static @Nullable ActivityRecord forTokenLocked(IBinder token) { + final ActivityRecord r = forToken(token); return r == null || r.getRootTask() == null ? null : r; } @@ -4036,17 +4047,32 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mDisplayContent.getDisplayPolicy().removeRelaunchingApp(this); } + ActivityServiceConnectionsHolder getOrCreateServiceConnectionsHolder() { + synchronized (this) { + if (mServiceConnectionsHolder == null) { + mServiceConnectionsHolder = new ActivityServiceConnectionsHolder(this); + } + return mServiceConnectionsHolder; + } + } + /** * Perform clean-up of service connections in an activity record. */ private void cleanUpActivityServices() { - if (mServiceConnectionsHolder == null) { - return; + synchronized (this) { + if (mServiceConnectionsHolder == null) { + return; + } + // Throw away any services that have been bound by this activity. + mServiceConnectionsHolder.disconnectActivityFromServices(); + // This activity record is removing, make sure not to disconnect twice. + mServiceConnectionsHolder = null; } - // Throw away any services that have been bound by this activity. - mServiceConnectionsHolder.disconnectActivityFromServices(); - // This activity record is removing, make sure not to disconnect twice. - mServiceConnectionsHolder = null; + } + + private void updateVisibleForServiceConnection() { + mVisibleForServiceConnection = mVisibleRequested || mState == RESUMED || mState == PAUSING; } /** @@ -5139,6 +5165,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A taskFragment.onActivityVisibleRequestedChanged(); } setInsetsFrozen(!visible); + updateVisibleForServiceConnection(); if (app != null) { mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); } @@ -5617,6 +5644,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } } + updateVisibleForServiceConnection(); if (app != null) { mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); } @@ -7880,6 +7908,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } /** + * @return The {@code true} if the current instance has {@link mCompatDisplayInsets} without + * considering the inheritance implemented in {@link #getCompatDisplayInsets()} + */ + boolean hasCompatDisplayInsetsWithoutInheritance() { + return mCompatDisplayInsets != null; + } + + /** * @return {@code true} if this activity is in size compatibility mode that uses the different * density than its parent or its bounds don't fit in parent naturally. */ @@ -7887,7 +7923,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mInSizeCompatModeForBounds) { return true; } - if (mCompatDisplayInsets == null || !shouldCreateCompatDisplayInsets() + if (getCompatDisplayInsets() == null || !shouldCreateCompatDisplayInsets() // The orientation is different from parent when transforming. || isFixedRotationTransforming()) { return false; @@ -7958,11 +7994,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. private void updateCompatDisplayInsets() { - if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { - mCompatDisplayInsets = mLetterboxUiController.getInheritedCompatDisplayInsets(); - return; - } - if (mCompatDisplayInsets != null || !shouldCreateCompatDisplayInsets()) { + if (getCompatDisplayInsets() != null || !shouldCreateCompatDisplayInsets()) { // The override configuration is set only once in size compatibility mode. return; } @@ -8025,9 +8057,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override float getCompatScale() { - if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { - return mLetterboxUiController.getInheritedSizeCompatScale(); - } return hasSizeCompatBounds() ? mSizeCompatScale : super.getCompatScale(); } @@ -8071,7 +8100,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A resolveFixedOrientationConfiguration(newParentConfiguration); } - if (mCompatDisplayInsets != null) { + if (getCompatDisplayInsets() != null) { resolveSizeCompatModeConfiguration(newParentConfiguration); } else if (inMultiWindowMode() && !isFixedOrientationLetterboxAllowed) { // We ignore activities' requested orientation in multi-window modes. They may be @@ -8089,7 +8118,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A resolveAspectRatioRestriction(newParentConfiguration); } - if (isFixedOrientationLetterboxAllowed || mCompatDisplayInsets != null + if (isFixedOrientationLetterboxAllowed || getCompatDisplayInsets() != null // In fullscreen, can be letterboxed for aspect ratio. || !inMultiWindowMode()) { updateResolvedBoundsPosition(newParentConfiguration); @@ -8097,7 +8126,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A boolean isIgnoreOrientationRequest = mDisplayContent != null && mDisplayContent.getIgnoreOrientationRequest(); - if (mCompatDisplayInsets == null // for size compat mode set in updateCompatDisplayInsets + if (getCompatDisplayInsets() == null + // for size compat mode set in updateCompatDisplayInsets // Fixed orientation letterboxing is possible on both large screen devices // with ignoreOrientationRequest enabled and on phones in split screen even with // ignoreOrientationRequest disabled. @@ -8143,7 +8173,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A info.neverSandboxDisplayApis(sConstrainDisplayApisConfig), info.alwaysSandboxDisplayApis(sConstrainDisplayApisConfig), !matchParentBounds(), - mCompatDisplayInsets != null, + getCompatDisplayInsets() != null, shouldCreateCompatDisplayInsets()); } resolvedConfig.windowConfiguration.setMaxBounds(mTmpBounds); @@ -8442,8 +8472,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A || orientationRespectedWithInsets)) { return; } + final CompatDisplayInsets compatDisplayInsets = getCompatDisplayInsets(); - if (mCompatDisplayInsets != null && !mCompatDisplayInsets.mIsInFixedOrientationLetterbox) { + if (compatDisplayInsets != null && !compatDisplayInsets.mIsInFixedOrientationLetterbox) { // App prefers to keep its original size. // If the size compat is from previous fixed orientation letterboxing, we may want to // have fixed orientation letterbox again, otherwise it will show the size compat @@ -8498,9 +8529,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mIsAspectRatioApplied = applyAspectRatio(resolvedBounds, containingBoundsWithInsets, containingBounds, desiredAspectRatio); - if (mCompatDisplayInsets != null) { - mCompatDisplayInsets.getBoundsByRotation( - mTmpBounds, newParentConfig.windowConfiguration.getRotation()); + if (compatDisplayInsets != null) { + compatDisplayInsets.getBoundsByRotation(mTmpBounds, + newParentConfig.windowConfiguration.getRotation()); if (resolvedBounds.width() != mTmpBounds.width() || resolvedBounds.height() != mTmpBounds.height()) { // The app shouldn't be resized, we only do fixed orientation letterboxing if the @@ -8514,7 +8545,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Calculate app bounds using fixed orientation bounds because they will be needed later // for comparison with size compat app bounds in {@link resolveSizeCompatModeConfiguration}. getTaskFragment().computeConfigResourceOverrides(getResolvedOverrideConfiguration(), - newParentConfig, mCompatDisplayInsets); + newParentConfig, compatDisplayInsets); mLetterboxBoundsForFixedOrientationAndAspectRatio = new Rect(resolvedBounds); } @@ -8571,13 +8602,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ? requestedOrientation // We should use the original orientation of the activity when possible to avoid // forcing the activity in the opposite orientation. - : mCompatDisplayInsets.mOriginalRequestedOrientation != ORIENTATION_UNDEFINED - ? mCompatDisplayInsets.mOriginalRequestedOrientation + : getCompatDisplayInsets().mOriginalRequestedOrientation != ORIENTATION_UNDEFINED + ? getCompatDisplayInsets().mOriginalRequestedOrientation : newParentConfiguration.orientation; int rotation = newParentConfiguration.windowConfiguration.getRotation(); final boolean isFixedToUserRotation = mDisplayContent == null || mDisplayContent.getDisplayRotation().isFixedToUserRotation(); - if (!isFixedToUserRotation && !mCompatDisplayInsets.mIsFloating) { + if (!isFixedToUserRotation && !getCompatDisplayInsets().mIsFloating) { // Use parent rotation because the original display can be rotated. resolvedConfig.windowConfiguration.setRotation(rotation); } else { @@ -8593,11 +8624,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // rely on them to contain the original and unchanging width and height of the app. final Rect containingAppBounds = new Rect(); final Rect containingBounds = mTmpBounds; - mCompatDisplayInsets.getContainerBounds(containingAppBounds, containingBounds, rotation, + getCompatDisplayInsets().getContainerBounds(containingAppBounds, containingBounds, rotation, orientation, orientationRequested, isFixedToUserRotation); resolvedBounds.set(containingBounds); // The size of floating task is fixed (only swap), so the aspect ratio is already correct. - if (!mCompatDisplayInsets.mIsFloating) { + if (!getCompatDisplayInsets().mIsFloating) { mIsAspectRatioApplied = applyAspectRatio(resolvedBounds, containingAppBounds, containingBounds); } @@ -8606,7 +8637,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // are calculated in compat container space. The actual position on screen will be applied // later, so the calculation is simpler that doesn't need to involve offset from parent. getTaskFragment().computeConfigResourceOverrides(resolvedConfig, newParentConfiguration, - mCompatDisplayInsets); + getCompatDisplayInsets()); // Use current screen layout as source because the size of app is independent to parent. resolvedConfig.screenLayout = TaskFragment.computeScreenLayoutOverride( getConfiguration().screenLayout, resolvedConfig.screenWidthDp, @@ -8641,14 +8672,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Calculates the scale the size compatibility bounds into the region which is available // to application. - final int contentW = resolvedAppBounds.width(); - final int contentH = resolvedAppBounds.height(); - final int viewportW = containerAppBounds.width(); - final int viewportH = containerAppBounds.height(); final float lastSizeCompatScale = mSizeCompatScale; - // Only allow to scale down. - mSizeCompatScale = (contentW <= viewportW && contentH <= viewportH) - ? 1f : Math.min((float) viewportW / contentW, (float) viewportH / contentH); + updateSizeCompatScale(resolvedAppBounds, containerAppBounds); + final int containerTopInset = containerAppBounds.top - containerBounds.top; final boolean topNotAligned = containerTopInset != resolvedAppBounds.top - resolvedBounds.top; @@ -8688,6 +8714,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A isInSizeCompatModeForBounds(resolvedAppBounds, containerAppBounds); } + void updateSizeCompatScale(Rect resolvedAppBounds, Rect containerAppBounds) { + // Only allow to scale down. + mSizeCompatScale = mLetterboxUiController.findOpaqueNotFinishingActivityBelow() + .map(activityRecord -> activityRecord.mSizeCompatScale) + .orElseGet(() -> { + final int contentW = resolvedAppBounds.width(); + final int contentH = resolvedAppBounds.height(); + final int viewportW = containerAppBounds.width(); + final int viewportH = containerAppBounds.height(); + return (contentW <= viewportW && contentH <= viewportH) ? 1f : Math.min( + (float) viewportW / contentW, (float) viewportH / contentH); + }); + } + private boolean isInSizeCompatModeForBounds(final Rect appBounds, final Rect containerBounds) { if (mLetterboxUiController.hasInheritedLetterboxBehavior()) { // To avoid wrong app behaviour, we decided to disable SCM when a translucent activity @@ -8750,10 +8790,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override public Rect getBounds() { - if (mSizeCompatBounds != null) { - return mSizeCompatBounds; - } - return super.getBounds(); + // TODO(b/268458693): Refactor configuration inheritance in case of translucent activities + final Rect superBounds = super.getBounds(); + return mLetterboxUiController.findOpaqueNotFinishingActivityBelow() + .map(ActivityRecord::getBounds) + .orElseGet(() -> { + if (mSizeCompatBounds != null) { + return mSizeCompatBounds; + } + return superBounds; + }); } @Override @@ -8778,7 +8824,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Max bounds should be sandboxed when an activity should have compatDisplayInsets, and it // will keep the same bounds and screen configuration when it was first launched regardless // how its parent window changes, so that the sandbox API will provide a consistent result. - if (mCompatDisplayInsets != null || shouldCreateCompatDisplayInsets()) { + if (getCompatDisplayInsets() != null || shouldCreateCompatDisplayInsets()) { return true; } @@ -8820,7 +8866,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mTransitionController.collect(this); } } - if (mCompatDisplayInsets != null) { + if (getCompatDisplayInsets() != null) { Configuration overrideConfig = getRequestedOverrideConfiguration(); // Adapt to changes in orientation locking. The app is still non-resizable, but // it can change which orientation is fixed. If the fixed orientation changes, @@ -8896,7 +8942,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mVisibleRequested) { // It may toggle the UI for user to restart the size compatibility mode activity. display.handleActivitySizeCompatModeIfNeeded(this); - } else if (mCompatDisplayInsets != null && !visibleIgnoringKeyguard + } else if (getCompatDisplayInsets() != null && !visibleIgnoringKeyguard && (app == null || !app.hasVisibleActivities())) { // visibleIgnoringKeyguard is checked to avoid clearing mCompatDisplayInsets during // displays change. Displays are turned off during the change so mVisibleRequested diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java index 0859d40c0fd1..5f56af7fd4e0 100644 --- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java +++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java @@ -16,14 +16,14 @@ package com.android.server.wm; -import static com.android.server.wm.ActivityRecord.State.PAUSING; -import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import android.util.ArraySet; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; + import java.io.PrintWriter; import java.util.function.Consumer; @@ -38,8 +38,6 @@ import java.util.function.Consumer; */ public class ActivityServiceConnectionsHolder<T> { - private final ActivityTaskManagerService mService; - /** The activity the owns this service connection object. */ private final ActivityRecord mActivity; @@ -49,19 +47,19 @@ public class ActivityServiceConnectionsHolder<T> { * on the WM side since we don't perform operations on the object. Mainly here for communication * and booking with the AM side. */ + @GuardedBy("mActivity") private ArraySet<T> mConnections; /** Whether all connections of {@link #mActivity} are being removed. */ private volatile boolean mIsDisconnecting; - ActivityServiceConnectionsHolder(ActivityTaskManagerService service, ActivityRecord activity) { - mService = service; + ActivityServiceConnectionsHolder(ActivityRecord activity) { mActivity = activity; } /** Adds a connection record that the activity has bound to a specific service. */ public void addConnection(T c) { - synchronized (mService.mGlobalLock) { + synchronized (mActivity) { if (mIsDisconnecting) { // This is unlikely to happen because the caller should create a new holder. if (DEBUG_CLEANUP) { @@ -79,7 +77,7 @@ public class ActivityServiceConnectionsHolder<T> { /** Removed a connection record between the activity and a specific service. */ public void removeConnection(T c) { - synchronized (mService.mGlobalLock) { + synchronized (mActivity) { if (mConnections == null) { return; } @@ -90,20 +88,18 @@ public class ActivityServiceConnectionsHolder<T> { } } + /** @see android.content.Context#BIND_ADJUST_WITH_ACTIVITY */ public boolean isActivityVisible() { - synchronized (mService.mGlobalLock) { - return mActivity.isVisibleRequested() || mActivity.isState(RESUMED, PAUSING); - } + return mActivity.mVisibleForServiceConnection; } public int getActivityPid() { - synchronized (mService.mGlobalLock) { - return mActivity.hasProcess() ? mActivity.app.getPid() : -1; - } + final WindowProcessController wpc = mActivity.app; + return wpc != null ? wpc.getPid() : -1; } public void forEachConnection(Consumer<T> consumer) { - synchronized (mService.mGlobalLock) { + synchronized (mActivity) { if (mConnections == null || mConnections.isEmpty()) { return; } @@ -118,6 +114,7 @@ public class ActivityServiceConnectionsHolder<T> { * general, this method is used to clean up if the activity didn't unbind services before it * is destroyed. */ + @GuardedBy("mActivity") void disconnectActivityFromServices() { if (mConnections == null || mConnections.isEmpty() || mIsDisconnecting) { return; @@ -130,16 +127,14 @@ public class ActivityServiceConnectionsHolder<T> { // still in the message queue, so keep the reference of {@link #mConnections} to make sure // the connection list is up-to-date. mIsDisconnecting = true; - mService.mH.post(() -> { - mService.mAmInternal.disconnectActivityFromServices(this); + mActivity.mAtmService.mH.post(() -> { + mActivity.mAtmService.mAmInternal.disconnectActivityFromServices(this); mIsDisconnecting = false; }); } public void dump(PrintWriter pw, String prefix) { - synchronized (mService.mGlobalLock) { - pw.println(prefix + "activity=" + mActivity); - } + pw.println(prefix + "activity=" + mActivity); } /** Used by {@link ActivityRecord#dump}. */ diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 861961599ada..491e58b63f76 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1486,7 +1486,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { a.persistableMode = ActivityInfo.PERSIST_NEVER; a.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; a.colorMode = ActivityInfo.COLOR_MODE_DEFAULT; - a.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; + a.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS | ActivityInfo.FLAG_NO_HISTORY; a.resizeMode = RESIZE_MODE_UNRESIZEABLE; a.configChanges = 0xffffffff; @@ -6000,18 +6000,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token) { - synchronized (mGlobalLock) { - final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token); - if (r == null) { - return null; - } - if (r.mServiceConnectionsHolder == null) { - r.mServiceConnectionsHolder = new ActivityServiceConnectionsHolder( - ActivityTaskManagerService.this, r); - } - - return r.mServiceConnectionsHolder; + final ActivityRecord r = ActivityRecord.forToken(token); + if (r == null || !r.inHistory) { + return null; } + return r.getOrCreateServiceConnectionsHolder(); } @Override diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index b0eecebc7d79..ec355b73a7be 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4505,24 +4505,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ @VisibleForTesting SurfaceControl computeImeParent() { - if (mImeLayeringTarget != null) { - // Ensure changing the IME parent when the layering target that may use IME has - // became to the input target for preventing IME flickers. - // Note that: - // 1) For the imeLayeringTarget that may not use IME but requires IME on top - // of it (e.g. an overlay window with NOT_FOCUSABLE|ALT_FOCUSABLE_IM flags), we allow - // it to re-parent the IME on top the display to keep the legacy behavior. - // 2) Even though the starting window won't use IME, the associated activity - // behind the starting window may request the input. If so, then we should still hold - // the IME parent change until the activity started the input. - boolean imeLayeringTargetMayUseIme = - LayoutParams.mayUseInputMethod(mImeLayeringTarget.mAttrs.flags) - || mImeLayeringTarget.mAttrs.type == TYPE_APPLICATION_STARTING; - if (imeLayeringTargetMayUseIme && (mImeInputTarget == null - || mImeLayeringTarget.mActivityRecord != mImeInputTarget.getActivityRecord())) { - // Do not change parent if the window hasn't requested IME. - return null; - } + if (!canComputeImeParent(mImeLayeringTarget, mImeInputTarget)) { + return null; } // Attach it to app if the target is part of an app and such app is covering the entire // screen. If it's not covering the entire screen the IME might extend beyond the apps @@ -4535,6 +4519,76 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp ? mImeWindowsContainer.getParent().getSurfaceControl() : null; } + private static boolean canComputeImeParent(@Nullable WindowState imeLayeringTarget, + @Nullable InputTarget imeInputTarget) { + if (imeLayeringTarget == null) { + return false; + } + if (shouldComputeImeParentForEmbeddedActivity(imeLayeringTarget, imeInputTarget)) { + return true; + } + // Ensure changing the IME parent when the layering target that may use IME has + // became to the input target for preventing IME flickers. + // Note that: + // 1) For the imeLayeringTarget that may not use IME but requires IME on top + // of it (e.g. an overlay window with NOT_FOCUSABLE|ALT_FOCUSABLE_IM flags), we allow + // it to re-parent the IME on top the display to keep the legacy behavior. + // 2) Even though the starting window won't use IME, the associated activity + // behind the starting window may request the input. If so, then we should still hold + // the IME parent change until the activity started the input. + boolean imeLayeringTargetMayUseIme = + LayoutParams.mayUseInputMethod(imeLayeringTarget.mAttrs.flags) + || imeLayeringTarget.mAttrs.type == TYPE_APPLICATION_STARTING; + + if (imeLayeringTargetMayUseIme && (imeInputTarget == null + || imeLayeringTarget.mActivityRecord != imeInputTarget.getActivityRecord())) { + // Do not change parent if the window hasn't requested IME. + return false; + } + return true; + } + + /** + * Called from {@link #computeImeParent()} to check the given IME targets if the IME surface + * parent should be updated in ActivityEmbeddings. + * + * As the IME layering target is calculated according to the window hierarchy by + * {@link #computeImeTarget}, the layering target and input target may be different when the + * window hasn't started input connection, WindowManagerService hasn't yet received the + * input target which reported from InputMethodManagerService. To make the IME surface will be + * shown on the best fit IME layering target, we basically won't update IME parent until both + * IME input and layering target updated for better IME transition. + * + * However, in activity embedding, tapping a window won't update it to the top window so the + * calculated IME layering target may higher than input target. Update IME parent for this case. + * + * @return {@code true} means the layer of IME layering target is higher than the input target + * and {@link #computeImeParent()} should keep progressing to update the IME + * surface parent on the display in case the IME surface left behind. + */ + private static boolean shouldComputeImeParentForEmbeddedActivity( + @Nullable WindowState imeLayeringTarget, @Nullable InputTarget imeInputTarget) { + if (imeInputTarget == null || imeLayeringTarget == null) { + return false; + } + final WindowState inputTargetWindow = imeInputTarget.getWindowState(); + if (inputTargetWindow == null || !imeLayeringTarget.isAttached() + || !inputTargetWindow.isAttached()) { + return false; + } + + final ActivityRecord inputTargetRecord = imeInputTarget.getActivityRecord(); + final ActivityRecord layeringTargetRecord = imeLayeringTarget.getActivityRecord(); + if (inputTargetRecord == null || layeringTargetRecord == null + || inputTargetRecord == layeringTargetRecord + || inputTargetRecord.getTask() != layeringTargetRecord.getTask() + || !inputTargetRecord.isEmbedded() || !layeringTargetRecord.isEmbedded()) { + // Check whether the input target and layering target are embedded in the same Task. + return false; + } + return imeLayeringTarget.compareTo(inputTargetWindow) > 0; + } + void setLayoutNeeded() { if (DEBUG_LAYOUT) Slog.w(TAG_WM, "setLayoutNeeded: callers=" + Debug.getCallers(3)); mLayoutNeeded = true; diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 8e9a21490645..41130812d658 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1577,9 +1577,8 @@ public class DisplayPolicy { applyKeyguardPolicy(win, imeTarget); // Check if the freeform window overlaps with the navigation bar area. - final boolean isOverlappingWithNavBar = isOverlappingWithNavBar(win); - if (isOverlappingWithNavBar && !mIsFreeformWindowOverlappingWithNavBar - && win.inFreeformWindowingMode()) { + if (!mIsFreeformWindowOverlappingWithNavBar && win.inFreeformWindowingMode() + && win.mActivityRecord != null && isOverlappingWithNavBar(win)) { mIsFreeformWindowOverlappingWithNavBar = true; } @@ -1637,7 +1636,7 @@ public class DisplayPolicy { // mode; if it's in gesture navigation mode, the navigation bar will be // NAV_BAR_FORCE_TRANSPARENT and its appearance won't be decided by overlapping // windows. - if (isOverlappingWithNavBar) { + if (isOverlappingWithNavBar(win)) { if (mNavBarColorWindowCandidate == null) { mNavBarColorWindowCandidate = win; addSystemBarColorApp(win); @@ -1665,7 +1664,7 @@ public class DisplayPolicy { addSystemBarColorApp(win); } } - if (isOverlappingWithNavBar && mNavBarColorWindowCandidate == null) { + if (isOverlappingWithNavBar(win) && mNavBarColorWindowCandidate == null) { mNavBarColorWindowCandidate = win; } } @@ -2858,7 +2857,7 @@ public class DisplayPolicy { @VisibleForTesting static boolean isOverlappingWithNavBar(@NonNull WindowState win) { - if (win.mActivityRecord == null || !win.isVisible()) { + if (!win.isVisible()) { return false; } diff --git a/services/core/java/com/android/server/wm/LetterboxConfiguration.java b/services/core/java/com/android/server/wm/LetterboxConfiguration.java index 513667024caa..fa49a6ba6c2b 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfiguration.java +++ b/services/core/java/com/android/server/wm/LetterboxConfiguration.java @@ -22,6 +22,7 @@ import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ALLOW import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ENABLE_CAMERA_COMPAT_TREATMENT; import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ENABLE_COMPAT_FAKE_FOCUS; import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY; +import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY; import android.annotation.IntDef; import android.annotation.NonNull; @@ -296,7 +297,6 @@ final class LetterboxConfiguration { R.bool.config_isCompatFakeFocusEnabled); mIsPolicyForIgnoringRequestedOrientationEnabled = mContext.getResources().getBoolean( R.bool.config_letterboxIsPolicyForIgnoringRequestedOrientationEnabled); - mIsDisplayRotationImmersiveAppCompatPolicyEnabled = mContext.getResources().getBoolean( R.bool.config_letterboxIsDisplayRotationImmersiveAppCompatPolicyEnabled); mDeviceConfig.updateFlagActiveStatus( @@ -311,7 +311,9 @@ final class LetterboxConfiguration { mDeviceConfig.updateFlagActiveStatus( /* isActive */ mIsCompatFakeFocusEnabled, /* key */ KEY_ENABLE_COMPAT_FAKE_FOCUS); - + mDeviceConfig.updateFlagActiveStatus( + /* isActive */ mTranslucentLetterboxingEnabled, + /* key */ KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY); mLetterboxConfigurationPersister = letterboxConfigurationPersister; mLetterboxConfigurationPersister.start(); } @@ -1003,7 +1005,7 @@ final class LetterboxConfiguration { boolean isTranslucentLetterboxingEnabled() { return mTranslucentLetterboxingOverrideEnabled || (mTranslucentLetterboxingEnabled - && isTranslucentLetterboxingAllowed()); + && mDeviceConfig.getFlag(KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY)); } void setTranslucentLetterboxingEnabled(boolean translucentLetterboxingEnabled) { @@ -1051,13 +1053,6 @@ final class LetterboxConfiguration { isDeviceInTabletopMode, nextVerticalPosition); } - // TODO(b/262378106): Cache a runtime flag and implement - // DeviceConfig.OnPropertiesChangedListener - static boolean isTranslucentLetterboxingAllowed() { - return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_WINDOW_MANAGER, - "enable_translucent_activity_letterbox", false); - } - /** Whether fake sending focus is enabled for unfocused apps in splitscreen */ boolean isCompatFakeFocusEnabled() { return mIsCompatFakeFocusEnabled && mDeviceConfig.getFlag(KEY_ENABLE_COMPAT_FAKE_FOCUS); diff --git a/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java b/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java index b364872e56e7..df3c8f0fdccc 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java +++ b/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java @@ -48,6 +48,11 @@ final class LetterboxConfigurationDeviceConfig static final String KEY_ENABLE_COMPAT_FAKE_FOCUS = "enable_compat_fake_focus"; private static final boolean DEFAULT_VALUE_ENABLE_COMPAT_FAKE_FOCUS = true; + static final String KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY = + "enable_letterbox_translucent_activity"; + + private static final boolean DEFAULT_VALUE_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY = true; + @VisibleForTesting static final Map<String, Boolean> sKeyToDefaultValueMap = Map.of( KEY_ENABLE_CAMERA_COMPAT_TREATMENT, @@ -57,7 +62,9 @@ final class LetterboxConfigurationDeviceConfig KEY_ALLOW_IGNORE_ORIENTATION_REQUEST, DEFAULT_VALUE_ALLOW_IGNORE_ORIENTATION_REQUEST, KEY_ENABLE_COMPAT_FAKE_FOCUS, - DEFAULT_VALUE_ENABLE_COMPAT_FAKE_FOCUS + DEFAULT_VALUE_ENABLE_COMPAT_FAKE_FOCUS, + KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY, + DEFAULT_VALUE_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY ); // Whether camera compatibility treatment is enabled. @@ -82,6 +89,10 @@ final class LetterboxConfigurationDeviceConfig // which isn't guaranteed by default in multi-window modes. private boolean mIsCompatFakeFocusAllowed = DEFAULT_VALUE_ENABLE_COMPAT_FAKE_FOCUS; + // Whether the letterbox strategy for transparent activities is allowed + private boolean mIsTranslucentLetterboxingAllowed = + DEFAULT_VALUE_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY; + // Set of active device configs that need to be updated in // DeviceConfig.OnPropertiesChangedListener#onPropertiesChanged. private final ArraySet<String> mActiveDeviceConfigsSet = new ArraySet<>(); @@ -129,6 +140,8 @@ final class LetterboxConfigurationDeviceConfig return mIsAllowIgnoreOrientationRequest; case KEY_ENABLE_COMPAT_FAKE_FOCUS: return mIsCompatFakeFocusAllowed; + case KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY: + return mIsTranslucentLetterboxingAllowed; default: throw new AssertionError("Unexpected flag name: " + key); } @@ -141,20 +154,20 @@ final class LetterboxConfigurationDeviceConfig } switch (key) { case KEY_ENABLE_CAMERA_COMPAT_TREATMENT: - mIsCameraCompatTreatmentEnabled = - getDeviceConfig(key, defaultValue); + mIsCameraCompatTreatmentEnabled = getDeviceConfig(key, defaultValue); break; case KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY: mIsDisplayRotationImmersiveAppCompatPolicyEnabled = getDeviceConfig(key, defaultValue); break; case KEY_ALLOW_IGNORE_ORIENTATION_REQUEST: - mIsAllowIgnoreOrientationRequest = - getDeviceConfig(key, defaultValue); + mIsAllowIgnoreOrientationRequest = getDeviceConfig(key, defaultValue); break; case KEY_ENABLE_COMPAT_FAKE_FOCUS: - mIsCompatFakeFocusAllowed = - getDeviceConfig(key, defaultValue); + mIsCompatFakeFocusAllowed = getDeviceConfig(key, defaultValue); + break; + case KEY_ENABLE_LETTERBOX_TRANSLUCENT_ACTIVITY: + mIsTranslucentLetterboxingAllowed = getDeviceConfig(key, defaultValue); break; default: throw new AssertionError("Unexpected flag name: " + key); diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index e3437683e957..e1dbe01aca61 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -193,12 +193,6 @@ final class LetterboxUiController { // The app compat state for the opaque activity if any private int mInheritedAppCompatState = APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; - // If true it means that the opaque activity beneath a translucent one is in SizeCompatMode. - private boolean mIsInheritedInSizeCompatMode; - - // This is the SizeCompatScale of the opaque activity beneath a translucent one - private float mInheritedSizeCompatScale; - // The CompatDisplayInsets of the opaque activity beneath the translucent one. private ActivityRecord.CompatDisplayInsets mInheritedCompatDisplayInsets; @@ -735,8 +729,21 @@ final class LetterboxUiController { : mActivityRecord.inMultiWindowMode() ? mActivityRecord.getTask().getBounds() : mActivityRecord.getRootTask().getParent().getBounds(); + // In case of translucent activities an option is to use the WindowState#getFrame() of + // the first opaque activity beneath. In some cases (e.g. an opaque activity is using + // non MATCH_PARENT layouts or a Dialog theme) this might not provide the correct + // information and in particular it might provide a value for a smaller area making + // the letterbox overlap with the translucent activity's frame. + // If we use WindowState#getFrame() for the translucent activity's letterbox inner + // frame, the letterbox will then be overlapped with the translucent activity's frame. + // Because the surface layer of letterbox is lower than an activity window, this + // won't crop the content, but it may affect other features that rely on values stored + // in mLetterbox, e.g. transitions, a status bar scrim and recents preview in Launcher + // For this reason we use ActivityRecord#getBounds() that the translucent activity + // inherits from the first opaque activity beneath and also takes care of the scaling + // in case of activities in size compat mode. final Rect innerFrame = hasInheritedLetterboxBehavior() - ? mActivityRecord.getWindowConfiguration().getBounds() : w.getFrame(); + ? mActivityRecord.getBounds() : w.getFrame(); mLetterbox.layout(spaceToFill, innerFrame, mTmpPoint); } else if (mLetterbox != null) { mLetterbox.hide(); @@ -1386,10 +1393,10 @@ final class LetterboxUiController { mLetterboxConfigListener.onRemoved(); clearInheritedConfig(); } - // In case mActivityRecord.getCompatDisplayInsets() is not null we don't apply the + // In case mActivityRecord.hasCompatDisplayInsetsWithoutOverride() we don't apply the // opaque activity constraints because we're expecting the activity is already letterboxed. - if (mActivityRecord.getTask() == null || mActivityRecord.getCompatDisplayInsets() != null - || mActivityRecord.fillsParent()) { + if (mActivityRecord.getTask() == null || mActivityRecord.fillsParent() + || mActivityRecord.hasCompatDisplayInsetsWithoutInheritance()) { return; } final ActivityRecord firstOpaqueActivityBeneath = mActivityRecord.getTask().getActivity( @@ -1417,6 +1424,7 @@ final class LetterboxUiController { // We need to initialize appBounds to avoid NPE. The actual value will // be set ahead when resolving the Configuration for the activity. mutatedConfiguration.windowConfiguration.setAppBounds(new Rect()); + inheritConfiguration(firstOpaqueActivityBeneath); return mutatedConfiguration; }); } @@ -1457,16 +1465,12 @@ final class LetterboxUiController { return mInheritedAppCompatState; } - float getInheritedSizeCompatScale() { - return mInheritedSizeCompatScale; - } - @Configuration.Orientation int getInheritedOrientation() { return mInheritedOrientation; } - public ActivityRecord.CompatDisplayInsets getInheritedCompatDisplayInsets() { + ActivityRecord.CompatDisplayInsets getInheritedCompatDisplayInsets() { return mInheritedCompatDisplayInsets; } @@ -1486,7 +1490,7 @@ final class LetterboxUiController { * @return The first not finishing opaque activity beneath the current translucent activity * if it exists and the strategy is enabled. */ - private Optional<ActivityRecord> findOpaqueNotFinishingActivityBelow() { + Optional<ActivityRecord> findOpaqueNotFinishingActivityBelow() { if (!hasInheritedLetterboxBehavior() || mActivityRecord.getTask() == null) { return Optional.empty(); } @@ -1508,8 +1512,6 @@ final class LetterboxUiController { } mInheritedOrientation = firstOpaque.getRequestedConfigurationOrientation(); mInheritedAppCompatState = firstOpaque.getAppCompatState(); - mIsInheritedInSizeCompatMode = firstOpaque.inSizeCompatMode(); - mInheritedSizeCompatScale = firstOpaque.getCompatScale(); mInheritedCompatDisplayInsets = firstOpaque.getCompatDisplayInsets(); } @@ -1519,8 +1521,6 @@ final class LetterboxUiController { mInheritedMaxAspectRatio = UNDEFINED_ASPECT_RATIO; mInheritedOrientation = Configuration.ORIENTATION_UNDEFINED; mInheritedAppCompatState = APP_COMPAT_STATE_CHANGED__STATE__UNKNOWN; - mIsInheritedInSizeCompatMode = false; - mInheritedSizeCompatScale = 1f; mInheritedCompatDisplayInsets = null; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3aa80c4ccefb..adaaa259e680 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3455,6 +3455,11 @@ class Task extends TaskFragment { && top.getOrganizedTask() == this && top.isState(RESUMED); // Whether the direct top activity is in size compat mode on foreground. info.topActivityInSizeCompat = isTopActivityResumed && top.inSizeCompatMode(); + if (info.topActivityInSizeCompat + && mWmService.mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) { + // We hide the restart button in case of transparent activities. + info.topActivityInSizeCompat = top.fillsParent(); + } // Whether the direct top activity is eligible for letterbox education. info.topActivityEligibleForLetterboxEducation = isTopActivityResumed && top.isEligibleForLetterboxEducation(); diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 22da56ad4d3b..19e45ff02463 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1953,7 +1953,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { 1f); mBackScreenshots.put(r.mActivityComponent.flattenToString(), backBuffer); } - child.asActivityRecord().inHistory = true; + addingActivity.inHistory = true; task.onDescendantActivityAdded(taskHadActivity, activityType, addingActivity); } } diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index eff9e8da9a76..37f0624464e5 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -113,6 +113,7 @@ public class DataManager { private static final long USAGE_STATS_QUERY_INTERVAL_SEC = 120L; @VisibleForTesting static final int MAX_CACHED_RECENT_SHORTCUTS = 30; + private static final int DEBOUNCE_LENGTH_MS = 500; private final Context mContext; private final Injector mInjector; @@ -129,6 +130,7 @@ public class DataManager { private final List<PeopleService.ConversationsListener> mConversationsListeners = new ArrayList<>(1); private final Handler mHandler; + private final PerPackageThrottler mShortcutsThrottler; private ContentObserver mCallLogContentObserver; private ContentObserver mMmsSmsContentObserver; @@ -140,14 +142,17 @@ public class DataManager { private ConversationStatusExpirationBroadcastReceiver mStatusExpReceiver; public DataManager(Context context) { - this(context, new Injector(), BackgroundThread.get().getLooper()); + this(context, new Injector(), BackgroundThread.get().getLooper(), + new PerPackageThrottlerImpl(BackgroundThread.getHandler(), DEBOUNCE_LENGTH_MS)); } - DataManager(Context context, Injector injector, Looper looper) { + DataManager(Context context, Injector injector, Looper looper, + PerPackageThrottler shortcutsThrottler) { mContext = context; mInjector = injector; mScheduledExecutor = mInjector.createScheduledExecutor(); mHandler = new Handler(looper); + mShortcutsThrottler = shortcutsThrottler; } /** Initialization. Called when the system services are up running. */ @@ -851,12 +856,12 @@ public class DataManager { // pair of <package name, conversation info> List<Pair<String, ConversationInfo>> cachedConvos = new ArrayList<>(); userData.forAllPackages(packageData -> { - packageData.forAllConversations(conversationInfo -> { - if (isEligibleForCleanUp(conversationInfo)) { - cachedConvos.add( - Pair.create(packageData.getPackageName(), conversationInfo)); - } - }); + packageData.forAllConversations(conversationInfo -> { + if (isEligibleForCleanUp(conversationInfo)) { + cachedConvos.add( + Pair.create(packageData.getPackageName(), conversationInfo)); + } + }); }); if (cachedConvos.size() <= targetCachedCount) { return; @@ -867,8 +872,8 @@ public class DataManager { numToUncache + 1, Comparator.comparingLong((Pair<String, ConversationInfo> pair) -> Math.max( - pair.second.getLastEventTimestamp(), - pair.second.getCreationTimestamp())).reversed()); + pair.second.getLastEventTimestamp(), + pair.second.getCreationTimestamp())).reversed()); for (Pair<String, ConversationInfo> cached : cachedConvos) { if (hasActiveNotifications(cached.first, userId, cached.second.getShortcutId())) { continue; @@ -1104,26 +1109,35 @@ public class DataManager { @Override public void onShortcutsAddedOrUpdated(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) { - mInjector.getBackgroundExecutor().execute(() -> { - PackageData packageData = getPackage(packageName, user.getIdentifier()); - for (ShortcutInfo shortcut : shortcuts) { - if (ShortcutHelper.isConversationShortcut( - shortcut, mShortcutServiceInternal, user.getIdentifier())) { - if (shortcut.isCached()) { - ConversationInfo conversationInfo = packageData != null - ? packageData.getConversationInfo(shortcut.getId()) : null; - if (conversationInfo == null - || !conversationInfo.isShortcutCachedForNotification()) { - // This is a newly cached shortcut. Clean up the existing cached - // shortcuts to ensure the cache size is under the limit. - cleanupCachedShortcuts(user.getIdentifier(), - MAX_CACHED_RECENT_SHORTCUTS - 1); + mShortcutsThrottler.scheduleDebounced( + new Pair<>(packageName, user.getIdentifier()), + () -> { + PackageData packageData = getPackage(packageName, user.getIdentifier()); + List<ShortcutInfo> queriedShortcuts = getShortcuts(packageName, + user.getIdentifier(), null); + boolean hasCachedShortcut = false; + for (ShortcutInfo shortcut : queriedShortcuts) { + if (ShortcutHelper.isConversationShortcut( + shortcut, mShortcutServiceInternal, user.getIdentifier())) { + if (shortcut.isCached()) { + ConversationInfo info = packageData != null + ? packageData.getConversationInfo(shortcut.getId()) + : null; + if (info == null + || !info.isShortcutCachedForNotification()) { + hasCachedShortcut = true; + } + } + addOrUpdateConversationInfo(shortcut); } } - addOrUpdateConversationInfo(shortcut); - } - } - }); + // Added at least one new conversation. Uncache older existing cached + // shortcuts to ensure the cache size is under the limit. + if (hasCachedShortcut) { + cleanupCachedShortcuts(user.getIdentifier(), + MAX_CACHED_RECENT_SHORTCUTS); + } + }); } @Override diff --git a/services/people/java/com/android/server/people/data/PerPackageThrottler.java b/services/people/java/com/android/server/people/data/PerPackageThrottler.java new file mode 100644 index 000000000000..3d6cd84d326a --- /dev/null +++ b/services/people/java/com/android/server/people/data/PerPackageThrottler.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2023 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.people.data; + +import android.util.Pair; + +/** The interface for throttling expensive runnables per package. */ +interface PerPackageThrottler { + /** + * Schedule a runnable to run in the future, and debounce runnables for same {@code pkgUserId} + * that occur until that future has run. + */ + void scheduleDebounced(Pair<String, Integer> pkgUserId, Runnable runnable); +} diff --git a/services/people/java/com/android/server/people/data/PerPackageThrottlerImpl.java b/services/people/java/com/android/server/people/data/PerPackageThrottlerImpl.java new file mode 100644 index 000000000000..fa5a67b328b2 --- /dev/null +++ b/services/people/java/com/android/server/people/data/PerPackageThrottlerImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 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.people.data; + +import android.os.Handler; +import android.util.Pair; + +import java.util.HashSet; + +/** + * A class that implements a per-package throttler that prevents a runnable from executing more than + * once every {@code debounceTime}. + */ +public class PerPackageThrottlerImpl implements PerPackageThrottler { + private final Handler mBackgroundHandler; + private final int mDebounceTime; + private final HashSet<Pair<String, Integer>> mPkgScheduledTasks = new HashSet<>(); + + PerPackageThrottlerImpl(Handler backgroundHandler, int debounceTime) { + mBackgroundHandler = backgroundHandler; + mDebounceTime = debounceTime; + } + + @Override + public synchronized void scheduleDebounced( + Pair<String, Integer> pkgUserId, Runnable runnable) { + if (mPkgScheduledTasks.contains(pkgUserId)) { + return; + } + mPkgScheduledTasks.add(pkgUserId); + mBackgroundHandler.postDelayed(() -> { + synchronized (this) { + mPkgScheduledTasks.remove(pkgUserId); + runnable.run(); + } + }, mDebounceTime); + } +} diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java index a27602d65118..454a23b70cb5 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java @@ -86,6 +86,7 @@ import android.service.notification.StatusBarNotification; import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.text.format.DateUtils; +import android.util.Pair; import android.util.Range; import com.android.internal.app.ChooserActivity; @@ -186,6 +187,7 @@ public final class DataManagerTest { private ShortcutInfo mShortcutInfo; private TestInjector mInjector; private TestLooper mLooper; + private TestPerPackageThrottler mShortcutThrottler; @Before public void setUp() throws PackageManager.NameNotFoundException { @@ -275,7 +277,9 @@ public final class DataManagerTest { mInjector = new TestInjector(); mLooper = new TestLooper(); - mDataManager = new DataManager(mContext, mInjector, mLooper.getLooper()); + mShortcutThrottler = new TestPerPackageThrottler(); + mDataManager = new DataManager(mContext, mInjector, mLooper.getLooper(), + mShortcutThrottler); mDataManager.initialize(); when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(), @@ -283,10 +287,7 @@ public final class DataManagerTest { mShortcutInfo = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, buildPerson()); - when(mShortcutServiceInternal.getShortcuts( - anyInt(), anyString(), anyLong(), anyString(), anyList(), any(), any(), - anyInt(), anyInt(), anyInt(), anyInt())) - .thenReturn(Collections.singletonList(mShortcutInfo)); + mockGetShortcuts(Collections.singletonList(mShortcutInfo)); verify(mShortcutServiceInternal).addShortcutChangeCallback( mShortcutChangeCallbackCaptor.capture()); mShortcutChangeCallback = mShortcutChangeCallbackCaptor.getValue(); @@ -972,6 +973,7 @@ public final class DataManagerTest { buildPerson()); ShortcutInfo shortcut3 = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, "sc3", buildPerson()); + mockGetShortcuts(List.of(shortcut1, shortcut2, shortcut3)); mShortcutChangeCallback.onShortcutsAddedOrUpdated(TEST_PKG_NAME, Arrays.asList(shortcut1, shortcut2, shortcut3), UserHandle.of(USER_ID_PRIMARY)); mShortcutChangeCallback.onShortcutsRemoved(TEST_PKG_NAME, @@ -1223,7 +1225,6 @@ public final class DataManagerTest { eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS)); } } - @Test public void testUncacheOldestCachedShortcut_missingNotificationEvents() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); @@ -1233,6 +1234,7 @@ public final class DataManagerTest { ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, shortcutId, buildPerson()); shortcut.setCached(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS); + mockGetShortcuts(Collections.singletonList(shortcut)); mShortcutChangeCallback.onShortcutsAddedOrUpdated( TEST_PKG_NAME, Collections.singletonList(shortcut), @@ -1252,7 +1254,6 @@ public final class DataManagerTest { eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS)); } } - @Test public void testUncacheOldestCachedShortcut_legacyConversation() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); @@ -1274,6 +1275,7 @@ public final class DataManagerTest { ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, shortcutId, buildPerson()); shortcut.setCached(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS); + mockGetShortcuts(Collections.singletonList(shortcut)); mShortcutChangeCallback.onShortcutsAddedOrUpdated( TEST_PKG_NAME, Collections.singletonList(shortcut), @@ -1311,7 +1313,8 @@ public final class DataManagerTest { mDataManager.reportShareTargetEvent(appTargetEvent, intentFilter); byte[] payload = mDataManager.getBackupPayload(USER_ID_PRIMARY); - DataManager dataManager = new DataManager(mContext, mInjector, mLooper.getLooper()); + DataManager dataManager = new DataManager( + mContext, mInjector, mLooper.getLooper(), mShortcutThrottler); dataManager.onUserUnlocked(USER_ID_PRIMARY); dataManager.restore(USER_ID_PRIMARY, payload); ConversationInfo conversationInfo = dataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY) @@ -1723,6 +1726,13 @@ public final class DataManagerTest { return (queryFlags & flag) != 0; } + private void mockGetShortcuts(List<ShortcutInfo> shortcutInfoList) { + when(mShortcutServiceInternal.getShortcuts( + anyInt(), anyString(), anyLong(), anyString(), any(), any(), any(), + anyInt(), anyInt(), anyInt(), anyInt())) + .thenReturn(shortcutInfoList); + } + // "Sends" a notification to a non-customized notification channel - the notification channel // is something generic like "messages" and the notification has a shortcut id private void sendGenericNotification() { @@ -1948,4 +1958,11 @@ public final class DataManagerTest { return mUsageStatsQueryHelper; } } + + private static class TestPerPackageThrottler implements PerPackageThrottler { + @Override + public void scheduleDebounced(Pair<String, Integer> pkgUserId, Runnable runnable) { + runnable.run(); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/people/data/PerPackageThrottlerImplTest.java b/services/tests/servicestests/src/com/android/server/people/data/PerPackageThrottlerImplTest.java new file mode 100644 index 000000000000..672cbb94e074 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/people/data/PerPackageThrottlerImplTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2023 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.people.data; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import android.util.Pair; + +import com.android.server.testutils.OffsettableClock; +import com.android.server.testutils.TestHandler; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.concurrent.atomic.AtomicBoolean; + +@RunWith(JUnit4.class) +public class PerPackageThrottlerImplTest { + private static final int DEBOUNCE_INTERVAL = 500; + private static final String PKG_ONE = "pkg_one"; + private static final String PKG_TWO = "pkg_two"; + private static final int USER_ID = 10; + + private final OffsettableClock mClock = new OffsettableClock.Stopped(); + private final TestHandler mTestHandler = new TestHandler(null, mClock); + private PerPackageThrottlerImpl mThrottler; + + @Before + public void setUp() { + mThrottler = new PerPackageThrottlerImpl(mTestHandler, DEBOUNCE_INTERVAL); + } + + @Test + public void scheduleDebounced() { + AtomicBoolean pkgOneRan = new AtomicBoolean(); + AtomicBoolean pkgTwoRan = new AtomicBoolean(); + + mThrottler.scheduleDebounced(new Pair<>(PKG_ONE, USER_ID), () -> pkgOneRan.set(true)); + mThrottler.scheduleDebounced(new Pair<>(PKG_ONE, USER_ID), () -> pkgOneRan.set(true)); + mThrottler.scheduleDebounced(new Pair<>(PKG_TWO, USER_ID), () -> pkgTwoRan.set(true)); + mThrottler.scheduleDebounced(new Pair<>(PKG_TWO, USER_ID), () -> pkgTwoRan.set(true)); + + assertFalse(pkgOneRan.get()); + assertFalse(pkgTwoRan.get()); + mClock.fastForward(DEBOUNCE_INTERVAL); + mTestHandler.timeAdvance(); + assertTrue(pkgOneRan.get()); + assertTrue(pkgTwoRan.get()); + } +} diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java index 949455a18570..b2754d237f42 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java @@ -32,22 +32,24 @@ import android.service.notification.Condition; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.EventInfo; import android.service.notification.ZenPolicy; -import android.test.suitebuilder.annotation.SmallTest; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; import android.util.Xml; +import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.UiServiceTestCase; import org.junit.Test; import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlPullParserException; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; @SmallTest @RunWith(AndroidJUnit4.class) @@ -189,8 +191,6 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Test public void testRuleXml() throws Exception { - String tag = "tag"; - ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); rule.configurationActivity = new ComponentName("a", "a"); rule.component = new ComponentName("b", "b"); @@ -205,20 +205,11 @@ public class ZenModeConfigTest extends UiServiceTestCase { rule.snoozing = true; rule.pkg = "b"; - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeRuleXml(rule, out); - out.endTag(null, tag); - out.endDocument(); + writeRuleXml(rule, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig.ZenRule fromXml = readRuleXml(bais); - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenModeConfig.ZenRule fromXml = ZenModeConfig.readRuleXml(parser); assertEquals("b", fromXml.pkg); // always resets on reboot assertFalse(fromXml.snoozing); @@ -237,75 +228,41 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Test public void testRuleXml_pkg_component() throws Exception { - String tag = "tag"; - ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); rule.configurationActivity = new ComponentName("a", "a"); rule.component = new ComponentName("b", "b"); - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeRuleXml(rule, out); - out.endTag(null, tag); - out.endDocument(); + writeRuleXml(rule, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig.ZenRule fromXml = readRuleXml(bais); - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenModeConfig.ZenRule fromXml = ZenModeConfig.readRuleXml(parser); assertEquals("b", fromXml.pkg); } @Test public void testRuleXml_pkg_configActivity() throws Exception { - String tag = "tag"; - ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); rule.configurationActivity = new ComponentName("a", "a"); - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeRuleXml(rule, out); - out.endTag(null, tag); - out.endDocument(); + writeRuleXml(rule, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig.ZenRule fromXml = readRuleXml(bais); - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenModeConfig.ZenRule fromXml = ZenModeConfig.readRuleXml(parser); assertNull(fromXml.pkg); } @Test public void testRuleXml_getPkg_nullPkg() throws Exception { - String tag = "tag"; - ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); rule.enabled = true; rule.configurationActivity = new ComponentName("a", "a"); - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeRuleXml(rule, out); - out.endTag(null, tag); - out.endDocument(); - - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenModeConfig.ZenRule fromXml = ZenModeConfig.readRuleXml(parser); + writeRuleXml(rule, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig.ZenRule fromXml = readRuleXml(bais); assertEquals("a", fromXml.getPkg()); fromXml.condition = new Condition(Uri.EMPTY, "", Condition.STATE_TRUE); @@ -313,25 +270,26 @@ public class ZenModeConfigTest extends UiServiceTestCase { } @Test - public void testZenPolicyXml_allUnset() throws Exception { - String tag = "tag"; + public void testRuleXml_emptyConditionId() throws Exception { + ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); + rule.conditionId = Uri.EMPTY; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeRuleXml(rule, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig.ZenRule fromXml = readRuleXml(bais); + + assertEquals(rule.condition, fromXml.condition); + } + + @Test + public void testZenPolicyXml_allUnset() throws Exception { ZenPolicy policy = new ZenPolicy.Builder().build(); - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeZenPolicyXml(policy, out); - out.endTag(null, tag); - out.endDocument(); - - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenPolicy fromXml = ZenModeConfig.readZenPolicyXml(parser); + writePolicyXml(policy, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenPolicy fromXml = readPolicyXml(bais); // nothing was set, so we should have nothing from the parser assertNull(fromXml); @@ -339,8 +297,6 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Test public void testZenPolicyXml() throws Exception { - String tag = "tag"; - ZenPolicy policy = new ZenPolicy.Builder() .allowCalls(ZenPolicy.PEOPLE_TYPE_CONTACTS) .allowMessages(ZenPolicy.PEOPLE_TYPE_NONE) @@ -355,20 +311,10 @@ public class ZenModeConfigTest extends UiServiceTestCase { .showVisualEffect(ZenPolicy.VISUAL_EFFECT_AMBIENT, true) .build(); - TypedXmlSerializer out = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - out.setOutput(new BufferedOutputStream(baos), "utf-8"); - out.startDocument(null, true); - out.startTag(null, tag); - ZenModeConfig.writeZenPolicyXml(policy, out); - out.endTag(null, tag); - out.endDocument(); - - TypedXmlPullParser parser = Xml.newFastPullParser(); - parser.setInput(new BufferedInputStream( - new ByteArrayInputStream(baos.toByteArray())), null); - parser.nextTag(); - ZenPolicy fromXml = ZenModeConfig.readZenPolicyXml(parser); + writePolicyXml(policy, baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenPolicy fromXml = readPolicyXml(bais); assertNotNull(fromXml); assertEquals(policy.getPriorityCategoryCalls(), fromXml.getPriorityCategoryCalls()); @@ -457,4 +403,45 @@ public class ZenModeConfigTest extends UiServiceTestCase { config.suppressedVisualEffects = 0; return config; } + + private void writeRuleXml(ZenModeConfig.ZenRule rule, ByteArrayOutputStream os) + throws IOException { + String tag = "tag"; + + TypedXmlSerializer out = Xml.newFastSerializer(); + out.setOutput(new BufferedOutputStream(os), "utf-8"); + out.startDocument(null, true); + out.startTag(null, tag); + ZenModeConfig.writeRuleXml(rule, out); + out.endTag(null, tag); + out.endDocument(); + } + + private ZenModeConfig.ZenRule readRuleXml(ByteArrayInputStream is) + throws XmlPullParserException, IOException { + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream(is), null); + parser.nextTag(); + return ZenModeConfig.readRuleXml(parser); + } + + private void writePolicyXml(ZenPolicy policy, ByteArrayOutputStream os) throws IOException { + String tag = "tag"; + + TypedXmlSerializer out = Xml.newFastSerializer(); + out.setOutput(new BufferedOutputStream(os), "utf-8"); + out.startDocument(null, true); + out.startTag(null, tag); + ZenModeConfig.writeZenPolicyXml(policy, out); + out.endTag(null, tag); + out.endDocument(); + } + + private ZenPolicy readPolicyXml(ByteArrayInputStream is) + throws XmlPullParserException, IOException { + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream(is), null); + parser.nextTag(); + return ZenModeConfig.readZenPolicyXml(parser); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index a017bd6a9436..ea50179746d8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2324,6 +2324,32 @@ public class ActivityRecordTests extends WindowTestsBase { } @Test + public void testActivityServiceConnectionsHolder() { + final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final ActivityServiceConnectionsHolder<Object> holder = + mAtm.mInternal.getServiceConnectionsHolder(activity.token); + assertNotNull(holder); + final Object connection = new Object(); + holder.addConnection(connection); + assertTrue(holder.isActivityVisible()); + final int[] count = new int[1]; + final Consumer<Object> c = conn -> count[0]++; + holder.forEachConnection(c); + assertEquals(1, count[0]); + + holder.removeConnection(connection); + holder.forEachConnection(c); + assertEquals(1, count[0]); + + activity.setVisibleRequested(false); + activity.setState(STOPPED, "test"); + assertFalse(holder.isActivityVisible()); + + activity.removeImmediately(); + assertNull(mAtm.mInternal.getServiceConnectionsHolder(activity.token)); + } + + @Test public void testTransferLaunchCookieWhenFinishing() { final ActivityRecord activity1 = createActivityWithTask(); final Binder launchCookie = new Binder(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index de84655986ef..318fff275f1f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -274,7 +274,8 @@ public class SizeCompatTests extends WindowTestsBase { public void testTranslucentActivitiesWhenUnfolding() { mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true); setUpDisplaySizeWithApp(2800, 1400); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + mActivity.mDisplayContent.setIgnoreOrientationRequest( + true /* ignoreOrientationRequest */); mActivity.mWmService.mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier( 1.0f /*letterboxVerticalPositionMultiplier*/); prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); @@ -285,18 +286,23 @@ public class SizeCompatTests extends WindowTestsBase { .build(); doReturn(false).when(translucentActivity).fillsParent(); mTask.addChild(translucentActivity); + assertEquals(translucentActivity.getBounds(), mActivity.getBounds()); mTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN); spyOn(mActivity); // Halffold - setFoldablePosture(translucentActivity, true /* isHalfFolded */, false /* isTabletop */); + setFoldablePosture(translucentActivity, true /* isHalfFolded */, + false /* isTabletop */); verify(mActivity).recomputeConfiguration(); + assertEquals(translucentActivity.getBounds(), mActivity.getBounds()); clearInvocations(mActivity); // Unfold - setFoldablePosture(translucentActivity, false /* isHalfFolded */, false /* isTabletop */); + setFoldablePosture(translucentActivity, false /* isHalfFolded */, + false /* isTabletop */); verify(mActivity).recomputeConfiguration(); + assertEquals(translucentActivity.getBounds(), mActivity.getBounds()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index c8932550d877..132aa90f1367 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -24,6 +24,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; @@ -603,4 +604,34 @@ public class TaskFragmentTest extends WindowTestsBase { assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, tf1.getOrientation(SCREEN_ORIENTATION_UNSET)); assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, task.getOrientation(SCREEN_ORIENTATION_UNSET)); } + + @Test + public void testUpdateImeParentForActivityEmbedding() { + // Setup two activities in ActivityEmbedding. + final Task task = createTask(mDisplayContent); + final TaskFragment tf0 = new TaskFragmentBuilder(mAtm) + .setParentTask(task) + .createActivityCount(1) + .setOrganizer(mOrganizer) + .setFragmentToken(new Binder()) + .build(); + final TaskFragment tf1 = new TaskFragmentBuilder(mAtm) + .setParentTask(task) + .createActivityCount(1) + .setOrganizer(mOrganizer) + .setFragmentToken(new Binder()) + .build(); + final ActivityRecord activity0 = tf0.getTopMostActivity(); + final ActivityRecord activity1 = tf1.getTopMostActivity(); + final WindowState win0 = createWindow(null, TYPE_BASE_APPLICATION, activity0, "win0"); + final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity1, "win1"); + doReturn(false).when(mDisplayContent).shouldImeAttachedToApp(); + + mDisplayContent.setImeInputTarget(win0); + mDisplayContent.setImeLayeringTarget(win1); + + // The ImeParent should be the display. + assertEquals(mDisplayContent.getImeContainer().getParent().getSurfaceControl(), + mDisplayContent.computeImeParent()); + } } diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 6ea416b54811..468bf1719d89 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -510,7 +510,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private boolean mUsbAccessoryConnected; private boolean mSourcePower; private boolean mSinkPower; - private boolean mConfigured; private boolean mAudioAccessoryConnected; private boolean mAudioAccessorySupported; @@ -543,7 +542,12 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private final UsbPermissionManager mPermissionManager; private NotificationManager mNotificationManager; + /** + * Do not debounce for the first disconnect after resetUsbGadget. + */ + protected boolean mResetUsbGadgetDisableDebounce; protected boolean mConnected; + protected boolean mConfigured; protected long mScreenUnlockedFunctions; protected boolean mBootCompleted; protected boolean mCurrentFunctionsApplied; @@ -650,15 +654,29 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser Slog.e(TAG, "unknown state " + state); return; } - if (configured == 0) removeMessages(MSG_UPDATE_STATE); if (connected == 1) removeMessages(MSG_FUNCTION_SWITCH_TIMEOUT); Message msg = Message.obtain(this, MSG_UPDATE_STATE); msg.arg1 = connected; msg.arg2 = configured; - // debounce disconnects to avoid problems bringing up USB tethering - sendMessageDelayed(msg, + if (DEBUG) { + Slog.i(TAG, "mResetUsbGadgetDisableDebounce:" + mResetUsbGadgetDisableDebounce + + " connected:" + connected + "configured:" + configured); + } + if (mResetUsbGadgetDisableDebounce) { + // Do not debounce disconnect after resetUsbGadget. + sendMessage(msg); + if (connected == 1) mResetUsbGadgetDisableDebounce = false; + } else { + if (configured == 0) { + removeMessages(MSG_UPDATE_STATE); + if (DEBUG) Slog.i(TAG, "removeMessages MSG_UPDATE_STATE"); + } + if (connected == 1) removeMessages(MSG_FUNCTION_SWITCH_TIMEOUT); + // debounce disconnects to avoid problems bringing up USB tethering. + sendMessageDelayed(msg, (connected == 0) ? (mScreenLocked ? DEVICE_STATE_UPDATE_DELAY : DEVICE_STATE_UPDATE_DELAY_EXT) : 0); + } } public void updateHostState(UsbPort port, UsbPortStatus status) { @@ -904,7 +922,10 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser case MSG_UPDATE_STATE: mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); - + if (DEBUG) { + Slog.i(TAG, "handleMessage MSG_UPDATE_STATE " + "mConnected:" + mConnected + + " mConfigured:" + mConfigured); + } updateUsbNotification(false); updateAdbNotification(false); if (mBootCompleted) { @@ -2010,12 +2031,19 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser } try { + // MSG_ACCESSORY_MODE_ENTER_TIMEOUT has to be removed to allow exiting + // AOAP mode during resetUsbGadget. + removeMessages(MSG_ACCESSORY_MODE_ENTER_TIMEOUT); + if (mConfigured) { + mResetUsbGadgetDisableDebounce = true; + } android.hardware.usb.gadget.V1_1.IUsbGadget gadgetProxy = android.hardware.usb.gadget.V1_1.IUsbGadget .castFrom(mGadgetProxy); gadgetProxy.reset(); } catch (RemoteException e) { Slog.e(TAG, "reset Usb Gadget failed", e); + mResetUsbGadgetDisableDebounce = false; } } break; diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt index a8cbc5dc922c..e05312fe8cc5 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationCold.kt @@ -18,12 +18,15 @@ package com.android.server.wm.flicker.launch import android.platform.test.annotations.Postsubmit import android.platform.test.annotations.RequiresDevice +import android.platform.test.rule.SettingOverrideRule +import android.provider.Settings import androidx.test.filters.FlakyTest import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group1 import com.android.server.wm.flicker.dsl.FlickerBuilder +import org.junit.ClassRule import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith @@ -98,5 +101,16 @@ open class OpenAppFromLockNotificationCold(testSpec: FlickerTestParameter) return com.android.server.wm.flicker.FlickerTestParameterFactory.getInstance() .getConfigNonRotationTests(repetitions = 3) } + + /** + * Ensures that posted notifications will be visible on the lockscreen and not + * suppressed due to being marked as seen. + */ + @ClassRule + @JvmField + val disableUnseenNotifFilterRule = SettingOverrideRule( + Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, + /* value= */ "0", + ) } -}
\ No newline at end of file +} diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt index cd8dea012db5..fcec79f4d7f5 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockNotificationWarm.kt @@ -18,6 +18,8 @@ package com.android.server.wm.flicker.launch import android.platform.test.annotations.Postsubmit import android.platform.test.annotations.RequiresDevice +import android.platform.test.rule.SettingOverrideRule +import android.provider.Settings import androidx.test.filters.FlakyTest import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter @@ -25,6 +27,7 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group1 import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.traces.common.FlickerComponentName +import org.junit.ClassRule import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith @@ -124,5 +127,16 @@ open class OpenAppFromLockNotificationWarm(testSpec: FlickerTestParameter) return com.android.server.wm.flicker.FlickerTestParameterFactory.getInstance() .getConfigNonRotationTests(repetitions = 3) } + + /** + * Ensures that posted notifications will be visible on the lockscreen and not + * suppressed due to being marked as seen. + */ + @ClassRule + @JvmField + val disableUnseenNotifFilterRule = SettingOverrideRule( + Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, + /* value= */ "0", + ) } -}
\ No newline at end of file +} diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index 34e8edb0a47f..8ea43abff895 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -27,7 +27,7 @@ namespace aapt { static ApiVersion sDevelopmentSdkLevel = 10000; static const auto sDevelopmentSdkCodeNames = - std::unordered_set<StringPiece>({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); + std::unordered_set<StringPiece>({"Q", "R", "S", "Sv2", "Tiramisu"}); static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = { {0x021c, 1}, |