Merge "Revert "Revert "Update material_deep_teal_500 to #008577."""
diff --git a/Android.bp b/Android.bp
index a84632a..a6290f1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -603,6 +603,7 @@
"core/java/android/content/EventLogTags.logtags",
"core/java/android/speech/tts/EventLogTags.logtags",
"core/java/android/net/EventLogTags.logtags",
+ "core/java/android/os/EventLogTags.logtags",
"core/java/android/webkit/EventLogTags.logtags",
"core/java/com/android/internal/app/EventLogTags.logtags",
"core/java/com/android/internal/logging/EventLogTags.logtags",
@@ -1105,3 +1106,27 @@
":hwbinder-stubs-docs",
],
}
+
+filegroup {
+ name: "apache-http-stubs-sources",
+ srcs: [
+ "core/java/org/apache/http/conn/ConnectTimeoutException.java",
+ "core/java/org/apache/http/conn/scheme/HostNameResolver.java",
+ "core/java/org/apache/http/conn/scheme/LayeredSocketFactory.java",
+ "core/java/org/apache/http/conn/scheme/SocketFactory.java",
+ "core/java/org/apache/http/conn/ssl/AbstractVerifier.java",
+ "core/java/org/apache/http/conn/ssl/AllowAllHostnameVerifier.java",
+ "core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java",
+ "core/java/org/apache/http/conn/ssl/BrowserCompatHostnameVerifier.java",
+ "core/java/org/apache/http/conn/ssl/SSLSocketFactory.java",
+ "core/java/org/apache/http/conn/ssl/StrictHostnameVerifier.java",
+ "core/java/org/apache/http/conn/ssl/X509HostnameVerifier.java",
+ "core/java/org/apache/http/params/CoreConnectionPNames.java",
+ "core/java/org/apache/http/params/HttpConnectionParams.java",
+ "core/java/org/apache/http/params/HttpParams.java",
+ "core/java/android/net/http/HttpResponseCache.java",
+ "core/java/android/net/http/SslCertificate.java",
+ "core/java/android/net/http/SslError.java",
+ "core/java/com/android/internal/util/HexDump.java",
+ ],
+}
diff --git a/api/current.txt b/api/current.txt
index c6c336e..c9f1dcb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7212,7 +7212,6 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
field public static final java.lang.String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
- field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
field public static final java.lang.String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
field public static final java.lang.String HINT_ACTIONS = "actions";
field public static final java.lang.String HINT_ERROR = "error";
@@ -7239,14 +7238,12 @@
field public static final java.lang.String SUBTYPE_MILLIS = "millis";
field public static final java.lang.String SUBTYPE_PRIORITY = "priority";
field public static final java.lang.String SUBTYPE_RANGE = "range";
- field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
field public static final java.lang.String SUBTYPE_SOURCE = "source";
field public static final java.lang.String SUBTYPE_TOGGLE = "toggle";
field public static final java.lang.String SUBTYPE_VALUE = "value";
}
public static class Slice.Builder {
- ctor public deprecated Slice.Builder(android.net.Uri);
ctor public Slice.Builder(android.net.Uri, android.app.slice.SliceSpec);
ctor public Slice.Builder(android.app.slice.Slice.Builder);
method public android.app.slice.Slice.Builder addAction(android.app.PendingIntent, android.app.slice.Slice, java.lang.String);
@@ -7258,10 +7255,8 @@
method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, java.lang.String, java.util.List<java.lang.String>);
method public android.app.slice.Slice.Builder addSubSlice(android.app.slice.Slice, java.lang.String);
method public android.app.slice.Slice.Builder addText(java.lang.CharSequence, java.lang.String, java.util.List<java.lang.String>);
- method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
method public android.app.slice.Slice build();
method public android.app.slice.Slice.Builder setCallerNeeded(boolean);
- method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
}
public final class SliceItem implements android.os.Parcelable {
@@ -7272,11 +7267,11 @@
method public java.util.List<java.lang.String> getHints();
method public android.graphics.drawable.Icon getIcon();
method public int getInt();
+ method public long getLong();
method public android.app.RemoteInput getRemoteInput();
method public android.app.slice.Slice getSlice();
method public java.lang.String getSubType();
method public java.lang.CharSequence getText();
- method public long getTimestamp();
method public boolean hasHint(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.slice.SliceItem> CREATOR;
@@ -7288,14 +7283,11 @@
field public static final java.lang.String FORMAT_REMOTE_INPUT = "input";
field public static final java.lang.String FORMAT_SLICE = "slice";
field public static final java.lang.String FORMAT_TEXT = "text";
- field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
}
public class SliceManager {
method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public deprecated android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.Set<android.app.slice.SliceSpec>);
- method public deprecated android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
method public int checkSlicePermission(android.net.Uri, int, int);
method public java.util.List<android.net.Uri> getPinnedSlices();
method public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
@@ -7303,7 +7295,6 @@
method public void grantSlicePermission(java.lang.String, android.net.Uri);
method public android.net.Uri mapIntentToUri(android.content.Intent);
method public void pinSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public deprecated void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
method public void revokeSlicePermission(java.lang.String, android.net.Uri);
method public void unpinSlice(android.net.Uri);
field public static final java.lang.String CATEGORY_SLICE = "android.app.slice.category.SLICE";
@@ -7324,7 +7315,6 @@
method public final java.lang.String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
- method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
method public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri);
method public android.net.Uri onMapIntentToUri(android.content.Intent);
@@ -11020,7 +11010,7 @@
field public java.lang.String sharedUserId;
field public int sharedUserLabel;
field public deprecated android.content.pm.Signature[] signatures;
- field public android.content.pm.Signature[][] signingCertificateHistory;
+ field public android.content.pm.SigningInfo signingInfo;
field public java.lang.String[] splitNames;
field public int[] splitRevisionCodes;
field public deprecated int versionCode;
@@ -11648,6 +11638,18 @@
field public static final android.os.Parcelable.Creator<android.content.pm.Signature> CREATOR;
}
+ public final class SigningInfo implements android.os.Parcelable {
+ ctor public SigningInfo();
+ ctor public SigningInfo(android.content.pm.SigningInfo);
+ method public int describeContents();
+ method public android.content.pm.Signature[] getApkContentsSigners();
+ method public android.content.pm.Signature[] getSigningCertificateHistory();
+ method public boolean hasMultipleSigners();
+ method public boolean hasPastSigningCertificates();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.content.pm.SigningInfo> CREATOR;
+ }
+
public final class VersionedPackage implements android.os.Parcelable {
ctor public VersionedPackage(java.lang.String, int);
ctor public VersionedPackage(java.lang.String, long);
@@ -27203,6 +27205,7 @@
field public static final int NET_CAPABILITY_IMS = 4; // 0x4
field public static final int NET_CAPABILITY_INTERNET = 12; // 0xc
field public static final int NET_CAPABILITY_MMS = 0; // 0x0
+ field public static final int NET_CAPABILITY_NOT_CONGESTED = 20; // 0x14
field public static final int NET_CAPABILITY_NOT_METERED = 11; // 0xb
field public static final int NET_CAPABILITY_NOT_RESTRICTED = 13; // 0xd
field public static final int NET_CAPABILITY_NOT_ROAMING = 18; // 0x12
@@ -32054,6 +32057,7 @@
}
public class BatteryManager {
+ method public long computeChargeTimeRemaining();
method public int getIntProperty(int);
method public long getLongProperty(int);
method public boolean isCharging();
@@ -41683,7 +41687,10 @@
field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
field public static final java.lang.String KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL = "config_telephony_use_own_number_for_voicemail_bool";
field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
+ field public static final java.lang.String KEY_DATA_LIMIT_NOTIFICATION_BOOL = "data_limit_notification_bool";
field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+ field public static final java.lang.String KEY_DATA_RAPID_NOTIFICATION_BOOL = "data_rapid_notification_bool";
+ field public static final java.lang.String KEY_DATA_WARNING_NOTIFICATION_BOOL = "data_warning_notification_bool";
field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
@@ -42040,7 +42047,6 @@
}
public class NetworkScan {
- method public deprecated void stop() throws android.os.RemoteException;
method public void stopScan();
field public static final int ERROR_INTERRUPTED = 10002; // 0x2712
field public static final int ERROR_INVALID_SCAN = 2; // 0x2
@@ -42504,7 +42510,6 @@
method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
method public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
- method public deprecated android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
method public void sendDialerSpecialCode(java.lang.String);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
@@ -47598,6 +47603,7 @@
method public void invalidateDrawable(android.graphics.drawable.Drawable);
method public void invalidateOutline();
method public boolean isAccessibilityFocused();
+ method public boolean isAccessibilityHeading();
method public boolean isActivated();
method public boolean isAttachedToWindow();
method public boolean isClickable();
@@ -47759,6 +47765,7 @@
method public void sendAccessibilityEvent(int);
method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
+ method public void setAccessibilityHeading(boolean);
method public void setAccessibilityLiveRegion(int);
method public void setAccessibilityPaneTitle(java.lang.CharSequence);
method public void setAccessibilityTraversalAfter(int);
@@ -53834,7 +53841,6 @@
method public android.graphics.Typeface getTypeface();
method public android.text.style.URLSpan[] getUrls();
method public boolean hasSelection();
- method public boolean isAccessibilityHeading();
method public boolean isAllCaps();
method public boolean isCursorVisible();
method public boolean isElegantTextHeight();
@@ -53857,7 +53863,6 @@
method protected void onTextChanged(java.lang.CharSequence, int, int, int);
method public boolean onTextContextMenuItem(int);
method public void removeTextChangedListener(android.text.TextWatcher);
- method public void setAccessibilityHeading(boolean);
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int);
diff --git a/api/removed.txt b/api/removed.txt
index 4e730c2..3649ab2 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -72,6 +72,36 @@
}
+package android.app.slice {
+
+ public final class Slice implements android.os.Parcelable {
+ field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
+ field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
+ }
+
+ public static class Slice.Builder {
+ ctor public deprecated Slice.Builder(android.net.Uri);
+ method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
+ method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
+ }
+
+ public final class SliceItem implements android.os.Parcelable {
+ method public deprecated long getTimestamp();
+ field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
+ }
+
+ public class SliceManager {
+ method public deprecated android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ method public deprecated android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
+ method public deprecated void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ }
+
+ public abstract class SliceProvider extends android.content.ContentProvider {
+ method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+ }
+
+}
+
package android.app.usage {
public final class StorageStats implements android.os.Parcelable {
@@ -516,6 +546,18 @@
}
+package android.telephony {
+
+ public class NetworkScan {
+ method public deprecated void stop() throws android.os.RemoteException;
+ }
+
+ public class TelephonyManager {
+ method public deprecated android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
+ }
+
+}
+
package android.text.format {
public class DateFormat {
diff --git a/api/system-current.txt b/api/system-current.txt
index 308b03e..6a10814 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -383,12 +383,18 @@
}
public final class StatsManager {
+ method public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
method public boolean addConfiguration(long, byte[]);
method public byte[] getData(long);
method public byte[] getMetadata();
+ method public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
+ method public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
+ method public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
method public boolean removeConfiguration(long);
+ method public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
method public boolean setDataFetchOperation(long, android.app.PendingIntent);
+ method public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
field public static final java.lang.String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
@@ -398,6 +404,11 @@
field public static final java.lang.String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
}
+ public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
+ ctor public StatsManager.StatsUnavailableException(java.lang.String);
+ ctor public StatsManager.StatsUnavailableException(java.lang.String, java.lang.Throwable);
+ }
+
public class VrManager {
method public void setAndBindVrCompositor(android.content.ComponentName);
method public void setPersistentVrModeEnabled(boolean);
@@ -4355,7 +4366,6 @@
method public byte[] getServerParams();
method public int getSnapshotVersion();
method public java.security.cert.CertPath getTrustedHardwareCertPath();
- method public deprecated byte[] getTrustedHardwarePublicKey();
method public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR;
@@ -4380,26 +4390,19 @@
public class RecoveryController {
method public android.security.keystore.recovery.RecoverySession createRecoverySession();
- method public byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
method public java.security.Key getKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
method public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public java.util.Map<java.lang.String, java.security.cert.X509Certificate> getRootCertificates();
method public java.security.Key importKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public void initRecoveryService(java.lang.String, byte[], byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public static boolean isRecoverableKeyStoreEnabled(android.content.Context);
method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
method public void setRecoveryStatus(java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setServerParams(byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setSnapshotCreatedPendingIntent(android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -4411,9 +4414,6 @@
public class RecoverySession implements java.lang.AutoCloseable {
method public void close();
method public java.util.Map<java.lang.String, java.security.Key> recoverKeyChainSnapshot(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
- method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
- method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
- method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public byte[] start(java.lang.String, java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
@@ -4423,7 +4423,6 @@
public final class WrappedApplicationKey implements android.os.Parcelable {
method public int describeContents();
- method public deprecated byte[] getAccount();
method public java.lang.String getAlias();
method public byte[] getEncryptedKeyMaterial();
method public void writeToParcel(android.os.Parcel, int);
@@ -4433,7 +4432,6 @@
public static class WrappedApplicationKey.Builder {
ctor public WrappedApplicationKey.Builder();
method public android.security.keystore.recovery.WrappedApplicationKey build();
- method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]);
}
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 48f43e0..961026b 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -91,6 +91,38 @@
}
+package android.security.keystore.recovery {
+
+ public final class KeyChainSnapshot implements android.os.Parcelable {
+ method public deprecated byte[] getTrustedHardwarePublicKey();
+ }
+
+ public class RecoveryController {
+ method public deprecated byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
+ }
+
+ public class RecoverySession implements java.lang.AutoCloseable {
+ method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ }
+
+ public final class WrappedApplicationKey implements android.os.Parcelable {
+ method public deprecated byte[] getAccount();
+ }
+
+ public static class WrappedApplicationKey.Builder {
+ method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
+ }
+
+}
+
package android.service.notification {
public abstract class NotificationListenerService extends android.app.Service {
diff --git a/api/test-current.txt b/api/test-current.txt
index 77f56a4..6b52d10 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -492,6 +492,27 @@
method public int getProgramId();
}
+ public final class BufferingParams implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getInitialMarkMs();
+ method public int getResumePlaybackMarkMs();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.BufferingParams> CREATOR;
+ }
+
+ public static class BufferingParams.Builder {
+ ctor public BufferingParams.Builder();
+ ctor public BufferingParams.Builder(android.media.BufferingParams);
+ method public android.media.BufferingParams build();
+ method public android.media.BufferingParams.Builder setInitialMarkMs(int);
+ method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int);
+ }
+
+ public class MediaPlayer implements android.media.AudioRouting android.media.VolumeAutomation {
+ method public android.media.BufferingParams getBufferingParams();
+ method public void setBufferingParams(android.media.BufferingParams);
+ }
+
public final class PlaybackParams implements android.os.Parcelable {
method public int getAudioStretchMode();
method public android.media.PlaybackParams setAudioStretchMode(int);
@@ -743,6 +764,15 @@
}
+package android.security {
+
+ public class KeyStoreException extends java.lang.Exception {
+ ctor public KeyStoreException(int, java.lang.String);
+ method public int getErrorCode();
+ }
+
+}
+
package android.security.keystore {
public abstract class AttestationUtils {
@@ -752,6 +782,10 @@
field public static final int ID_TYPE_SERIAL = 1; // 0x1
}
+ public static final class KeyGenParameterSpec.Builder {
+ method public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean);
+ }
+
public final class KeyProtection implements java.security.KeyStore.ProtectionParameter {
method public long getBoundToSpecificSecureUserId();
}
@@ -928,6 +962,10 @@
package android.telephony.mbms {
+ public static class DownloadRequest.Builder {
+ method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
+ }
+
public final class FileInfo implements android.os.Parcelable {
ctor public FileInfo(android.net.Uri, java.lang.String);
}
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 4e693e3..f7cc00c 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -780,8 +780,6 @@
}
void StatsService::sayHiToStatsCompanion() {
- // TODO: This method needs to be private. It is temporarily public and unsecured for testing
- // purposes.
sp<IStatsCompanionService> statsCompanion = getStatsCompanionService();
if (statsCompanion != nullptr) {
VLOG("Telling statsCompanion that statsd is ready");
@@ -825,42 +823,37 @@
Status StatsService::getData(int64_t key, vector<uint8_t>* output) {
IPCThreadState* ipc = IPCThreadState::self();
VLOG("StatsService::getData with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid());
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), key);
- mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(),
- false /* include_current_bucket*/, output);
- return Status::ok();
- } else {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ ConfigKey configKey(ipc->getCallingUid(), key);
+ mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(),
+ false /* include_current_bucket*/, output);
+ return Status::ok();
}
Status StatsService::getMetadata(vector<uint8_t>* output) {
IPCThreadState* ipc = IPCThreadState::self();
VLOG("StatsService::getMetadata with Pid %i, Uid %i", ipc->getCallingPid(),
ipc->getCallingUid());
- if (checkCallingPermission(String16(kPermissionDump))) {
- StatsdStats::getInstance().dumpStats(output, false); // Don't reset the counters.
- return Status::ok();
- } else {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ StatsdStats::getInstance().dumpStats(output, false); // Don't reset the counters.
+ return Status::ok();
}
-Status StatsService::addConfiguration(int64_t key,
- const vector <uint8_t>& config,
- bool* success) {
+Status StatsService::addConfiguration(int64_t key, const vector <uint8_t>& config) {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
+ return Status::fromExceptionCode(binder::Status::EX_SECURITY);
+ }
IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- if (addConfigurationChecked(ipc->getCallingUid(), key, config)) {
- *success = true;
- } else {
- *success = false;
- }
+ if (addConfigurationChecked(ipc->getCallingUid(), key, config)) {
return Status::ok();
} else {
- *success = false;
- return Status::fromExceptionCode(binder::Status::EX_SECURITY);
+ ALOGE("Could not parse malformatted StatsdConfig");
+ return Status::fromExceptionCode(binder::Status::EX_ILLEGAL_ARGUMENT,
+ "config does not correspond to a StatsdConfig proto");
}
}
@@ -876,80 +869,62 @@
return true;
}
-Status StatsService::removeDataFetchOperation(int64_t key, bool* success) {
- IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), key);
- mConfigManager->RemoveConfigReceiver(configKey);
- *success = true;
- return Status::ok();
- } else {
- *success = false;
+Status StatsService::removeDataFetchOperation(int64_t key) {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ IPCThreadState* ipc = IPCThreadState::self();
+ ConfigKey configKey(ipc->getCallingUid(), key);
+ mConfigManager->RemoveConfigReceiver(configKey);
+ return Status::ok();
}
-Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender,
- bool* success) {
- IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), key);
- mConfigManager->SetConfigReceiver(configKey, intentSender);
- *success = true;
- return Status::ok();
- } else {
- *success = false;
+Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender) {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ IPCThreadState* ipc = IPCThreadState::self();
+ ConfigKey configKey(ipc->getCallingUid(), key);
+ mConfigManager->SetConfigReceiver(configKey, intentSender);
+ return Status::ok();
}
-Status StatsService::removeConfiguration(int64_t key, bool* success) {
- IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), key);
- mConfigManager->RemoveConfig(configKey);
- SubscriberReporter::getInstance().removeConfig(configKey);
- *success = true;
- return Status::ok();
- } else {
- *success = false;
+Status StatsService::removeConfiguration(int64_t key) {
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ IPCThreadState* ipc = IPCThreadState::self();
+ ConfigKey configKey(ipc->getCallingUid(), key);
+ mConfigManager->RemoveConfig(configKey);
+ SubscriberReporter::getInstance().removeConfig(configKey);
+ return Status::ok();
}
Status StatsService::setBroadcastSubscriber(int64_t configId,
int64_t subscriberId,
- const sp<android::IBinder>& intentSender,
- bool* success) {
+ const sp<android::IBinder>& intentSender) {
VLOG("StatsService::setBroadcastSubscriber called.");
- IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), configId);
- SubscriberReporter::getInstance()
- .setBroadcastSubscriber(configKey, subscriberId, intentSender);
- *success = true;
- return Status::ok();
- } else {
- *success = false;
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ IPCThreadState* ipc = IPCThreadState::self();
+ ConfigKey configKey(ipc->getCallingUid(), configId);
+ SubscriberReporter::getInstance()
+ .setBroadcastSubscriber(configKey, subscriberId, intentSender);
+ return Status::ok();
}
Status StatsService::unsetBroadcastSubscriber(int64_t configId,
- int64_t subscriberId,
- bool* success) {
+ int64_t subscriberId) {
VLOG("StatsService::unsetBroadcastSubscriber called.");
- IPCThreadState* ipc = IPCThreadState::self();
- if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), configId);
- SubscriberReporter::getInstance()
- .unsetBroadcastSubscriber(configKey, subscriberId);
- *success = true;
- return Status::ok();
- } else {
- *success = false;
+ if (!checkCallingPermission(String16(kPermissionDump))) {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
}
+ IPCThreadState* ipc = IPCThreadState::self();
+ ConfigKey configKey(ipc->getCallingUid(), configId);
+ SubscriberReporter::getInstance()
+ .unsetBroadcastSubscriber(configKey, subscriberId);
+ return Status::ok();
}
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 5712620..d502796 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -94,24 +94,23 @@
* Binder call to let clients send a configuration and indicate they're interested when they
* should requestData for this configuration.
*/
- virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config,
- bool* success) override;
+ virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config) override;
/**
* Binder call to let clients register the data fetch operation for a configuration.
*/
- virtual Status setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender,
- bool* success) override;
+ virtual Status setDataFetchOperation(int64_t key,
+ const sp<android::IBinder>& intentSender) override;
/**
* Binder call to remove the data fetch operation for the specified config key.
*/
- virtual Status removeDataFetchOperation(int64_t key, bool* success) override;
+ virtual Status removeDataFetchOperation(int64_t key) override;
/**
* Binder call to allow clients to remove the specified configuration.
*/
- virtual Status removeConfiguration(int64_t key, bool* success) override;
+ virtual Status removeConfiguration(int64_t key) override;
/**
* Binder call to associate the given config's subscriberId with the given intentSender.
@@ -119,17 +118,13 @@
*/
virtual Status setBroadcastSubscriber(int64_t configId,
int64_t subscriberId,
- const sp<android::IBinder>& intentSender,
- bool* success) override;
+ const sp<android::IBinder>& intentSender) override;
/**
* Binder call to unassociate the given config's subscriberId with any intentSender.
*/
- virtual Status unsetBroadcastSubscriber(int64_t configId, int64_t subscriberId,
- bool* success) override;
+ virtual Status unsetBroadcastSubscriber(int64_t configId, int64_t subscriberId) override;
- // TODO: public for testing since statsd doesn't run when system starts. Change to private
- // later.
/** Inform statsCompanion that statsd is ready. */
virtual void sayHiToStatsCompanion();
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index 4ce4768..8ce9ec7 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -116,11 +116,6 @@
ALOGE("Failed to add service");
return -1;
}
-
- // TODO: This line is temporary, since statsd doesn't start up automatically (and therefore
- // the call in StatsService::SystemRunning() won't ever be called right now).
- // TODO: Are you sure? Don't we need to reconnect to the system process if we get restarted?
- // --joeo
service->sayHiToStatsCompanion();
// Start the log reader thread
diff --git a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
index d4892ed..5499ee3 100644
--- a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
@@ -35,7 +35,7 @@
config.SerializeToString(&str);
std::vector<uint8_t> configAsVec(str.begin(), str.end());
bool success;
- service.addConfiguration(kConfigKey, configAsVec, &success);
+ service.addConfiguration(kConfigKey, configAsVec);
}
ConfigMetricsReport GetReports(StatsService& service) {
diff --git a/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java b/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
index 0e6c933..2b7da6a 100644
--- a/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
+++ b/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
@@ -19,6 +19,7 @@
import android.app.PendingIntent;
import android.app.IntentService;
import android.app.StatsManager;
+import android.app.StatsManager.StatsUnavailableException;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -171,12 +172,16 @@
return;
}
if (mStatsManager != null) {
- byte[] data = mStatsManager.getData(CONFIG_ID);
- if (data != null) {
- displayData(data);
- } else {
- mReportText.setText("Failed!");
+ try {
+ byte[] data = mStatsManager.getReports(CONFIG_ID);
+ if (data != null) {
+ displayData(data);
+ return;
+ }
+ } catch (StatsUnavailableException e) {
+ Log.e(TAG, "Failed to get data from statsd", e);
}
+ mReportText.setText("Failed!");
}
}
});
@@ -194,10 +199,11 @@
byte[] config = new byte[inputStream.available()];
inputStream.read(config);
if (mStatsManager != null) {
- if (mStatsManager.addConfiguration(CONFIG_ID, config)) {
+ try {
+ mStatsManager.addConfig(CONFIG_ID, config);
Toast.makeText(
MainActivity.this, "Config pushed", Toast.LENGTH_LONG).show();
- } else {
+ } catch (StatsUnavailableException | IllegalArgumentException e) {
Toast.makeText(MainActivity.this, "Config push FAILED!",
Toast.LENGTH_LONG).show();
}
@@ -218,11 +224,12 @@
return;
}
if (mStatsManager != null) {
- if (mStatsManager.setDataFetchOperation(CONFIG_ID, pi)) {
+ try {
+ mStatsManager.setFetchReportsOperation(pi, CONFIG_ID);
Toast.makeText(MainActivity.this,
"Receiver specified to pending intent", Toast.LENGTH_LONG)
.show();
- } else {
+ } catch (StatsUnavailableException e) {
Toast.makeText(MainActivity.this, "Statsd did not set receiver",
Toast.LENGTH_LONG)
.show();
@@ -241,10 +248,11 @@
return;
}
if (mStatsManager != null) {
- if (mStatsManager.setDataFetchOperation(CONFIG_ID, null)) {
+ try {
+ mStatsManager.setFetchReportsOperation(null, CONFIG_ID);
Toast.makeText(MainActivity.this, "Receiver remove", Toast.LENGTH_LONG)
.show();
- } else {
+ } catch (StatsUnavailableException e) {
Toast.makeText(MainActivity.this, "Statsd did not remove receiver",
Toast.LENGTH_LONG)
.show();
diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
index bed4d98..769f78c 100644
--- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
+++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
@@ -355,7 +355,13 @@
return null;
}
if (mStatsManager != null) {
- byte[] data = mStatsManager.getMetadata();
+ byte[] data;
+ try {
+ data = mStatsManager.getStatsMetadata();
+ } catch (StatsManager.StatsUnavailableException e) {
+ Log.e(TAG, "Failed to get data from statsd", e);
+ return null;
+ }
if (data != null) {
StatsdStatsReport report = null;
boolean good = false;
@@ -375,7 +381,13 @@
return null;
}
if (mStatsManager != null) {
- byte[] data = mStatsManager.getData(ConfigFactory.CONFIG_ID);
+ byte[] data;
+ try {
+ data = mStatsManager.getReports(ConfigFactory.CONFIG_ID);
+ } catch (StatsManager.StatsUnavailableException e) {
+ Log.e(TAG, "Failed to get data from statsd", e);
+ return null;
+ }
if (data != null) {
ConfigMetricsReportList reports = null;
try {
@@ -563,10 +575,11 @@
// TODO: Clear all configs instead of specific ones.
if (mStatsManager != null) {
if (mStarted) {
- if (!mStatsManager.removeConfiguration(ConfigFactory.CONFIG_ID)) {
+ try {
+ mStatsManager.removeConfig(ConfigFactory.CONFIG_ID);
Log.d(TAG, "Removed loadtest statsd configs.");
- } else {
- Log.d(TAG, "Failed to remove loadtest configs.");
+ } catch (StatsManager.StatsUnavailableException e) {
+ Log.e(TAG, "Failed to remove loadtest configs.", e);
}
}
}
@@ -574,12 +587,13 @@
private boolean setConfig(ConfigFactory.ConfigMetadata configData) {
if (mStatsManager != null) {
- if (mStatsManager.addConfiguration(ConfigFactory.CONFIG_ID, configData.bytes)) {
+ try {
+ mStatsManager.addConfig(ConfigFactory.CONFIG_ID, configData.bytes);
mNumMetrics = configData.numMetrics;
Log.d(TAG, "Config pushed to statsd");
return true;
- } else {
- Log.d(TAG, "Failed to push config to statsd");
+ } catch (StatsManager.StatsUnavailableException | IllegalArgumentException e) {
+ Log.e(TAG, "Failed to push config to statsd", e);
}
}
return false;
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 87fb998..7177336 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -32326,7 +32326,7 @@
HSPLandroid/view/IWindowSession$Stub$Proxy;->getDisplayFrame(Landroid/view/IWindow;Landroid/graphics/Rect;)V
HSPLandroid/view/IWindowSession$Stub$Proxy;->getInTouchMode()Z
HSPLandroid/view/IWindowSession$Stub$Proxy;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
HSPLandroid/view/IWindowSession$Stub$Proxy;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
HSPLandroid/view/IWindowSession$Stub$Proxy;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
HSPLandroid/view/IWindowSession$Stub$Proxy;->setWallpaperPosition(Landroid/os/IBinder;FFFF)V
@@ -32349,7 +32349,7 @@
HSPLandroid/view/IWindowSession;->pokeDrawLock(Landroid/os/IBinder;)V
HSPLandroid/view/IWindowSession;->prepareDrag(Landroid/view/IWindow;IIILandroid/view/Surface;)Landroid/os/IBinder;
HSPLandroid/view/IWindowSession;->prepareToReplaceWindows(Landroid/os/IBinder;Z)V
-HSPLandroid/view/IWindowSession;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HSPLandroid/view/IWindowSession;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
HSPLandroid/view/IWindowSession;->remove(Landroid/view/IWindow;)V
HSPLandroid/view/IWindowSession;->reportDropResult(Landroid/view/IWindow;Z)V
HSPLandroid/view/IWindowSession;->sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index fa61fab..17f25bd08ee 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -2230,7 +2230,7 @@
Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I
Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z
Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
Landroid/view/KeyCharacterMap$FallbackAction;->keyCode:I
Landroid/view/KeyCharacterMap$FallbackAction;->metaState:I
Landroid/view/KeyCharacterMap;-><init>(J)V
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 50a4398..82c3383 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -5873,7 +5873,7 @@
} finally {
// If the app targets < O-MR1, or doesn't change the thread policy
// during startup, clobber the policy to maintain behavior of b/36951662
- if (data.appInfo.targetSdkVersion <= Build.VERSION_CODES.O
+ if (data.appInfo.targetSdkVersion < Build.VERSION_CODES.O_MR1
|| StrictMode.getThreadPolicy().equals(writesAllowedPolicy)) {
StrictMode.setThreadPolicy(savedPolicy);
}
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 5067e19..5461c0c 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -54,6 +54,13 @@
void setShowBadge(String pkg, int uid, boolean showBadge);
boolean canShowBadge(String pkg, int uid);
void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled);
+ /**
+ * Updates the notification's enabled state. Additionally locks importance for all of the
+ * notifications belonging to the app, such that future notifications aren't reconsidered for
+ * blocking helper.
+ */
+ void setNotificationsEnabledWithImportanceLockForPackage(String pkg, int uid, boolean enabled);
+
boolean areNotificationsEnabledForPackage(String pkg, int uid);
boolean areNotificationsEnabled(String pkg);
int getPackageImportance(String pkg);
diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java
index 4a6fa8c..8783d94 100644
--- a/core/java/android/app/StatsManager.java
+++ b/core/java/android/app/StatsManager.java
@@ -23,6 +23,7 @@
import android.os.IStatsManager;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.util.AndroidException;
import android.util.Slog;
/**
@@ -82,55 +83,74 @@
}
/**
- * Clients can send a configuration and simultaneously registers the name of a broadcast
- * receiver that listens for when it should request data.
+ * Adds the given configuration and associates it with the given configKey. If a config with the
+ * given configKey already exists for the caller's uid, it is replaced with the new one.
*
* @param configKey An arbitrary integer that allows clients to track the configuration.
- * @param config Wire-encoded StatsDConfig proto that specifies metrics (and all
+ * @param config Wire-encoded StatsdConfig proto that specifies metrics (and all
* dependencies eg, conditions and matchers).
- * @return true if successful
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+ * @throws IllegalArgumentException if config is not a wire-encoded StatsdConfig proto
*/
@RequiresPermission(Manifest.permission.DUMP)
- public boolean addConfiguration(long configKey, byte[] config) {
+ public void addConfig(long configKey, byte[] config) throws StatsUnavailableException {
synchronized (this) {
try {
IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when adding configuration");
- return false;
- }
- return service.addConfiguration(configKey, config);
+ service.addConfiguration(configKey, config); // can throw IllegalArgumentException
} catch (RemoteException e) {
Slog.e(TAG, "Failed to connect to statsd when adding configuration");
- return false;
+ throw new StatsUnavailableException("could not connect", e);
}
}
}
/**
+ * TODO: Temporary for backwards compatibility. Remove.
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public boolean addConfiguration(long configKey, byte[] config) {
+ try {
+ addConfig(configKey, config);
+ return true;
+ } catch (StatsUnavailableException | IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ /**
* Remove a configuration from logging.
*
* @param configKey Configuration key to remove.
- * @return true if successful
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
*/
@RequiresPermission(Manifest.permission.DUMP)
- public boolean removeConfiguration(long configKey) {
+ public void removeConfig(long configKey) throws StatsUnavailableException {
synchronized (this) {
try {
IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when removing configuration");
- return false;
- }
- return service.removeConfiguration(configKey);
+ service.removeConfiguration(configKey);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to connect to statsd when removing configuration");
- return false;
+ throw new StatsUnavailableException("could not connect", e);
}
}
}
/**
+ * TODO: Temporary for backwards compatibility. Remove.
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public boolean removeConfiguration(long configKey) {
+ try {
+ removeConfig(configKey);
+ return true;
+ } catch (StatsUnavailableException e) {
+ return false;
+ }
+ }
+
+ /**
* Set the PendingIntent to be used when broadcasting subscriber information to the given
* subscriberId within the given config.
* <p>
@@ -150,123 +170,165 @@
* {@link #EXTRA_STATS_DIMENSIONS_VALUE}.
* <p>
* This function can only be called by the owner (uid) of the config. It must be called each
- * time statsd starts. The config must have been added first (via addConfiguration()).
+ * time statsd starts. The config must have been added first (via {@link #addConfig}).
*
- * @param configKey The integer naming the config to which this subscriber is attached.
- * @param subscriberId ID of the subscriber, as used in the config.
* @param pendingIntent the PendingIntent to use when broadcasting info to the subscriber
* associated with the given subscriberId. May be null, in which case
* it undoes any previous setting of this subscriberId.
- * @return true if successful
+ * @param configKey The integer naming the config to which this subscriber is attached.
+ * @param subscriberId ID of the subscriber, as used in the config.
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public void setBroadcastSubscriber(
+ PendingIntent pendingIntent, long configKey, long subscriberId)
+ throws StatsUnavailableException {
+ synchronized (this) {
+ try {
+ IStatsManager service = getIStatsManagerLocked();
+ if (pendingIntent != null) {
+ // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
+ IBinder intentSender = pendingIntent.getTarget().asBinder();
+ service.setBroadcastSubscriber(configKey, subscriberId, intentSender);
+ } else {
+ service.unsetBroadcastSubscriber(configKey, subscriberId);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to connect to statsd when adding broadcast subscriber", e);
+ throw new StatsUnavailableException("could not connect", e);
+ }
+ }
+ }
+
+ /**
+ * TODO: Temporary for backwards compatibility. Remove.
*/
@RequiresPermission(Manifest.permission.DUMP)
public boolean setBroadcastSubscriber(
long configKey, long subscriberId, PendingIntent pendingIntent) {
- synchronized (this) {
- try {
- IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when adding broadcast subscriber");
- return false;
- }
- if (pendingIntent != null) {
- // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
- IBinder intentSender = pendingIntent.getTarget().asBinder();
- return service.setBroadcastSubscriber(configKey, subscriberId, intentSender);
- } else {
- return service.unsetBroadcastSubscriber(configKey, subscriberId);
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to connect to statsd when adding broadcast subscriber", e);
- return false;
- }
+ try {
+ setBroadcastSubscriber(pendingIntent, configKey, subscriberId);
+ return true;
+ } catch (StatsUnavailableException e) {
+ return false;
}
}
/**
* Registers the operation that is called to retrieve the metrics data. This must be called
- * each time statsd starts. The config must have been added first (via addConfiguration(),
- * although addConfiguration could have been called on a previous boot). This operation allows
+ * each time statsd starts. The config must have been added first (via {@link #addConfig},
+ * although addConfig could have been called on a previous boot). This operation allows
* statsd to send metrics data whenever statsd determines that the metrics in memory are
- * approaching the memory limits. The fetch operation should call {@link #getData} to fetch the
- * data, which also deletes the retrieved metrics from statsd's memory.
+ * approaching the memory limits. The fetch operation should call {@link #getReports} to fetch
+ * the data, which also deletes the retrieved metrics from statsd's memory.
*
- * @param configKey The integer naming the config to which this operation is attached.
* @param pendingIntent the PendingIntent to use when broadcasting info to the subscriber
* associated with the given subscriberId. May be null, in which case
* it removes any associated pending intent with this configKey.
- * @return true if successful
+ * @param configKey The integer naming the config to which this operation is attached.
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
*/
@RequiresPermission(Manifest.permission.DUMP)
- public boolean setDataFetchOperation(long configKey, PendingIntent pendingIntent) {
+ public void setFetchReportsOperation(PendingIntent pendingIntent, long configKey)
+ throws StatsUnavailableException {
synchronized (this) {
try {
IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when registering data listener.");
- return false;
- }
if (pendingIntent == null) {
- return service.removeDataFetchOperation(configKey);
+ service.removeDataFetchOperation(configKey);
} else {
// Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
IBinder intentSender = pendingIntent.getTarget().asBinder();
- return service.setDataFetchOperation(configKey, intentSender);
+ service.setDataFetchOperation(configKey, intentSender);
}
} catch (RemoteException e) {
Slog.e(TAG, "Failed to connect to statsd when registering data listener.");
- return false;
+ throw new StatsUnavailableException("could not connect", e);
}
}
}
/**
- * Clients can request data with a binder call. This getter is destructive and also clears
- * the retrieved metrics from statsd memory.
- *
- * @param configKey Configuration key to retrieve data from.
- * @return Serialized ConfigMetricsReportList proto. Returns null on failure (eg, if statsd
- * crashed).
+ * TODO: Temporary for backwards compatibility. Remove.
*/
@RequiresPermission(Manifest.permission.DUMP)
- public @Nullable byte[] getData(long configKey) {
+ public boolean setDataFetchOperation(long configKey, PendingIntent pendingIntent) {
+ try {
+ setFetchReportsOperation(pendingIntent, configKey);
+ return true;
+ } catch (StatsUnavailableException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Request the data collected for the given configKey.
+ * This getter is destructive - it also clears the retrieved metrics from statsd's memory.
+ *
+ * @param configKey Configuration key to retrieve data from.
+ * @return Serialized ConfigMetricsReportList proto.
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public byte[] getReports(long configKey) throws StatsUnavailableException {
synchronized (this) {
try {
IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when getting data");
- return null;
- }
return service.getData(configKey);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to connect to statsd when getting data");
- return null;
+ throw new StatsUnavailableException("could not connect", e);
+ }
+ }
+ }
+
+ /**
+ * TODO: Temporary for backwards compatibility. Remove.
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public @Nullable byte[] getData(long configKey) {
+ try {
+ return getReports(configKey);
+ } catch (StatsUnavailableException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Clients can request metadata for statsd. Will contain stats across all configurations but not
+ * the actual metrics themselves (metrics must be collected via {@link #getReports(long)}.
+ * This getter is not destructive and will not reset any metrics/counters.
+ *
+ * @return Serialized StatsdStatsReport proto.
+ * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+ */
+ @RequiresPermission(Manifest.permission.DUMP)
+ public byte[] getStatsMetadata() throws StatsUnavailableException {
+ synchronized (this) {
+ try {
+ IStatsManager service = getIStatsManagerLocked();
+ return service.getMetadata();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to connect to statsd when getting metadata");
+ throw new StatsUnavailableException("could not connect", e);
}
}
}
/**
* Clients can request metadata for statsd. Will contain stats across all configurations but not
- * the actual metrics themselves (metrics must be collected via {@link #getData(String)}.
+ * the actual metrics themselves (metrics must be collected via {@link #getReports(long)}.
* This getter is not destructive and will not reset any metrics/counters.
*
* @return Serialized StatsdStatsReport proto. Returns null on failure (eg, if statsd crashed).
*/
@RequiresPermission(Manifest.permission.DUMP)
public @Nullable byte[] getMetadata() {
- synchronized (this) {
- try {
- IStatsManager service = getIStatsManagerLocked();
- if (service == null) {
- Slog.e(TAG, "Failed to find statsd when getting metadata");
- return null;
- }
- return service.getMetadata();
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to connect to statsd when getting metadata");
- return null;
- }
+ try {
+ return getStatsMetadata();
+ } catch (StatsUnavailableException e) {
+ return null;
}
}
@@ -279,14 +341,33 @@
}
}
- private IStatsManager getIStatsManagerLocked() throws RemoteException {
+ private IStatsManager getIStatsManagerLocked() throws StatsUnavailableException {
if (mService != null) {
return mService;
}
mService = IStatsManager.Stub.asInterface(ServiceManager.getService("stats"));
- if (mService != null) {
+ if (mService == null) {
+ throw new StatsUnavailableException("could not be found");
+ }
+ try {
mService.asBinder().linkToDeath(new StatsdDeathRecipient(), 0);
+ } catch (RemoteException e) {
+ throw new StatsUnavailableException("could not connect when linkToDeath", e);
}
return mService;
}
+
+ /**
+ * Exception thrown when communication with the stats service fails (eg if it is not available).
+ * This might be thrown early during boot before the stats service has started or if it crashed.
+ */
+ public static class StatsUnavailableException extends AndroidException {
+ public StatsUnavailableException(String reason) {
+ super("Failed to connect to statsd: " + reason);
+ }
+
+ public StatsUnavailableException(String reason, Throwable e) {
+ super("Failed to connect to statsd: " + reason, e);
+ }
+ }
}
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 17bc6ea..6c2fb2d 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -413,7 +413,7 @@
} catch (OutOfMemoryError e) {
Log.w(TAG, "Out of memory loading the current wallpaper: " + e);
} catch (SecurityException e) {
- if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+ if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) {
Log.w(TAG, "No permission to access wallpaper, suppressing"
+ " exception to avoid crashing legacy app.");
} else {
@@ -977,7 +977,7 @@
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (SecurityException e) {
- if (mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+ if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) {
Log.w(TAG, "No permission to access wallpaper, suppressing"
+ " exception to avoid crashing legacy app.");
return null;
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 39b9181..d1c957b 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -148,17 +148,10 @@
* Flag for {@link BackupDataOutput#getTransportFlags()} and
* {@link FullBackupDataOutput#getTransportFlags()} only.
*
- * <p>The transport has client-side encryption enabled. i.e., the user's backup is encrypted
- * with a key known only to the device, and not to the remote storage solution where the backup
- * data is stored. The key may be synced to a remote trusted hardware module if it has
- * protections equivalent to those described in the
- * <a href="https://developer.android.com/preview/features/security/ckv-whitepaper.html">Google
- * Cloud Key Vault Service whitepaper</a>. Having direct access to the trusted hardware module
- * must be insufficient to decrypt the user's backup data.
- *
- * <p>The backup data itself must be encrypted using an AES/GCM/NoPadding cipher. The key
- * material must be randomly generated using {@link java.security.SecureRandom}, and must have
- * at least 256 bits of entropy.
+ * <p>The transport has client-side encryption enabled. i.e., the user's backup has been
+ * encrypted with a key known only to the device, and not to the remote storage solution. Even
+ * if an attacker had root access to the remote storage provider they should not be able to
+ * decrypt the user's backup data.
*/
public static final int FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED = 1;
diff --git a/core/java/android/app/backup/BackupDataOutput.java b/core/java/android/app/backup/BackupDataOutput.java
index 4f90cf7..5a66f34 100644
--- a/core/java/android/app/backup/BackupDataOutput.java
+++ b/core/java/android/app/backup/BackupDataOutput.java
@@ -107,12 +107,8 @@
/**
* Returns flags with additional information about the backup transport. For supported flags see
- * {@link android.app.backup.BackupAgent}.
+ * {@link android.app.backup.BackupAgent}
*
- * <p>Returns the same flags that {@link BackupTransport#getTransportFlags()} returns.
- *
- * @see BackupAgent#FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
- * @see BackupAgent#FLAG_DEVICE_TO_DEVICE_TRANSFER
* @see FullBackupDataOutput#getTransportFlags()
*/
public int getTransportFlags() {
diff --git a/core/java/android/app/backup/FullBackupDataOutput.java b/core/java/android/app/backup/FullBackupDataOutput.java
index f1d9dc6..18f4283 100644
--- a/core/java/android/app/backup/FullBackupDataOutput.java
+++ b/core/java/android/app/backup/FullBackupDataOutput.java
@@ -26,12 +26,8 @@
/**
* Returns flags with additional information about the backup transport. For supported flags see
- * {@link android.app.backup.BackupAgent}.
+ * {@link android.app.backup.BackupAgent}
*
- * <p>Returns the same flags that {@link BackupTransport#getTransportFlags()} returns.
- *
- * @see BackupAgent#FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
- * @see BackupAgent#FLAG_DEVICE_TO_DEVICE_TRANSFER
* @see BackupDataOutput#getTransportFlags()
*/
public int getTransportFlags() {
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 4336f18..aadf904 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -197,6 +197,7 @@
/**
* Key to retrieve an extra added to an intent when the value of a slider is changed.
* @deprecated remove once support lib is update to use EXTRA_RANGE_VALUE instead
+ * @removed
*/
@Deprecated
public static final String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
@@ -224,6 +225,7 @@
/**
* Subtype to tag an item as representing a slider.
* @deprecated remove once support lib is update to use SUBTYPE_RANGE instead
+ * @removed
*/
@Deprecated
public static final String SUBTYPE_SLIDER = "slider";
@@ -360,6 +362,7 @@
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
@Deprecated
public Builder(@NonNull Uri uri) {
@@ -388,7 +391,7 @@
/**
* Tells the system whether for this slice the return value of
- * {@link SliceProvider#onBindSlice(Uri, List)} may be different depending on
+ * {@link SliceProvider#onBindSlice(Uri, java.util.Set)} may be different depending on
* {@link SliceProvider#getCallingPackage()} and should not be cached for multiple
* apps.
*/
@@ -411,6 +414,7 @@
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
public Builder setSpec(SliceSpec spec) {
mSpec = spec;
@@ -490,6 +494,7 @@
/**
* @deprecated TO BE REMOVED.
+ * @removed
*/
@Deprecated
public Slice.Builder addTimestamp(long time, @Nullable @SliceSubtype String subType,
diff --git a/core/java/android/app/slice/SliceItem.java b/core/java/android/app/slice/SliceItem.java
index 019ae49..c058a14 100644
--- a/core/java/android/app/slice/SliceItem.java
+++ b/core/java/android/app/slice/SliceItem.java
@@ -46,7 +46,7 @@
* <li>{@link #FORMAT_IMAGE}</li>
* <li>{@link #FORMAT_ACTION}</li>
* <li>{@link #FORMAT_INT}</li>
- * <li>{@link #FORMAT_TIMESTAMP}</li>
+ * <li>{@link #FORMAT_LONG}</li>
* <li>{@link #FORMAT_REMOTE_INPUT}</li>
* <li>{@link #FORMAT_BUNDLE}</li>
*
@@ -103,6 +103,7 @@
public static final String FORMAT_LONG = "long";
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
@Deprecated
public static final String FORMAT_TIMESTAMP = FORMAT_LONG;
@@ -168,7 +169,7 @@
* <li>{@link #FORMAT_IMAGE}</li>
* <li>{@link #FORMAT_ACTION}</li>
* <li>{@link #FORMAT_INT}</li>
- * <li>{@link #FORMAT_TIMESTAMP}</li>
+ * <li>{@link #FORMAT_LONG}</li>
* <li>{@link #FORMAT_REMOTE_INPUT}</li>
* <li>{@link #FORMAT_BUNDLE}</li>
* @see #getSubType() ()
@@ -249,8 +250,17 @@
}
/**
- * @return The timestamp held by this {@link #FORMAT_TIMESTAMP} SliceItem
+ * @return The long held by this {@link #FORMAT_LONG} SliceItem
*/
+ public long getLong() {
+ return (Long) mObj;
+ }
+
+ /**
+ * @deprecated replaced by {@link #getLong()}
+ * @removed
+ */
+ @Deprecated
public long getTimestamp() {
return (Long) mObj;
}
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index dc8a3b9..28e5938 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -139,6 +139,7 @@
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
@Deprecated
public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) {
@@ -263,6 +264,7 @@
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
@Deprecated
public @Nullable Slice bindSlice(@NonNull Uri uri, @NonNull List<SliceSpec> supportedSpecs) {
@@ -277,12 +279,12 @@
* <ol>
* <li> If the intent contains data that {@link ContentResolver#getType} is
* {@link SliceProvider#SLICE_TYPE} then the data will be returned.</li>
- * <li>If the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
- * the provider will be asked to {@link SliceProvider#onMapIntentToUri} and that result
- * will be returned.</li>
- * <li>Lastly, if the intent explicitly points at an activity, and that activity has
+ * <li>If the intent explicitly points at an activity, and that activity has
* meta-data for key {@link #SLICE_METADATA_KEY}, then the Uri specified there will be
* returned.</li>
+ * <li>Lastly, if the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
+ * the provider will be asked to {@link SliceProvider#onMapIntentToUri} and that result
+ * will be returned.</li>
* <li>If no slice is found, then {@code null} is returned.</li>
* </ol>
* @param intent The intent associated with a slice.
@@ -292,37 +294,12 @@
* @see Intent
*/
public @Nullable Uri mapIntentToUri(@NonNull Intent intent) {
- Preconditions.checkNotNull(intent, "intent");
- Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null
- || intent.getData() != null,
- "Slice intent must be explicit %s", intent);
ContentResolver resolver = mContext.getContentResolver();
-
- // Check if the intent has data for the slice uri on it and use that
- final Uri intentData = intent.getData();
- if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
- return intentData;
- }
+ final Uri staticUri = resolveStatic(intent, resolver);
+ if (staticUri != null) return staticUri;
// Otherwise ask the app
- Intent queryIntent = new Intent(intent);
- if (!queryIntent.hasCategory(CATEGORY_SLICE)) {
- queryIntent.addCategory(CATEGORY_SLICE);
- }
- List<ResolveInfo> providers =
- mContext.getPackageManager().queryIntentContentProviders(queryIntent, 0);
- if (providers == null || providers.isEmpty()) {
- // There are no providers, see if this activity has a direct link.
- ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
- PackageManager.GET_META_DATA);
- if (resolve != null && resolve.activityInfo != null
- && resolve.activityInfo.metaData != null
- && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
- return Uri.parse(
- resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY));
- }
- return null;
- }
- String authority = providers.get(0).providerInfo.authority;
+ String authority = getAuthority(intent);
+ if (authority == null) return null;
Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(authority).build();
try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) {
@@ -343,10 +320,43 @@
}
}
+ private String getAuthority(Intent intent) {
+ Intent queryIntent = new Intent(intent);
+ if (!queryIntent.hasCategory(CATEGORY_SLICE)) {
+ queryIntent.addCategory(CATEGORY_SLICE);
+ }
+ List<ResolveInfo> providers =
+ mContext.getPackageManager().queryIntentContentProviders(queryIntent, 0);
+ return providers != null && !providers.isEmpty() ? providers.get(0).providerInfo.authority
+ : null;
+ }
+
+ private Uri resolveStatic(@NonNull Intent intent, ContentResolver resolver) {
+ Preconditions.checkNotNull(intent, "intent");
+ Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null
+ || intent.getData() != null,
+ "Slice intent must be explicit %s", intent);
+
+ // Check if the intent has data for the slice uri on it and use that
+ final Uri intentData = intent.getData();
+ if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
+ return intentData;
+ }
+ // There are no providers, see if this activity has a direct link.
+ ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
+ PackageManager.GET_META_DATA);
+ if (resolve != null && resolve.activityInfo != null
+ && resolve.activityInfo.metaData != null
+ && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
+ return Uri.parse(
+ resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY));
+ }
+ return null;
+ }
+
/**
- * Turns a slice intent into slice content. Expects an explicit intent. If there is no
- * {@link android.content.ContentProvider} associated with the given intent this will throw
- * {@link IllegalArgumentException}.
+ * Turns a slice intent into slice content. Is a shortcut to perform the action
+ * of both {@link #mapIntentToUri(Intent)} and {@link #bindSlice(Uri, Set)} at once.
*
* @param intent The intent associated with a slice.
* @param supportedSpecs List of supported specs.
@@ -362,28 +372,11 @@
|| intent.getData() != null,
"Slice intent must be explicit %s", intent);
ContentResolver resolver = mContext.getContentResolver();
-
- // Check if the intent has data for the slice uri on it and use that
- final Uri intentData = intent.getData();
- if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
- return bindSlice(intentData, supportedSpecs);
- }
+ final Uri staticUri = resolveStatic(intent, resolver);
+ if (staticUri != null) return bindSlice(staticUri, supportedSpecs);
// Otherwise ask the app
- List<ResolveInfo> providers =
- mContext.getPackageManager().queryIntentContentProviders(intent, 0);
- if (providers == null || providers.isEmpty()) {
- // There are no providers, see if this activity has a direct link.
- ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
- PackageManager.GET_META_DATA);
- if (resolve != null && resolve.activityInfo != null
- && resolve.activityInfo.metaData != null
- && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
- return bindSlice(Uri.parse(resolve.activityInfo.metaData
- .getString(SLICE_METADATA_KEY)), supportedSpecs);
- }
- return null;
- }
- String authority = providers.get(0).providerInfo.authority;
+ String authority = getAuthority(intent);
+ if (authority == null) return null;
Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(authority).build();
try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) {
@@ -392,8 +385,6 @@
}
Bundle extras = new Bundle();
extras.putParcelable(SliceProvider.EXTRA_INTENT, intent);
- extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
- new ArrayList<>(supportedSpecs));
final Bundle res = provider.call(SliceProvider.METHOD_MAP_INTENT, null, extras);
if (res == null) {
return null;
@@ -408,6 +399,7 @@
/**
* @deprecated TO BE REMOVED.
+ * @removed
*/
@Deprecated
@Nullable
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index d369272..7d8e394 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -204,6 +204,7 @@
/**
* @deprecated TO BE REMOVED
+ * @removed
*/
@Deprecated
public Slice onBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 3df4336..71edc8a 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -1514,22 +1514,24 @@
* @return true, if the request is send to the Bluetooth stack.
* @hide
*/
- public boolean requestLeConnectionUpdate(int minConnectionInterval,
- int maxConnectionInterval,
- int slaveLatency, int supervisionTimeout) {
+ public boolean requestLeConnectionUpdate(int minConnectionInterval, int maxConnectionInterval,
+ int slaveLatency, int supervisionTimeout,
+ int minConnectionEventLen, int maxConnectionEventLen) {
if (DBG) {
Log.d(TAG, "requestLeConnectionUpdate() - min=(" + minConnectionInterval
- + ")" + (1.25 * minConnectionInterval)
- + "msec, max=(" + maxConnectionInterval + ")"
+ + ")" + (1.25 * minConnectionInterval)
+ + "msec, max=(" + maxConnectionInterval + ")"
+ (1.25 * maxConnectionInterval) + "msec, latency=" + slaveLatency
- + ", timeout=" + supervisionTimeout + "msec");
+ + ", timeout=" + supervisionTimeout + "msec" + ", min_ce="
+ + minConnectionEventLen + ", max_ce=" + maxConnectionEventLen);
}
if (mService == null || mClientIf == 0) return false;
try {
mService.leConnectionUpdate(mClientIf, mDevice.getAddress(),
- minConnectionInterval, maxConnectionInterval,
- slaveLatency, supervisionTimeout);
+ minConnectionInterval, maxConnectionInterval,
+ slaveLatency, supervisionTimeout,
+ minConnectionEventLen, maxConnectionEventLen);
} catch (RemoteException e) {
Log.e(TAG, "", e);
return false;
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index c5a39f4..d65e051 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1694,7 +1694,7 @@
if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
return mHiddenApiPolicy;
}
- if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+ if (targetSdkVersion < Build.VERSION_CODES.P) {
return HIDDEN_API_ENFORCEMENT_BLACK;
} else {
return HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
@@ -1728,9 +1728,9 @@
if (isPackageWhitelistedForHiddenApis()) {
return;
}
- if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+ if (targetSdkVersion < Build.VERSION_CODES.P) {
setHiddenApiEnforcementPolicy(policyPreP);
- } else if (targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+ } else if (targetSdkVersion >= Build.VERSION_CODES.P) {
setHiddenApiEnforcementPolicy(policyP);
}
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 627ceb7..5f9f8f1 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -244,7 +244,7 @@
* the first position to be the same across updates.
*
* <strong>Deprecated</strong> This has been replaced by the
- * {@link PackageInfo#signingCertificateHistory} field, which takes into
+ * {@link PackageInfo#signingInfo} field, which takes into
* account signing certificate rotation. For backwards compatibility in
* the event of signing certificate rotation, this will return the oldest
* reported signing certificate, so that an application will appear to
@@ -256,29 +256,15 @@
public Signature[] signatures;
/**
- * Array of all signatures arrays read from the package file, potentially
+ * Signing information read from the package file, potentially
* including past signing certificates no longer used after signing
- * certificate rotation. Though signing certificate rotation is only
- * available for apps with a single signing certificate, this provides an
- * array of arrays so that packages signed with multiple signing
- * certificates can still return all signers. This is only filled in if
+ * certificate rotation. This is only filled in if
* the flag {@link PackageManager#GET_SIGNING_CERTIFICATES} was set.
*
- * A package must be singed with at least one certificate, which is at
- * position zero in the array. An application may be signed by multiple
- * certificates, which would be in the array at position zero in an
- * indeterminate order. A package may also have a history of certificates
- * due to signing certificate rotation. In this case, the array will be
- * populated by a series of single-entry arrays corresponding to a signing
- * certificate of the package.
- *
- * <strong>Note:</strong> Signature ordering is not guaranteed to be
- * stable which means that a package signed with certificates A and B is
- * equivalent to being signed with certificates B and A. This means that
- * in case multiple signatures are reported you cannot assume the one at
- * the first position will be the same across updates.
+ * Use this field instead of the deprecated {@code signatures} field.
+ * See {@link SigningInfo} for more information on its contents.
*/
- public Signature[][] signingCertificateHistory;
+ public SigningInfo signingInfo;
/**
* Application specified preferred configuration
@@ -476,17 +462,11 @@
dest.writeBoolean(mOverlayIsStatic);
dest.writeInt(compileSdkVersion);
dest.writeString(compileSdkVersionCodename);
- writeSigningCertificateHistoryToParcel(dest, parcelableFlags);
- }
-
- private void writeSigningCertificateHistoryToParcel(Parcel dest, int parcelableFlags) {
- if (signingCertificateHistory != null) {
- dest.writeInt(signingCertificateHistory.length);
- for (int i = 0; i < signingCertificateHistory.length; i++) {
- dest.writeTypedArray(signingCertificateHistory[i], parcelableFlags);
- }
+ if (signingInfo != null) {
+ dest.writeInt(1);
+ signingInfo.writeToParcel(dest, parcelableFlags);
} else {
- dest.writeInt(-1);
+ dest.writeInt(0);
}
}
@@ -544,7 +524,10 @@
mOverlayIsStatic = source.readBoolean();
compileSdkVersion = source.readInt();
compileSdkVersionCodename = source.readString();
- readSigningCertificateHistoryFromParcel(source);
+ int hasSigningInfo = source.readInt();
+ if (hasSigningInfo != 0) {
+ signingInfo = SigningInfo.CREATOR.createFromParcel(source);
+ }
// The component lists were flattened with the redundant ApplicationInfo
// instances omitted. Distribute the canonical one here as appropriate.
@@ -556,16 +539,6 @@
}
}
- private void readSigningCertificateHistoryFromParcel(Parcel source) {
- int len = source.readInt();
- if (len != -1) {
- signingCertificateHistory = new Signature[len][];
- for (int i = 0; i < len; i++) {
- signingCertificateHistory[i] = source.createTypedArray(Signature.CREATOR);
- }
- }
- }
-
private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
if (components != null) {
for (ComponentInfo ci : components) {
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 3e0db60..453a74a 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -810,21 +810,11 @@
// replacement for GET_SIGNATURES
if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) {
- if (p.mSigningDetails.hasPastSigningCertificates()) {
- // Package has included signing certificate rotation information. Convert each
- // entry to an array
- int numberOfSigs = p.mSigningDetails.pastSigningCertificates.length;
- pi.signingCertificateHistory = new Signature[numberOfSigs][];
- for (int i = 0; i < numberOfSigs; i++) {
- pi.signingCertificateHistory[i] =
- new Signature[] { p.mSigningDetails.pastSigningCertificates[i] };
- }
- } else if (p.mSigningDetails.hasSignatures()) {
- // otherwise keep old behavior
- int numberOfSigs = p.mSigningDetails.signatures.length;
- pi.signingCertificateHistory = new Signature[1][numberOfSigs];
- System.arraycopy(p.mSigningDetails.signatures, 0,
- pi.signingCertificateHistory[0], 0, numberOfSigs);
+ if (p.mSigningDetails != SigningDetails.UNKNOWN) {
+ // only return a valid SigningInfo if there is signing information to report
+ pi.signingInfo = new SigningInfo(p.mSigningDetails);
+ } else {
+ pi.signingInfo = null;
}
}
return pi;
@@ -2726,7 +2716,7 @@
// Fot apps targeting O-MR1 we require explicit enumeration of all certs.
String[] additionalCertSha256Digests = EmptyArray.STRING;
- if (pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.O) {
+ if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O_MR1) {
additionalCertSha256Digests = parseAdditionalCertificates(res, parser, outError);
if (additionalCertSha256Digests == null) {
return false;
diff --git a/core/java/android/content/pm/PackageSharedLibraryUpdater.java b/core/java/android/content/pm/PackageSharedLibraryUpdater.java
index fa89432..b14b321 100644
--- a/core/java/android/content/pm/PackageSharedLibraryUpdater.java
+++ b/core/java/android/content/pm/PackageSharedLibraryUpdater.java
@@ -62,7 +62,7 @@
static boolean apkTargetsApiLevelLessThanOrEqualToOMR1(PackageParser.Package pkg) {
int targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
- return targetSdkVersion <= Build.VERSION_CODES.O_MR1;
+ return targetSdkVersion < Build.VERSION_CODES.P;
}
/**
diff --git a/core/java/android/content/pm/SigningInfo.java b/core/java/android/content/pm/SigningInfo.java
new file mode 100644
index 0000000..ef87403
--- /dev/null
+++ b/core/java/android/content/pm/SigningInfo.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Information pertaining to the signing certificates used to sign a package.
+ */
+public final class SigningInfo implements Parcelable {
+
+ @NonNull
+ private final PackageParser.SigningDetails mSigningDetails;
+
+ public SigningInfo() {
+ mSigningDetails = PackageParser.SigningDetails.UNKNOWN;
+ }
+
+ /**
+ * @hide only packagemanager should be populating this
+ */
+ public SigningInfo(PackageParser.SigningDetails signingDetails) {
+ mSigningDetails = new PackageParser.SigningDetails(signingDetails);
+ }
+
+ public SigningInfo(SigningInfo orig) {
+ mSigningDetails = new PackageParser.SigningDetails(orig.mSigningDetails);
+ }
+
+ private SigningInfo(Parcel source) {
+ mSigningDetails = PackageParser.SigningDetails.CREATOR.createFromParcel(source);
+ }
+
+ /**
+ * Although relatively uncommon, packages may be signed by more than one signer, in which case
+ * their identity is viewed as being the set of all signers, not just any one.
+ */
+ public boolean hasMultipleSigners() {
+ return mSigningDetails.signatures != null && mSigningDetails.signatures.length > 1;
+ }
+
+ /**
+ * APK Signature Scheme v3 enables packages to provide a proof-of-rotation record that the
+ * platform verifies, and uses, to allow the use of new signing certificates. This is only
+ * available to packages that are not signed by multiple signers. In the event of a change to a
+ * new signing certificate, the package's past signing certificates are presented as well. Any
+ * check of a package's signing certificate should also include a search through its entire
+ * signing history, since it could change to a new signing certificate at any time.
+ */
+ public boolean hasPastSigningCertificates() {
+ return mSigningDetails.signatures != null
+ && mSigningDetails.pastSigningCertificates != null;
+ }
+
+ /**
+ * Returns the signing certificates this package has proven it is authorized to use. This
+ * includes both the signing certificate associated with the signer of the package and the past
+ * signing certificates it included as its proof of signing certificate rotation. This method
+ * is the preferred replacement for the {@code GET_SIGNATURES} flag used with {@link
+ * PackageManager#getPackageInfo(String, int)}. When determining if a package is signed by a
+ * desired certificate, the returned array should be checked to determine if it is one of the
+ * entries.
+ *
+ * <note>
+ * This method returns null if the package is signed by multiple signing certificates, as
+ * opposed to being signed by one current signer and also providing the history of past
+ * signing certificates. {@link #hasMultipleSigners()} may be used to determine if this
+ * package is signed by multiple signers. Packages which are signed by multiple signers
+ * cannot change their signing certificates and their {@code Signature} array should be
+ * checked to make sure that every entry matches the looked-for signing certificates.
+ * </note>
+ */
+ public Signature[] getSigningCertificateHistory() {
+ if (hasMultipleSigners()) {
+ return null;
+ } else if (!hasPastSigningCertificates()) {
+
+ // this package is only signed by one signer with no history, return it
+ return mSigningDetails.signatures;
+ } else {
+
+ // this package has provided proof of past signing certificates, include them
+ return mSigningDetails.pastSigningCertificates;
+ }
+ }
+
+ /**
+ * Returns the signing certificates used to sign the APK contents of this application. Not
+ * including any past signing certificates the package proved it is authorized to use.
+ * <note>
+ * This method should not be used unless {@link #hasMultipleSigners()} returns true,
+ * indicating that {@link #getSigningCertificateHistory()} cannot be used, otherwise {@link
+ * #getSigningCertificateHistory()} should be preferred.
+ * </note>
+ */
+ public Signature[] getApkContentsSigners() {
+ return mSigningDetails.signatures;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int parcelableFlags) {
+ mSigningDetails.writeToParcel(dest, parcelableFlags);
+ }
+
+ public static final Parcelable.Creator<SigningInfo> CREATOR =
+ new Parcelable.Creator<SigningInfo>() {
+ @Override
+ public SigningInfo createFromParcel(Parcel source) {
+ return new SigningInfo(source);
+ }
+
+ @Override
+ public SigningInfo[] newArray(int size) {
+ return new SigningInfo[size];
+ }
+ };
+}
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 9878067..d3b40e8 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -254,9 +254,8 @@
/**
* Indicates that this network is not congested.
* <p>
- * When a network is congested, the device should defer network traffic that
- * can be done at a later time without breaking developer contracts.
- * @hide
+ * When a network is congested, applications should defer network traffic
+ * that can be done at a later time, such as uploading analytics.
*/
public static final int NET_CAPABILITY_NOT_CONGESTED = 20;
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
index 6363161..954071a 100644
--- a/core/java/android/os/BatteryManager.java
+++ b/core/java/android/os/BatteryManager.java
@@ -353,4 +353,20 @@
public static boolean isPlugWired(int plugType) {
return plugType == BATTERY_PLUGGED_USB || plugType == BATTERY_PLUGGED_AC;
}
+
+ /**
+ * Compute an approximation for how much time (in milliseconds) remains until the battery is
+ * fully charged. Returns -1 if no time can be computed: either there is not enough current
+ * data to make a decision or the battery is currently discharging.
+ *
+ * @return how much time is left, in milliseconds, until the battery is fully charged or -1 if
+ * the computation fails
+ */
+ public long computeChargeTimeRemaining() {
+ try {
+ return mBatteryStats.computeChargeTimeRemaining();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 6ebb102..1d232bf 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -3814,6 +3814,9 @@
final BatterySipper bs = sippers.get(i);
String label;
switch (bs.drainType) {
+ case AMBIENT_DISPLAY:
+ label = "ambi";
+ break;
case IDLE:
label="idle";
break;
@@ -4975,6 +4978,9 @@
final BatterySipper bs = sippers.get(i);
pw.print(prefix);
switch (bs.drainType) {
+ case AMBIENT_DISPLAY:
+ pw.print(" Ambient display: ");
+ break;
case IDLE:
pw.print(" Idle: ");
break;
@@ -7777,6 +7783,9 @@
int n = SystemProto.PowerUseItem.UNKNOWN_SIPPER;
int uid = 0;
switch (bs.drainType) {
+ case AMBIENT_DISPLAY:
+ n = SystemProto.PowerUseItem.AMBIENT_DISPLAY;
+ break;
case IDLE:
n = SystemProto.PowerUseItem.IDLE;
break;
diff --git a/core/java/android/os/EventLogTags.logtags b/core/java/android/os/EventLogTags.logtags
new file mode 100644
index 0000000..b143a74
--- /dev/null
+++ b/core/java/android/os/EventLogTags.logtags
@@ -0,0 +1,6 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package android.os
+
+230000 service_manager_stats (call_count|1),(total_time|1|3),(duration|1|3)
+230001 service_manager_slow (time|1|3),(service|3)
diff --git a/core/java/android/os/IStatsManager.aidl b/core/java/android/os/IStatsManager.aidl
index 2a68714..3b32c52 100644
--- a/core/java/android/os/IStatsManager.aidl
+++ b/core/java/android/os/IStatsManager.aidl
@@ -77,45 +77,51 @@
/**
* Fetches data for the specified configuration key. Returns a byte array representing proto
* wire-encoded of ConfigMetricsReportList.
+ *
+ * Requires Manifest.permission.DUMP.
*/
byte[] getData(in long key);
/**
* Fetches metadata across statsd. Returns byte array representing wire-encoded proto.
+ *
+ * Requires Manifest.permission.DUMP.
*/
byte[] getMetadata();
/**
* Sets a configuration with the specified config key and subscribes to updates for this
* configuration key. Broadcasts will be sent if this configuration needs to be collected.
- * The configuration must be a wire-encoded StatsDConfig. The receiver for this data is
+ * The configuration must be a wire-encoded StatsdConfig. The receiver for this data is
* registered in a separate function.
*
- * Returns if this configuration was correctly registered.
+ * Requires Manifest.permission.DUMP.
*/
- boolean addConfiguration(in long configKey, in byte[] config);
+ void addConfiguration(in long configKey, in byte[] config);
/**
* Registers the given pending intent for this config key. This intent is invoked when the
* memory consumed by the metrics for this configuration approach the pre-defined limits. There
* can be at most one listener per config key.
*
- * Returns if this listener was correctly registered.
+ * Requires Manifest.permission.DUMP.
*/
- boolean setDataFetchOperation(long configKey, in IBinder intentSender);
+ void setDataFetchOperation(long configKey, in IBinder intentSender);
/**
* Removes the data fetch operation for the specified configuration.
+ *
+ * Requires Manifest.permission.DUMP.
*/
- boolean removeDataFetchOperation(long configKey);
+ void removeDataFetchOperation(long configKey);
/**
* Removes the configuration with the matching config key. No-op if this config key does not
* exist.
*
- * Returns if this configuration key was removed.
+ * Requires Manifest.permission.DUMP.
*/
- boolean removeConfiguration(in long configKey);
+ void removeConfiguration(in long configKey);
/**
* Set the IIntentSender (i.e. PendingIntent) to be used when broadcasting subscriber
@@ -133,16 +139,16 @@
* intentSender must be convertible into an IntentSender using IntentSender(IBinder)
* and cannot be null.
*
- * Returns true if successful.
+ * Requires Manifest.permission.DUMP.
*/
- boolean setBroadcastSubscriber(long configKey, long subscriberId, in IBinder intentSender);
+ void setBroadcastSubscriber(long configKey, long subscriberId, in IBinder intentSender);
/**
* Undoes setBroadcastSubscriber() for the (configKey, subscriberId) pair.
* Any broadcasts associated with subscriberId will henceforth not be sent.
* No-op if this (configKey, subsriberId) pair was not associated with an IntentSender.
*
- * Returns true if successful.
+ * Requires Manifest.permission.DUMP.
*/
- boolean unsetBroadcastSubscriber(long configKey, long subscriberId);
+ void unsetBroadcastSubscriber(long configKey, long subscriberId);
}
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index 3be76d6..165276d 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -18,7 +18,9 @@
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BinderInternal;
+import com.android.internal.util.StatLogger;
import java.util.HashMap;
import java.util.Map;
@@ -26,9 +28,76 @@
/** @hide */
public final class ServiceManager {
private static final String TAG = "ServiceManager";
+ private static final Object sLock = new Object();
+
private static IServiceManager sServiceManager;
+
+ /**
+ * Cache for the "well known" services, such as WM and AM.
+ */
private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
+ /**
+ * We do the "slow log" at most once every this interval.
+ */
+ private static final int SLOW_LOG_INTERVAL_MS = 5000;
+
+ /**
+ * We do the "stats log" at most once every this interval.
+ */
+ private static final int STATS_LOG_INTERVAL_MS = 5000;
+
+ /**
+ * Threshold in uS for a "slow" call, used on core UIDs. We use a more relax value to
+ * avoid logspam.
+ */
+ private static final long GET_SERVICE_SLOW_THRESHOLD_US_CORE =
+ SystemProperties.getInt("debug.servicemanager.slow_call_core_ms", 10) * 1000;
+
+ /**
+ * Threshold in uS for a "slow" call, used on non-core UIDs. We use a more relax value to
+ * avoid logspam.
+ */
+ private static final long GET_SERVICE_SLOW_THRESHOLD_US_NON_CORE =
+ SystemProperties.getInt("debug.servicemanager.slow_call_ms", 50) * 1000;
+
+ /**
+ * We log stats logging ever this many getService() calls.
+ */
+ private static final int GET_SERVICE_LOG_EVERY_CALLS_CORE =
+ SystemProperties.getInt("debug.servicemanager.log_calls_core", 100);
+
+ /**
+ * We log stats logging ever this many getService() calls.
+ */
+ private static final int GET_SERVICE_LOG_EVERY_CALLS_NON_CORE =
+ SystemProperties.getInt("debug.servicemanager.log_calls", 200);
+
+ @GuardedBy("sLock")
+ private static int sGetServiceAccumulatedUs;
+
+ @GuardedBy("sLock")
+ private static int sGetServiceAccumulatedCallCount;
+
+ @GuardedBy("sLock")
+ private static long sLastStatsLogUptime;
+
+ @GuardedBy("sLock")
+ private static long sLastSlowLogUptime;
+
+ @GuardedBy("sLock")
+ private static long sLastSlowLogActualTime;
+
+ interface Stats {
+ int GET_SERVICE = 0;
+
+ int COUNT = GET_SERVICE + 1;
+ }
+
+ public static final StatLogger sStatLogger = new StatLogger(new String[] {
+ "getService()",
+ });
+
private static IServiceManager getIServiceManager() {
if (sServiceManager != null) {
return sServiceManager;
@@ -52,7 +121,7 @@
if (service != null) {
return service;
} else {
- return Binder.allowBlocking(getIServiceManager().getService(name));
+ return Binder.allowBlocking(rawGetService(name));
}
} catch (RemoteException e) {
Log.e(TAG, "error in getService", e);
@@ -177,4 +246,59 @@
super("No service published for: " + name);
}
}
+
+ private static IBinder rawGetService(String name) throws RemoteException {
+ final long start = sStatLogger.getTime();
+
+ final IBinder binder = getIServiceManager().getService(name);
+
+ final int time = (int) sStatLogger.logDurationStat(Stats.GET_SERVICE, start);
+
+ final int myUid = Process.myUid();
+ final boolean isCore = UserHandle.isCore(myUid);
+
+ final long slowThreshold = isCore
+ ? GET_SERVICE_SLOW_THRESHOLD_US_CORE
+ : GET_SERVICE_SLOW_THRESHOLD_US_NON_CORE;
+
+ synchronized (sLock) {
+ sGetServiceAccumulatedUs += time;
+ sGetServiceAccumulatedCallCount++;
+
+ final long nowUptime = SystemClock.uptimeMillis();
+
+ // Was a slow call?
+ if (time >= slowThreshold) {
+ // We do a slow log:
+ // - At most once in every SLOW_LOG_INTERVAL_MS
+ // - OR it was slower than the previously logged slow call.
+ if ((nowUptime > (sLastSlowLogUptime + SLOW_LOG_INTERVAL_MS))
+ || (sLastSlowLogActualTime < time)) {
+ EventLogTags.writeServiceManagerSlow(time / 1000, name);
+
+ sLastSlowLogUptime = nowUptime;
+ sLastSlowLogActualTime = time;
+ }
+ }
+
+ // Every GET_SERVICE_LOG_EVERY_CALLS calls, log the total time spent in getService().
+
+ final int logInterval = isCore
+ ? GET_SERVICE_LOG_EVERY_CALLS_CORE
+ : GET_SERVICE_LOG_EVERY_CALLS_NON_CORE;
+
+ if ((sGetServiceAccumulatedCallCount >= logInterval)
+ && (nowUptime >= (sLastStatsLogUptime + STATS_LOG_INTERVAL_MS))) {
+
+ EventLogTags.writeServiceManagerStats(
+ sGetServiceAccumulatedCallCount, // Total # of getService() calls.
+ sGetServiceAccumulatedUs / 1000, // Total time spent in getService() calls.
+ (int) (nowUptime - sLastStatsLogUptime)); // Uptime duration since last log.
+ sGetServiceAccumulatedCallCount = 0;
+ sGetServiceAccumulatedUs = 0;
+ sLastStatsLogUptime = nowUptime;
+ }
+ }
+ return binder;
+ }
}
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 17d83db..3270719 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -924,13 +924,17 @@
/** @hide */
@VisibleForTesting
public int[] getUids() {
- return mUids;
+ int[] uids = new int[mSize];
+ System.arraycopy(mUids, 0, uids, 0, mSize);
+ return uids;
}
/** @hide */
@VisibleForTesting
public String[] getTags() {
- return mTags;
+ String[] tags = new String[mSize];
+ System.arraycopy(mTags, 0, tags, 0, mSize);
+ return tags;
}
/** @hide */
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index d1d5d8e..673da50 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -166,6 +166,11 @@
private List<String> mApiBlacklistExemptions = Collections.emptyList();
/**
+ * Proportion of hidden API accesses that should be logged to the event log; 0 - 0x10000.
+ */
+ private int mHiddenApiAccessLogSampleRate;
+
+ /**
* The state of the connection to the primary zygote.
*/
private ZygoteState primaryZygoteState;
@@ -478,6 +483,21 @@
}
}
+ /**
+ * Set the precentage of detected hidden API accesses that are logged to the event log.
+ *
+ * <p>This rate will take affect for all new processes forked from the zygote after this call.
+ *
+ * @param rate An integer between 0 and 0x10000 inclusive. 0 means no event logging.
+ */
+ public void setHiddenApiAccessLogSampleRate(int rate) {
+ synchronized (mLock) {
+ mHiddenApiAccessLogSampleRate = rate;
+ maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
+ maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState);
+ }
+ }
+
@GuardedBy("mLock")
private void maybeSetApiBlacklistExemptions(ZygoteState state, boolean sendIfEmpty) {
if (state == null || state.isClosed()) {
@@ -505,6 +525,29 @@
}
}
+ private void maybeSetHiddenApiAccessLogSampleRate(ZygoteState state) {
+ if (state == null || state.isClosed()) {
+ return;
+ }
+ if (mHiddenApiAccessLogSampleRate == -1) {
+ return;
+ }
+ try {
+ state.writer.write(Integer.toString(1));
+ state.writer.newLine();
+ state.writer.write("--hidden-api-log-sampling-rate="
+ + Integer.toString(mHiddenApiAccessLogSampleRate));
+ state.writer.newLine();
+ state.writer.flush();
+ int status = state.inputStream.readInt();
+ if (status != 0) {
+ Slog.e(LOG_TAG, "Failed to set hidden API log sampling rate; status " + status);
+ }
+ } catch (IOException ioe) {
+ Slog.e(LOG_TAG, "Failed to set hidden API log sampling rate", ioe);
+ }
+ }
+
/**
* Tries to open socket to Zygote process if not already open. If
* already open, does nothing. May block and retry. Requires that mLock be held.
@@ -520,6 +563,7 @@
throw new ZygoteStartFailedEx("Error connecting to primary zygote", ioe);
}
maybeSetApiBlacklistExemptions(primaryZygoteState, false);
+ maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
}
if (primaryZygoteState.matches(abi)) {
return primaryZygoteState;
@@ -533,6 +577,7 @@
throw new ZygoteStartFailedEx("Error connecting to secondary zygote", ioe);
}
maybeSetApiBlacklistExemptions(secondaryZygoteState, false);
+ maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState);
}
if (secondaryZygoteState.matches(abi)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 38de1e4..ef87752 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11774,6 +11774,15 @@
"hidden_api_blacklist_exemptions";
/**
+ * Sampling rate for hidden API access event logs, as an integer in the range 0 to 0x10000
+ * inclusive.
+ *
+ * @hide
+ */
+ public static final String HIDDEN_API_ACCESS_LOG_SAMPLING_RATE =
+ "hidden_api_access_log_sampling_rate";
+
+ /**
* Hidden API enforcement policy for apps targeting SDK versions prior to the latest
* version.
*
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index 9334aa9..54f82f9 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -119,6 +119,7 @@
* See implementation for binary key format.
*
* @deprecated Use {@link #getTrustedHardwareCertPath} instead.
+ * @removed
*/
@Deprecated
public @NonNull byte[] getTrustedHardwarePublicKey() {
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index b84843b..fa4964d 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -302,6 +302,7 @@
/**
* @deprecated Use {@link #initRecoveryService(String, byte[], byte[])} instead.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -373,6 +374,7 @@
/**
* @deprecated Use {@link #getKeyChainSnapshot()}
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -449,6 +451,7 @@
/**
* @deprecated Use {@link #getAliases()}.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -474,6 +477,7 @@
/**
* @deprecated Use {@link #setRecoveryStatus(String, int)}
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -508,6 +512,7 @@
/**
* @deprecated Use {@link #getRecoveryStatus(String)}.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -600,7 +605,10 @@
* @throws LockScreenRequiredException if the user has not set a lock screen. This is required
* to generate recoverable keys, as the snapshots are encrypted using a key derived from the
* lock screen.
+ * @deprecated Use {@link #generateKey(String)}
+ * @removed
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public byte[] generateAndStoreKey(@NonNull String alias, byte[] account)
throws InternalRecoveryServiceException, LockScreenRequiredException {
@@ -609,6 +617,7 @@
/**
* @deprecated Use {@link #generateKey(String)}.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 8353389..dc2961b 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -79,6 +79,7 @@
/**
* @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -110,6 +111,7 @@
/**
* @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -199,6 +201,7 @@
/**
* @deprecated Use {@link #recoverKeyChainSnapshot(byte[], List)} instead.
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index 32952db..7f81d04 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -76,6 +76,7 @@
/**
* @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
*/
@Deprecated
public Builder setAccount(@NonNull byte[] account) {
@@ -134,6 +135,7 @@
/**
* @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
*/
@Deprecated
public @NonNull byte[] getAccount() {
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index daecea7..7b01f7a 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -83,7 +83,8 @@
private static final int DAY_MINUTES = 24 * 60;
private static final int ZERO_VALUE_MS = 10 * SECONDS_MS;
- // Default allow categories set in readXml() from default_zen_mode_config.xml, fallback values:
+ // Default allow categories set in readXml() from default_zen_mode_config.xml,
+ // fallback/upgrade values:
private static final boolean DEFAULT_ALLOW_ALARMS = true;
private static final boolean DEFAULT_ALLOW_MEDIA = true;
private static final boolean DEFAULT_ALLOW_SYSTEM = false;
@@ -97,7 +98,7 @@
private static final int DEFAULT_SUPPRESSED_VISUAL_EFFECTS =
Policy.getAllSuppressedVisualEffects();
- public static final int XML_VERSION = 6;
+ public static final int XML_VERSION = 7;
public static final String ZEN_TAG = "zen";
private static final String ZEN_ATT_VERSION = "version";
private static final String ZEN_ATT_USER = "user";
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index f1fd812..c48b6d1 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -813,7 +813,7 @@
}
final int relayoutResult = mSession.relayout(
mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
- View.VISIBLE, 0, mWinFrame, mOverscanInsets, mContentInsets,
+ View.VISIBLE, 0, -1, mWinFrame, mOverscanInsets, mContentInsets,
mVisibleInsets, mStableInsets, mOutsets, mBackdropFrame,
mDisplayCutout, mMergedConfiguration, mSurfaceHolder.mSurface);
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index f332358..e60377b 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -219,7 +219,7 @@
links[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
if (widget.getContext().getApplicationInfo().targetSdkVersion
- > Build.VERSION_CODES.O_MR1) {
+ >= Build.VERSION_CODES.P) {
// Selection change will reposition the toolbar. Hide it for a few ms for a
// smoother transition.
widget.hideFloatingToolbar(HIDE_FLOATING_TOOLBAR_DELAY_MS);
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index c905f49..f3d39de 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -19,7 +19,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.UiThread;
import android.content.Context;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
@@ -30,17 +29,12 @@
import android.text.method.MovementMethod;
import android.text.style.URLSpan;
import android.util.Patterns;
-import android.view.textclassifier.TextClassifier;
-import android.view.textclassifier.TextLinks;
-import android.view.textclassifier.TextLinks.TextLinkSpan;
-import android.view.textclassifier.TextLinksParams;
import android.webkit.WebView;
import android.widget.TextView;
import com.android.i18n.phonenumbers.PhoneNumberMatch;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
-import com.android.internal.util.Preconditions;
import libcore.util.EmptyArray;
@@ -52,11 +46,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -497,236 +486,6 @@
return hasMatches;
}
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param params optional parameters to specify how to generate the links
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @Nullable TextLinksParams params) {
- return addLinksAsync(textView, params, null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param mask mask to define which kinds of links will be generated
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @LinkifyMask int mask) {
- return addLinksAsync(textView, TextLinksParams.fromLinkMask(mask),
- null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param params optional parameters to specify how to generate the links
- * @param executor Executor that runs the background task
- * @param callback Callback that receives the final status of the background task execution
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback) {
- Preconditions.checkNotNull(textView);
- final CharSequence text = textView.getText();
- final Spannable spannable = (text instanceof Spannable)
- ? (Spannable) text : SpannableString.valueOf(text);
- final Runnable modifyTextView = () -> {
- addLinkMovementMethod(textView);
- if (spannable != text) {
- textView.setText(spannable);
- }
- };
- return addLinksAsync(spannable, textView.getTextClassifier(),
- params, executor, callback, modifyTextView);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param params optional parameters to specify how to generate the links
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params) {
- return addLinksAsync(text, classifier, params, null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by the link {@code mask} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param mask mask to define which kinds of links will be generated
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @LinkifyMask int mask) {
- return addLinksAsync(text, classifier, TextLinksParams.fromLinkMask(mask),
- null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param params optional parameters to specify how to generate the links
- * @param executor Executor that runs the background task
- * @param callback Callback that receives the final status of the background task execution
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback) {
- return addLinksAsync(text, classifier, params, executor, callback,
- null /* modifyTextView */);
- }
-
- private static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback,
- @Nullable Runnable modifyTextView) {
- Preconditions.checkNotNull(text);
- Preconditions.checkNotNull(classifier);
-
- // TODO: This is a bug. We shouldnot call getMaxGenerateLinksTextLength() on the UI thread.
- // The input text may exceed the maximum length the text classifier can handle. In such
- // cases, we process the text up to the maximum length.
- final CharSequence truncatedText = text.subSequence(
- 0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
-
- final TextClassifier.EntityConfig entityConfig = (params == null)
- ? null : params.getEntityConfig();
- final TextLinks.Request request = new TextLinks.Request.Builder(truncatedText)
- .setLegacyFallback(true)
- .setEntityConfig(entityConfig)
- .build();
- final Supplier<TextLinks> supplier = () -> classifier.generateLinks(request);
- final Consumer<TextLinks> consumer = links -> {
- if (links.getLinks().isEmpty()) {
- if (callback != null) {
- callback.accept(TextLinks.STATUS_NO_LINKS_FOUND);
- }
- return;
- }
-
- // Remove spans only for the part of the text we generated links for.
- final TextLinkSpan[] old =
- text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
- for (int i = old.length - 1; i >= 0; i--) {
- text.removeSpan(old[i]);
- }
-
- final @TextLinks.Status int result = params.apply(text, links);
- if (result == TextLinks.STATUS_LINKS_APPLIED) {
- if (modifyTextView != null) {
- modifyTextView.run();
- }
- }
- if (callback != null) {
- callback.accept(result);
- }
- };
- if (executor == null) {
- return CompletableFuture.supplyAsync(supplier).thenAccept(consumer);
- } else {
- return CompletableFuture.supplyAsync(supplier, executor).thenAccept(consumer);
- }
- }
-
private static final void applyLink(String url, int start, int end, Spannable text) {
URLSpan span = new URLSpan(url);
diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java
index 975ad48..9c89876 100644
--- a/core/java/android/util/RecurrenceRule.java
+++ b/core/java/android/util/RecurrenceRule.java
@@ -149,6 +149,10 @@
}
};
+ public boolean isRecurring() {
+ return period != null;
+ }
+
@Deprecated
public boolean isMonthly() {
return start != null
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index d8a5609..f868a00 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -66,6 +66,7 @@
* @param viewVisibility Window root view's visibility.
* @param flags Request flags: {@link WindowManagerGlobal#RELAYOUT_INSETS_PENDING},
* {@link WindowManagerGlobal#RELAYOUT_DEFER_SURFACE_DESTROY}.
+ * @param frameNumber A frame number in which changes requested in this layout will be rendered.
* @param outFrame Rect in which is placed the new position/size on
* screen.
* @param outOverscanInsets Rect in which is placed the offsets from
@@ -96,7 +97,7 @@
*/
int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility,
- int flags, out Rect outFrame, out Rect outOverscanInsets,
+ int flags, long frameNumber, out Rect outFrame, out Rect outOverscanInsets,
out Rect outContentInsets, out Rect outVisibleInsets, out Rect outStableInsets,
out Rect outOutsets, out Rect outBackdropFrame,
out DisplayCutout.ParcelableWrapper displayCutout,
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b367dc7..71b6084 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -697,6 +697,7 @@
* security policy. See also {@link MotionEvent#FLAG_WINDOW_IS_OBSCURED}.
* </p>
*
+ * @attr ref android.R.styleable#View_accessibilityHeading
* @attr ref android.R.styleable#View_alpha
* @attr ref android.R.styleable#View_background
* @attr ref android.R.styleable#View_clickable
@@ -2955,7 +2956,7 @@
* 1 PFLAG3_SCREEN_READER_FOCUSABLE
* 1 PFLAG3_AGGREGATED_VISIBLE
* 1 PFLAG3_AUTOFILLID_EXPLICITLY_SET
- * 1 available
+ * 1 PFLAG3_ACCESSIBILITY_HEADING
* |-------|-------|-------|-------|
*/
@@ -3252,6 +3253,11 @@
*/
private static final int PFLAG3_AUTOFILLID_EXPLICITLY_SET = 0x40000000;
+ /**
+ * Indicates if the View is a heading for accessibility purposes
+ */
+ private static final int PFLAG3_ACCESSIBILITY_HEADING = 0x80000000;
+
/* End of masks for mPrivateFlags3 */
/**
@@ -5475,6 +5481,8 @@
case R.styleable.View_outlineAmbientShadowColor:
setOutlineAmbientShadowColor(a.getColor(attr, Color.BLACK));
break;
+ case com.android.internal.R.styleable.View_accessibilityHeading:
+ setAccessibilityHeading(a.getBoolean(attr, false));
}
}
@@ -8795,6 +8803,7 @@
info.addAction(AccessibilityAction.ACTION_SHOW_ON_SCREEN);
populateAccessibilityNodeInfoDrawingOrderInParent(info);
info.setPaneTitle(mAccessibilityPaneTitle);
+ info.setHeading(isAccessibilityHeading());
}
/**
@@ -10782,11 +10791,37 @@
* accessibility tools.
*/
public void setScreenReaderFocusable(boolean screenReaderFocusable) {
+ updatePflags3AndNotifyA11yIfChanged(PFLAG3_SCREEN_READER_FOCUSABLE, screenReaderFocusable);
+ }
+
+ /**
+ * Gets whether this view is a heading for accessibility purposes.
+ *
+ * @return {@code true} if the view is a heading, {@code false} otherwise.
+ *
+ * @attr ref android.R.styleable#View_accessibilityHeading
+ */
+ public boolean isAccessibilityHeading() {
+ return (mPrivateFlags3 & PFLAG3_ACCESSIBILITY_HEADING) != 0;
+ }
+
+ /**
+ * Set if view is a heading for a section of content for accessibility purposes.
+ *
+ * @param isHeading {@code true} if the view is a heading, {@code false} otherwise.
+ *
+ * @attr ref android.R.styleable#View_accessibilityHeading
+ */
+ public void setAccessibilityHeading(boolean isHeading) {
+ updatePflags3AndNotifyA11yIfChanged(PFLAG3_ACCESSIBILITY_HEADING, isHeading);
+ }
+
+ private void updatePflags3AndNotifyA11yIfChanged(int mask, boolean newValue) {
int pflags3 = mPrivateFlags3;
- if (screenReaderFocusable) {
- pflags3 |= PFLAG3_SCREEN_READER_FOCUSABLE;
+ if (newValue) {
+ pflags3 |= mask;
} else {
- pflags3 &= ~PFLAG3_SCREEN_READER_FOCUSABLE;
+ pflags3 &= ~mask;
}
if (pflags3 != mPrivateFlags3) {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 70054717..2c17bdf 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -6479,17 +6479,17 @@
params.type = mOrigWindowType;
}
}
-
- if (mSurface.isValid()) {
- params.frameNumber = mSurface.getNextFrameNumber();
- }
}
- int relayoutResult = mWindowSession.relayout(
- mWindow, mSeq, params,
+ long frameNumber = -1;
+ if (mSurface.isValid()) {
+ frameNumber = mSurface.getNextFrameNumber();
+ }
+
+ int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
- (int) (mView.getMeasuredHeight() * appScale + 0.5f),
- viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,
+ (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
+ insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
mWinFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
mPendingMergedConfiguration, mSurface);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index f6181d7..0f5c23f 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -2438,13 +2438,6 @@
public long hideTimeoutMilliseconds = -1;
/**
- * A frame number in which changes requested in this layout will be rendered.
- *
- * @hide
- */
- public long frameNumber = -1;
-
- /**
* The color mode requested by this window. The target display may
* not be able to honor the request. When the color mode is not set
* to {@link ActivityInfo#COLOR_MODE_DEFAULT}, it might override the
@@ -2617,7 +2610,6 @@
TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags);
out.writeInt(mColorMode);
out.writeLong(hideTimeoutMilliseconds);
- out.writeLong(frameNumber);
}
public static final Parcelable.Creator<LayoutParams> CREATOR
@@ -2674,7 +2666,6 @@
accessibilityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mColorMode = in.readInt();
hideTimeoutMilliseconds = in.readLong();
- frameNumber = in.readLong();
}
@SuppressWarnings({"PointlessBitwiseExpression"})
@@ -2875,10 +2866,6 @@
changes |= SURFACE_INSETS_CHANGED;
}
- // The frame number changing is only relevant in the context of other
- // changes, and so we don't need to track it with a flag.
- frameNumber = o.frameNumber;
-
if (hasManualSurfaceInsets != o.hasManualSurfaceInsets) {
hasManualSurfaceInsets = o.hasManualSurfaceInsets;
changes |= SURFACE_INSETS_CHANGED;
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 6af678b..dac100a 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -39,6 +39,7 @@
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
+import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -4837,14 +4838,48 @@
return true;
}
- private boolean handleOverlapsMagnifier() {
- final int handleY = mContainer.getDecorViewLayoutParams().y;
- final int magnifierBottomWhenAtWindowTop =
- mTextView.getRootWindowInsets().getSystemWindowInsetTop()
- + mMagnifierAnimator.mMagnifier.getHeight();
- return handleY <= magnifierBottomWhenAtWindowTop;
+ private boolean handleOverlapsMagnifier(@NonNull final HandleView handle,
+ @NonNull final Rect magnifierRect) {
+ final PopupWindow window = handle.mContainer;
+ if (!window.hasDecorView()) {
+ return false;
+ }
+ final Rect handleRect = new Rect(
+ window.getDecorViewLayoutParams().x,
+ window.getDecorViewLayoutParams().y,
+ window.getDecorViewLayoutParams().x + window.getContentView().getWidth(),
+ window.getDecorViewLayoutParams().y + window.getContentView().getHeight());
+ return Rect.intersects(handleRect, magnifierRect);
}
+ private @Nullable HandleView getOtherSelectionHandle() {
+ final SelectionModifierCursorController controller = getSelectionController();
+ if (controller == null || !controller.isActive()) {
+ return null;
+ }
+ return controller.mStartHandle != this
+ ? controller.mStartHandle
+ : controller.mEndHandle;
+ }
+
+ private final Magnifier.Callback mHandlesVisibilityCallback = new Magnifier.Callback() {
+ @Override
+ public void onOperationComplete() {
+ final Point magnifierTopLeft = mMagnifierAnimator.mMagnifier.getWindowCoords();
+ if (magnifierTopLeft == null) {
+ return;
+ }
+ final Rect magnifierRect = new Rect(magnifierTopLeft.x, magnifierTopLeft.y,
+ magnifierTopLeft.x + mMagnifierAnimator.mMagnifier.getWidth(),
+ magnifierTopLeft.y + mMagnifierAnimator.mMagnifier.getHeight());
+ setVisible(!handleOverlapsMagnifier(HandleView.this, magnifierRect));
+ final HandleView otherHandle = getOtherSelectionHandle();
+ if (otherHandle != null) {
+ otherHandle.setVisible(!handleOverlapsMagnifier(otherHandle, magnifierRect));
+ }
+ }
+ };
+
protected final void updateMagnifier(@NonNull final MotionEvent event) {
if (mMagnifierAnimator == null) {
return;
@@ -4858,12 +4893,8 @@
mRenderCursorRegardlessTiming = true;
mTextView.invalidateCursorPath();
suspendBlink();
- // Hide handle if it overlaps the magnifier.
- if (handleOverlapsMagnifier()) {
- setVisible(false);
- } else {
- setVisible(true);
- }
+ mMagnifierAnimator.mMagnifier
+ .setOnOperationCompleteCallback(mHandlesVisibilityCallback);
mMagnifierAnimator.show(showPosInView.x, showPosInView.y);
} else {
@@ -4877,6 +4908,10 @@
mRenderCursorRegardlessTiming = false;
resumeBlink();
setVisible(true);
+ final HandleView otherHandle = getOtherSelectionHandle();
+ if (otherHandle != null) {
+ otherHandle.setVisible(true);
+ }
}
}
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 5eb6699..cb362e6 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -233,6 +233,17 @@
return mZoom;
}
+ /**
+ * @hide
+ */
+ @Nullable
+ public Point getWindowCoords() {
+ if (mWindow == null) {
+ return null;
+ }
+ return new Point(mWindow.mLastDrawContentPositionX, mWindow.mLastDrawContentPositionY);
+ }
+
@Nullable
private Surface getValidViewSurface() {
// TODO: deduplicate this against the first part of #performPixelCopy
@@ -374,8 +385,11 @@
private final Runnable mMagnifierUpdater;
// The handler where the magnifier updater jobs will be post'd.
private final Handler mHandler;
- // The callback to be run after the next draw. Only used for testing.
+ // The callback to be run after the next draw.
private Callback mCallback;
+ // The position of the magnifier content when the last draw was requested.
+ private int mLastDrawContentPositionX;
+ private int mLastDrawContentPositionY;
// Members below describe the state of the magnifier. Reads/writes to them
// have to be synchronized between the UI thread and the thread that handles
@@ -598,6 +612,8 @@
callback = null;
}
+ mLastDrawContentPositionX = mWindowPositionX + mOffsetX;
+ mLastDrawContentPositionY = mWindowPositionY + mOffsetY;
mFrameDrawScheduled = false;
}
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 468abdc..1f2b90a 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -969,7 +969,7 @@
mHot = true;
trimText();
final TextSelection selection;
- if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+ if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.P) {
final TextSelection.Request request = new TextSelection.Request.Builder(
mTrimmedText, mRelativeStart, mRelativeEnd)
.setDefaultLocales(mDefaultLocales)
@@ -1023,7 +1023,7 @@
trimText();
final TextClassification classification;
- if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+ if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.P) {
final TextClassification.Request request =
new TextClassification.Request.Builder(
mTrimmedText, mRelativeStart, mRelativeEnd)
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index dbcd2d0..5380cd8 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -317,7 +317,6 @@
* @attr ref android.R.styleable#TextView_autoSizeMaxTextSize
* @attr ref android.R.styleable#TextView_autoSizeStepGranularity
* @attr ref android.R.styleable#TextView_autoSizePresetSizes
- * @attr ref android.R.styleable#TextView_accessibilityHeading
*/
@RemoteView
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
@@ -417,7 +416,6 @@
private int mCurTextColor;
private int mCurHintTextColor;
private boolean mFreezesText;
- private boolean mIsAccessibilityHeading;
private Editable.Factory mEditableFactory = Editable.Factory.getInstance();
private Spannable.Factory mSpannableFactory = Spannable.Factory.getInstance();
@@ -1294,8 +1292,6 @@
case com.android.internal.R.styleable.TextView_lineHeight:
lineHeight = a.getDimensionPixelSize(attr, -1);
break;
- case com.android.internal.R.styleable.TextView_accessibilityHeading:
- mIsAccessibilityHeading = a.getBoolean(attr, false);
}
}
@@ -5229,32 +5225,6 @@
}
/**
- * Gets whether this view is a heading for accessibility purposes.
- *
- * @return {@code true} if the view is a heading, {@code false} otherwise.
- *
- * @attr ref android.R.styleable#TextView_accessibilityHeading
- */
- public boolean isAccessibilityHeading() {
- return mIsAccessibilityHeading;
- }
-
- /**
- * Set if view is a heading for a section of content for accessibility purposes.
- *
- * @param isHeading {@code true} if the view is a heading, {@code false} otherwise.
- *
- * @attr ref android.R.styleable#TextView_accessibilityHeading
- */
- public void setAccessibilityHeading(boolean isHeading) {
- if (isHeading != mIsAccessibilityHeading) {
- mIsAccessibilityHeading = isHeading;
- notifyViewAccessibilityStateChangedIfNeeded(
- AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
- }
- }
-
- /**
* Convenience method to append the specified text to the TextView's
* display buffer, upgrading it to {@link android.widget.TextView.BufferType#EDITABLE}
* if it was not already editable.
@@ -10849,7 +10819,6 @@
info.setText(getTextForAccessibility());
info.setHintText(mHint);
info.setShowingHintText(isShowingHint());
- info.setHeading(mIsAccessibilityHeading);
if (mBufferType == BufferType.EDITABLE) {
info.setEditable(true);
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 322c876..25af355 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -19,10 +19,10 @@
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.Slog;
-import android.view.Window;
import android.view.WindowManager;
import com.android.internal.R;
@@ -31,6 +31,10 @@
implements DialogInterface.OnClickListener {
private static final String TAG = "SuspendedAppActivity";
+ public static final String EXTRA_SUSPENDED_PACKAGE =
+ "SuspendedAppActivity.extra.SUSPENDED_PACKAGE";
+ public static final String EXTRA_SUSPENDING_PACKAGE =
+ "SuspendedAppActivity.extra.SUSPENDING_PACKAGE";
public static final String EXTRA_DIALOG_MESSAGE = "SuspendedAppActivity.extra.DIALOG_MESSAGE";
public static final String EXTRA_MORE_DETAILS_INTENT =
"SuspendedAppActivity.extra.MORE_DETAILS_INTENT";
@@ -38,10 +42,19 @@
private Intent mMoreDetailsIntent;
private int mUserId;
+ private CharSequence getAppLabel(String packageName) {
+ final PackageManager pm = getPackageManager();
+ try {
+ return pm.getApplicationInfoAsUser(packageName, 0, mUserId).loadLabel(pm);
+ } catch (PackageManager.NameNotFoundException ne) {
+ Slog.e(TAG, "Package " + packageName + " not found", ne);
+ }
+ return packageName;
+ }
+
@Override
public void onCreate(Bundle icicle) {
- Window window = getWindow();
- window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
+ getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
super.onCreate(icicle);
final Intent intent = getIntent();
@@ -52,15 +65,22 @@
finish();
return;
}
- String dialogMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
- if (dialogMessage == null) {
- dialogMessage = getString(R.string.app_suspended_default_message);
+ final String suppliedMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
+ final CharSequence suspendedAppLabel = getAppLabel(
+ intent.getStringExtra(EXTRA_SUSPENDED_PACKAGE));
+ final CharSequence dialogMessage;
+ if (suppliedMessage == null) {
+ dialogMessage = getString(R.string.app_suspended_default_message,
+ suspendedAppLabel,
+ getAppLabel(intent.getStringExtra(EXTRA_SUSPENDING_PACKAGE)));
+ } else {
+ dialogMessage = String.format(getResources().getConfiguration().getLocales().get(0),
+ suppliedMessage, suspendedAppLabel);
}
final AlertController.AlertParams ap = mAlertParams;
ap.mTitle = getString(R.string.app_suspended_title);
- ap.mMessage = String.format(getResources().getConfiguration().getLocales().get(0),
- dialogMessage, intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME));
+ ap.mMessage = dialogMessage;
ap.mPositiveButtonText = getString(android.R.string.ok);
if (mMoreDetailsIntent != null) {
ap.mNeutralButtonText = getString(R.string.app_suspended_more_details);
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 5d40a73..f537e3e 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -166,6 +166,11 @@
return null;
}
+ if (parsedArgs.hiddenApiAccessLogSampleRate != -1) {
+ handleHiddenApiAccessLogSampleRate(parsedArgs.hiddenApiAccessLogSampleRate);
+ return null;
+ }
+
if (parsedArgs.permittedCapabilities != 0 || parsedArgs.effectiveCapabilities != 0) {
throw new ZygoteSecurityException("Client may not specify capabilities: " +
"permitted=0x" + Long.toHexString(parsedArgs.permittedCapabilities) +
@@ -294,6 +299,15 @@
}
}
+ private void handleHiddenApiAccessLogSampleRate(int percent) {
+ try {
+ ZygoteInit.setHiddenApiAccessLogSampleRate(percent);
+ mSocketOutStream.writeInt(0);
+ } catch (IOException ioe) {
+ throw new IllegalStateException("Error writing to command socket", ioe);
+ }
+ }
+
protected void preload() {
ZygoteInit.lazyPreload();
}
@@ -461,6 +475,12 @@
String[] apiBlacklistExemptions;
/**
+ * Sampling rate for logging hidden API accesses to the event log. This is sent to the
+ * pre-forked zygote at boot time, or when it changes, via --hidden-api-log-sampling-rate.
+ */
+ int hiddenApiAccessLogSampleRate = -1;
+
+ /**
* Constructs instance and parses args
* @param args zygote command-line args
* @throws IllegalArgumentException
@@ -483,6 +503,7 @@
boolean seenRuntimeArgs = false;
+ boolean expectRuntimeArgs = true;
for ( /* curArg */ ; curArg < args.length; curArg++) {
String arg = args[curArg];
@@ -612,6 +633,7 @@
preloadPackageCacheKey = args[++curArg];
} else if (arg.equals("--preload-default")) {
preloadDefault = true;
+ expectRuntimeArgs = false;
} else if (arg.equals("--start-child-zygote")) {
startChildZygote = true;
} else if (arg.equals("--set-api-blacklist-exemptions")) {
@@ -619,6 +641,16 @@
// with the regular fork command.
apiBlacklistExemptions = Arrays.copyOfRange(args, curArg + 1, args.length);
curArg = args.length;
+ expectRuntimeArgs = false;
+ } else if (arg.startsWith("--hidden-api-log-sampling-rate=")) {
+ String rateStr = arg.substring(arg.indexOf('=') + 1);
+ try {
+ hiddenApiAccessLogSampleRate = Integer.parseInt(rateStr);
+ } catch (NumberFormatException nfe) {
+ throw new IllegalArgumentException(
+ "Invalid log sampling rate: " + rateStr, nfe);
+ }
+ expectRuntimeArgs = false;
} else {
break;
}
@@ -633,7 +665,7 @@
throw new IllegalArgumentException(
"Unexpected arguments after --preload-package.");
}
- } else if (!preloadDefault && apiBlacklistExemptions == null) {
+ } else if (expectRuntimeArgs) {
if (!seenRuntimeArgs) {
throw new IllegalArgumentException("Unexpected argument : " + args[curArg]);
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index c5d41db..6f58365 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -26,8 +26,8 @@
import android.icu.util.ULocale;
import android.opengl.EGL14;
import android.os.Build;
-import android.os.IInstalld;
import android.os.Environment;
+import android.os.IInstalld;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -44,16 +44,16 @@
import android.system.StructCapUserData;
import android.system.StructCapUserHeader;
import android.text.Hyphenator;
-import android.util.TimingsTraceLog;
import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
+import android.util.TimingsTraceLog;
import android.webkit.WebViewFactory;
import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
-
import com.android.internal.util.Preconditions;
+
import dalvik.system.DexFile;
import dalvik.system.VMRuntime;
import dalvik.system.ZygoteHooks;
@@ -67,8 +67,8 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.security.Security;
import java.security.Provider;
+import java.security.Security;
/**
* Startup class for the zygote process.
@@ -518,6 +518,10 @@
VMRuntime.getRuntime().setHiddenApiExemptions(exemptions);
}
+ public static void setHiddenApiAccessLogSampleRate(int percent) {
+ VMRuntime.getRuntime().setHiddenApiAccessLogSamplingRate(percent);
+ }
+
/**
* Creates a PathClassLoader for the given class path that is associated with a shared
* namespace, i.e., this classloader can access platform-private native libraries. The
diff --git a/core/java/com/android/internal/util/StatLogger.java b/core/java/com/android/internal/util/StatLogger.java
new file mode 100644
index 0000000..1dac136
--- /dev/null
+++ b/core/java/com/android/internal/util/StatLogger.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2018 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.util;
+
+import android.os.SystemClock;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.StatLoggerProto;
+import com.android.server.StatLoggerProto.Event;
+
+import java.io.PrintWriter;
+
+/**
+ * Simple class to keep track of the number of times certain events happened and their durations for
+ * benchmarking.
+ *
+ * @hide
+ */
+public class StatLogger {
+ private static final String TAG = "StatLogger";
+
+ private final Object mLock = new Object();
+
+ private final int SIZE;
+
+ @GuardedBy("mLock")
+ private final int[] mCountStats;
+
+ @GuardedBy("mLock")
+ private final long[] mDurationStats;
+
+ @GuardedBy("mLock")
+ private final int[] mCallsPerSecond;
+
+ @GuardedBy("mLock")
+ private final long[] mDurationPerSecond;
+
+ @GuardedBy("mLock")
+ private final int[] mMaxCallsPerSecond;
+
+ @GuardedBy("mLock")
+ private final long[] mMaxDurationPerSecond;
+
+ @GuardedBy("mLock")
+ private final long[] mMaxDurationStats;
+
+ @GuardedBy("mLock")
+ private long mNextTickTime = SystemClock.elapsedRealtime() + 1000;
+
+ private final String[] mLabels;
+
+ public StatLogger(String[] eventLabels) {
+ SIZE = eventLabels.length;
+ mCountStats = new int[SIZE];
+ mDurationStats = new long[SIZE];
+ mCallsPerSecond = new int[SIZE];
+ mMaxCallsPerSecond = new int[SIZE];
+ mDurationPerSecond = new long[SIZE];
+ mMaxDurationPerSecond = new long[SIZE];
+ mMaxDurationStats = new long[SIZE];
+ mLabels = eventLabels;
+ }
+
+ /**
+ * Return the current time in the internal time unit.
+ * Call it before an event happens, and
+ * give it back to the {@link #logDurationStat(int, long)}} after the event.
+ */
+ public long getTime() {
+ return SystemClock.elapsedRealtimeNanos() / 1000;
+ }
+
+ /**
+ * @see {@link #getTime()}
+ *
+ * @return the duration in microseconds.
+ */
+ public long logDurationStat(int eventId, long start) {
+ synchronized (mLock) {
+ final long duration = getTime() - start;
+ if (eventId >= 0 && eventId < SIZE) {
+ mCountStats[eventId]++;
+ mDurationStats[eventId] += duration;
+ } else {
+ Slog.wtf(TAG, "Invalid event ID: " + eventId);
+ return duration;
+ }
+ if (mMaxDurationStats[eventId] < duration) {
+ mMaxDurationStats[eventId] = duration;
+ }
+
+ // Keep track of the per-second max.
+ final long nowRealtime = SystemClock.elapsedRealtime();
+ if (nowRealtime > mNextTickTime) {
+ if (mMaxCallsPerSecond[eventId] < mCallsPerSecond[eventId]) {
+ mMaxCallsPerSecond[eventId] = mCallsPerSecond[eventId];
+ }
+ if (mMaxDurationPerSecond[eventId] < mDurationPerSecond[eventId]) {
+ mMaxDurationPerSecond[eventId] = mDurationPerSecond[eventId];
+ }
+
+ mCallsPerSecond[eventId] = 0;
+ mDurationPerSecond[eventId] = 0;
+
+ mNextTickTime = nowRealtime + 1000;
+ }
+
+ mCallsPerSecond[eventId]++;
+ mDurationPerSecond[eventId] += duration;
+
+ return duration;
+ }
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ dump(new IndentingPrintWriter(pw, " ").setIndent(prefix));
+ }
+
+ public void dump(IndentingPrintWriter pw) {
+ synchronized (mLock) {
+ pw.println("Stats:");
+ pw.increaseIndent();
+ for (int i = 0; i < SIZE; i++) {
+ final int count = mCountStats[i];
+ final double durationMs = mDurationStats[i] / 1000.0;
+
+ pw.println(String.format(
+ "%s: count=%d, total=%.1fms, avg=%.3fms, max calls/s=%d max dur/s=%.1fms"
+ + " max time=%.1fms",
+ mLabels[i], count, durationMs,
+ (count == 0 ? 0 : durationMs / count),
+ mMaxCallsPerSecond[i], mMaxDurationPerSecond[i] / 1000.0,
+ mMaxDurationStats[i] / 1000.0));
+ }
+ pw.decreaseIndent();
+ }
+ }
+
+ public void dumpProto(ProtoOutputStream proto, long fieldId) {
+ synchronized (mLock) {
+ final long outer = proto.start(fieldId);
+
+ for (int i = 0; i < mLabels.length; i++) {
+ final long inner = proto.start(StatLoggerProto.EVENTS);
+
+ proto.write(Event.EVENT_ID, i);
+ proto.write(Event.LABEL, mLabels[i]);
+ proto.write(Event.COUNT, mCountStats[i]);
+ proto.write(Event.TOTAL_DURATION_MICROS, mDurationStats[i]);
+
+ proto.end(inner);
+ }
+
+ proto.end(outer);
+ }
+ }
+}
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 35aae15..2ce5a0b 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -1706,6 +1706,7 @@
contentContainer.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentContainer.setTag(FLOATING_TOOLBAR_TAG);
+ contentContainer.setClipToOutline(true);
return contentContainer;
}
diff --git a/core/proto/android/app/activitymanager.proto b/core/proto/android/app/activitymanager.proto
index 4756c13..ead7e16 100644
--- a/core/proto/android/app/activitymanager.proto
+++ b/core/proto/android/app/activitymanager.proto
@@ -23,14 +23,14 @@
// ActivityManager.java UID_OBSERVERs flags
enum UidObserverFlag {
- // report changes in process state, original value is 1 << 0
- UID_OBSERVER_FLAG_PROCSTATE = 1;
- // report uid gone, original value is 1 << 1
- UID_OBSERVER_FLAG_GONE = 2;
- // report uid has become idle, original value is 1 << 2
- UID_OBSERVER_FLAG_IDLE = 3;
- // report uid has become active, original value is 1 << 3
- UID_OBSERVER_FLAG_ACTIVE = 4;
- // report uid cached state has changed, original value is 1 << 4
- UID_OBSERVER_FLAG_CACHED = 5;
+ // report changes in process state, original value is 1 << 0
+ UID_OBSERVER_FLAG_PROCSTATE = 1;
+ // report uid gone, original value is 1 << 1
+ UID_OBSERVER_FLAG_GONE = 2;
+ // report uid has become idle, original value is 1 << 2
+ UID_OBSERVER_FLAG_IDLE = 3;
+ // report uid has become active, original value is 1 << 3
+ UID_OBSERVER_FLAG_ACTIVE = 4;
+ // report uid cached state has changed, original value is 1 << 4
+ UID_OBSERVER_FLAG_CACHED = 5;
}
diff --git a/core/proto/android/app/alarmmanager.proto b/core/proto/android/app/alarmmanager.proto
index 7ef08ca..53be1ee 100644
--- a/core/proto/android/app/alarmmanager.proto
+++ b/core/proto/android/app/alarmmanager.proto
@@ -27,31 +27,31 @@
* An android.app.AlarmManager object.
*/
message AlarmManagerProto {
- enum AlarmType {
- // Alarm time in System.currentTimeMillis() (wall clock time in UTC), which
- // will wake up the device when it goes off.
- RTC_WAKEUP = 0;
- // Alarm time in System.currentTimeMillis() (wall clock time in UTC). This
- // alarm does not wake the device up; if it goes off while the device is
- // asleep, it will not be delivered until the next time the device wakes up.
- RTC = 1;
- // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
- // sleep), which will wake up the device when it goes off.
- ELAPSED_REALTIME_WAKEUP = 2;
- // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
- // sleep). This alarm does not wake the device up; if it goes off while the
- // device is asleep, it will not be delivered until the next time the device
- // wakes up.
- ELAPSED_REALTIME = 3;
- }
+ enum AlarmType {
+ // Alarm time in System.currentTimeMillis() (wall clock time in UTC), which
+ // will wake up the device when it goes off.
+ RTC_WAKEUP = 0;
+ // Alarm time in System.currentTimeMillis() (wall clock time in UTC). This
+ // alarm does not wake the device up; if it goes off while the device is
+ // asleep, it will not be delivered until the next time the device wakes up.
+ RTC = 1;
+ // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
+ // sleep), which will wake up the device when it goes off.
+ ELAPSED_REALTIME_WAKEUP = 2;
+ // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
+ // sleep). This alarm does not wake the device up; if it goes off while the
+ // device is asleep, it will not be delivered until the next time the device
+ // wakes up.
+ ELAPSED_REALTIME = 3;
+ }
}
// An android.app.AlarmManager.AlarmClockInfo object.
message AlarmClockInfoProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // This value is UTC wall clock time in milliseconds, as returned by
- // System#currentTimeMillis() for example.
- optional int64 trigger_time_ms = 1;
- optional android.app.PendingIntentProto show_intent = 2;
+ // This value is UTC wall clock time in milliseconds, as returned by
+ // System#currentTimeMillis() for example.
+ optional int64 trigger_time_ms = 1;
+ optional android.app.PendingIntentProto show_intent = 2;
}
diff --git a/core/proto/android/app/job/enums.proto b/core/proto/android/app/job/enums.proto
index 17bf4fb..2290b2f 100644
--- a/core/proto/android/app/job/enums.proto
+++ b/core/proto/android/app/job/enums.proto
@@ -24,10 +24,10 @@
// Reasons a job is stopped.
// Primarily used in android.app.job.JobParameters.java.
enum StopReasonEnum {
- STOP_REASON_UNKNOWN = -1;
- STOP_REASON_CANCELLED = 0;
- STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
- STOP_REASON_PREEMPT = 2;
- STOP_REASON_TIMEOUT = 3;
- STOP_REASON_DEVICE_IDLE = 4;
+ STOP_REASON_UNKNOWN = -1;
+ STOP_REASON_CANCELLED = 0;
+ STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+ STOP_REASON_PREEMPT = 2;
+ STOP_REASON_TIMEOUT = 3;
+ STOP_REASON_DEVICE_IDLE = 4;
}
diff --git a/core/proto/android/app/pendingintent.proto b/core/proto/android/app/pendingintent.proto
index ab0d34e..04ce850 100644
--- a/core/proto/android/app/pendingintent.proto
+++ b/core/proto/android/app/pendingintent.proto
@@ -26,7 +26,7 @@
* An android.app.PendingIntent object.
*/
message PendingIntentProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string target = 1;
+ optional string target = 1;
}
diff --git a/core/proto/android/app/statusbarmanager.proto b/core/proto/android/app/statusbarmanager.proto
index 3d1447a..1108508 100644
--- a/core/proto/android/app/statusbarmanager.proto
+++ b/core/proto/android/app/statusbarmanager.proto
@@ -19,15 +19,15 @@
option java_multiple_files = true;
message StatusBarManagerProto {
- enum WindowState {
- WINDOW_STATE_SHOWING = 0;
- WINDOW_STATE_HIDING = 1;
- WINDOW_STATE_HIDDEN = 2;
- }
- enum TransientWindowState {
- TRANSIENT_BAR_NONE = 0;
- TRANSIENT_BAR_SHOW_REQUESTED = 1;
- TRANSIENT_BAR_SHOWING = 2;
- TRANSIENT_BAR_HIDING = 3;
- }
+ enum WindowState {
+ WINDOW_STATE_SHOWING = 0;
+ WINDOW_STATE_HIDING = 1;
+ WINDOW_STATE_HIDDEN = 2;
+ }
+ enum TransientWindowState {
+ TRANSIENT_BAR_NONE = 0;
+ TRANSIENT_BAR_SHOW_REQUESTED = 1;
+ TRANSIENT_BAR_SHOWING = 2;
+ TRANSIENT_BAR_HIDING = 3;
+ }
}
diff --git a/core/proto/android/app/window_configuration.proto b/core/proto/android/app/window_configuration.proto
index 1e8ace4..c9f3986 100644
--- a/core/proto/android/app/window_configuration.proto
+++ b/core/proto/android/app/window_configuration.proto
@@ -25,9 +25,9 @@
/** Proto representation for WindowConfiguration.java class. */
message WindowConfigurationProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.RectProto app_bounds = 1;
- optional int32 windowing_mode = 2;
- optional int32 activity_type = 3;
+ optional .android.graphics.RectProto app_bounds = 1;
+ optional int32 windowing_mode = 2;
+ optional int32 activity_type = 3;
}
diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto
index 9e459e6..d0c9226 100644
--- a/core/proto/android/bluetooth/enums.proto
+++ b/core/proto/android/bluetooth/enums.proto
@@ -22,22 +22,22 @@
// Bluetooth connection states.
enum ConnectionStateEnum {
- CONNECTION_STATE_DISCONNECTED = 0;
- CONNECTION_STATE_CONNECTING = 1;
- CONNECTION_STATE_CONNECTED = 2;
- CONNECTION_STATE_DISCONNECTING = 3;
+ CONNECTION_STATE_DISCONNECTED = 0;
+ CONNECTION_STATE_CONNECTING = 1;
+ CONNECTION_STATE_CONNECTED = 2;
+ CONNECTION_STATE_DISCONNECTING = 3;
}
// Bluetooth Adapter Enable and Disable Reasons
enum EnableDisableReasonEnum {
- ENABLE_DISABLE_REASON_UNSPECIFIED = 0;
- ENABLE_DISABLE_REASON_APPLICATION_REQUEST = 1;
- ENABLE_DISABLE_REASON_AIRPLANE_MODE = 2;
- ENABLE_DISABLE_REASON_DISALLOWED = 3;
- ENABLE_DISABLE_REASON_RESTARTED = 4;
- ENABLE_DISABLE_REASON_START_ERROR = 5;
- ENABLE_DISABLE_REASON_SYSTEM_BOOT = 6;
- ENABLE_DISABLE_REASON_CRASH = 7;
- ENABLE_DISABLE_REASON_USER_SWITCH = 8;
- ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9;
-}
\ No newline at end of file
+ ENABLE_DISABLE_REASON_UNSPECIFIED = 0;
+ ENABLE_DISABLE_REASON_APPLICATION_REQUEST = 1;
+ ENABLE_DISABLE_REASON_AIRPLANE_MODE = 2;
+ ENABLE_DISABLE_REASON_DISALLOWED = 3;
+ ENABLE_DISABLE_REASON_RESTARTED = 4;
+ ENABLE_DISABLE_REASON_START_ERROR = 5;
+ ENABLE_DISABLE_REASON_SYSTEM_BOOT = 6;
+ ENABLE_DISABLE_REASON_CRASH = 7;
+ ENABLE_DISABLE_REASON_USER_SWITCH = 8;
+ ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9;
+}
diff --git a/core/proto/android/content/activityinfo.proto b/core/proto/android/content/activityinfo.proto
index 012752a..87acd84 100644
--- a/core/proto/android/content/activityinfo.proto
+++ b/core/proto/android/content/activityinfo.proto
@@ -19,24 +19,24 @@
option java_multiple_files = true;
message ActivityInfoProto {
- enum ScreenOrientation {
- SCREEN_ORIENTATION_UNSET = -2;
- SCREEN_ORIENTATION_UNSPECIFIED = -1;
- SCREEN_ORIENTATION_LANDSCAPE = 0;
- SCREEN_ORIENTATION_PORTRAIT = 1;
- SCREEN_ORIENTATION_USER = 2;
- SCREEN_ORIENTATION_BEHIND = 3;
- SCREEN_ORIENTATION_SENSOR = 4;
- SCREEN_ORIENTATION_NOSENSOR = 5;
- SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;
- SCREEN_ORIENTATION_SENSOR_PORTRAIT = 7;
- SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
- SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
- SCREEN_ORIENTATION_FULL_SENSOR = 10;
- SCREEN_ORIENTATION_USER_LANDSCAPE = 11;
- SCREEN_ORIENTATION_USER_PORTRAIT = 12;
- SCREEN_ORIENTATION_FULL_USER = 13;
- SCREEN_ORIENTATION_LOCKED = 14;
- }
+ enum ScreenOrientation {
+ SCREEN_ORIENTATION_UNSET = -2;
+ SCREEN_ORIENTATION_UNSPECIFIED = -1;
+ SCREEN_ORIENTATION_LANDSCAPE = 0;
+ SCREEN_ORIENTATION_PORTRAIT = 1;
+ SCREEN_ORIENTATION_USER = 2;
+ SCREEN_ORIENTATION_BEHIND = 3;
+ SCREEN_ORIENTATION_SENSOR = 4;
+ SCREEN_ORIENTATION_NOSENSOR = 5;
+ SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;
+ SCREEN_ORIENTATION_SENSOR_PORTRAIT = 7;
+ SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
+ SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
+ SCREEN_ORIENTATION_FULL_SENSOR = 10;
+ SCREEN_ORIENTATION_USER_LANDSCAPE = 11;
+ SCREEN_ORIENTATION_USER_PORTRAIT = 12;
+ SCREEN_ORIENTATION_FULL_USER = 13;
+ SCREEN_ORIENTATION_LOCKED = 14;
+ }
}
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index 6a174e8..5755c59 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -28,63 +28,63 @@
* An android Configuration object.
*/
message ConfigurationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional float font_scale = 1;
- optional uint32 mcc = 2;
- optional uint32 mnc = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
- repeated LocaleProto locales = 4;
- optional uint32 screen_layout = 5;
- optional uint32 color_mode = 6;
- optional uint32 touchscreen = 7;
- optional uint32 keyboard = 8;
- optional uint32 keyboard_hidden = 9;
- optional uint32 hard_keyboard_hidden = 10;
- optional uint32 navigation = 11;
- optional uint32 navigation_hidden = 12;
- optional uint32 orientation = 13;
- optional uint32 ui_mode = 14;
- optional uint32 screen_width_dp = 15;
- optional uint32 screen_height_dp = 16;
- optional uint32 smallest_screen_width_dp = 17;
- optional uint32 density_dpi = 18;
- optional .android.app.WindowConfigurationProto window_configuration = 19;
+ optional float font_scale = 1;
+ optional uint32 mcc = 2;
+ optional uint32 mnc = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ repeated LocaleProto locales = 4;
+ optional uint32 screen_layout = 5;
+ optional uint32 color_mode = 6;
+ optional uint32 touchscreen = 7;
+ optional uint32 keyboard = 8;
+ optional uint32 keyboard_hidden = 9;
+ optional uint32 hard_keyboard_hidden = 10;
+ optional uint32 navigation = 11;
+ optional uint32 navigation_hidden = 12;
+ optional uint32 orientation = 13;
+ optional uint32 ui_mode = 14;
+ optional uint32 screen_width_dp = 15;
+ optional uint32 screen_height_dp = 16;
+ optional uint32 smallest_screen_width_dp = 17;
+ optional uint32 density_dpi = 18;
+ optional .android.app.WindowConfigurationProto window_configuration = 19;
}
/**
* All current configuration data used to select resources.
*/
message ResourcesConfigurationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- required ConfigurationProto configuration = 1;
+ required ConfigurationProto configuration = 1;
- optional uint32 sdk_version = 2;
- optional uint32 screen_width_px = 3;
- optional uint32 screen_height_px = 4;
+ optional uint32 sdk_version = 2;
+ optional uint32 screen_width_px = 3;
+ optional uint32 screen_height_px = 4;
}
/**
* Overall device configuration data.
*/
message DeviceConfigurationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional uint32 stable_screen_width_px = 1;
- optional uint32 stable_screen_height_px = 2;
- optional uint32 stable_density_dpi = 3;
+ optional uint32 stable_screen_width_px = 1;
+ optional uint32 stable_screen_height_px = 2;
+ optional uint32 stable_density_dpi = 3;
- optional uint64 total_ram = 4;
- optional bool low_ram = 5;
- optional uint32 max_cores = 6;
- optional bool has_secure_screen_lock = 7;
+ optional uint64 total_ram = 4;
+ optional bool low_ram = 5;
+ optional uint32 max_cores = 6;
+ optional bool has_secure_screen_lock = 7;
- optional uint32 opengl_version = 8;
- repeated string opengl_extensions = 9;
+ optional uint32 opengl_version = 8;
+ repeated string opengl_extensions = 9;
- repeated string shared_libraries = 10;
- repeated string features = 11;
- repeated string cpu_architectures = 12;
+ repeated string shared_libraries = 10;
+ repeated string features = 11;
+ repeated string cpu_architectures = 12;
}
/**
@@ -92,8 +92,8 @@
* to filter and target apps.
*/
message GlobalConfigurationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ResourcesConfigurationProto resources = 1;
- optional DeviceConfigurationProto device = 2;
+ optional ResourcesConfigurationProto resources = 1;
+ optional DeviceConfigurationProto device = 2;
}
diff --git a/core/proto/android/content/locale.proto b/core/proto/android/content/locale.proto
index 2be3ab9..87b555c 100644
--- a/core/proto/android/content/locale.proto
+++ b/core/proto/android/content/locale.proto
@@ -23,10 +23,10 @@
package android.content;
message LocaleProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string language = 1;
- optional string country = 2;
- optional string variant = 3;
+ optional string language = 1;
+ optional string country = 2;
+ optional string variant = 3;
}
diff --git a/core/proto/android/graphics/pixelformat.proto b/core/proto/android/graphics/pixelformat.proto
index 4e42c92..d7f5f0c 100644
--- a/core/proto/android/graphics/pixelformat.proto
+++ b/core/proto/android/graphics/pixelformat.proto
@@ -19,16 +19,16 @@
option java_multiple_files = true;
message PixelFormatProto {
- enum Format {
- UNKNOWN = 0;
- TRANSLUCENT = -3;
- TRANSPARENT = -2;
- OPAQUE = -1;
- RGBA_8888 = 1;
- RGBX_8888 = 2;
- RGB_888 = 3;
- RGB_565 = 4;
- RGBA_F16 = 0x16;
- RGBA_1010102 = 0x2B;
- }
+ enum Format {
+ UNKNOWN = 0;
+ TRANSLUCENT = -3;
+ TRANSPARENT = -2;
+ OPAQUE = -1;
+ RGBA_8888 = 1;
+ RGBX_8888 = 2;
+ RGB_888 = 3;
+ RGB_565 = 4;
+ RGBA_F16 = 0x16;
+ RGBA_1010102 = 0x2B;
+ }
}
diff --git a/core/proto/android/graphics/point.proto b/core/proto/android/graphics/point.proto
index 035b9fe..04d879f 100644
--- a/core/proto/android/graphics/point.proto
+++ b/core/proto/android/graphics/point.proto
@@ -22,9 +22,9 @@
option java_multiple_files = true;
message PointProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 x = 1;
- optional int32 y = 2;
+ optional int32 x = 1;
+ optional int32 y = 2;
}
diff --git a/core/proto/android/graphics/rect.proto b/core/proto/android/graphics/rect.proto
index eb403fe..c216b2b 100644
--- a/core/proto/android/graphics/rect.proto
+++ b/core/proto/android/graphics/rect.proto
@@ -22,11 +22,11 @@
option java_multiple_files = true;
message RectProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 left = 1;
- optional int32 top = 2;
- optional int32 right = 3;
- optional int32 bottom = 4;
+ optional int32 left = 1;
+ optional int32 top = 2;
+ optional int32 right = 3;
+ optional int32 bottom = 4;
}
diff --git a/core/proto/android/internal/locallog.proto b/core/proto/android/internal/locallog.proto
index 73d1492..df0b90b 100644
--- a/core/proto/android/internal/locallog.proto
+++ b/core/proto/android/internal/locallog.proto
@@ -22,7 +22,7 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
message LocalLogProto {
- option (.android.msg_privacy).dest = DEST_EXPLICIT;
+ option (.android.msg_privacy).dest = DEST_EXPLICIT;
- repeated string lines = 1;
+ repeated string lines = 1;
}
diff --git a/core/proto/android/internal/processstats.proto b/core/proto/android/internal/processstats.proto
index 5629c2d..7c1ac3f 100644
--- a/core/proto/android/internal/processstats.proto
+++ b/core/proto/android/internal/processstats.proto
@@ -19,10 +19,10 @@
package com.android.internal.app.procstats;
message ProcessStatsProto {
- enum MemoryFactor {
- MEM_FACTOR_NORMAL = 0;
- MEM_FACTOR_MODERATE = 1;
- MEM_FACTOR_LOW = 2;
- MEM_FACTOR_CRITICAL = 3;
- }
+ enum MemoryFactor {
+ MEM_FACTOR_NORMAL = 0;
+ MEM_FACTOR_MODERATE = 1;
+ MEM_FACTOR_LOW = 2;
+ MEM_FACTOR_CRITICAL = 3;
+ }
}
diff --git a/core/proto/android/os/backtrace.proto b/core/proto/android/os/backtrace.proto
index ba81386..8bbae17 100644
--- a/core/proto/android/os/backtrace.proto
+++ b/core/proto/android/os/backtrace.proto
@@ -22,10 +22,10 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
message BackTraceProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
message Stack {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
optional int32 pid = 1;
optional string dump = 2;
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 8e98ac9..0970bd5 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -25,859 +25,860 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
message BatteryStatsProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 report_version = 1;
- optional int64 parcel_version = 2;
- optional string start_platform_version = 3;
- optional string end_platform_version = 4;
- repeated UidProto uids = 5;
- optional SystemProto system = 6;
+ optional int32 report_version = 1;
+ optional int64 parcel_version = 2;
+ optional string start_platform_version = 3;
+ optional string end_platform_version = 4;
+ repeated UidProto uids = 5;
+ optional SystemProto system = 6;
}
message ControllerActivityProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Time (milliseconds) spent in the idle state.
- optional int64 idle_duration_ms = 1;
- // Time (milliseconds) spent in the receive state.
- optional int64 rx_duration_ms = 2;
- // Total power (mAh) consumed by the controller in all states. The value may
- // always be 0 if the device doesn't support power calculations.
- optional int64 power_mah = 3;
-
- // Represents a transmit level, where each level may draw a different amount
- // of power. The levels themselves are controller-specific (and may possibly
- // be device specific...yet to be confirmed).
- message TxLevel {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Transmit level. Higher levels draw more power.
- optional int32 level = 1;
- // Time spent in this specific transmit level state.
- optional int64 duration_ms = 2;
- }
- repeated TxLevel tx = 4;
+ // Time (milliseconds) spent in the idle state.
+ optional int64 idle_duration_ms = 1;
+ // Time (milliseconds) spent in the receive state.
+ optional int64 rx_duration_ms = 2;
+ // Total power (mAh) consumed by the controller in all states. The value may
+ // always be 0 if the device doesn't support power calculations.
+ optional int64 power_mah = 3;
+
+ // Represents a transmit level, where each level may draw a different amount
+ // of power. The levels themselves are controller-specific (and may possibly
+ // be device specific...yet to be confirmed).
+ message TxLevel {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Transmit level. Higher levels draw more power.
+ optional int32 level = 1;
+ // Time spent in this specific transmit level state.
+ optional int64 duration_ms = 2;
+ }
+ repeated TxLevel tx = 4;
}
message SystemProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- message Battery {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Wall clock time when the data collection started.
- // In case of device time manually reset by users:
- // start_clock_time_ms keeps the same value in the current collection
- // period and changes for later collection periods.
- optional int64 start_clock_time_ms = 1;
- // #times the device has been started since start_clock_time_millis.
- optional int64 start_count = 2;
- // Total realtime duration (= SINCE_UNPLUGGED battery_realtime_millis.)
- optional int64 total_realtime_ms = 3;
- optional int64 total_uptime_ms = 4;
- // Realtime duration on battery.
- optional int64 battery_realtime_ms = 5;
- // Uptime duration (i.e., not suspend).
- // Uptime is anytime the CPUs were on. The radio and Wifi chip
- // can be running while the CPUs are off.
- optional int64 battery_uptime_ms = 6;
- // Total realtime duration measured with screen off or dozing.
- optional int64 screen_off_realtime_ms = 7;
- // Total uptime duration measured with screen off or dozing.
- optional int64 screen_off_uptime_ms = 8;
- // Total time the screen was dozing while the device was running on battery.
- // For historical reasons, screen_doze_duration_msec is a subset of
- // screen_off_realtime_msec.
- optional int64 screen_doze_duration_ms = 9;
- // The estimated real battery capacity, which may be less than the declared
- // battery capacity (for example, because of battery aging). This field is
- // less reliable than min(max)_learned_battery_capacity_uah, use those two
- // fields whenever possible.
- optional int64 estimated_battery_capacity_mah = 10;
- // The minimum learned battery capacity in uAh.
- optional int64 min_learned_battery_capacity_uah = 11;
- // The maximum learned battery capacity in uAh.
- optional int64 max_learned_battery_capacity_uah = 12;
- };
- optional Battery battery = 1;
+ message Battery {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message BatteryDischarge {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Wall clock time when the data collection started.
+ // In case of device time manually reset by users:
+ // start_clock_time_ms keeps the same value in the current collection
+ // period and changes for later collection periods.
+ optional int64 start_clock_time_ms = 1;
+ // #times the device has been started since start_clock_time_millis.
+ optional int64 start_count = 2;
+ // Total realtime duration (= SINCE_UNPLUGGED battery_realtime_millis.)
+ optional int64 total_realtime_ms = 3;
+ optional int64 total_uptime_ms = 4;
+ // Realtime duration on battery.
+ optional int64 battery_realtime_ms = 5;
+ // Uptime duration (i.e., not suspend).
+ // Uptime is anytime the CPUs were on. The radio and Wifi chip
+ // can be running while the CPUs are off.
+ optional int64 battery_uptime_ms = 6;
+ // Total realtime duration measured with screen off or dozing.
+ optional int64 screen_off_realtime_ms = 7;
+ // Total uptime duration measured with screen off or dozing.
+ optional int64 screen_off_uptime_ms = 8;
+ // Total time the screen was dozing while the device was running on battery.
+ // For historical reasons, screen_doze_duration_msec is a subset of
+ // screen_off_realtime_msec.
+ optional int64 screen_doze_duration_ms = 9;
+ // The estimated real battery capacity, which may be less than the declared
+ // battery capacity (for example, because of battery aging). This field is
+ // less reliable than min(max)_learned_battery_capacity_uah, use those two
+ // fields whenever possible.
+ optional int64 estimated_battery_capacity_mah = 10;
+ // The minimum learned battery capacity in uAh.
+ optional int64 min_learned_battery_capacity_uah = 11;
+ // The maximum learned battery capacity in uAh.
+ optional int64 max_learned_battery_capacity_uah = 12;
+ };
+ optional Battery battery = 1;
- // Discharged battery percentage points since the stats were last reset
- // after charging (lower bound approximation).
- optional int32 lower_bound_since_charge = 1;
- // Upper bound approximation.
- optional int32 upper_bound_since_charge = 2;
- // Discharged points while screen is on.
- optional int32 screen_on_since_charge = 3;
- // Discharged points while screen is off.
- optional int32 screen_off_since_charge = 4;
- // Discharged points while screen was dozing. For historical reasons,
- // screen_doze_since_charge is a subset of screen_off_since_charge.
- optional int32 screen_doze_since_charge = 5;
- // Total amount of battery discharged in mAh. This will only be non-zero for
- // devices that report battery discharge via a coulomb counter.
- optional int64 total_mah = 6;
- // Total amount of battery discharged while the screen was off in mAh.
- // This will only be non-zero for devices that report battery discharge
- // via a coulomb counter.
- optional int64 total_mah_screen_off = 7;
- // Total amount of battery discharged while the screen was dozing in mAh.
- // This will only be non-zero for devices that report battery discharge
- // via a coulomb counter. For historical reasons, total_mah_screen_doze is
- // a subset of total_mah_screen_off.
- optional int64 total_mah_screen_doze = 8;
- // Total amount of battery discharged in mAh while the device was in light doze mode.
- // This will only be non-zero for devices that report battery discharge
- // via a coulomb counter.
- optional int64 total_mah_light_doze = 9;
- // Total amount of battery discharged in mAh while the device was in deep doze mode.
- // This will only be non-zero for devices that report battery discharge
- // via a coulomb counter.
- optional int64 total_mah_deep_doze = 10;
- };
- optional BatteryDischarge battery_discharge = 2;
+ message BatteryDischarge {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- oneof time_remaining {
- // Approximation for how much time remains until the battery is fully
- // charged. The device will print -1 if there wasn't enough data to
- // calculate an estimate, or if the battery is currently discharging.
- int64 charge_time_remaining_ms = 3;
- // Approximation for how much time remains until the battery is fully
- // discharged. The device will print -1 if there wasn't enough data to
- // calculate an estimate, or if the battery is currently charging.
- int64 discharge_time_remaining_ms = 4;
- }
+ // Discharged battery percentage points since the stats were last reset
+ // after charging (lower bound approximation).
+ optional int32 lower_bound_since_charge = 1;
+ // Upper bound approximation.
+ optional int32 upper_bound_since_charge = 2;
+ // Discharged points while screen is on.
+ optional int32 screen_on_since_charge = 3;
+ // Discharged points while screen is off.
+ optional int32 screen_off_since_charge = 4;
+ // Discharged points while screen was dozing. For historical reasons,
+ // screen_doze_since_charge is a subset of screen_off_since_charge.
+ optional int32 screen_doze_since_charge = 5;
+ // Total amount of battery discharged in mAh. This will only be non-zero for
+ // devices that report battery discharge via a coulomb counter.
+ optional int64 total_mah = 6;
+ // Total amount of battery discharged while the screen was off in mAh.
+ // This will only be non-zero for devices that report battery discharge
+ // via a coulomb counter.
+ optional int64 total_mah_screen_off = 7;
+ // Total amount of battery discharged while the screen was dozing in mAh.
+ // This will only be non-zero for devices that report battery discharge
+ // via a coulomb counter. For historical reasons, total_mah_screen_doze is
+ // a subset of total_mah_screen_off.
+ optional int64 total_mah_screen_doze = 8;
+ // Total amount of battery discharged in mAh while the device was in light doze mode.
+ // This will only be non-zero for devices that report battery discharge
+ // via a coulomb counter.
+ optional int64 total_mah_light_doze = 9;
+ // Total amount of battery discharged in mAh while the device was in deep doze mode.
+ // This will only be non-zero for devices that report battery discharge
+ // via a coulomb counter.
+ optional int64 total_mah_deep_doze = 10;
+ };
+ optional BatteryDischarge battery_discharge = 2;
- // BatteryLevelStep tracks data for which conditions were continuously held for
- // the entire duration. Field for which the conditions were not consistent
- // for the entire duration should be marked MIXED.
- message BatteryLevelStep {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // How long the battery was at the current level.
- optional int64 duration_ms = 1;
- // Battery level
- optional int32 level = 2;
-
- // State of the display. A special enum is used rather than
- // DisplayProto.State because a MIXED value needs to be in the enum, and
- // batterystats doesn't care about all of the different display states.
- enum DisplayState {
- DS_MIXED = 0;
- DS_ON = 1;
- DS_OFF = 2;
- DS_DOZE = 3;
- DS_DOZE_SUSPEND = 4;
- // Any display state error that comes through should be sent to hackbod@.
- DS_ERROR = 5;
+ oneof time_remaining {
+ // Approximation for how much time remains until the battery is fully
+ // charged. The device will print -1 if there wasn't enough data to
+ // calculate an estimate, or if the battery is currently discharging.
+ int64 charge_time_remaining_ms = 3;
+ // Approximation for how much time remains until the battery is fully
+ // discharged. The device will print -1 if there wasn't enough data to
+ // calculate an estimate, or if the battery is currently charging.
+ int64 discharge_time_remaining_ms = 4;
}
- // The state of the display for the entire battery level step. MIXED is used
- // if there were multiple states for this step.
- optional DisplayState display_state = 3;
- // Indicates status in power save mode.
- enum PowerSaveMode {
- PSM_MIXED = 0;
- PSM_ON = 1;
- PSM_OFF = 2;
+ // BatteryLevelStep tracks data for which conditions were continuously held for
+ // the entire duration. Field for which the conditions were not consistent
+ // for the entire duration should be marked MIXED.
+ message BatteryLevelStep {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // How long the battery was at the current level.
+ optional int64 duration_ms = 1;
+ // Battery level
+ optional int32 level = 2;
+
+ // State of the display. A special enum is used rather than
+ // DisplayProto.State because a MIXED value needs to be in the enum, and
+ // batterystats doesn't care about all of the different display states.
+ enum DisplayState {
+ DS_MIXED = 0;
+ DS_ON = 1;
+ DS_OFF = 2;
+ DS_DOZE = 3;
+ DS_DOZE_SUSPEND = 4;
+ // Any display state error that comes through should be sent to hackbod@.
+ DS_ERROR = 5;
+ }
+ // The state of the display for the entire battery level step. MIXED is used
+ // if there were multiple states for this step.
+ optional DisplayState display_state = 3;
+
+ // Indicates status in power save mode.
+ enum PowerSaveMode {
+ PSM_MIXED = 0;
+ PSM_ON = 1;
+ PSM_OFF = 2;
+ }
+ // Battery Saver mode for the entire battery level step. MIXED is used
+ // if there were multiple states for this step.
+ optional PowerSaveMode power_save_mode = 4;
+
+ // Indicates status in idle mode.
+ enum IdleMode {
+ IM_MIXED = 0;
+ IM_ON = 2;
+ IM_OFF = 3;
+ }
+ // Doze mode for the entire battery level step. MIXED is used if there were
+ // multiple states for this step.
+ optional IdleMode idle_mode = 5;
+ };
+ // Battery level steps when the device was charging.
+ repeated BatteryLevelStep charge_step = 5;
+ // Battery level steps when the device was discharging.
+ repeated BatteryLevelStep discharge_step = 6;
+
+ // All CPU frequencies of the device.
+ repeated int64 cpu_frequency = 7;
+
+ message DataConnection {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ oneof type {
+ android.telephony.NetworkTypeEnum name = 1;
+ // If is_none is not set, then the name is a valid network type.
+ bool is_none = 2;
+ }
+ optional TimerProto total = 3;
+ };
+ repeated DataConnection data_connection = 8;
+
+ optional ControllerActivityProto global_bluetooth_controller = 9;
+ optional ControllerActivityProto global_modem_controller = 10;
+ optional ControllerActivityProto global_wifi_controller = 11;
+
+ message GlobalNetwork {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Total Bytes received on mobile connections.
+ optional int64 mobile_bytes_rx = 1;
+ // Total Bytes transmitted on mobile connections.
+ optional int64 mobile_bytes_tx = 2;
+ // Total Bytes received on wifi connections.
+ optional int64 wifi_bytes_rx = 3;
+ // Total Bytes transmitted on wifi connections.
+ optional int64 wifi_bytes_tx = 4;
+ // Total Packets received on mobile connections.
+ optional int64 mobile_packets_rx = 5;
+ // Total Packets transmitted on mobile connections.
+ optional int64 mobile_packets_tx = 6;
+ // Total Packets received on wifi connections.
+ optional int64 wifi_packets_rx = 7;
+ // Total Packets transmitted on wifi connections.
+ optional int64 wifi_packets_tx = 8;
+ // Total Bytes received on bluetooth connections.
+ optional int64 bt_bytes_rx = 9;
+ // Total Bytes transmitted on bluetooth connections.
+ optional int64 bt_bytes_tx = 10;
+ };
+ optional GlobalNetwork global_network = 12;
+
+ message GlobalWifi {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // The amount of time that wifi has been on while the device was running on
+ // battery.
+ optional int64 on_duration_ms = 1;
+ // The amount of time that wifi has been on and the driver has been in the
+ // running state while the device was running on battery.
+ optional int64 running_duration_ms = 2;
}
- // Battery Saver mode for the entire battery level step. MIXED is used
- // if there were multiple states for this step.
- optional PowerSaveMode power_save_mode = 4;
+ optional GlobalWifi global_wifi = 13;
- // Indicates status in idle mode.
- enum IdleMode {
- IM_MIXED = 0;
- IM_ON = 2;
- IM_OFF = 3;
+ // Kernel wakelock metrics are only recorded when the device is unplugged
+ // *and* the screen is off.
+ message KernelWakelock {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ // Kernel wakelock stats aren't apportioned across all kernel wakelocks (as
+ // app wakelocks stats are).
+ optional TimerProto total = 2;
+ // The kernel doesn't have the data to enable printing out current and max
+ // durations.
+ };
+ repeated KernelWakelock kernel_wakelock = 14;
+
+ message Misc {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int64 screen_on_duration_ms = 1;
+ optional int64 phone_on_duration_ms = 2;
+ optional int64 full_wakelock_total_duration_ms = 3;
+ // The total elapsed time that a partial wakelock was held. This duration
+ // does not double count wakelocks held at the same time.
+ optional int64 partial_wakelock_total_duration_ms = 4;
+ optional int64 mobile_radio_active_duration_ms = 5;
+ // The time that is the difference between the mobile radio time we saw
+ // based on the elapsed timestamp when going down vs. the given time stamp
+ // from the radio.
+ optional int64 mobile_radio_active_adjusted_time_ms = 6;
+ optional int32 mobile_radio_active_count = 7;
+ // The amount of time that the mobile network has been active (in a high
+ // power state) but not being able to blame on an app.
+ optional int32 mobile_radio_active_unknown_duration_ms = 8;
+ // Total amount of time the device was in the interactive state.
+ optional int64 interactive_duration_ms = 9;
+ optional int64 battery_saver_mode_enabled_duration_ms = 10;
+ optional int32 num_connectivity_changes = 11;
+ // Amount of time the device was in deep Doze.
+ optional int64 deep_doze_enabled_duration_ms = 12;
+ // How many times the device went into deep Doze mode.
+ optional int32 deep_doze_count = 13;
+ // Amount of time the device was idling in deep Doze. Idling time
+ // encompasses "doze" time and the maintenance windows that allow apps to
+ // operate.
+ optional int64 deep_doze_idling_duration_ms = 14;
+ // How many times the device idling for deep Doze mode.
+ optional int32 deep_doze_idling_count = 15;
+ optional int64 longest_deep_doze_duration_ms = 16;
+ // Amount of time the device was in Doze Light.
+ optional int64 light_doze_enabled_duration_ms = 17;
+ // How many times the device went into Doze Light mode.
+ optional int32 light_doze_count = 18;
+ // Amount of time the device was idling in Doze Light. Idling time
+ // encompasses "doze" time and the maintenance windows that allow apps to
+ // operate.
+ optional int64 light_doze_idling_duration_ms = 19;
+ // How many times the device idling for Doze Light mode.
+ optional int32 light_doze_idling_count = 20;
+ optional int64 longest_light_doze_duration_ms = 21;
}
- // Doze mode for the entire battery level step. MIXED is used if there were
- // multiple states for this step.
- optional IdleMode idle_mode = 5;
- };
- // Battery level steps when the device was charging.
- repeated BatteryLevelStep charge_step = 5;
- // Battery level steps when the device was discharging.
- repeated BatteryLevelStep discharge_step = 6;
+ optional Misc misc = 15;
- // All CPU frequencies of the device.
- repeated int64 cpu_frequency = 7;
+ message PhoneSignalStrength {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message DataConnection {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
- oneof type {
- android.telephony.NetworkTypeEnum name = 1;
- // If is_none is not set, then the name is a valid network type.
- bool is_none = 2;
+ optional android.telephony.SignalStrengthEnum name = 1;
+ optional TimerProto total = 2;
+ };
+ repeated PhoneSignalStrength phone_signal_strength = 16;
+
+ message PowerUseItem {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ enum Sipper {
+ UNKNOWN_SIPPER = 0;
+ IDLE = 1;
+ CELL = 2;
+ PHONE = 3;
+ WIFI = 4;
+ BLUETOOTH = 5;
+ FLASHLIGHT = 6;
+ SCREEN = 7;
+ USER = 8;
+ UNACCOUNTED = 9;
+ OVERCOUNTED = 10;
+ CAMERA = 11;
+ MEMORY = 12;
+ AMBIENT_DISPLAY = 13;
+ };
+ optional Sipper name = 1;
+ // UID, only valid for the USER sipper.
+ optional int32 uid = 2;
+ // Estimated power use in mAh.
+ optional double computed_power_mah = 3;
+ // Starting in Oreo, Battery Settings has two modes to display the battery
+ // info. The first is "app usage list". In this mode, items with should_hide
+ // enabled are hidden.
+ optional bool should_hide = 4;
+ // Smeared power from screen usage. Screen usage power is split and smeared
+ // among apps, based on activity time.
+ optional double screen_power_mah = 5;
+ // Smeared power using proportional method. Power usage from hidden sippers
+ // is smeared to all apps proportionally (except for screen usage).
+ optional double proportional_smear_mah = 6;
+ };
+ repeated PowerUseItem power_use_item = 17;
+
+ message PowerUseSummary {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional double battery_capacity_mah = 1;
+ optional double computed_power_mah = 2;
+ // Lower bound of actual power drained.
+ optional double min_drained_power_mah = 3;
+ // Upper bound of actual power drained.
+ optional double max_drained_power_mah = 4;
+ };
+ optional PowerUseSummary power_use_summary = 18;
+
+ message ResourcePowerManager {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Either StateName or StateName.VoterName.
+ optional string name = 1;
+ optional TimerProto total = 2;
+ optional TimerProto screen_off = 3;
}
- optional TimerProto total = 3;
- };
- repeated DataConnection data_connection = 8;
+ repeated ResourcePowerManager resource_power_manager = 19;
- optional ControllerActivityProto global_bluetooth_controller = 9;
- optional ControllerActivityProto global_modem_controller = 10;
- optional ControllerActivityProto global_wifi_controller = 11;
+ message ScreenBrightness {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message GlobalNetwork {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Total Bytes received on mobile connections.
- optional int64 mobile_bytes_rx = 1;
- // Total Bytes transmitted on mobile connections.
- optional int64 mobile_bytes_tx = 2;
- // Total Bytes received on wifi connections.
- optional int64 wifi_bytes_rx = 3;
- // Total Bytes transmitted on wifi connections.
- optional int64 wifi_bytes_tx = 4;
- // Total Packets received on mobile connections.
- optional int64 mobile_packets_rx = 5;
- // Total Packets transmitted on mobile connections.
- optional int64 mobile_packets_tx = 6;
- // Total Packets received on wifi connections.
- optional int64 wifi_packets_rx = 7;
- // Total Packets transmitted on wifi connections.
- optional int64 wifi_packets_tx = 8;
- // Total Bytes received on bluetooth connections.
- optional int64 bt_bytes_rx = 9;
- // Total Bytes transmitted on bluetooth connections.
- optional int64 bt_bytes_tx = 10;
- };
- optional GlobalNetwork global_network = 12;
-
- message GlobalWifi {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // The amount of time that wifi has been on while the device was running on
- // battery.
- optional int64 on_duration_ms = 1;
- // The amount of time that wifi has been on and the driver has been in the
- // running state while the device was running on battery.
- optional int64 running_duration_ms = 2;
- }
- optional GlobalWifi global_wifi = 13;
-
- // Kernel wakelock metrics are only recorded when the device is unplugged
- // *and* the screen is off.
- message KernelWakelock {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string name = 1;
- // Kernel wakelock stats aren't apportioned across all kernel wakelocks (as
- // app wakelocks stats are).
- optional TimerProto total = 2;
- // The kernel doesn't have the data to enable printing out current and max
- // durations.
- };
- repeated KernelWakelock kernel_wakelock = 14;
-
- message Misc {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 screen_on_duration_ms = 1;
- optional int64 phone_on_duration_ms = 2;
- optional int64 full_wakelock_total_duration_ms = 3;
- // The total elapsed time that a partial wakelock was held. This duration
- // does not double count wakelocks held at the same time.
- optional int64 partial_wakelock_total_duration_ms = 4;
- optional int64 mobile_radio_active_duration_ms = 5;
- // The time that is the difference between the mobile radio time we saw
- // based on the elapsed timestamp when going down vs. the given time stamp
- // from the radio.
- optional int64 mobile_radio_active_adjusted_time_ms = 6;
- optional int32 mobile_radio_active_count = 7;
- // The amount of time that the mobile network has been active (in a high
- // power state) but not being able to blame on an app.
- optional int32 mobile_radio_active_unknown_duration_ms = 8;
- // Total amount of time the device was in the interactive state.
- optional int64 interactive_duration_ms = 9;
- optional int64 battery_saver_mode_enabled_duration_ms = 10;
- optional int32 num_connectivity_changes = 11;
- // Amount of time the device was in deep Doze.
- optional int64 deep_doze_enabled_duration_ms = 12;
- // How many times the device went into deep Doze mode.
- optional int32 deep_doze_count = 13;
- // Amount of time the device was idling in deep Doze. Idling time
- // encompasses "doze" time and the maintenance windows that allow apps to
- // operate.
- optional int64 deep_doze_idling_duration_ms = 14;
- // How many times the device idling for deep Doze mode.
- optional int32 deep_doze_idling_count = 15;
- optional int64 longest_deep_doze_duration_ms = 16;
- // Amount of time the device was in Doze Light.
- optional int64 light_doze_enabled_duration_ms = 17;
- // How many times the device went into Doze Light mode.
- optional int32 light_doze_count = 18;
- // Amount of time the device was idling in Doze Light. Idling time
- // encompasses "doze" time and the maintenance windows that allow apps to
- // operate.
- optional int64 light_doze_idling_duration_ms = 19;
- // How many times the device idling for Doze Light mode.
- optional int32 light_doze_idling_count = 20;
- optional int64 longest_light_doze_duration_ms = 21;
- }
- optional Misc misc = 15;
-
- message PhoneSignalStrength {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional android.telephony.SignalStrengthEnum name = 1;
- optional TimerProto total = 2;
- };
- repeated PhoneSignalStrength phone_signal_strength = 16;
-
- message PowerUseItem {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- enum Sipper {
- UNKNOWN_SIPPER = 0;
- IDLE = 1;
- CELL = 2;
- PHONE = 3;
- WIFI = 4;
- BLUETOOTH = 5;
- FLASHLIGHT = 6;
- SCREEN = 7;
- USER = 8;
- UNACCOUNTED = 9;
- OVERCOUNTED = 10;
- CAMERA = 11;
- MEMORY = 12;
+ enum Name {
+ DARK = 0; // Not screen-off.
+ DIM = 1;
+ MEDIUM = 2;
+ LIGHT = 3;
+ BRIGHT = 4;
+ };
+ optional Name name = 1;
+ optional TimerProto total = 2;
};
- optional Sipper name = 1;
- // UID, only valid for the USER sipper.
- optional int32 uid = 2;
- // Estimated power use in mAh.
- optional double computed_power_mah = 3;
- // Starting in Oreo, Battery Settings has two modes to display the battery
- // info. The first is "app usage list". In this mode, items with should_hide
- // enabled are hidden.
- optional bool should_hide = 4;
- // Smeared power from screen usage. Screen usage power is split and smeared
- // among apps, based on activity time.
- optional double screen_power_mah = 5;
- // Smeared power using proportional method. Power usage from hidden sippers
- // is smeared to all apps proportionally (except for screen usage).
- optional double proportional_smear_mah = 6;
- };
- repeated PowerUseItem power_use_item = 17;
+ repeated ScreenBrightness screen_brightness = 20;
- message PowerUseSummary {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Duration and number of times trying to acquire a signal
+ optional TimerProto signal_scanning = 21;
- optional double battery_capacity_mah = 1;
- optional double computed_power_mah = 2;
- // Lower bound of actual power drained.
- optional double min_drained_power_mah = 3;
- // Upper bound of actual power drained.
- optional double max_drained_power_mah = 4;
- };
- optional PowerUseSummary power_use_summary = 18;
+ message WakeupReason {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message ResourcePowerManager {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Either StateName or StateName.VoterName.
- optional string name = 1;
- optional TimerProto total = 2;
- optional TimerProto screen_off = 3;
- }
- repeated ResourcePowerManager resource_power_manager = 19;
-
- message ScreenBrightness {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- enum Name {
- DARK = 0; // Not screen-off.
- DIM = 1;
- MEDIUM = 2;
- LIGHT = 3;
- BRIGHT = 4;
+ optional string name = 1;
+ optional TimerProto total = 2;
};
- optional Name name = 1;
- optional TimerProto total = 2;
- };
- repeated ScreenBrightness screen_brightness = 20;
+ repeated WakeupReason wakeup_reason = 22;
- // Duration and number of times trying to acquire a signal
- optional TimerProto signal_scanning = 21;
+ message WifiMulticastWakelockTotal {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message WakeupReason {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional int64 duration_ms = 1;
+ optional int32 count = 2;
+ }
+ optional WifiMulticastWakelockTotal wifi_multicast_wakelock_total = 23;
- optional string name = 1;
- optional TimerProto total = 2;
- };
- repeated WakeupReason wakeup_reason = 22;
+ message WifiSignalStrength {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message WifiMulticastWakelockTotal {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 duration_ms = 1;
- optional int32 count = 2;
- }
- optional WifiMulticastWakelockTotal wifi_multicast_wakelock_total = 23;
-
- message WifiSignalStrength {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- enum Name {
- NONE = 0;
- POOR = 1;
- MODERATE = 2;
- GOOD = 3;
- GREAT = 4;
+ enum Name {
+ NONE = 0;
+ POOR = 1;
+ MODERATE = 2;
+ GOOD = 3;
+ GREAT = 4;
+ };
+ optional Name name = 1;
+ optional TimerProto total = 2;
};
- optional Name name = 1;
- optional TimerProto total = 2;
- };
- repeated WifiSignalStrength wifi_signal_strength = 24;
+ repeated WifiSignalStrength wifi_signal_strength = 24;
- message WifiState {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message WifiState {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- enum Name {
- OFF = 0;
- OFF_SCANNING = 1;
- ON_NO_NETWORKS = 2;
- ON_DISCONNECTED = 3;
- ON_CONNECTED_STA = 4;
- ON_CONNECTED_P2P = 5;
- ON_CONNECTED_STA_P2P = 6;
- SOFT_AP = 7;
+ enum Name {
+ OFF = 0;
+ OFF_SCANNING = 1;
+ ON_NO_NETWORKS = 2;
+ ON_DISCONNECTED = 3;
+ ON_CONNECTED_STA = 4;
+ ON_CONNECTED_P2P = 5;
+ ON_CONNECTED_STA_P2P = 6;
+ SOFT_AP = 7;
+ };
+ optional Name name = 1;
+ optional TimerProto total = 2;
};
- optional Name name = 1;
- optional TimerProto total = 2;
- };
- repeated WifiState wifi_state = 25;
+ repeated WifiState wifi_state = 25;
- message WifiSupplicantState {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message WifiSupplicantState {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- enum Name {
- INVALID = 0;
- DISCONNECTED = 1;
- INTERFACE_DISABLED = 2;
- INACTIVE = 3;
- SCANNING = 4;
- AUTHENTICATING = 5;
- ASSOCIATING = 6;
- ASSOCIATED = 7;
- FOUR_WAY_HANDSHAKE = 8;
- GROUP_HANDSHAKE = 9;
- COMPLETED = 10;
- DORMANT = 11;
- UNINITIALIZED = 12;
+ enum Name {
+ INVALID = 0;
+ DISCONNECTED = 1;
+ INTERFACE_DISABLED = 2;
+ INACTIVE = 3;
+ SCANNING = 4;
+ AUTHENTICATING = 5;
+ ASSOCIATING = 6;
+ ASSOCIATED = 7;
+ FOUR_WAY_HANDSHAKE = 8;
+ GROUP_HANDSHAKE = 9;
+ COMPLETED = 10;
+ DORMANT = 11;
+ UNINITIALIZED = 12;
+ };
+ optional Name name = 1;
+ optional TimerProto total = 2;
};
- optional Name name = 1;
- optional TimerProto total = 2;
- };
- repeated WifiSupplicantState wifi_supplicant_state = 26;
+ repeated WifiSupplicantState wifi_supplicant_state = 26;
}
message TimerProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // This may be an apportioned time.
- optional int64 duration_ms = 1;
- optional int64 count = 2;
- // The max duration if it is being tracked. Not all Timer subclasses
- // track the max duration.
- optional int64 max_duration_ms = 3;
- // The current time the timer has been active, if it is being tracked.
- // Not all Timer subclasses track the current duration.
- optional int64 current_duration_ms = 4;
- // The total cumulative duration (i.e. sum of past durations) that this timer
- // has been on since reset. This may differ from duration_ms since, depending
- // on the Timer, getTotalTimeLocked may represent the total 'blamed' or
- // 'pooled' time, rather than the actual time. By contrast, total_duration_ms
- // always gives the actual total time. Not all Timer subclasses track the
- // total duration.
- optional int64 total_duration_ms = 5;
+ // This may be an apportioned time.
+ optional int64 duration_ms = 1;
+ optional int64 count = 2;
+ // The max duration if it is being tracked. Not all Timer subclasses
+ // track the max duration.
+ optional int64 max_duration_ms = 3;
+ // The current time the timer has been active, if it is being tracked.
+ // Not all Timer subclasses track the current duration.
+ optional int64 current_duration_ms = 4;
+ // The total cumulative duration (i.e. sum of past durations) that this timer
+ // has been on since reset. This may differ from duration_ms since, depending
+ // on the Timer, getTotalTimeLocked may represent the total 'blamed' or
+ // 'pooled' time, rather than the actual time. By contrast, total_duration_ms
+ // always gives the actual total time. Not all Timer subclasses track the
+ // total duration.
+ optional int64 total_duration_ms = 5;
}
message UidProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Combination of app ID and user ID.
- optional int32 uid = 1;
-
- // The statistics associated with a particular package.
- message Package {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string name = 1;
+ // Combination of app ID and user ID.
+ optional int32 uid = 1;
- message Service {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // The statistics associated with a particular package.
+ message Package {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string name = 1;
- // Time spent started.
- optional int64 start_duration_ms = 2;
- optional int32 start_count = 3;
- optional int32 launch_count = 4;
+ optional string name = 1;
+
+ message Service {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ // Time spent started.
+ optional int64 start_duration_ms = 2;
+ optional int32 start_count = 3;
+ optional int32 launch_count = 4;
+ }
+ repeated Service services = 2;
}
- repeated Service services = 2;
- }
- repeated Package packages = 2;
+ repeated Package packages = 2;
- optional ControllerActivityProto bluetooth_controller = 3;
- optional ControllerActivityProto modem_controller = 4;
- optional ControllerActivityProto wifi_controller = 5;
+ optional ControllerActivityProto bluetooth_controller = 3;
+ optional ControllerActivityProto modem_controller = 4;
+ optional ControllerActivityProto wifi_controller = 5;
- // Bluetooth misc data.
- message BluetoothMisc {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Bluetooth misc data.
+ message BluetoothMisc {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Duration spent BLE scanning blamed on this App (i.e. apportioned to this
- // app amongst all apps doing BLE scanning; see explanation of 'apportioned'
- // in App's comment).
- optional TimerProto apportioned_ble_scan = 1;
- // Background times aren't apportioned.
- optional TimerProto background_ble_scan = 2;
- // Running unoptimized BLE scanning, as defined by Bluetooth's
- // AppScanStats.recordScanStart. As of May 2017, these are unfiltered,
- // non-opportunistic, non-first-match scans. Durations are not
- // pooled/apportioned.
- optional TimerProto unoptimized_ble_scan = 3;
- // Running unoptimized BLE scanning when app is in background. Durations are
- // not pooled/apportioned.
- optional TimerProto background_unoptimized_ble_scan = 4;
- // Count of results returned by BLE scanning.
- optional int32 ble_scan_result_count = 5;
- // Count of results returned by BLE scans when app is in background.
- // (Included in ble_scan_result_count.)
- optional int32 background_ble_scan_result_count = 6;
- }
- optional BluetoothMisc bluetooth_misc = 6;
-
- message Cpu {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Total CPU time with processes executing in userspace. Summed up across
- // multiple cores.
- optional int64 user_duration_ms = 1;
- // Total CPU time with processes executing kernel syscalls. Summed up across
- // multiple cores.
- optional int64 system_duration_ms = 2;
-
- // CPU time broken down by CPU frequency (go/cpu-battery-metrics).
- //
- // These are real CPU time measurement from the kernel, so their sum can
- // be different from the sum of user_duration_millis and
- // system_duration_millis, which are just approximations. Data is not
- // tracked when device is charging.
- message ByFrequency {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Index of the frequency in system.cpu_frequency. It starts from 1, to
- // make it easier to analyze.
- optional int32 frequency_index = 1;
- // CPU time in milliseconds.
- optional int64 total_duration_ms = 2;
- // Screen-off CPU time in milliseconds.
- optional int64 screen_off_duration_ms = 3;
+ // Duration spent BLE scanning blamed on this App (i.e. apportioned to this
+ // app amongst all apps doing BLE scanning; see explanation of 'apportioned'
+ // in App's comment).
+ optional TimerProto apportioned_ble_scan = 1;
+ // Background times aren't apportioned.
+ optional TimerProto background_ble_scan = 2;
+ // Running unoptimized BLE scanning, as defined by Bluetooth's
+ // AppScanStats.recordScanStart. As of May 2017, these are unfiltered,
+ // non-opportunistic, non-first-match scans. Durations are not
+ // pooled/apportioned.
+ optional TimerProto unoptimized_ble_scan = 3;
+ // Running unoptimized BLE scanning when app is in background. Durations are
+ // not pooled/apportioned.
+ optional TimerProto background_unoptimized_ble_scan = 4;
+ // Count of results returned by BLE scanning.
+ optional int32 ble_scan_result_count = 5;
+ // Count of results returned by BLE scans when app is in background.
+ // (Included in ble_scan_result_count.)
+ optional int32 background_ble_scan_result_count = 6;
}
- // CPU times accumulated across all process states.
- repeated ByFrequency by_frequency = 3;
+ optional BluetoothMisc bluetooth_misc = 6;
- enum ProcessState {
- TOP = 0;
- FOREGROUND_SERVICE = 1;
- FOREGROUND = 2;
- BACKGROUND = 3;
- TOP_SLEEPING = 4;
- HEAVY_WEIGHT = 5;
- CACHED = 6;
+ message Cpu {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Total CPU time with processes executing in userspace. Summed up across
+ // multiple cores.
+ optional int64 user_duration_ms = 1;
+ // Total CPU time with processes executing kernel syscalls. Summed up across
+ // multiple cores.
+ optional int64 system_duration_ms = 2;
+
+ // CPU time broken down by CPU frequency (go/cpu-battery-metrics).
+ //
+ // These are real CPU time measurement from the kernel, so their sum can
+ // be different from the sum of user_duration_millis and
+ // system_duration_millis, which are just approximations. Data is not
+ // tracked when device is charging.
+ message ByFrequency {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Index of the frequency in system.cpu_frequency. It starts from 1, to
+ // make it easier to analyze.
+ optional int32 frequency_index = 1;
+ // CPU time in milliseconds.
+ optional int64 total_duration_ms = 2;
+ // Screen-off CPU time in milliseconds.
+ optional int64 screen_off_duration_ms = 3;
+ }
+ // CPU times accumulated across all process states.
+ repeated ByFrequency by_frequency = 3;
+
+ enum ProcessState {
+ TOP = 0;
+ FOREGROUND_SERVICE = 1;
+ FOREGROUND = 2;
+ BACKGROUND = 3;
+ TOP_SLEEPING = 4;
+ HEAVY_WEIGHT = 5;
+ CACHED = 6;
+ }
+ // CPU times at different process states.
+ message ByProcessState {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional ProcessState process_state = 1;
+ repeated ByFrequency by_frequency = 2;
+ }
+ repeated ByProcessState by_process_state = 4;
}
- // CPU times at different process states.
- message ByProcessState {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional Cpu cpu = 7;
- optional ProcessState process_state = 1;
- repeated ByFrequency by_frequency = 2;
+ // Duration is pooled/apportioned.
+ optional TimerProto audio = 8;
+ // Duration is pooled/apportioned.
+ optional TimerProto camera = 9;
+ // Duration is pooled/apportioned.
+ optional TimerProto flashlight = 10;
+ // Duration is not pooled/apportioned.
+ optional TimerProto foreground_activity = 11;
+ // Duration is not pooled/apportioned.
+ optional TimerProto foreground_service = 12;
+ // Duration is not pooled/apportioned.
+ optional TimerProto vibrator = 13;
+ // Duration is pooled/apportioned.
+ optional TimerProto video = 14;
+
+ message Job {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ // Job times aren't apportioned.
+ optional TimerProto total = 2;
+ optional TimerProto background = 3;
}
- repeated ByProcessState by_process_state = 4;
- }
- optional Cpu cpu = 7;
+ repeated Job jobs = 15;
- // Duration is pooled/apportioned.
- optional TimerProto audio = 8;
- // Duration is pooled/apportioned.
- optional TimerProto camera = 9;
- // Duration is pooled/apportioned.
- optional TimerProto flashlight = 10;
- // Duration is not pooled/apportioned.
- optional TimerProto foreground_activity = 11;
- // Duration is not pooled/apportioned.
- optional TimerProto foreground_service = 12;
- // Duration is not pooled/apportioned.
- optional TimerProto vibrator = 13;
- // Duration is pooled/apportioned.
- optional TimerProto video = 14;
+ message JobCompletion {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message Job {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Job name.
+ optional string name = 1;
- optional string name = 1;
- // Job times aren't apportioned.
- optional TimerProto total = 2;
- optional TimerProto background = 3;
- }
- repeated Job jobs = 15;
+ message ReasonCount {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message JobCompletion {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional android.app.job.StopReasonEnum name = 1;
+ optional int32 count = 2;
+ }
+ repeated ReasonCount reason_count = 2;
+ };
+ repeated JobCompletion job_completion = 16;
- // Job name.
- optional string name = 1;
+ message Network {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- message ReasonCount {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Mobile data traffic (total, background + foreground).
+ optional int64 mobile_bytes_rx = 1;
+ optional int64 mobile_bytes_tx = 2;
+ // Wifi data traffic (total, background + foreground).
+ optional int64 wifi_bytes_rx = 3;
+ optional int64 wifi_bytes_tx = 4;
+ // Bluetooth data traffic (total, background + foreground).
+ optional int64 bt_bytes_rx = 5;
+ optional int64 bt_bytes_tx = 6;
+ // In packets (total, background + foreground).
+ optional int64 mobile_packets_rx = 7;
+ optional int64 mobile_packets_tx = 8;
+ optional int64 wifi_packets_rx = 9;
+ optional int64 wifi_packets_tx = 10;
+ // Radio active duration.
+ optional int64 mobile_active_duration_ms = 11;
+ optional int32 mobile_active_count = 12;
+ // Number of times the app woke up the mobile radio.
+ optional int32 mobile_wakeup_count = 13;
+ // Number of times the app woke up the wifi radio.
+ optional int32 wifi_wakeup_count = 14;
+ // Mobile data traffic in the background only, included in total above.
+ optional int64 mobile_bytes_bg_rx = 15;
+ optional int64 mobile_bytes_bg_tx = 16;
+ // Wifi data traffic in the background only, included in total above.
+ optional int64 wifi_bytes_bg_rx = 17;
+ optional int64 wifi_bytes_bg_tx = 18;
+ // In packets (background only, included in total packets above).
+ optional int64 mobile_packets_bg_rx = 19;
+ optional int64 mobile_packets_bg_tx = 20;
+ optional int64 wifi_packets_bg_rx = 21;
+ optional int64 wifi_packets_bg_tx = 22;
+ };
+ optional Network network = 17;
- optional android.app.job.StopReasonEnum name = 1;
- optional int32 count = 2;
+ // TODO: combine System and App messages?
+ message PowerUseItem {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Estimated power use in mAh.
+ optional double computed_power_mah = 1;
+ // Starting in Oreo, Battery Settings has two modes to display the battery
+ // info. The first is "app usage list". In this mode, items with should_hide
+ // enabled are hidden.
+ optional bool should_hide = 2;
+ // Smeared power from screen usage. Screen usage power is split and smeared
+ // among apps, based on activity time.
+ optional double screen_power_mah = 3;
+ // Smeared power using proportional method. Power usage from hidden sippers
+ // is smeared to all apps proportionally (except for screen usage).
+ optional double proportional_smear_mah = 4;
+ };
+ optional PowerUseItem power_use_item = 18;
+
+ // Durations are not pooled/apportioned.
+ message Process {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ // Time spent executing in user code.
+ optional int64 user_duration_ms = 2;
+ // Time spent executing in kernel code.
+ optional int64 system_duration_ms = 3;
+ // Time the process was running in the foreground.
+ optional int64 foreground_duration_ms = 4;
+ // Number of times the process has been started.
+ optional int32 start_count = 5;
+ // Number of times the process has had an ANR.
+ optional int32 anr_count = 6;
+ // Number of times the process has crashed.
+ optional int32 crash_count = 7;
+ };
+ repeated Process process = 19;
+
+ message StateTime {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // All of these (non-deprecated) states are mutually exclusive and can be
+ // added together to find the total time a uid has had any processes running
+ // at all.
+
+ // In approximate order or priority (top being what the framework considers
+ // most important and is thus least likely to kill when resources are
+ // needed:
+ // top > foreground service > foreground > background > top sleeping > heavy weight > cache
+ enum State {
+ // Time this uid has any processes in the top state.
+ PROCESS_STATE_TOP = 0;
+ // Time this uid has any process with a started foreground service, but
+ // none in the "top" state.
+ PROCESS_STATE_FOREGROUND_SERVICE = 1;
+ // Time this uid has any process in an active foreground state, but none in the
+ // "foreground service" or better state. Persistent and other foreground states go here.
+ PROCESS_STATE_FOREGROUND = 2;
+ // Time this uid has any process in an active background state, but none
+ // in the "foreground" or better state.
+ PROCESS_STATE_BACKGROUND = 3;
+ // Time this uid has any process that is top while the device is sleeping,
+ // but not active for any other reason. We consider is a kind of cached
+ // process for execution restrictions. Sleeping is mostly screen off, but
+ // also includes the time when the screen is on but the device has not yet
+ // been unlocked.
+ PROCESS_STATE_TOP_SLEEPING = 4;
+ // Time this uid has any process that is in the background but it has an
+ // activity marked as "can't save state". This is essentially a cached
+ // process, though the system will try much harder than normal to avoid
+ // killing it.
+ PROCESS_STATE_HEAVY_WEIGHT = 5;
+ // Time this uid has any processes that are sitting around cached, not in
+ // one of the other active states.
+ PROCESS_STATE_CACHED = 6;
+ }
+ optional State state = 1;
+ optional int64 duration_ms = 2;
}
- repeated ReasonCount reason_count = 2;
- };
- repeated JobCompletion job_completion = 16;
+ repeated StateTime states = 20;
- message Network {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Sensor {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Mobile data traffic (total, background + foreground).
- optional int64 mobile_bytes_rx = 1;
- optional int64 mobile_bytes_tx = 2;
- // Wifi data traffic (total, background + foreground).
- optional int64 wifi_bytes_rx = 3;
- optional int64 wifi_bytes_tx = 4;
- // Bluetooth data traffic (total, background + foreground).
- optional int64 bt_bytes_rx = 5;
- optional int64 bt_bytes_tx = 6;
- // In packets (total, background + foreground).
- optional int64 mobile_packets_rx = 7;
- optional int64 mobile_packets_tx = 8;
- optional int64 wifi_packets_rx = 9;
- optional int64 wifi_packets_tx = 10;
- // Radio active duration.
- optional int64 mobile_active_duration_ms = 11;
- optional int32 mobile_active_count = 12;
- // Number of times the app woke up the mobile radio.
- optional int32 mobile_wakeup_count = 13;
- // Number of times the app woke up the wifi radio.
- optional int32 wifi_wakeup_count = 14;
- // Mobile data traffic in the background only, included in total above.
- optional int64 mobile_bytes_bg_rx = 15;
- optional int64 mobile_bytes_bg_tx = 16;
- // Wifi data traffic in the background only, included in total above.
- optional int64 wifi_bytes_bg_rx = 17;
- optional int64 wifi_bytes_bg_tx = 18;
- // In packets (background only, included in total packets above).
- optional int64 mobile_packets_bg_rx = 19;
- optional int64 mobile_packets_bg_tx = 20;
- optional int64 wifi_packets_bg_rx = 21;
- optional int64 wifi_packets_bg_tx = 22;
- };
- optional Network network = 17;
-
- // TODO: combine System and App messages?
- message PowerUseItem {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Estimated power use in mAh.
- optional double computed_power_mah = 1;
- // Starting in Oreo, Battery Settings has two modes to display the battery
- // info. The first is "app usage list". In this mode, items with should_hide
- // enabled are hidden.
- optional bool should_hide = 2;
- // Smeared power from screen usage. Screen usage power is split and smeared
- // among apps, based on activity time.
- optional double screen_power_mah = 3;
- // Smeared power using proportional method. Power usage from hidden sippers
- // is smeared to all apps proportionally (except for screen usage).
- optional double proportional_smear_mah = 4;
- };
- optional PowerUseItem power_use_item = 18;
-
- // Durations are not pooled/apportioned.
- message Process {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string name = 1;
- // Time spent executing in user code.
- optional int64 user_duration_ms = 2;
- // Time spent executing in kernel code.
- optional int64 system_duration_ms = 3;
- // Time the process was running in the foreground.
- optional int64 foreground_duration_ms = 4;
- // Number of times the process has been started.
- optional int32 start_count = 5;
- // Number of times the process has had an ANR.
- optional int32 anr_count = 6;
- // Number of times the process has crashed.
- optional int32 crash_count = 7;
- };
- repeated Process process = 19;
-
- message StateTime {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // All of these (non-deprecated) states are mutually exclusive and can be
- // added together to find the total time a uid has had any processes running
- // at all.
-
- // In approximate order or priority (top being what the framework considers
- // most important and is thus least likely to kill when resources are
- // needed:
- // top > foreground service > foreground > background > top sleeping > heavy weight > cache
- enum State {
- // Time this uid has any processes in the top state.
- PROCESS_STATE_TOP = 0;
- // Time this uid has any process with a started foreground service, but
- // none in the "top" state.
- PROCESS_STATE_FOREGROUND_SERVICE = 1;
- // Time this uid has any process in an active foreground state, but none in the
- // "foreground service" or better state. Persistent and other foreground states go here.
- PROCESS_STATE_FOREGROUND = 2;
- // Time this uid has any process in an active background state, but none
- // in the "foreground" or better state.
- PROCESS_STATE_BACKGROUND = 3;
- // Time this uid has any process that is top while the device is sleeping,
- // but not active for any other reason. We consider is a kind of cached
- // process for execution restrictions. Sleeping is mostly screen off, but
- // also includes the time when the screen is on but the device has not yet
- // been unlocked.
- PROCESS_STATE_TOP_SLEEPING = 4;
- // Time this uid has any process that is in the background but it has an
- // activity marked as "can't save state". This is essentially a cached
- // process, though the system will try much harder than normal to avoid
- // killing it.
- PROCESS_STATE_HEAVY_WEIGHT = 5;
- // Time this uid has any processes that are sitting around cached, not in
- // one of the other active states.
- PROCESS_STATE_CACHED = 6;
+ optional int32 id = 1;
+ optional TimerProto apportioned = 2;
+ // Background times aren't apportioned.
+ optional TimerProto background = 3;
}
- optional State state = 1;
- optional int64 duration_ms = 2;
- }
- repeated StateTime states = 20;
+ repeated Sensor sensors = 21;
- message Sensor {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Sync {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 id = 1;
- optional TimerProto apportioned = 2;
- // Background times aren't apportioned.
- optional TimerProto background = 3;
- }
- repeated Sensor sensors = 21;
+ optional string name = 1;
+ // Sync times aren't apportioned.
+ optional TimerProto total = 2;
+ optional TimerProto background = 3;
+ }
+ repeated Sync syncs = 22;
- message Sync {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message UserActivity {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string name = 1;
- // Sync times aren't apportioned.
- optional TimerProto total = 2;
- optional TimerProto background = 3;
- }
- repeated Sync syncs = 22;
+ optional android.os.PowerManagerProto.UserActivityEvent name = 1;
+ optional int32 count = 2;
+ };
+ repeated UserActivity user_activity = 23;
- message UserActivity {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Aggregated wakelock data for an app overall, across all of its wakelocks.
+ // The Wakelock message holds data about each *individual* wakelock, but it
+ // cannot be used to ascertain the aggregated time the app spent holding
+ // wakelocks, since merely summing Wakelock data will either underestimate (in
+ // the case of wakelock.partial.duration_ms) or overestimate (in the case of
+ // wakelock.partial.total_duration_ms) the total time, due to overlapping
+ // wakelocks. AggregatedWakelock, on the other hand, holds overall per-app
+ // wakelock data.
+ message AggregatedWakelock {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional android.os.PowerManagerProto.UserActivityEvent name = 1;
- optional int32 count = 2;
- };
- repeated UserActivity user_activity = 23;
+ // The total duration that the app spent holding partial wakelocks.
+ // It includes both foreground + background use.
+ optional int64 partial_duration_ms = 1;
+ // The total duration that the app spent holding partial wakelocks while the
+ // app was in the background. Subtracting from partial_duration_ms will
+ // yield foreground usage.
+ optional int64 background_partial_duration_ms = 2;
+ };
+ optional AggregatedWakelock aggregated_wakelock = 24;
- // Aggregated wakelock data for an app overall, across all of its wakelocks.
- // The Wakelock message holds data about each *individual* wakelock, but it
- // cannot be used to ascertain the aggregated time the app spent holding
- // wakelocks, since merely summing Wakelock data will either underestimate (in
- // the case of wakelock.partial.duration_ms) or overestimate (in the case of
- // wakelock.partial.total_duration_ms) the total time, due to overlapping
- // wakelocks. AggregatedWakelock, on the other hand, holds overall per-app
- // wakelock data.
- message AggregatedWakelock {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Wakelock {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // The total duration that the app spent holding partial wakelocks.
- // It includes both foreground + background use.
- optional int64 partial_duration_ms = 1;
- // The total duration that the app spent holding partial wakelocks while the
- // app was in the background. Subtracting from partial_duration_ms will
- // yield foreground usage.
- optional int64 background_partial_duration_ms = 2;
- };
- optional AggregatedWakelock aggregated_wakelock = 24;
+ optional string name = 1;
- message Wakelock {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Full wakelocks keep the screen on. Based on
+ // PowerManager.SCREEN_BRIGHT_WAKE_LOCK (deprecated in API 13) and
+ // PowerManager.SCREEN_DIM_WAKE_LOCK (deprecated in API 17). Current, max,
+ // and total durations are not tracked for full wakelocks.
+ optional TimerProto full = 2;
- optional string name = 1;
+ // Partial wakelocks ensure the CPU is running while allowing the screen
+ // to turn off. Based on PowerManager.PARTIAL_WAKE_LOCK.
+ // Partial wakelock metrics are only recorded when the device is unplugged
+ // *and* the screen is off. Current, max, and total durations are tracked
+ // for partial wakelocks.
+ optional TimerProto partial = 3;
- // Full wakelocks keep the screen on. Based on
- // PowerManager.SCREEN_BRIGHT_WAKE_LOCK (deprecated in API 13) and
- // PowerManager.SCREEN_DIM_WAKE_LOCK (deprecated in API 17). Current, max,
- // and total durations are not tracked for full wakelocks.
- optional TimerProto full = 2;
+ // These fields are for tracking partial wakelocks (see above), but only
+ // the time the wakelock was held while the app was in a background state.
+ // Since all background tracking is 'actual', not 'apportioned',
+ // background_partial.duration_ms is identical to
+ // background_partial.total_duration_ms.
+ optional TimerProto background_partial = 4;
- // Partial wakelocks ensure the CPU is running while allowing the screen
- // to turn off. Based on PowerManager.PARTIAL_WAKE_LOCK.
- // Partial wakelock metrics are only recorded when the device is unplugged
- // *and* the screen is off. Current, max, and total durations are tracked
- // for partial wakelocks.
- optional TimerProto partial = 3;
+ // Window wakelocks keep the screen on. Current, max, and total durations
+ // are not tracked for window wakelocks.
+ optional TimerProto window = 5;
+ };
+ repeated Wakelock wakelocks = 25;
- // These fields are for tracking partial wakelocks (see above), but only
- // the time the wakelock was held while the app was in a background state.
- // Since all background tracking is 'actual', not 'apportioned',
- // background_partial.duration_ms is identical to
- // background_partial.total_duration_ms.
- optional TimerProto background_partial = 4;
+ message WakeupAlarm {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Window wakelocks keep the screen on. Current, max, and total durations
- // are not tracked for window wakelocks.
- optional TimerProto window = 5;
- };
- repeated Wakelock wakelocks = 25;
+ // Wakeup alarm name.
+ optional string name = 1;
+ // Only includes counts when screen-off (& on battery).
+ optional int32 count = 2;
+ }
+ repeated WakeupAlarm wakeup_alarm = 26;
- message WakeupAlarm {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Wifi {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Wakeup alarm name.
- optional string name = 1;
- // Only includes counts when screen-off (& on battery).
- optional int32 count = 2;
- }
- repeated WakeupAlarm wakeup_alarm = 26;
+ // Duration holding Wifi-lock. This time is apportioned.
+ optional int64 full_wifi_lock_duration_ms = 1;
+ // Duration running Wifi. This time is apportioned.
+ optional int64 running_duration_ms = 2;
+ // Duration performing Wifi-scan blamed on this App (i.e. apportioned to
+ // this app amongst all apps doing Wifi-scanning; see explanation of
+ // 'apportioned' in App's comment).
+ optional TimerProto apportioned_scan = 3;
+ // Scans performed when app is in background. (Included in
+ // apportioned_scan). This value is not apportioned. Subtracting
+ // background_scan.total_duration_ms from apportioned_scan.total_duration_ms
+ // will yield foreground usage.
+ optional TimerProto background_scan = 4;
+ };
+ optional Wifi wifi = 27;
- message Wifi {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Duration holding Wifi-lock. This time is apportioned.
- optional int64 full_wifi_lock_duration_ms = 1;
- // Duration running Wifi. This time is apportioned.
- optional int64 running_duration_ms = 2;
- // Duration performing Wifi-scan blamed on this App (i.e. apportioned to
- // this app amongst all apps doing Wifi-scanning; see explanation of
- // 'apportioned' in App's comment).
- optional TimerProto apportioned_scan = 3;
- // Scans performed when app is in background. (Included in
- // apportioned_scan). This value is not apportioned. Subtracting
- // background_scan.total_duration_ms from apportioned_scan.total_duration_ms
- // will yield foreground usage.
- optional TimerProto background_scan = 4;
- };
- optional Wifi wifi = 27;
-
- // WiFi Multicast Wakelock
- // This timer tracks the duration and count for the app to request the
- // wakelock for wifi multicast traffic.
- // This wakelock disables the filtering of multicast packets to reach the host
- // processor, and results in a power penalty.
- // It is useful to monitor the applications resulting in that
- optional TimerProto wifi_multicast_wakelock = 28;
+ // WiFi Multicast Wakelock
+ // This timer tracks the duration and count for the app to request the
+ // wakelock for wifi multicast traffic.
+ // This wakelock disables the filtering of multicast packets to reach the host
+ // processor, and results in a power penalty.
+ // It is useful to monitor the applications resulting in that
+ optional TimerProto wifi_multicast_wakelock = 28;
}
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index ab15d4f..503bd21 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -228,7 +228,7 @@
];
optional android.service.print.PrintServiceDumpProto print = 3010 [
- (section).type = SECTION_NONE, // Turn off until we get approval for it.
+ (section).type = SECTION_DUMPSYS,
(section).args = "print --proto"
];
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 0c617ff..418e15b 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -38,995 +38,995 @@
option java_multiple_files = true;
message ActivityManagerServiceProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ActivityManagerServiceDumpActivitiesProto activities = 1;
+ optional ActivityManagerServiceDumpActivitiesProto activities = 1;
- optional ActivityManagerServiceDumpBroadcastsProto broadcasts = 2;
+ optional ActivityManagerServiceDumpBroadcastsProto broadcasts = 2;
- optional ActivityManagerServiceDumpServicesProto services = 3;
+ optional ActivityManagerServiceDumpServicesProto services = 3;
- optional ActivityManagerServiceDumpProcessesProto processes = 4;
+ optional ActivityManagerServiceDumpProcessesProto processes = 4;
}
// "dumpsys activity --proto activities"
message ActivityManagerServiceDumpActivitiesProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ActivityStackSupervisorProto activity_stack_supervisor = 1;
+ optional ActivityStackSupervisorProto activity_stack_supervisor = 1;
}
message ActivityStackSupervisorProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
- repeated ActivityDisplayProto displays = 2;
- optional KeyguardControllerProto keyguard_controller = 3;
- optional int32 focused_stack_id = 4;
- optional .com.android.server.wm.IdentifierProto resumed_activity = 5;
- // Whether or not the home activity is the recents activity. This is needed for the CTS tests to
- // know what activity types to check for when invoking splitscreen multi-window.
- optional bool is_home_recents_component = 6;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ repeated ActivityDisplayProto displays = 2;
+ optional KeyguardControllerProto keyguard_controller = 3;
+ optional int32 focused_stack_id = 4;
+ optional .com.android.server.wm.IdentifierProto resumed_activity = 5;
+ // Whether or not the home activity is the recents activity. This is needed for the CTS tests to
+ // know what activity types to check for when invoking splitscreen multi-window.
+ optional bool is_home_recents_component = 6;
}
/* represents ActivityStackSupervisor.ActivityDisplay */
message ActivityDisplayProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
- optional int32 id = 2;
- repeated ActivityStackProto stacks = 3;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ optional int32 id = 2;
+ repeated ActivityStackProto stacks = 3;
}
message ActivityStackProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
- optional int32 id = 2;
- repeated TaskRecordProto tasks = 3;
- optional .com.android.server.wm.IdentifierProto resumed_activity = 4;
- optional int32 display_id = 5;
- optional bool fullscreen = 6;
- optional .android.graphics.RectProto bounds = 7;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ optional int32 id = 2;
+ repeated TaskRecordProto tasks = 3;
+ optional .com.android.server.wm.IdentifierProto resumed_activity = 4;
+ optional int32 display_id = 5;
+ optional bool fullscreen = 6;
+ optional .android.graphics.RectProto bounds = 7;
}
message TaskRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
- optional int32 id = 2;
- repeated ActivityRecordProto activities = 3;
- optional int32 stack_id = 4;
- optional .android.graphics.RectProto last_non_fullscreen_bounds = 5;
- optional string real_activity = 6;
- optional string orig_activity = 7;
- optional int32 activity_type = 8;
- optional int32 resize_mode = 9;
- optional bool fullscreen = 10;
- optional .android.graphics.RectProto bounds = 11;
- optional int32 min_width = 12;
- optional int32 min_height = 13;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ optional int32 id = 2;
+ repeated ActivityRecordProto activities = 3;
+ optional int32 stack_id = 4;
+ optional .android.graphics.RectProto last_non_fullscreen_bounds = 5;
+ optional string real_activity = 6;
+ optional string orig_activity = 7;
+ optional int32 activity_type = 8;
+ optional int32 resize_mode = 9;
+ optional bool fullscreen = 10;
+ optional .android.graphics.RectProto bounds = 11;
+ optional int32 min_width = 12;
+ optional int32 min_height = 13;
}
message ActivityRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
- optional .com.android.server.wm.IdentifierProto identifier = 2;
- optional string state = 3;
- optional bool visible = 4;
- optional bool front_of_task = 5;
- optional int32 proc_id = 6;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.IdentifierProto identifier = 2;
+ optional string state = 3;
+ optional bool visible = 4;
+ optional bool front_of_task = 5;
+ optional int32 proc_id = 6;
}
message KeyguardControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool keyguard_showing = 1;
- optional bool keyguard_occluded = 2;
+ optional bool keyguard_showing = 1;
+ optional bool keyguard_occluded = 2;
}
// "dumpsys activity --proto broadcasts"
message ActivityManagerServiceDumpBroadcastsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- repeated ReceiverListProto receiver_list = 1;
-
- optional .com.android.server.IntentResolverProto receiver_resolver = 2;
-
- repeated BroadcastQueueProto broadcast_queue = 3;
-
- repeated StickyBroadcastProto sticky_broadcasts = 4;
-
- message MainHandler {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string handler = 1;
- optional .android.os.LooperProto looper = 2;
- }
- optional MainHandler handler = 5;
+ repeated ReceiverListProto receiver_list = 1;
+
+ optional .com.android.server.IntentResolverProto receiver_resolver = 2;
+
+ repeated BroadcastQueueProto broadcast_queue = 3;
+
+ repeated StickyBroadcastProto sticky_broadcasts = 4;
+
+ message MainHandler {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string handler = 1;
+ optional .android.os.LooperProto looper = 2;
+ }
+ optional MainHandler handler = 5;
}
message ReceiverListProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ProcessRecordProto app = 1;
- optional int32 pid = 2;
- optional int32 uid = 3;
- optional int32 user = 4;
- optional BroadcastRecordProto current = 5;
- optional bool linked_to_death = 6;
- repeated BroadcastFilterProto filters = 7;
- optional string hex_hash = 8; // used to find this ReceiverList object in IntentResolver
+ optional ProcessRecordProto app = 1;
+ optional int32 pid = 2;
+ optional int32 uid = 3;
+ optional int32 user = 4;
+ optional BroadcastRecordProto current = 5;
+ optional bool linked_to_death = 6;
+ repeated BroadcastFilterProto filters = 7;
+ optional string hex_hash = 8; // used to find this ReceiverList object in IntentResolver
}
message ProcessRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 pid = 1;
- optional string process_name = 2;
- optional int32 uid = 3;
- optional int32 user_id = 4;
- optional int32 app_id = 5;
- optional int32 isolated_app_id = 6;
- optional bool persistent = 7;
-}
-
-message BroadcastRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 user_id = 1;
- optional string intent_action = 2;
-}
-
-message BroadcastFilterProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional .android.content.IntentFilterProto intent_filter = 1;
- optional string required_permission = 2;
- optional string hex_hash = 3; // used to find the BroadcastFilter object in IntentResolver
- optional int32 owning_user_id = 4;
-}
-
-message BroadcastQueueProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string queue_name = 1;
- repeated BroadcastRecordProto parallel_broadcasts = 2;
- repeated BroadcastRecordProto ordered_broadcasts = 3;
- optional BroadcastRecordProto pending_broadcast = 4;
- repeated BroadcastRecordProto historical_broadcasts = 5;
-
- message BroadcastSummary {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional .android.content.IntentProto intent = 1;
- optional int64 enqueue_clock_time_ms = 2;
- optional int64 dispatch_clock_time_ms = 3;
- optional int64 finish_clock_time_ms = 4;
- }
- repeated BroadcastSummary historical_broadcasts_summary = 6;
-}
-
-message MemInfoDumpProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 uptime_duration_ms = 1;
- optional int64 elapsed_realtime_ms = 2;
-
- message ProcessMemory {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 pid = 1;
optional string process_name = 2;
+ optional int32 uid = 3;
+ optional int32 user_id = 4;
+ optional int32 app_id = 5;
+ optional int32 isolated_app_id = 6;
+ optional bool persistent = 7;
+}
- message MemoryInfo {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string name = 1;
- // The proportional set size for the heap.
- optional int32 total_pss_kb = 2;
- // The proportional set size that is swappable for the heap.
- optional int32 clean_pss_kb = 3;
- // The private dirty pages used by the heap.
- optional int32 shared_dirty_kb = 4;
- // The shared dirty pages used by the heap.
- optional int32 private_dirty_kb = 5;
- // The shared clean pages used by the heap.
- optional int32 shared_clean_kb = 6;
- // The private clean pages used by the heap.
- optional int32 private_clean_kb = 7;
- oneof dirty_swap {
- // The dirty the pages that have been swapped out.
- int32 dirty_swap_kb = 8;
- // The dirty the pages that have been swapped out, proportional.
- int32 dirty_swap_pss_kb = 9;
- }
- }
- message HeapInfo {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional MemoryInfo mem_info = 1;
- optional int32 heap_size_kb = 2;
- optional int32 heap_alloc_kb = 3;
- optional int32 heap_free_kb = 4;
- }
- optional HeapInfo native_heap = 3;
- optional HeapInfo dalvik_heap = 4;
- repeated MemoryInfo other_heaps = 5;
- optional MemoryInfo unknown_heap = 6;
- // Summation of native_heap, dalvik_heap, and other_heaps.
- optional HeapInfo total_heap = 7;
-
- repeated MemoryInfo dalvik_details = 8;
-
- message AppSummary {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 java_heap_pss_kb = 1;
- optional int32 native_heap_pss_kb = 2;
- optional int32 code_pss_kb = 3;
- optional int32 stack_pss_kb = 4;
- optional int32 graphics_pss_kb = 5;
- optional int32 private_other_pss_kb = 6;
- optional int32 system_pss_kb = 7;
-
- oneof total_swap {
- int32 total_swap_pss = 8;
- int32 total_swap_kb = 9;
- }
- }
- optional AppSummary app_summary = 9;
- }
- repeated ProcessMemory native_processes = 3;
-
- message AppData {
+message BroadcastRecordProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ProcessMemory process_memory = 1;
+ optional int32 user_id = 1;
+ optional string intent_action = 2;
+}
- message ObjectStats {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+message BroadcastFilterProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 view_instance_count = 1;
- optional int32 view_root_instance_count = 2;
- optional int32 app_context_instance_count = 3;
- optional int32 activity_instance_count = 4;
- optional int32 global_asset_count = 5;
- optional int32 global_asset_manager_count = 6;
- optional int32 local_binder_object_count = 7;
- optional int32 proxy_binder_object_count = 8;
- optional int64 parcel_memory_kb = 9;
- optional int32 parcel_count = 10;
- optional int32 binder_object_death_count = 11;
- optional int32 open_ssl_socket_count = 12;
- optional int32 webview_instance_count = 13;
- }
- optional ObjectStats objects = 2;
+ optional .android.content.IntentFilterProto intent_filter = 1;
+ optional string required_permission = 2;
+ optional string hex_hash = 3; // used to find the BroadcastFilter object in IntentResolver
+ optional int32 owning_user_id = 4;
+}
- message SqlStats {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+message BroadcastQueueProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 memory_used_kb = 1;
- optional int32 pagecache_overflow_kb = 2;
- optional int32 malloc_size_kb = 3;
+ optional string queue_name = 1;
+ repeated BroadcastRecordProto parallel_broadcasts = 2;
+ repeated BroadcastRecordProto ordered_broadcasts = 3;
+ optional BroadcastRecordProto pending_broadcast = 4;
+ repeated BroadcastRecordProto historical_broadcasts = 5;
- message Database {
+ message BroadcastSummary {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string name = 1;
- optional int32 page_size = 2;
- optional int32 db_size = 3;
- // Number of lookaside slots:
- // http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html
- optional int32 lookaside_b = 4;
- // Statement cache stats: hits/misses/cachesize
- optional string cache = 5;
- }
- repeated Database databases = 4;
+ optional .android.content.IntentProto intent = 1;
+ optional int64 enqueue_clock_time_ms = 2;
+ optional int64 dispatch_clock_time_ms = 3;
+ optional int64 finish_clock_time_ms = 4;
}
- optional SqlStats sql = 3;
+ repeated BroadcastSummary historical_broadcasts_summary = 6;
+}
- optional string asset_allocations = 4;
- optional string unreachable_memory = 5;
- }
- repeated AppData app_processes = 4;
-
- message MemItem {
+message MemInfoDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string tag = 1;
- optional string label = 2;
- optional int32 id = 3;
- optional bool is_proc = 4;
- optional bool has_activities = 5;
- optional int64 pss_kb = 6;
- optional int64 swap_pss_kb = 7;
- repeated MemItem sub_items = 8;
- }
- repeated MemItem total_pss_by_process = 5;
- repeated MemItem total_pss_by_oom_adjustment = 6;
- repeated MemItem total_pss_by_category = 7;
+ optional int64 uptime_duration_ms = 1;
+ optional int64 elapsed_realtime_ms = 2;
- optional int64 total_ram_kb = 8;
- optional .com.android.internal.app.procstats.ProcessStatsProto.MemoryFactor status = 9;
- // Total free RAM = cached_pss_kb + cached_kernel_kb + free_kb.
- optional int64 cached_pss_kb = 10;
- optional int64 cached_kernel_kb = 11;
- optional int64 free_kb = 12;
- // Total used RAM = used_pss_kb + used_kernel_kb.
- optional int64 used_pss_kb = 13;
- optional int64 used_kernel_kb = 14;
+ message ProcessMemory {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int64 lost_ram_kb = 15;
+ optional int32 pid = 1;
+ optional string process_name = 2;
- optional int64 total_zram_kb = 16;
- optional int64 zram_physical_used_in_swap_kb = 17;
- optional int64 total_zram_swap_kb = 18;
+ message MemoryInfo {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int64 ksm_sharing_kb = 19;
- optional int64 ksm_shared_kb = 20;
- optional int64 ksm_unshared_kb = 21;
- optional int64 ksm_volatile_kb = 22;
+ optional string name = 1;
+ // The proportional set size for the heap.
+ optional int32 total_pss_kb = 2;
+ // The proportional set size that is swappable for the heap.
+ optional int32 clean_pss_kb = 3;
+ // The private dirty pages used by the heap.
+ optional int32 shared_dirty_kb = 4;
+ // The shared dirty pages used by the heap.
+ optional int32 private_dirty_kb = 5;
+ // The shared clean pages used by the heap.
+ optional int32 shared_clean_kb = 6;
+ // The private clean pages used by the heap.
+ optional int32 private_clean_kb = 7;
+ oneof dirty_swap {
+ // The dirty the pages that have been swapped out.
+ int32 dirty_swap_kb = 8;
+ // The dirty the pages that have been swapped out, proportional.
+ int32 dirty_swap_pss_kb = 9;
+ }
+ }
+ message HeapInfo {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // The approximate per-application memory class of the current device. This
- // gives developers an idea of how hard a memory limit you should impose on
- // their application to let the overall system work best. The value is in
- // megabytes; the baseline Android memory class is 16 (which happens to be the
- // Java heap limit of those devices); some devices with more memory may have
- // 24 or even higher numbers.
- optional int32 tuning_mb = 23;
- // The approximate per-application memory class of the current device when an
- // application is running with a large heap. This is the space available for
- // memory-intensive applications; most applications should not need this
- // amount of memory, and should instead stay with the tuning_mb limit. The
- // value is in megabytes. This may be the same size as tuning_mb on memory
- // constrained devices, or it may be significantly larger on devices with a
- // large amount of available RAM.
- // This is the size of the application's Dalvik heap if it has specified
- // 'android:largeHeap="true"' in its manifest.
- optional int32 tuning_large_mb = 24;
+ optional MemoryInfo mem_info = 1;
+ optional int32 heap_size_kb = 2;
+ optional int32 heap_alloc_kb = 3;
+ optional int32 heap_free_kb = 4;
+ }
+ optional HeapInfo native_heap = 3;
+ optional HeapInfo dalvik_heap = 4;
+ repeated MemoryInfo other_heaps = 5;
+ optional MemoryInfo unknown_heap = 6;
+ // Summation of native_heap, dalvik_heap, and other_heaps.
+ optional HeapInfo total_heap = 7;
- optional int64 oom_kb = 25;
+ repeated MemoryInfo dalvik_details = 8;
- // The maximum pss size in kb that we consider a process acceptable to restore
- // from its cached state for running in the background when RAM is low.
- optional int64 restore_limit_kb = 26;
+ message AppSummary {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool is_low_ram_device = 27;
- optional bool is_high_end_gfx = 28;
+ optional int32 java_heap_pss_kb = 1;
+ optional int32 native_heap_pss_kb = 2;
+ optional int32 code_pss_kb = 3;
+ optional int32 stack_pss_kb = 4;
+ optional int32 graphics_pss_kb = 5;
+ optional int32 private_other_pss_kb = 6;
+ optional int32 system_pss_kb = 7;
+
+ oneof total_swap {
+ int32 total_swap_pss = 8;
+ int32 total_swap_kb = 9;
+ }
+ }
+ optional AppSummary app_summary = 9;
+ }
+ repeated ProcessMemory native_processes = 3;
+
+ message AppData {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional ProcessMemory process_memory = 1;
+
+ message ObjectStats {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 view_instance_count = 1;
+ optional int32 view_root_instance_count = 2;
+ optional int32 app_context_instance_count = 3;
+ optional int32 activity_instance_count = 4;
+ optional int32 global_asset_count = 5;
+ optional int32 global_asset_manager_count = 6;
+ optional int32 local_binder_object_count = 7;
+ optional int32 proxy_binder_object_count = 8;
+ optional int64 parcel_memory_kb = 9;
+ optional int32 parcel_count = 10;
+ optional int32 binder_object_death_count = 11;
+ optional int32 open_ssl_socket_count = 12;
+ optional int32 webview_instance_count = 13;
+ }
+ optional ObjectStats objects = 2;
+
+ message SqlStats {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 memory_used_kb = 1;
+ optional int32 pagecache_overflow_kb = 2;
+ optional int32 malloc_size_kb = 3;
+
+ message Database {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ optional int32 page_size = 2;
+ optional int32 db_size = 3;
+ // Number of lookaside slots:
+ // http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html
+ optional int32 lookaside_b = 4;
+ // Statement cache stats: hits/misses/cachesize
+ optional string cache = 5;
+ }
+ repeated Database databases = 4;
+ }
+ optional SqlStats sql = 3;
+
+ optional string asset_allocations = 4;
+ optional string unreachable_memory = 5;
+ }
+ repeated AppData app_processes = 4;
+
+ message MemItem {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string tag = 1;
+ optional string label = 2;
+ optional int32 id = 3;
+ optional bool is_proc = 4;
+ optional bool has_activities = 5;
+ optional int64 pss_kb = 6;
+ optional int64 swap_pss_kb = 7;
+ repeated MemItem sub_items = 8;
+ }
+ repeated MemItem total_pss_by_process = 5;
+ repeated MemItem total_pss_by_oom_adjustment = 6;
+ repeated MemItem total_pss_by_category = 7;
+
+ optional int64 total_ram_kb = 8;
+ optional .com.android.internal.app.procstats.ProcessStatsProto.MemoryFactor status = 9;
+ // Total free RAM = cached_pss_kb + cached_kernel_kb + free_kb.
+ optional int64 cached_pss_kb = 10;
+ optional int64 cached_kernel_kb = 11;
+ optional int64 free_kb = 12;
+ // Total used RAM = used_pss_kb + used_kernel_kb.
+ optional int64 used_pss_kb = 13;
+ optional int64 used_kernel_kb = 14;
+
+ optional int64 lost_ram_kb = 15;
+
+ optional int64 total_zram_kb = 16;
+ optional int64 zram_physical_used_in_swap_kb = 17;
+ optional int64 total_zram_swap_kb = 18;
+
+ optional int64 ksm_sharing_kb = 19;
+ optional int64 ksm_shared_kb = 20;
+ optional int64 ksm_unshared_kb = 21;
+ optional int64 ksm_volatile_kb = 22;
+
+ // The approximate per-application memory class of the current device. This
+ // gives developers an idea of how hard a memory limit you should impose on
+ // their application to let the overall system work best. The value is in
+ // megabytes; the baseline Android memory class is 16 (which happens to be the
+ // Java heap limit of those devices); some devices with more memory may have
+ // 24 or even higher numbers.
+ optional int32 tuning_mb = 23;
+ // The approximate per-application memory class of the current device when an
+ // application is running with a large heap. This is the space available for
+ // memory-intensive applications; most applications should not need this
+ // amount of memory, and should instead stay with the tuning_mb limit. The
+ // value is in megabytes. This may be the same size as tuning_mb on memory
+ // constrained devices, or it may be significantly larger on devices with a
+ // large amount of available RAM.
+ // This is the size of the application's Dalvik heap if it has specified
+ // 'android:largeHeap="true"' in its manifest.
+ optional int32 tuning_large_mb = 24;
+
+ optional int64 oom_kb = 25;
+
+ // The maximum pss size in kb that we consider a process acceptable to restore
+ // from its cached state for running in the background when RAM is low.
+ optional int64 restore_limit_kb = 26;
+
+ optional bool is_low_ram_device = 27;
+ optional bool is_high_end_gfx = 28;
}
message StickyBroadcastProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 user = 1;
-
- message StickyAction {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string name = 1;
- repeated .android.content.IntentProto intents = 2;
- }
- repeated StickyAction actions = 2;
+ optional int32 user = 1;
+
+ message StickyAction {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+ repeated .android.content.IntentProto intents = 2;
+ }
+ repeated StickyAction actions = 2;
}
// "dumpsys activity --proto service"
message ActivityManagerServiceDumpServicesProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ActiveServicesProto active_services = 1;
+ optional ActiveServicesProto active_services = 1;
}
message ActiveServicesProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- message ServicesByUser {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 user_id = 1;
- repeated ServiceRecordProto service_records = 2;
- }
- repeated ServicesByUser services_by_users = 1;
+ message ServicesByUser {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 user_id = 1;
+ repeated ServiceRecordProto service_records = 2;
+ }
+ repeated ServicesByUser services_by_users = 1;
}
// corresponds to ActivityManagerService.GrantUri Java class
message GrantUriProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 source_user_id = 1;
- optional string uri = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 source_user_id = 1;
+ optional string uri = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
message NeededUriGrantsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string target_package = 1;
- optional int32 target_uid = 2;
- optional int32 flags = 3;
+ optional string target_package = 1;
+ optional int32 target_uid = 2;
+ optional int32 flags = 3;
- repeated GrantUriProto grants = 4;
+ repeated GrantUriProto grants = 4;
}
message UriPermissionOwnerProto {
- option (.android.msg_privacy).dest = DEST_EXPLICIT;
+ option (.android.msg_privacy).dest = DEST_EXPLICIT;
- optional string owner = 1;
- repeated GrantUriProto read_perms = 2;
- repeated GrantUriProto write_perms = 3;
+ optional string owner = 1;
+ repeated GrantUriProto read_perms = 2;
+ repeated GrantUriProto write_perms = 3;
}
message ServiceRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string short_name = 1;
- optional bool is_running = 2; // false if the application service is null
- optional int32 pid = 3;
- optional .android.content.IntentProto intent = 4;
- optional string package_name = 5;
- optional string process_name = 6;
- optional string permission = 7;
-
- message AppInfo {
- option (.android.msg_privacy).dest = DEST_EXPLICIT;
-
- optional string base_dir = 1;
- optional string res_dir = 2;
- optional string data_dir = 3;
- }
- optional AppInfo appinfo = 8;
- optional ProcessRecordProto app = 9;
- optional ProcessRecordProto isolated_proc = 10;
- optional bool whitelist_manager = 11;
- optional bool delayed = 12;
-
- message Foreground {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 id = 1;
- optional .android.app.NotificationProto notification = 2;
- }
- optional Foreground foreground = 13;
+ optional string short_name = 1;
+ optional bool is_running = 2; // false if the application service is null
+ optional int32 pid = 3;
+ optional .android.content.IntentProto intent = 4;
+ optional string package_name = 5;
+ optional string process_name = 6;
+ optional string permission = 7;
- optional .android.util.Duration create_real_time = 14;
- optional .android.util.Duration starting_bg_timeout = 15;
- optional .android.util.Duration last_activity_time = 16;
- optional .android.util.Duration restart_time = 17;
- optional bool created_from_fg = 18;
+ message AppInfo {
+ option (.android.msg_privacy).dest = DEST_EXPLICIT;
- // variables used to track states related to service start
- message Start {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional string base_dir = 1;
+ optional string res_dir = 2;
+ optional string data_dir = 3;
+ }
+ optional AppInfo appinfo = 8;
+ optional ProcessRecordProto app = 9;
+ optional ProcessRecordProto isolated_proc = 10;
+ optional bool whitelist_manager = 11;
+ optional bool delayed = 12;
- optional bool start_requested = 1;
- optional bool delayed_stop = 2;
- optional bool stop_if_killed = 3;
- optional bool call_start = 4;
- optional int32 last_start_id = 5;
- }
- optional Start start = 19;
+ message Foreground {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message ExecuteNesting {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional int32 id = 1;
+ optional .android.app.NotificationProto notification = 2;
+ }
+ optional Foreground foreground = 13;
- optional int32 execute_nesting = 1;
- optional bool execute_fg = 2;
- optional .android.util.Duration executing_start = 3;
- }
- optional ExecuteNesting execute = 20;
+ optional .android.util.Duration create_real_time = 14;
+ optional .android.util.Duration starting_bg_timeout = 15;
+ optional .android.util.Duration last_activity_time = 16;
+ optional .android.util.Duration restart_time = 17;
+ optional bool created_from_fg = 18;
- optional .android.util.Duration destory_time = 21;
+ // variables used to track states related to service start
+ message Start {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message Crash {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional bool start_requested = 1;
+ optional bool delayed_stop = 2;
+ optional bool stop_if_killed = 3;
+ optional bool call_start = 4;
+ optional int32 last_start_id = 5;
+ }
+ optional Start start = 19;
- optional int32 restart_count = 1;
- optional .android.util.Duration restart_delay = 2;
- optional .android.util.Duration next_restart_time = 3;
- optional int32 crash_count = 4;
- }
- optional Crash crash = 22;
+ message ExecuteNesting {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message StartItem {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional int32 execute_nesting = 1;
+ optional bool execute_fg = 2;
+ optional .android.util.Duration executing_start = 3;
+ }
+ optional ExecuteNesting execute = 20;
- optional int32 id = 1;
- optional .android.util.Duration duration = 2;
- optional int32 delivery_count = 3;
- optional int32 done_executing_count = 4;
- optional .android.content.IntentProto intent = 5;
- optional NeededUriGrantsProto needed_grants = 6;
- optional UriPermissionOwnerProto uri_permissions = 7;
- }
- repeated StartItem delivered_starts = 23;
- repeated StartItem pending_starts = 24;
+ optional .android.util.Duration destory_time = 21;
- repeated IntentBindRecordProto bindings = 25;
- repeated ConnectionRecordProto connections = 26;
+ message Crash {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // Next Tag: 27
+ optional int32 restart_count = 1;
+ optional .android.util.Duration restart_delay = 2;
+ optional .android.util.Duration next_restart_time = 3;
+ optional int32 crash_count = 4;
+ }
+ optional Crash crash = 22;
+
+ message StartItem {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 id = 1;
+ optional .android.util.Duration duration = 2;
+ optional int32 delivery_count = 3;
+ optional int32 done_executing_count = 4;
+ optional .android.content.IntentProto intent = 5;
+ optional NeededUriGrantsProto needed_grants = 6;
+ optional UriPermissionOwnerProto uri_permissions = 7;
+ }
+ repeated StartItem delivered_starts = 23;
+ repeated StartItem pending_starts = 24;
+
+ repeated IntentBindRecordProto bindings = 25;
+ repeated ConnectionRecordProto connections = 26;
+
+ // Next Tag: 27
}
message ConnectionRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // used to find same record, e.g. AppBindRecord has the hex_hash
- optional string hex_hash = 1; // cross reference the object and avoid double logging.
- optional int32 user_id = 2;
+ // used to find same record, e.g. AppBindRecord has the hex_hash
+ optional string hex_hash = 1; // cross reference the object and avoid double logging.
+ optional int32 user_id = 2;
- enum Flag {
- AUTO_CREATE = 0;
- DEBUG_UNBIND = 1;
- NOT_FG = 2;
- IMPORTANT_BG = 3;
- ABOVE_CLIENT = 4;
- ALLOW_OOM_MANAGEMENT = 5;
- WAIVE_PRIORITY = 6;
- IMPORTANT = 7;
- ADJUST_WITH_ACTIVITY = 8;
- FG_SERVICE_WHILE_AWAKE = 9;
- FG_SERVICE = 10;
- TREAT_LIKE_ACTIVITY = 11;
- VISIBLE = 12;
- SHOWING_UI = 13;
- NOT_VISIBLE = 14;
- DEAD = 15;
- }
- repeated Flag flags = 3;
- optional string service_name = 4;
+ enum Flag {
+ AUTO_CREATE = 0;
+ DEBUG_UNBIND = 1;
+ NOT_FG = 2;
+ IMPORTANT_BG = 3;
+ ABOVE_CLIENT = 4;
+ ALLOW_OOM_MANAGEMENT = 5;
+ WAIVE_PRIORITY = 6;
+ IMPORTANT = 7;
+ ADJUST_WITH_ACTIVITY = 8;
+ FG_SERVICE_WHILE_AWAKE = 9;
+ FG_SERVICE = 10;
+ TREAT_LIKE_ACTIVITY = 11;
+ VISIBLE = 12;
+ SHOWING_UI = 13;
+ NOT_VISIBLE = 14;
+ DEAD = 15;
+ }
+ repeated Flag flags = 3;
+ optional string service_name = 4;
}
message AppBindRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string service_name = 1;
- optional string client_proc_name = 2;
- repeated string connections = 3; // hex_hash of ConnectionRecordProto
+ optional string service_name = 1;
+ optional string client_proc_name = 2;
+ repeated string connections = 3; // hex_hash of ConnectionRecordProto
}
message IntentBindRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.content.IntentProto intent = 1;
- optional string binder = 2;
- optional bool auto_create = 3; // value of BIND_AUTO_CREATE flag.
- optional bool requested = 4;
- optional bool received = 5;
- optional bool has_bound = 6;
- optional bool do_rebind = 7;
+ optional .android.content.IntentProto intent = 1;
+ optional string binder = 2;
+ optional bool auto_create = 3; // value of BIND_AUTO_CREATE flag.
+ optional bool requested = 4;
+ optional bool received = 5;
+ optional bool has_bound = 6;
+ optional bool do_rebind = 7;
- repeated AppBindRecordProto apps = 8;
+ repeated AppBindRecordProto apps = 8;
}
// TODO: "dumpsys activity --proto processes"
message ActivityManagerServiceDumpProcessesProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- repeated ProcessRecordProto procs = 1;
- repeated ProcessRecordProto isolated_procs = 2;
- repeated ActiveInstrumentationProto active_instrumentations = 3;
- repeated UidRecordProto active_uids = 4;
- repeated UidRecordProto validate_uids = 5;
-
- // Process LRU list (sorted by oom_adj)
- message LruProcesses {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 size = 1;
- optional int32 non_act_at = 2;
- optional int32 non_svc_at = 3;
- repeated ProcessOomProto list = 4;
- }
- optional LruProcesses lru_procs = 6;
- repeated ProcessRecordProto pids_self_locked = 7;
- // Foreground Processes
- repeated ImportanceTokenProto important_procs = 8;
- // Persisent processes that are starting
- repeated ProcessRecordProto persistent_starting_procs = 9;
- // Processes that are being removed
- repeated ProcessRecordProto removed_procs = 10;
- // Processes that are on old until the system is ready
- repeated ProcessRecordProto on_hold_procs = 11;
- // Processes that are waiting to GC
- repeated ProcessToGcProto gc_procs = 12;
- optional AppErrorsProto app_errors = 13;
- optional UserControllerProto user_controller = 14;
- optional ProcessRecordProto home_proc = 15;
- optional ProcessRecordProto previous_proc = 16;
- optional int64 previous_proc_visible_time_ms = 17;
- optional ProcessRecordProto heavy_weight_proc = 18;
- optional .android.content.ConfigurationProto global_configuration = 19;
- // ActivityStackSupervisorProto dumps these values as well, still here?
- // repeated ActivityDisplayProto displays = 20;
+ repeated ProcessRecordProto procs = 1;
+ repeated ProcessRecordProto isolated_procs = 2;
+ repeated ActiveInstrumentationProto active_instrumentations = 3;
+ repeated UidRecordProto active_uids = 4;
+ repeated UidRecordProto validate_uids = 5;
- optional bool config_will_change = 21;
+ // Process LRU list (sorted by oom_adj)
+ message LruProcesses {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message ScreenCompatPackage {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string package = 1;
- optional int32 mode = 2;
- }
- repeated ScreenCompatPackage screen_compat_packages = 22;
-
- message UidObserverRegistrationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 uid = 1;
- optional string package = 2;
- repeated .android.app.UidObserverFlag flags = 3;
- optional int32 cut_point = 4; // only available when UID_OBSERVER_PROCSTATE is on
-
- message ProcState {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 uid = 1;
- optional int32 state = 2;
+ optional int32 size = 1;
+ optional int32 non_act_at = 2;
+ optional int32 non_svc_at = 3;
+ repeated ProcessOomProto list = 4;
}
- repeated ProcState last_proc_states = 5;
- }
- repeated UidObserverRegistrationProto uid_observers = 23;
- repeated int32 device_idle_whitelist = 24;
- repeated int32 device_idle_temp_whitelist = 25;
+ optional LruProcesses lru_procs = 6;
+ repeated ProcessRecordProto pids_self_locked = 7;
+ // Foreground Processes
+ repeated ImportanceTokenProto important_procs = 8;
+ // Persisent processes that are starting
+ repeated ProcessRecordProto persistent_starting_procs = 9;
+ // Processes that are being removed
+ repeated ProcessRecordProto removed_procs = 10;
+ // Processes that are on old until the system is ready
+ repeated ProcessRecordProto on_hold_procs = 11;
+ // Processes that are waiting to GC
+ repeated ProcessToGcProto gc_procs = 12;
+ optional AppErrorsProto app_errors = 13;
+ optional UserControllerProto user_controller = 14;
+ optional ProcessRecordProto home_proc = 15;
+ optional ProcessRecordProto previous_proc = 16;
+ optional int64 previous_proc_visible_time_ms = 17;
+ optional ProcessRecordProto heavy_weight_proc = 18;
+ optional .android.content.ConfigurationProto global_configuration = 19;
+ // ActivityStackSupervisorProto dumps these values as well, still here?
+ // repeated ActivityDisplayProto displays = 20;
- message PendingTempWhitelist {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional bool config_will_change = 21;
- optional int32 target_uid = 1;
- optional int64 duration_ms = 2;
- optional string tag = 3;
- }
- repeated PendingTempWhitelist pending_temp_whitelist = 26;
+ message ScreenCompatPackage {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message SleepStatus {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional string package = 1;
+ optional int32 mode = 2;
+ }
+ repeated ScreenCompatPackage screen_compat_packages = 22;
- optional .android.os.PowerManagerInternalProto.Wakefulness wakefulness = 1;
- repeated string sleep_tokens = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional bool sleeping = 3;
- optional bool shutting_down = 4;
- optional bool test_pss_mode = 5;
- }
- optional SleepStatus sleep_status = 27;
-
- message Voice {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string session = 1;
- optional .android.os.PowerManagerProto.WakeLock wakelock = 2;
- }
- optional Voice running_voice = 28;
-
- optional VrControllerProto vr_controller = 29;
-
- message DebugApp {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string debug_app = 1;
- optional string orig_debug_app = 2;
- optional bool debug_transient = 3;
- optional bool orig_wait_for_debugger = 4;
- }
- optional DebugApp debug = 30;
- optional AppTimeTrackerProto current_tracker = 31;
-
- message MemWatchProcess {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- message Process {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string name = 1;
-
- message MemStats {
+ message UidObserverRegistrationProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 uid = 1;
- optional string size = 2;
- optional string report_to = 3;
- }
- repeated MemStats mem_stats = 2;
+ optional string package = 2;
+ repeated .android.app.UidObserverFlag flags = 3;
+ optional int32 cut_point = 4; // only available when UID_OBSERVER_PROCSTATE is on
+
+ message ProcState {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 uid = 1;
+ optional int32 state = 2;
+ }
+ repeated ProcState last_proc_states = 5;
}
- repeated Process procs = 1;
+ repeated UidObserverRegistrationProto uid_observers = 23;
+ repeated int32 device_idle_whitelist = 24;
+ repeated int32 device_idle_temp_whitelist = 25;
- message Dump {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message PendingTempWhitelist {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string proc_name = 1;
- optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional int32 pid = 3;
- optional int32 uid = 4;
+ optional int32 target_uid = 1;
+ optional int64 duration_ms = 2;
+ optional string tag = 3;
}
- optional Dump dump = 2;
- }
- optional MemWatchProcess mem_watch_processes = 32;
- optional string track_allocation_app = 33;
+ repeated PendingTempWhitelist pending_temp_whitelist = 26;
- message Profile {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message SleepStatus {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string app_name = 1;
- optional ProcessRecordProto proc = 2;
- optional .android.app.ProfilerInfoProto info = 3;
- optional int32 type = 4;
- }
- optional Profile profile = 34;
- optional string native_debugging_app = 35;
- optional bool always_finish_activities = 36;
+ optional .android.os.PowerManagerInternalProto.Wakefulness wakefulness = 1;
+ repeated string sleep_tokens = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional bool sleeping = 3;
+ optional bool shutting_down = 4;
+ optional bool test_pss_mode = 5;
+ }
+ optional SleepStatus sleep_status = 27;
- message Controller {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Voice {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string controller = 1;
- optional bool is_a_monkey = 2;
- }
- optional Controller controller = 37;
+ optional string session = 1;
+ optional .android.os.PowerManagerProto.WakeLock wakelock = 2;
+ }
+ optional Voice running_voice = 28;
- optional int32 total_persistent_procs = 38;
- optional bool processes_ready = 39;
- optional bool system_ready = 40;
- optional bool booted = 41;
- optional int32 factory_test = 42;
- optional bool booting = 43;
- optional bool call_finish_booting = 44;
- optional bool boot_animation_complete = 45;
- optional int64 last_power_check_uptime_ms = 46;
- optional .android.os.PowerManagerProto.WakeLock going_to_sleep = 47;
- optional .android.os.PowerManagerProto.WakeLock launching_activity = 48;
- optional int32 adj_seq = 49;
- optional int32 lru_seq = 50;
- optional int32 num_non_cached_procs = 51;
- optional int32 num_cached_hidden_procs = 52;
- optional int32 num_service_procs = 53;
- optional int32 new_num_service_procs = 54;
- optional bool allow_lower_mem_level = 55;
- optional int32 last_memory_level = 56;
- optional int32 last_num_processes = 57;
- optional .android.util.Duration last_idle_time = 58;
- optional int64 low_ram_since_last_idle_ms = 59;
+ optional VrControllerProto vr_controller = 29;
+
+ message DebugApp {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string debug_app = 1;
+ optional string orig_debug_app = 2;
+ optional bool debug_transient = 3;
+ optional bool orig_wait_for_debugger = 4;
+ }
+ optional DebugApp debug = 30;
+ optional AppTimeTrackerProto current_tracker = 31;
+
+ message MemWatchProcess {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ message Process {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string name = 1;
+
+ message MemStats {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 uid = 1;
+ optional string size = 2;
+ optional string report_to = 3;
+ }
+ repeated MemStats mem_stats = 2;
+ }
+ repeated Process procs = 1;
+
+ message Dump {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string proc_name = 1;
+ optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 pid = 3;
+ optional int32 uid = 4;
+ }
+ optional Dump dump = 2;
+ }
+ optional MemWatchProcess mem_watch_processes = 32;
+ optional string track_allocation_app = 33;
+
+ message Profile {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string app_name = 1;
+ optional ProcessRecordProto proc = 2;
+ optional .android.app.ProfilerInfoProto info = 3;
+ optional int32 type = 4;
+ }
+ optional Profile profile = 34;
+ optional string native_debugging_app = 35;
+ optional bool always_finish_activities = 36;
+
+ message Controller {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string controller = 1;
+ optional bool is_a_monkey = 2;
+ }
+ optional Controller controller = 37;
+
+ optional int32 total_persistent_procs = 38;
+ optional bool processes_ready = 39;
+ optional bool system_ready = 40;
+ optional bool booted = 41;
+ optional int32 factory_test = 42;
+ optional bool booting = 43;
+ optional bool call_finish_booting = 44;
+ optional bool boot_animation_complete = 45;
+ optional int64 last_power_check_uptime_ms = 46;
+ optional .android.os.PowerManagerProto.WakeLock going_to_sleep = 47;
+ optional .android.os.PowerManagerProto.WakeLock launching_activity = 48;
+ optional int32 adj_seq = 49;
+ optional int32 lru_seq = 50;
+ optional int32 num_non_cached_procs = 51;
+ optional int32 num_cached_hidden_procs = 52;
+ optional int32 num_service_procs = 53;
+ optional int32 new_num_service_procs = 54;
+ optional bool allow_lower_mem_level = 55;
+ optional int32 last_memory_level = 56;
+ optional int32 last_num_processes = 57;
+ optional .android.util.Duration last_idle_time = 58;
+ optional int64 low_ram_since_last_idle_ms = 59;
}
message ActiveInstrumentationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.content.ComponentNameProto class = 1;
- optional bool finished = 2;
- repeated ProcessRecordProto running_processes = 3;
- repeated string target_processes = 4;
- optional .android.content.pm.ApplicationInfoProto target_info = 5;
- optional string profile_file = 6;
- optional string watcher = 7;
- optional string ui_automation_connection = 8;
- optional string arguments = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional .android.content.ComponentNameProto class = 1;
+ optional bool finished = 2;
+ repeated ProcessRecordProto running_processes = 3;
+ repeated string target_processes = 4;
+ optional .android.content.pm.ApplicationInfoProto target_info = 5;
+ optional string profile_file = 6;
+ optional string watcher = 7;
+ optional string ui_automation_connection = 8;
+ optional string arguments = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
// Proto definition of com.android.server.am.UidRecord.java
message UidRecordProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int32 uid = 1;
- optional .android.app.ProcessStateEnum current = 2;
- optional bool ephemeral = 3;
- optional bool fg_services = 4;
- optional bool whilelist = 5;
- optional .android.util.Duration last_background_time = 6;
- optional bool idle = 7;
-
- enum Change {
- CHANGE_GONE = 0;
- CHANGE_IDLE = 1;
- CHANGE_ACTIVE = 2;
- CHANGE_CACHED = 3;
- CHANGE_UNCACHED = 4;
- }
- repeated Change last_reported_changes = 8;
- optional int32 num_procs = 9;
-
- message ProcStateSequence {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int64 cururent = 1;
- optional int64 last_network_updated = 2;
- optional int64 last_dispatched = 3;
- }
- optional ProcStateSequence network_state_update = 10;
+ optional int32 uid = 1;
+ optional .android.app.ProcessStateEnum current = 2;
+ optional bool ephemeral = 3;
+ optional bool fg_services = 4;
+ optional bool whilelist = 5;
+ optional .android.util.Duration last_background_time = 6;
+ optional bool idle = 7;
- // Next Tag: 11
+ enum Change {
+ CHANGE_GONE = 0;
+ CHANGE_IDLE = 1;
+ CHANGE_ACTIVE = 2;
+ CHANGE_CACHED = 3;
+ CHANGE_UNCACHED = 4;
+ }
+ repeated Change last_reported_changes = 8;
+ optional int32 num_procs = 9;
+
+ message ProcStateSequence {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int64 cururent = 1;
+ optional int64 last_network_updated = 2;
+ optional int64 last_dispatched = 3;
+ }
+ optional ProcStateSequence network_state_update = 10;
+
+ // Next Tag: 11
}
// proto of class ImportanceToken in ActivityManagerService
message ImportanceTokenProto {
- option (.android.msg_privacy).dest = DEST_EXPLICIT;
+ option (.android.msg_privacy).dest = DEST_EXPLICIT;
- optional int32 pid = 1;
- optional string token = 2;
- optional string reason = 3;
+ optional int32 pid = 1;
+ optional string token = 2;
+ optional string reason = 3;
}
// proto of class VrController.java
message VrControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- enum VrMode {
- FLAG_NON_VR_MODE = 0;
- FLAG_VR_MODE = 1;
- FLAG_PERSISTENT_VR_MODE = 2;
- }
- repeated VrMode vr_mode = 1;
- optional int32 render_thread_id = 2;
+ enum VrMode {
+ FLAG_NON_VR_MODE = 0;
+ FLAG_VR_MODE = 1;
+ FLAG_PERSISTENT_VR_MODE = 2;
+ }
+ repeated VrMode vr_mode = 1;
+ optional int32 render_thread_id = 2;
}
message ProcessOomProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional bool persistent = 1;
- optional int32 num = 2;
- optional string oom_adj = 3;
-
- // Activity manager's version of Process enum, see ProcessList.java
- enum SchedGroup {
- SCHED_GROUP_UNKNOWN = -1;
- SCHED_GROUP_BACKGROUND = 0;
- SCHED_GROUP_DEFAULT = 1;
- SCHED_GROUP_TOP_APP = 2;
- SCHED_GROUP_TOP_APP_BOUND = 3;
- }
- optional SchedGroup sched_group = 4 [ default = SCHED_GROUP_UNKNOWN];
-
- oneof Foreground {
- bool activities = 5;
- bool services = 6;
- }
-
- optional .android.app.ProcessStateEnum state = 7;
- optional int32 trim_memory_level = 8;
- optional ProcessRecordProto proc = 9;
- optional string adj_type = 10;
-
- oneof AdjTarget {
- .android.content.ComponentNameProto adj_target_component_name = 11;
- string adj_target_object = 12;
- }
-
- oneof AdjSource {
- ProcessRecordProto adj_source_proc = 13;
- string adj_source_object = 14;
- }
-
- message Detail {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 max_adj = 1;
- optional int32 cur_raw_adj = 2;
- optional int32 set_raw_adj = 3;
- optional int32 cur_adj = 4;
- optional int32 set_adj = 5;
- optional .android.app.ProcessStateEnum current_state = 7;
- optional .android.app.ProcessStateEnum set_state = 8;
- optional string last_pss = 9;
- optional string last_swap_pss = 10;
- optional string last_cached_pss = 11;
- optional bool cached = 12;
- optional bool empty = 13;
- optional bool has_above_client = 14;
+ optional bool persistent = 1;
+ optional int32 num = 2;
+ optional string oom_adj = 3;
- // only make sense if process is a service
- message CpuRunTime {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 over_ms = 1;
- optional int64 used_ms = 2;
- optional float ultilization = 3; // ratio of cpu time usage
+ // Activity manager's version of Process enum, see ProcessList.java
+ enum SchedGroup {
+ SCHED_GROUP_UNKNOWN = -1;
+ SCHED_GROUP_BACKGROUND = 0;
+ SCHED_GROUP_DEFAULT = 1;
+ SCHED_GROUP_TOP_APP = 2;
+ SCHED_GROUP_TOP_APP_BOUND = 3;
}
- optional CpuRunTime service_run_time = 15;
- }
- optional Detail detail = 15;
+ optional SchedGroup sched_group = 4 [ default = SCHED_GROUP_UNKNOWN];
+
+ oneof Foreground {
+ bool activities = 5;
+ bool services = 6;
+ }
+
+ optional .android.app.ProcessStateEnum state = 7;
+ optional int32 trim_memory_level = 8;
+ optional ProcessRecordProto proc = 9;
+ optional string adj_type = 10;
+
+ oneof AdjTarget {
+ .android.content.ComponentNameProto adj_target_component_name = 11;
+ string adj_target_object = 12;
+ }
+
+ oneof AdjSource {
+ ProcessRecordProto adj_source_proc = 13;
+ string adj_source_object = 14;
+ }
+
+ message Detail {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 max_adj = 1;
+ optional int32 cur_raw_adj = 2;
+ optional int32 set_raw_adj = 3;
+ optional int32 cur_adj = 4;
+ optional int32 set_adj = 5;
+ optional .android.app.ProcessStateEnum current_state = 7;
+ optional .android.app.ProcessStateEnum set_state = 8;
+ optional string last_pss = 9;
+ optional string last_swap_pss = 10;
+ optional string last_cached_pss = 11;
+ optional bool cached = 12;
+ optional bool empty = 13;
+ optional bool has_above_client = 14;
+
+ // only make sense if process is a service
+ message CpuRunTime {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int64 over_ms = 1;
+ optional int64 used_ms = 2;
+ optional float ultilization = 3; // ratio of cpu time usage
+ }
+ optional CpuRunTime service_run_time = 15;
+ }
+ optional Detail detail = 15;
}
message ProcessToGcProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ProcessRecordProto proc = 1;
- optional bool report_low_memory = 2;
- optional int64 now_uptime_ms = 3;
- optional int64 last_gced_ms = 4;
- optional int64 last_low_memory_ms = 5;
+ optional ProcessRecordProto proc = 1;
+ optional bool report_low_memory = 2;
+ optional int64 now_uptime_ms = 3;
+ optional int64 last_gced_ms = 4;
+ optional int64 last_low_memory_ms = 5;
}
// sync with com.android.server.am.AppErrors.java
message AppErrorsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 now_uptime_ms = 1;
-
- message ProcessCrashTime {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string process_name = 1;
+ optional int64 now_uptime_ms = 1;
- message Entry {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message ProcessCrashTime {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional int64 last_crashed_at_ms = 2;
+ optional string process_name = 1;
+
+ message Entry {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 uid = 1;
+ optional int64 last_crashed_at_ms = 2;
+ }
+ repeated Entry entries = 2;
}
- repeated Entry entries = 2;
- }
- repeated ProcessCrashTime process_crash_times = 2;
+ repeated ProcessCrashTime process_crash_times = 2;
- message BadProcess {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message BadProcess {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string process_name = 1;
+ optional string process_name = 1;
- message Entry {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message Entry {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional int64 crashed_at_ms = 2;
- optional string short_msg = 3;
- optional string long_msg = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional string stack = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 uid = 1;
+ optional int64 crashed_at_ms = 2;
+ optional string short_msg = 3;
+ optional string long_msg = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string stack = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ }
+ repeated Entry entries = 2;
}
- repeated Entry entries = 2;
- }
- repeated BadProcess bad_processes = 3;
+ repeated BadProcess bad_processes = 3;
}
// sync with com.android.server.am.UserState.java
message UserStateProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- enum State {
- STATE_BOOTING = 0;
- STATE_RUNNING_LOCKED = 1;
- STATE_RUNNING_UNLOCKING = 2;
- STATE_RUNNING_UNLOCKED = 3;
- STATE_STOPPING = 4;
- STATE_SHUTDOWN = 5;
- }
- optional State state = 1;
- optional bool switching = 2;
+ enum State {
+ STATE_BOOTING = 0;
+ STATE_RUNNING_LOCKED = 1;
+ STATE_RUNNING_UNLOCKING = 2;
+ STATE_RUNNING_UNLOCKED = 3;
+ STATE_STOPPING = 4;
+ STATE_SHUTDOWN = 5;
+ }
+ optional State state = 1;
+ optional bool switching = 2;
}
// sync with com.android.server.am.UserController.java
message UserControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- message User {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 id = 1;
- optional UserStateProto state = 2;
- }
- repeated User started_users = 1;
- repeated int32 started_user_array = 2;
- repeated int32 user_lru = 3;
+ message User {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message UserProfile {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ optional int32 id = 1;
+ optional UserStateProto state = 2;
+ }
+ repeated User started_users = 1;
+ repeated int32 started_user_array = 2;
+ repeated int32 user_lru = 3;
- optional int32 user = 1;
- optional int32 profile = 2;
- }
- repeated UserProfile user_profile_group_ids = 4;
+ message UserProfile {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 user = 1;
+ optional int32 profile = 2;
+ }
+ repeated UserProfile user_profile_group_ids = 4;
}
// sync with com.android.server.am.AppTimeTracker.java
message AppTimeTrackerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional string receiver = 1;
- optional int64 total_duration_ms = 2;
-
- message PackageTime {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string package = 1;
- optional int64 duration_ms = 2;
- }
- repeated PackageTime package_times = 3;
+ optional string receiver = 1;
+ optional int64 total_duration_ms = 2;
- optional .android.util.Duration started_time = 4;
- optional string started_package = 5;
+ message PackageTime {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional string package = 1;
+ optional int64 duration_ms = 2;
+ }
+ repeated PackageTime package_times = 3;
+
+ optional .android.util.Duration started_time = 4;
+ optional string started_package = 5;
}
diff --git a/core/proto/android/server/alarmmanagerservice.proto b/core/proto/android/server/alarmmanagerservice.proto
index 53e3ba9..eef78d1 100644
--- a/core/proto/android/server/alarmmanagerservice.proto
+++ b/core/proto/android/server/alarmmanagerservice.proto
@@ -29,254 +29,254 @@
// next ID: 43
message AlarmManagerServiceDumpProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional int64 current_time = 1;
- optional int64 elapsed_realtime = 2;
- optional int64 last_time_change_clock_time = 3;
- optional int64 last_time_change_realtime = 4;
- // Current settings
- optional ConstantsProto settings = 5;
-
- // Dump from ForceAppStandbyTracker.
- optional ForceAppStandbyTrackerProto force_app_standby_tracker = 6;
-
- optional bool is_interactive = 7;
- // Only valid if is_interactive is false.
- optional int64 time_since_non_interactive_ms = 8;
- // Only valid if is_interactive is false.
- optional int64 max_wakeup_delay_ms = 9;
- // Only valid if is_interactive is false.
- optional int64 time_since_last_dispatch_ms = 10;
- // Only valid if is_interactive is false.
- optional int64 time_until_next_non_wakeup_delivery_ms = 11;
-
- // Can be negative if the non-wakeup alarm time is in the past (non-wakeup
- // alarms aren't delivered unil the next time the device wakes up).
- optional int64 time_until_next_non_wakeup_alarm_ms = 12;
- optional int64 time_until_next_wakeup_ms = 13;
- optional int64 time_since_last_wakeup_ms = 14;
- // Time since the last wakeup was set.
- optional int64 time_since_last_wakeup_set_ms = 15;
- optional int64 time_change_event_count = 16;
- // The current set of user whitelisted apps for device idle mode, meaning
- // these are allowed to freely schedule alarms. These are app IDs, not UIDs.
- repeated int32 device_idle_user_whitelist_app_ids = 17;
-
- repeated AlarmClockMetadataProto next_alarm_clock_metadata = 18;
-
- repeated BatchProto pending_alarm_batches = 19;
-
- // List of alarms per uid deferred due to user applied background restrictions
- // on the source app.
- repeated AlarmProto pending_user_blocked_background_alarms = 20;
-
- // When idling mode will end. Will be empty if the device is not currently
- // idling.
- optional AlarmProto pending_idle_until = 21;
-
- // Any alarms that we don't want to run during idle mode. Will be empty if the
- // device is not currently idling.
- repeated AlarmProto pending_while_idle_alarms = 22;
-
- // This is a special alarm that will put the system into idle until it goes
- // off. The caller has given the time they want this to happen at.
- optional AlarmProto next_wake_from_idle = 23;
-
- repeated AlarmProto past_due_non_wakeup_alarms = 24;
-
- // Number of delayed alarms.
- optional int32 delayed_alarm_count = 25;
- // The total amount of time alarms had been delayed. Overlapping alarms are
- // only counted once (ie. If two alarms were meant to trigger at the same time
- // but were delayed by 5 seconds, the total time would be 5 seconds).
- optional int64 total_delay_time_ms = 26;
- optional int64 max_delay_duration_ms = 27;
- optional int64 max_non_interactive_duration_ms = 28;
-
- optional int32 broadcast_ref_count = 29;
- // Canonical count of (operation.send() - onSendFinished()) and listener
- // send/complete/timeout invocations.
- optional int32 pending_intent_send_count = 30;
- optional int32 pending_intent_finish_count = 31;
- optional int32 listener_send_count = 32;
- optional int32 listener_finish_count = 33;
-
- repeated InFlightProto outstanding_deliveries = 34;
-
- message LastAllowWhileIdleDispatch {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- // In the 'elapsed' timebase.
- optional int64 time_ms = 2;
+ optional int64 current_time = 1;
+ optional int64 elapsed_realtime = 2;
+ optional int64 last_time_change_clock_time = 3;
+ optional int64 last_time_change_realtime = 4;
+ // Current settings
+ optional ConstantsProto settings = 5;
- // Time when the next while-idle is allowed, in the 'elapsed' timebase.
- optional int64 next_allowed_ms = 3;
- }
+ // Dump from ForceAppStandbyTracker.
+ optional ForceAppStandbyTrackerProto force_app_standby_tracker = 6;
- // Whether the short or long while-idle timeout should be used for each UID.
- repeated int32 use_allow_while_idle_short_time = 35;
+ optional bool is_interactive = 7;
+ // Only valid if is_interactive is false.
+ optional int64 time_since_non_interactive_ms = 8;
+ // Only valid if is_interactive is false.
+ optional int64 max_wakeup_delay_ms = 9;
+ // Only valid if is_interactive is false.
+ optional int64 time_since_last_dispatch_ms = 10;
+ // Only valid if is_interactive is false.
+ optional int64 time_until_next_non_wakeup_delivery_ms = 11;
- // For each uid, this is the last time we dispatched an "allow while idle"
- // alarm, used to determine the earliest we can dispatch the next such alarm.
- repeated LastAllowWhileIdleDispatch last_allow_while_idle_dispatch_times = 36;
+ // Can be negative if the non-wakeup alarm time is in the past (non-wakeup
+ // alarms aren't delivered unil the next time the device wakes up).
+ optional int64 time_until_next_non_wakeup_alarm_ms = 12;
+ optional int64 time_until_next_wakeup_ms = 13;
+ optional int64 time_since_last_wakeup_ms = 14;
+ // Time since the last wakeup was set.
+ optional int64 time_since_last_wakeup_set_ms = 15;
+ optional int64 time_change_event_count = 16;
+ // The current set of user whitelisted apps for device idle mode, meaning
+ // these are allowed to freely schedule alarms. These are app IDs, not UIDs.
+ repeated int32 device_idle_user_whitelist_app_ids = 17;
- optional com.android.internal.util.LocalLogProto recent_problems = 37;
+ repeated AlarmClockMetadataProto next_alarm_clock_metadata = 18;
- message TopAlarm {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ repeated BatchProto pending_alarm_batches = 19;
- optional int32 uid = 1;
- optional string package_name = 2;
- optional FilterStatsProto filter = 3;
- }
- repeated TopAlarm top_alarms = 38;
+ // List of alarms per uid deferred due to user applied background restrictions
+ // on the source app.
+ repeated AlarmProto pending_user_blocked_background_alarms = 20;
- message AlarmStat {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // When idling mode will end. Will be empty if the device is not currently
+ // idling.
+ optional AlarmProto pending_idle_until = 21;
- optional BroadcastStatsProto broadcast = 1;
- repeated FilterStatsProto filters = 2;
- }
- repeated AlarmStat alarm_stats = 39;
+ // Any alarms that we don't want to run during idle mode. Will be empty if the
+ // device is not currently idling.
+ repeated AlarmProto pending_while_idle_alarms = 22;
- repeated IdleDispatchEntryProto allow_while_idle_dispatches = 40;
- repeated WakeupEventProto recent_wakeup_history = 41;
+ // This is a special alarm that will put the system into idle until it goes
+ // off. The caller has given the time they want this to happen at.
+ optional AlarmProto next_wake_from_idle = 23;
+
+ repeated AlarmProto past_due_non_wakeup_alarms = 24;
+
+ // Number of delayed alarms.
+ optional int32 delayed_alarm_count = 25;
+ // The total amount of time alarms had been delayed. Overlapping alarms are
+ // only counted once (ie. If two alarms were meant to trigger at the same time
+ // but were delayed by 5 seconds, the total time would be 5 seconds).
+ optional int64 total_delay_time_ms = 26;
+ optional int64 max_delay_duration_ms = 27;
+ optional int64 max_non_interactive_duration_ms = 28;
+
+ optional int32 broadcast_ref_count = 29;
+ // Canonical count of (operation.send() - onSendFinished()) and listener
+ // send/complete/timeout invocations.
+ optional int32 pending_intent_send_count = 30;
+ optional int32 pending_intent_finish_count = 31;
+ optional int32 listener_send_count = 32;
+ optional int32 listener_finish_count = 33;
+
+ repeated InFlightProto outstanding_deliveries = 34;
+
+ message LastAllowWhileIdleDispatch {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 uid = 1;
+ // In the 'elapsed' timebase.
+ optional int64 time_ms = 2;
+
+ // Time when the next while-idle is allowed, in the 'elapsed' timebase.
+ optional int64 next_allowed_ms = 3;
+ }
+
+ // Whether the short or long while-idle timeout should be used for each UID.
+ repeated int32 use_allow_while_idle_short_time = 35;
+
+ // For each uid, this is the last time we dispatched an "allow while idle"
+ // alarm, used to determine the earliest we can dispatch the next such alarm.
+ repeated LastAllowWhileIdleDispatch last_allow_while_idle_dispatch_times = 36;
+
+ optional com.android.internal.util.LocalLogProto recent_problems = 37;
+
+ message TopAlarm {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 uid = 1;
+ optional string package_name = 2;
+ optional FilterStatsProto filter = 3;
+ }
+ repeated TopAlarm top_alarms = 38;
+
+ message AlarmStat {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional BroadcastStatsProto broadcast = 1;
+ repeated FilterStatsProto filters = 2;
+ }
+ repeated AlarmStat alarm_stats = 39;
+
+ repeated IdleDispatchEntryProto allow_while_idle_dispatches = 40;
+ repeated WakeupEventProto recent_wakeup_history = 41;
}
// This is a soft wrapper for alarm clock information. It is not representative
// of an android.app.AlarmManager.AlarmClockInfo object.
message AlarmClockMetadataProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 user = 1;
- optional bool is_pending_send = 2;
- // This value is UTC wall clock time in milliseconds, as returned by
- // System#currentTimeMillis() for example.
- optional int64 trigger_time_ms = 3;
+ optional int32 user = 1;
+ optional bool is_pending_send = 2;
+ // This value is UTC wall clock time in milliseconds, as returned by
+ // System#currentTimeMillis() for example.
+ optional int64 trigger_time_ms = 3;
}
// A com.android.server.AlarmManagerService.Alarm object.
message AlarmProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional .android.app.AlarmManagerProto.AlarmType type = 2;
- // How long until the alarm goes off, in the 'elapsed' timebase. Can be
- // negative if 'when' is in the past.
- optional int64 time_until_when_elapsed_ms = 3;
- optional int64 window_length_ms = 4;
- optional int64 repeat_interval_ms = 5;
- optional int32 count = 6;
- optional int32 flags = 7;
- optional .android.app.AlarmClockInfoProto alarm_clock = 8;
- optional .android.app.PendingIntentProto operation = 9;
- optional string listener = 10 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional .android.app.AlarmManagerProto.AlarmType type = 2;
+ // How long until the alarm goes off, in the 'elapsed' timebase. Can be
+ // negative if 'when' is in the past.
+ optional int64 time_until_when_elapsed_ms = 3;
+ optional int64 window_length_ms = 4;
+ optional int64 repeat_interval_ms = 5;
+ optional int32 count = 6;
+ optional int32 flags = 7;
+ optional .android.app.AlarmClockInfoProto alarm_clock = 8;
+ optional .android.app.PendingIntentProto operation = 9;
+ optional string listener = 10 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
// A com.android.server.AlarmManagerService.Batch object.
message BatchProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // Start time in terms of elapsed realtime.
- optional int64 start_realtime = 1;
- // End time in terms of elapsed realtime.
- optional int64 end_realtime = 2;
- optional int32 flags = 3;
- repeated AlarmProto alarms = 4;
+ // Start time in terms of elapsed realtime.
+ optional int64 start_realtime = 1;
+ // End time in terms of elapsed realtime.
+ optional int64 end_realtime = 2;
+ optional int32 flags = 3;
+ repeated AlarmProto alarms = 4;
}
// A com.android.server.AlarmManagerService.BroadcastStats object.
message BroadcastStatsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional string package_name = 2;
- // The total amount of time this broadcast was in flight.
- optional int64 total_flight_duration_ms = 3;
- optional int32 count = 4;
- optional int32 wakeup_count = 5;
- // The last time this first became active (when nesting changed from 0 to 1)
- // in terms of elapsed realtime.
- optional int64 start_time_realtime = 6;
- // The broadcast is active if nesting > 0.
- optional int32 nesting = 7;
+ optional int32 uid = 1;
+ optional string package_name = 2;
+ // The total amount of time this broadcast was in flight.
+ optional int64 total_flight_duration_ms = 3;
+ optional int32 count = 4;
+ optional int32 wakeup_count = 5;
+ // The last time this first became active (when nesting changed from 0 to 1)
+ // in terms of elapsed realtime.
+ optional int64 start_time_realtime = 6;
+ // The broadcast is active if nesting > 0.
+ optional int32 nesting = 7;
}
// A com.android.server.AlarmManagerService.Constants object.
message ConstantsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // Minimum futurity of a new alarm.
- optional int64 min_futurity_duration_ms = 1;
- // Minimum alarm recurrence interval.
- optional int64 min_interval_duration_ms = 2;
- // Direct alarm listener callback timeout.
- optional int64 listener_timeout_duration_ms = 3;
- // Minimum time between ALLOW_WHILE_IDLE alarms when system is not idle.
- optional int64 allow_while_idle_short_duration_ms = 4;
- // Minimum time between ALLOW_WHILE_IDLE alarms when system is idling.
- optional int64 allow_while_idle_long_duration_ms = 5;
- // BroadcastOptions.setTemporaryAppWhitelistDuration() to use for FLAG_ALLOW_WHILE_IDLE.
- optional int64 allow_while_idle_whitelist_duration_ms = 6;
- // Maximum alarm recurrence interval.
- optional int64 max_interval_duration_ms = 7;
+ // Minimum futurity of a new alarm.
+ optional int64 min_futurity_duration_ms = 1;
+ // Minimum alarm recurrence interval.
+ optional int64 min_interval_duration_ms = 2;
+ // Direct alarm listener callback timeout.
+ optional int64 listener_timeout_duration_ms = 3;
+ // Minimum time between ALLOW_WHILE_IDLE alarms when system is not idle.
+ optional int64 allow_while_idle_short_duration_ms = 4;
+ // Minimum time between ALLOW_WHILE_IDLE alarms when system is idling.
+ optional int64 allow_while_idle_long_duration_ms = 5;
+ // BroadcastOptions.setTemporaryAppWhitelistDuration() to use for FLAG_ALLOW_WHILE_IDLE.
+ optional int64 allow_while_idle_whitelist_duration_ms = 6;
+ // Maximum alarm recurrence interval.
+ optional int64 max_interval_duration_ms = 7;
}
// A com.android.server.AlarmManagerService.FilterStats object.
message FilterStatsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
- // The last time this filter when in flight, in terms of elapsed realtime.
- optional int64 last_flight_time_realtime = 2;
- // The total amount of time this filter was in flight.
- optional int64 total_flight_duration_ms = 3;
- optional int32 count = 4;
- optional int32 wakeup_count = 5;
- // The last time this first became active (when nesting changed from 0 to 1)
- // in terms of elapsed realtime.
- optional int64 start_time_realtime = 6;
- // The filter is active if nesting > 0.
- optional int32 nesting = 7;
+ optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ // The last time this filter when in flight, in terms of elapsed realtime.
+ optional int64 last_flight_time_realtime = 2;
+ // The total amount of time this filter was in flight.
+ optional int64 total_flight_duration_ms = 3;
+ optional int32 count = 4;
+ optional int32 wakeup_count = 5;
+ // The last time this first became active (when nesting changed from 0 to 1)
+ // in terms of elapsed realtime.
+ optional int64 start_time_realtime = 6;
+ // The filter is active if nesting > 0.
+ optional int32 nesting = 7;
}
// A com.android.server.AlarmManagerService.IdleDispatchEntry object.
message IdleDispatchEntryProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional string pkg = 2;
- optional string tag = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional string op = 4;
- // Time when this entry was created, in terms of elapsed realtime.
- optional int64 entry_creation_realtime = 5;
- // For a RESCHEDULED op, this is the last time we dispatched an "allow while
- // idle" alarm for the UID. For a SET op, this is when the alarm was
- // triggered. Times are in the 'elapsed' timebase.
- optional int64 arg_realtime = 6;
+ optional int32 uid = 1;
+ optional string pkg = 2;
+ optional string tag = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string op = 4;
+ // Time when this entry was created, in terms of elapsed realtime.
+ optional int64 entry_creation_realtime = 5;
+ // For a RESCHEDULED op, this is the last time we dispatched an "allow while
+ // idle" alarm for the UID. For a SET op, this is when the alarm was
+ // triggered. Times are in the 'elapsed' timebase.
+ optional int64 arg_realtime = 6;
}
// A com.android.server.AlarmManagerService.InFlight object.
message InFlightProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional int64 when_elapsed_ms = 3;
- optional .android.app.AlarmManagerProto.AlarmType alarm_type = 4;
- optional .android.app.PendingIntentProto pending_intent = 5;
- optional BroadcastStatsProto broadcast_stats = 6;
- optional FilterStatsProto filter_stats = 7;
- optional .android.os.WorkSourceProto work_source = 8;
+ optional int32 uid = 1;
+ optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int64 when_elapsed_ms = 3;
+ optional .android.app.AlarmManagerProto.AlarmType alarm_type = 4;
+ optional .android.app.PendingIntentProto pending_intent = 5;
+ optional BroadcastStatsProto broadcast_stats = 6;
+ optional FilterStatsProto filter_stats = 7;
+ optional .android.os.WorkSourceProto work_source = 8;
}
// A com.android.server.AlarmManagerService.WakeupEvent object.
message WakeupEventProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional string action = 2;
- optional int64 when = 3;
+ optional int32 uid = 1;
+ optional string action = 2;
+ optional int64 when = 3;
}
diff --git a/core/proto/android/server/animationadapter.proto b/core/proto/android/server/animationadapter.proto
index 9bfa794..0bcc488 100644
--- a/core/proto/android/server/animationadapter.proto
+++ b/core/proto/android/server/animationadapter.proto
@@ -24,55 +24,55 @@
option java_multiple_files = true;
message AnimationAdapterProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional LocalAnimationAdapterProto local = 1;
- optional RemoteAnimationAdapterWrapperProto remote = 2;
+ optional LocalAnimationAdapterProto local = 1;
+ optional RemoteAnimationAdapterWrapperProto remote = 2;
}
/* represents RemoteAnimationAdapterWrapper */
message RemoteAnimationAdapterWrapperProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.view.RemoteAnimationTargetProto target = 1;
+ optional .android.view.RemoteAnimationTargetProto target = 1;
}
/* represents LocalAnimationAdapter */
message LocalAnimationAdapterProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional AnimationSpecProto animation_spec = 1;
+ optional AnimationSpecProto animation_spec = 1;
}
message AnimationSpecProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowAnimationSpecProto window = 1;
- optional MoveAnimationSpecProto move = 2;
- optional AlphaAnimationSpecProto alpha = 3;
+ optional WindowAnimationSpecProto window = 1;
+ optional MoveAnimationSpecProto move = 2;
+ optional AlphaAnimationSpecProto alpha = 3;
}
/* represents WindowAnimationSpec */
message WindowAnimationSpecProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string animation = 1;
+ optional string animation = 1;
}
/* represents MoveAnimationSpec*/
message MoveAnimationSpecProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.PointProto from = 1;
- optional .android.graphics.PointProto to = 2;
- optional int64 duration = 3;
+ optional .android.graphics.PointProto from = 1;
+ optional .android.graphics.PointProto to = 2;
+ optional int64 duration_ms = 3;
}
/* represents AlphaAnimationSpec */
message AlphaAnimationSpecProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional float from = 1;
- optional float to = 2;
- optional int64 duration = 3;
-}
\ No newline at end of file
+ optional float from = 1;
+ optional float to = 2;
+ optional int64 duration_ms = 3;
+}
diff --git a/core/proto/android/server/appwindowthumbnail.proto b/core/proto/android/server/appwindowthumbnail.proto
index 54ad193..a1be721 100644
--- a/core/proto/android/server/appwindowthumbnail.proto
+++ b/core/proto/android/server/appwindowthumbnail.proto
@@ -26,9 +26,9 @@
* Represents a {@link com.android.server.wm.AppWindowThumbnail} object.
*/
message AppWindowThumbnailProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 width = 1;
- optional int32 height = 2;
- optional SurfaceAnimatorProto surface_animator = 3;
-}
\ No newline at end of file
+ optional int32 width = 1;
+ optional int32 height = 2;
+ optional SurfaceAnimatorProto surface_animator = 3;
+}
diff --git a/core/proto/android/server/forceappstandbytracker.proto b/core/proto/android/server/forceappstandbytracker.proto
index 5296e47..1113d6a 100644
--- a/core/proto/android/server/forceappstandbytracker.proto
+++ b/core/proto/android/server/forceappstandbytracker.proto
@@ -27,51 +27,51 @@
//
// Next ID: 12
message ForceAppStandbyTrackerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- // Whether all apps are forced standby or not.
- optional bool force_all_apps_standby = 1;
-
- // UIDs currently active.
- repeated int32 active_uids = 2;
-
- // UIDs currently in the foreground.
- repeated int32 foreground_uids = 11;
-
- // App ids that are in power-save whitelist.
- repeated int32 power_save_whitelist_app_ids = 3;
-
- // App ids that are in temporary power-save whitelist.
- repeated int32 temp_power_save_whitelist_app_ids = 4;
-
- message RunAnyInBackgroundRestrictedPackages {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 uid = 1;
- optional string package_name = 2;
- }
- // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
- repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5;
+ // Whether all apps are forced standby or not.
+ optional bool force_all_apps_standby = 1;
- // Whether device is a small battery device
- optional bool is_small_battery_device = 6;
+ // UIDs currently active.
+ repeated int32 active_uids = 2;
- // Whether force app standby for small battery device setting is enabled
- optional bool force_all_apps_standby_for_small_battery = 7;
+ // UIDs currently in the foreground.
+ repeated int32 foreground_uids = 11;
- // Whether device is plugged in to the charger
- optional bool is_plugged_in = 8;
+ // App ids that are in power-save whitelist.
+ repeated int32 power_save_whitelist_app_ids = 3;
- // Performance stats.
- optional StatLoggerProto stats = 9;
+ // App ids that are in temporary power-save whitelist.
+ repeated int32 temp_power_save_whitelist_app_ids = 4;
- message ExemptedPackage {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ message RunAnyInBackgroundRestrictedPackages {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 userId = 1;
- optional string package_name = 2;
- }
+ optional int32 uid = 1;
+ optional string package_name = 2;
+ }
+ // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
+ repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5;
- // Packages that are in the EXEMPT bucket.
- repeated ExemptedPackage exempted_packages = 10;
+ // Whether device is a small battery device
+ optional bool is_small_battery_device = 6;
+
+ // Whether force app standby for small battery device setting is enabled
+ optional bool force_all_apps_standby_for_small_battery = 7;
+
+ // Whether device is plugged in to the charger
+ optional bool is_plugged_in = 8;
+
+ // Performance stats.
+ optional StatLoggerProto stats = 9;
+
+ message ExemptedPackage {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 userId = 1;
+ optional string package_name = 2;
+ }
+
+ // Packages that are in the EXEMPT bucket.
+ repeated ExemptedPackage exempted_packages = 10;
}
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 4df3b63..0a10cec 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -219,23 +219,6 @@
message StateControllerProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- message AppIdleController {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional bool is_parole_on = 1;
-
- message TrackedJob {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- optional JobStatusShortInfoProto info = 1;
- optional int32 source_uid = 2;
- optional string source_package_name = 3;
- // If the constraints are satisfied, then the controller will mark
- // the job as RUNNABLE, otherwise, it will be WAITING.
- optional bool are_constraints_satisfied = 4;
- }
- repeated TrackedJob tracked_jobs = 2;
- }
message BackgroundJobsController {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -413,15 +396,14 @@
repeated TrackedJob tracked_jobs = 4;
}
oneof controller {
- AppIdleController app_idle = 1;
- BackgroundJobsController background = 2;
- BatteryController battery = 3;
- ConnectivityController connectivity = 4;
- ContentObserverController content_observer = 5;
- DeviceIdleJobsController device_idle = 6;
- IdleController idle = 7;
- StorageController storage = 8;
- TimeController time = 9;
+ BackgroundJobsController background = 1;
+ BatteryController battery = 2;
+ ConnectivityController connectivity = 3;
+ ContentObserverController content_observer = 4;
+ DeviceIdleJobsController device_idle = 5;
+ IdleController idle = 6;
+ StorageController storage = 7;
+ TimeController time = 8;
}
}
@@ -618,8 +600,8 @@
CONSTRAINT_DEADLINE = 5;
CONSTRAINT_IDLE = 6;
CONSTRAINT_CONNECTIVITY = 7;
- CONSTRAINT_CONTENT_TRIGGER = 9;
- CONSTRAINT_DEVICE_NOT_DOZING = 10;
+ CONSTRAINT_CONTENT_TRIGGER = 8;
+ CONSTRAINT_DEVICE_NOT_DOZING = 9;
}
repeated Constraint required_constraints = 7;
repeated Constraint satisfied_constraints = 8;
diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto
index eb60942..cee556a 100644
--- a/core/proto/android/server/powermanagerservice.proto
+++ b/core/proto/android/server/powermanagerservice.proto
@@ -313,36 +313,41 @@
}
message BatterySaverStateMachineProto {
- // Whether battery saver is enabled.
- optional bool enabled = 1;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // Whether system has booted.
- optional bool boot_completed = 2;
+ // Whether battery saver is enabled.
+ optional bool enabled = 1;
- // Whether settings have been loaded already.
- optional bool settings_loaded = 3;
+ // Whether system has booted.
+ optional bool boot_completed = 2;
- // Whether battery status has been set at least once.
- optional bool battery_status_set = 4;
+ // Whether settings have been loaded already.
+ optional bool settings_loaded = 3;
- // Whether automatic battery saver has been canceled by the user.
- optional bool battery_saver_snoozing = 5;
+ // Whether battery status has been set at least once.
+ optional bool battery_status_set = 4;
- // Whether the device is connected to any power source.
- optional bool is_powered = 6;
+ // Whether automatic battery saver has been canceled by the user.
+ optional bool battery_saver_snoozing = 5;
- // Current battery level in %, 0-100.
- optional int32 battery_level = 7;
+ // Whether the device is connected to any power source.
+ optional bool is_powered = 6;
- // Whether battery level is low or not.
- optional bool is_battery_level_low = 8;
+ // Current battery level in %, 0-100.
+ optional int32 battery_level = 7;
- // The value of Global.LOW_POWER_MODE.
- optional bool setting_battery_saver_enabled = 9;
+ // Whether battery level is low or not.
+ optional bool is_battery_level_low = 8;
- // The value of Global.LOW_POWER_MODE_STICKY.
- optional bool setting_battery_saver_enabled_sticky = 10;
+ // The value of Global.LOW_POWER_MODE. This is a cached value, so it could
+ // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+ optional bool setting_battery_saver_enabled = 9;
- // The value of Global.LOW_POWER_MODE_TRIGGER_LEVEL.
- optional int32 setting_battery_saver_trigger_threshold = 11;
-}
\ No newline at end of file
+ // The value of Global.LOW_POWER_MODE_STICKY. This is a cached value, so it could
+ // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+ optional bool setting_battery_saver_enabled_sticky = 10;
+
+ // The value of Global.LOW_POWER_MODE_TRIGGER_LEVEL. This is a cached value, so it could
+ // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+ optional int32 setting_battery_saver_trigger_threshold = 11;
+}
diff --git a/core/proto/android/server/statlogger.proto b/core/proto/android/server/statlogger.proto
index 2b7daea..46badc4 100644
--- a/core/proto/android/server/statlogger.proto
+++ b/core/proto/android/server/statlogger.proto
@@ -24,17 +24,17 @@
// Dump from StatLogger.
message StatLoggerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- message Event {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 eventId = 1;
- // Labels are hard-coded in Android framework code.
- optional string label = 2;
- optional int32 count = 3;
- optional int64 total_duration_micros = 4;
- }
+ message Event {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- repeated Event events = 1;
+ optional int32 eventId = 1;
+ // Labels are hard-coded in Android framework code.
+ optional string label = 2;
+ optional int32 count = 3;
+ optional int64 total_duration_micros = 4;
+ }
+
+ repeated Event events = 1;
}
diff --git a/core/proto/android/server/surfaceanimator.proto b/core/proto/android/server/surfaceanimator.proto
index 84560bc..e3e8baa 100644
--- a/core/proto/android/server/surfaceanimator.proto
+++ b/core/proto/android/server/surfaceanimator.proto
@@ -27,10 +27,9 @@
* Represents a {@link com.android.server.wm.SurfaceAnimator} object.
*/
message SurfaceAnimatorProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- reserved 1; // Was string animation_adapter = 1
- optional .android.view.SurfaceControlProto leash = 2;
- optional bool animation_start_delayed = 3;
- optional AnimationAdapterProto animation_adapter = 4;
-}
\ No newline at end of file
+ optional .android.view.SurfaceControlProto leash = 1;
+ optional bool animation_start_delayed = 2;
+ optional AnimationAdapterProto animation_adapter = 3;
+}
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index ee371c1..7467d8f 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -33,350 +33,350 @@
option java_multiple_files = true;
message WindowManagerServiceDumpProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowManagerPolicyProto policy = 1;
- /* window hierarchy root */
- optional RootWindowContainerProto root_window_container = 2;
- optional IdentifierProto focused_window = 3;
- optional string focused_app = 4;
- optional IdentifierProto input_method_window = 5;
- optional bool display_frozen = 6;
- optional int32 rotation = 7;
- optional int32 last_orientation = 8;
- optional AppTransitionProto app_transition = 9;
+ optional WindowManagerPolicyProto policy = 1;
+ /* window hierarchy root */
+ optional RootWindowContainerProto root_window_container = 2;
+ optional IdentifierProto focused_window = 3;
+ optional string focused_app = 4;
+ optional IdentifierProto input_method_window = 5;
+ optional bool display_frozen = 6;
+ optional int32 rotation = 7;
+ optional int32 last_orientation = 8;
+ optional AppTransitionProto app_transition = 9;
}
/* represents DisplayContent */
message RootWindowContainerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- repeated DisplayProto displays = 2;
- /* window references in top down z order */
- repeated IdentifierProto windows = 3;
+ optional WindowContainerProto window_container = 1;
+ repeated DisplayProto displays = 2;
+ /* window references in top down z order */
+ repeated IdentifierProto windows = 3;
}
message BarControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.app.StatusBarManagerProto.WindowState state = 1;
- optional .android.app.StatusBarManagerProto.TransientWindowState transient_state = 2;
+ optional .android.app.StatusBarManagerProto.WindowState state = 1;
+ optional .android.app.StatusBarManagerProto.TransientWindowState transient_state = 2;
}
message WindowOrientationListenerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool enabled = 1;
- optional .android.view.SurfaceProto.Rotation rotation = 2;
+ optional bool enabled = 1;
+ optional .android.view.SurfaceProto.Rotation rotation = 2;
}
message KeyguardServiceDelegateProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool showing = 1;
- optional bool occluded = 2;
- optional bool secure = 3;
- enum ScreenState {
- SCREEN_STATE_OFF = 0;
- SCREEN_STATE_TURNING_ON = 1;
- SCREEN_STATE_ON = 2;
- SCREEN_STATE_TURNING_OFF = 3;
- }
- optional ScreenState screen_state = 4;
- enum InteractiveState {
- INTERACTIVE_STATE_SLEEP = 0;
- INTERACTIVE_STATE_WAKING = 1;
- INTERACTIVE_STATE_AWAKE = 2;
- INTERACTIVE_STATE_GOING_TO_SLEEP = 3;
- }
- optional InteractiveState interactive_state = 5;
+ optional bool showing = 1;
+ optional bool occluded = 2;
+ optional bool secure = 3;
+ enum ScreenState {
+ SCREEN_STATE_OFF = 0;
+ SCREEN_STATE_TURNING_ON = 1;
+ SCREEN_STATE_ON = 2;
+ SCREEN_STATE_TURNING_OFF = 3;
+ }
+ optional ScreenState screen_state = 4;
+ enum InteractiveState {
+ INTERACTIVE_STATE_SLEEP = 0;
+ INTERACTIVE_STATE_WAKING = 1;
+ INTERACTIVE_STATE_AWAKE = 2;
+ INTERACTIVE_STATE_GOING_TO_SLEEP = 3;
+ }
+ optional InteractiveState interactive_state = 5;
}
/* represents PhoneWindowManager */
message WindowManagerPolicyProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 last_system_ui_flags = 1;
- enum UserRotationMode {
- USER_ROTATION_FREE = 0;
- USER_ROTATION_LOCKED = 1;
- }
- optional UserRotationMode rotation_mode = 2;
- optional .android.view.SurfaceProto.Rotation rotation = 3;
- optional .android.content.ActivityInfoProto.ScreenOrientation orientation = 4;
- optional bool screen_on_fully = 5;
- optional bool keyguard_draw_complete = 6;
- optional bool window_manager_draw_complete = 7;
- optional string focused_app_token = 8;
- optional IdentifierProto focused_window = 9;
- optional IdentifierProto top_fullscreen_opaque_window = 10;
- optional IdentifierProto top_fullscreen_opaque_or_dimming_window = 11;
- optional bool keyguard_occluded = 12;
- optional bool keyguard_occluded_changed = 13;
- optional bool keyguard_occluded_pending = 14;
- optional bool force_status_bar = 15;
- optional bool force_status_bar_from_keyguard = 16;
- optional BarControllerProto status_bar = 17;
- optional BarControllerProto navigation_bar = 18;
- optional WindowOrientationListenerProto orientation_listener = 19;
- optional KeyguardServiceDelegateProto keyguard_delegate = 20;
+ optional int32 last_system_ui_flags = 1;
+ enum UserRotationMode {
+ USER_ROTATION_FREE = 0;
+ USER_ROTATION_LOCKED = 1;
+ }
+ optional UserRotationMode rotation_mode = 2;
+ optional .android.view.SurfaceProto.Rotation rotation = 3;
+ optional .android.content.ActivityInfoProto.ScreenOrientation orientation = 4;
+ optional bool screen_on_fully = 5;
+ optional bool keyguard_draw_complete = 6;
+ optional bool window_manager_draw_complete = 7;
+ optional string focused_app_token = 8;
+ optional IdentifierProto focused_window = 9;
+ optional IdentifierProto top_fullscreen_opaque_window = 10;
+ optional IdentifierProto top_fullscreen_opaque_or_dimming_window = 11;
+ optional bool keyguard_occluded = 12;
+ optional bool keyguard_occluded_changed = 13;
+ optional bool keyguard_occluded_pending = 14;
+ optional bool force_status_bar = 15;
+ optional bool force_status_bar_from_keyguard = 16;
+ optional BarControllerProto status_bar = 17;
+ optional BarControllerProto navigation_bar = 18;
+ optional WindowOrientationListenerProto orientation_listener = 19;
+ optional KeyguardServiceDelegateProto keyguard_delegate = 20;
}
/* represents AppTransition */
message AppTransitionProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- enum AppState {
- APP_STATE_IDLE = 0;
- APP_STATE_READY = 1;
- APP_STATE_RUNNING = 2;
- APP_STATE_TIMEOUT = 3;
- }
- optional AppState app_transition_state = 1;
- /* definitions for constants found in {@link com.android.server.wm.AppTransition} */
- enum TransitionType {
- TRANSIT_NONE = 0;
- TRANSIT_UNSET = -1;
- TRANSIT_ACTIVITY_OPEN = 6;
- TRANSIT_ACTIVITY_CLOSE = 7;
- TRANSIT_TASK_OPEN = 8;
- TRANSIT_TASK_CLOSE = 9;
- TRANSIT_TASK_TO_FRONT = 10;
- TRANSIT_TASK_TO_BACK = 11;
- TRANSIT_WALLPAPER_CLOSE = 12;
- TRANSIT_WALLPAPER_OPEN = 13;
- TRANSIT_WALLPAPER_INTRA_OPEN = 14;
- TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
- TRANSIT_TASK_OPEN_BEHIND = 16;
- TRANSIT_TASK_IN_PLACE = 17;
- TRANSIT_ACTIVITY_RELAUNCH = 18;
- TRANSIT_DOCK_TASK_FROM_RECENTS = 19;
- TRANSIT_KEYGUARD_GOING_AWAY = 20;
- TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
- TRANSIT_KEYGUARD_OCCLUDE = 22;
- TRANSIT_KEYGUARD_UNOCCLUDE = 23;
- TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
- TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
- }
- optional TransitionType last_used_app_transition = 2;
+ enum AppState {
+ APP_STATE_IDLE = 0;
+ APP_STATE_READY = 1;
+ APP_STATE_RUNNING = 2;
+ APP_STATE_TIMEOUT = 3;
+ }
+ optional AppState app_transition_state = 1;
+ /* definitions for constants found in {@link com.android.server.wm.AppTransition} */
+ enum TransitionType {
+ TRANSIT_NONE = 0;
+ TRANSIT_UNSET = -1;
+ TRANSIT_ACTIVITY_OPEN = 6;
+ TRANSIT_ACTIVITY_CLOSE = 7;
+ TRANSIT_TASK_OPEN = 8;
+ TRANSIT_TASK_CLOSE = 9;
+ TRANSIT_TASK_TO_FRONT = 10;
+ TRANSIT_TASK_TO_BACK = 11;
+ TRANSIT_WALLPAPER_CLOSE = 12;
+ TRANSIT_WALLPAPER_OPEN = 13;
+ TRANSIT_WALLPAPER_INTRA_OPEN = 14;
+ TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
+ TRANSIT_TASK_OPEN_BEHIND = 16;
+ TRANSIT_TASK_IN_PLACE = 17;
+ TRANSIT_ACTIVITY_RELAUNCH = 18;
+ TRANSIT_DOCK_TASK_FROM_RECENTS = 19;
+ TRANSIT_KEYGUARD_GOING_AWAY = 20;
+ TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
+ TRANSIT_KEYGUARD_OCCLUDE = 22;
+ TRANSIT_KEYGUARD_UNOCCLUDE = 23;
+ TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
+ TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
+ }
+ optional TransitionType last_used_app_transition = 2;
}
/* represents DisplayContent */
message DisplayProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- optional int32 id = 2;
- repeated StackProto stacks = 3;
- optional DockedStackDividerControllerProto docked_stack_divider_controller = 4;
- optional PinnedStackControllerProto pinned_stack_controller = 5;
- /* non app windows */
- repeated WindowTokenProto above_app_windows = 6;
- repeated WindowTokenProto below_app_windows = 7;
- repeated WindowTokenProto ime_windows = 8;
- optional int32 dpi = 9;
- optional .android.view.DisplayInfoProto display_info = 10;
- optional int32 rotation = 11;
- optional ScreenRotationAnimationProto screen_rotation_animation = 12;
- optional DisplayFramesProto display_frames = 13;
+ optional WindowContainerProto window_container = 1;
+ optional int32 id = 2;
+ repeated StackProto stacks = 3;
+ optional DockedStackDividerControllerProto docked_stack_divider_controller = 4;
+ optional PinnedStackControllerProto pinned_stack_controller = 5;
+ /* non app windows */
+ repeated WindowTokenProto above_app_windows = 6;
+ repeated WindowTokenProto below_app_windows = 7;
+ repeated WindowTokenProto ime_windows = 8;
+ optional int32 dpi = 9;
+ optional .android.view.DisplayInfoProto display_info = 10;
+ optional int32 rotation = 11;
+ optional ScreenRotationAnimationProto screen_rotation_animation = 12;
+ optional DisplayFramesProto display_frames = 13;
}
/* represents DisplayFrames */
message DisplayFramesProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.RectProto stable_bounds = 1;
+ optional .android.graphics.RectProto stable_bounds = 1;
}
/* represents DockedStackDividerController */
message DockedStackDividerControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool minimized_dock = 1;
+ optional bool minimized_dock = 1;
}
/* represents PinnedStackController */
message PinnedStackControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.RectProto default_bounds = 1;
- optional .android.graphics.RectProto movement_bounds = 2;
+ optional .android.graphics.RectProto default_bounds = 1;
+ optional .android.graphics.RectProto movement_bounds = 2;
}
/* represents TaskStack */
message StackProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- optional int32 id = 2;
- repeated TaskProto tasks = 3;
- optional bool fills_parent = 4;
- optional .android.graphics.RectProto bounds = 5;
- optional bool animation_background_surface_is_dimming = 6;
- optional bool defer_removal = 7;
- optional float minimize_amount = 8;
- optional bool adjusted_for_ime = 9;
- optional float adjust_ime_amount = 10;
- optional float adjust_divider_amount = 11;
- optional .android.graphics.RectProto adjusted_bounds = 12;
- optional bool animating_bounds = 13;
+ optional WindowContainerProto window_container = 1;
+ optional int32 id = 2;
+ repeated TaskProto tasks = 3;
+ optional bool fills_parent = 4;
+ optional .android.graphics.RectProto bounds = 5;
+ optional bool animation_background_surface_is_dimming = 6;
+ optional bool defer_removal = 7;
+ optional float minimize_amount = 8;
+ optional bool adjusted_for_ime = 9;
+ optional float adjust_ime_amount = 10;
+ optional float adjust_divider_amount = 11;
+ optional .android.graphics.RectProto adjusted_bounds = 12;
+ optional bool animating_bounds = 13;
}
/* represents Task */
message TaskProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- optional int32 id = 2;
- repeated AppWindowTokenProto app_window_tokens = 3;
- optional bool fills_parent = 4;
- optional .android.graphics.RectProto bounds = 5;
- optional .android.graphics.RectProto temp_inset_bounds = 6;
- optional bool defer_removal = 7;
+ optional WindowContainerProto window_container = 1;
+ optional int32 id = 2;
+ repeated AppWindowTokenProto app_window_tokens = 3;
+ optional bool fills_parent = 4;
+ optional .android.graphics.RectProto bounds = 5;
+ optional .android.graphics.RectProto temp_inset_bounds = 6;
+ optional bool defer_removal = 7;
}
/* represents AppWindowToken */
message AppWindowTokenProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- /* obtained from ActivityRecord */
- optional string name = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
- optional WindowTokenProto window_token = 2;
- optional bool last_surface_showing = 3;
- optional bool is_waiting_for_transition_start = 4;
- optional bool is_really_animating = 5;
- optional AppWindowThumbnailProto thumbnail = 6;
- optional bool fills_parent = 7;
- optional bool app_stopped = 8;
- optional bool hidden_requested = 9;
- optional bool client_hidden = 10;
- optional bool defer_hiding_client = 11;
- optional bool reported_drawn = 12;
- optional bool reported_visible = 13;
- optional int32 num_interesting_windows = 14;
- optional int32 num_drawn_windows = 15;
- optional bool all_drawn = 16;
- optional bool last_all_drawn = 17;
- optional bool removed = 18;
- optional IdentifierProto starting_window = 19;
- optional bool starting_displayed = 20;
- optional bool starting_moved = 21;
- optional bool hidden_set_from_transferred_starting_window = 22;
- repeated .android.graphics.RectProto frozen_bounds = 23;
+ /* obtained from ActivityRecord */
+ optional string name = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional WindowTokenProto window_token = 2;
+ optional bool last_surface_showing = 3;
+ optional bool is_waiting_for_transition_start = 4;
+ optional bool is_really_animating = 5;
+ optional AppWindowThumbnailProto thumbnail = 6;
+ optional bool fills_parent = 7;
+ optional bool app_stopped = 8;
+ optional bool hidden_requested = 9;
+ optional bool client_hidden = 10;
+ optional bool defer_hiding_client = 11;
+ optional bool reported_drawn = 12;
+ optional bool reported_visible = 13;
+ optional int32 num_interesting_windows = 14;
+ optional int32 num_drawn_windows = 15;
+ optional bool all_drawn = 16;
+ optional bool last_all_drawn = 17;
+ optional bool removed = 18;
+ optional IdentifierProto starting_window = 19;
+ optional bool starting_displayed = 20;
+ optional bool starting_moved = 21;
+ optional bool hidden_set_from_transferred_starting_window = 22;
+ repeated .android.graphics.RectProto frozen_bounds = 23;
}
/* represents WindowToken */
message WindowTokenProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- optional int32 hash_code = 2;
- repeated WindowStateProto windows = 3;
- optional bool hidden = 4;
- optional bool waiting_to_show = 5;
- optional bool paused = 6;
+ optional WindowContainerProto window_container = 1;
+ optional int32 hash_code = 2;
+ repeated WindowStateProto windows = 3;
+ optional bool hidden = 4;
+ optional bool waiting_to_show = 5;
+ optional bool paused = 6;
}
/* represents WindowState */
message WindowStateProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional WindowContainerProto window_container = 1;
- optional IdentifierProto identifier = 2;
- optional int32 display_id = 3;
- optional int32 stack_id = 4;
- optional .android.view.WindowLayoutParamsProto attributes = 5;
- optional .android.graphics.RectProto given_content_insets = 6;
- optional .android.graphics.RectProto frame = 7;
- optional .android.graphics.RectProto containing_frame = 8;
- optional .android.graphics.RectProto parent_frame = 9;
- optional .android.graphics.RectProto content_frame = 10;
- optional .android.graphics.RectProto content_insets = 11;
- optional .android.graphics.RectProto surface_insets = 12;
- optional WindowStateAnimatorProto animator = 13;
- optional bool animating_exit = 14;
- repeated WindowStateProto child_windows = 15;
- optional .android.graphics.RectProto surface_position = 16;
- optional int32 requested_width = 18;
- optional int32 requested_height = 19;
- optional int32 view_visibility = 20;
- optional int32 system_ui_visibility = 21;
- optional bool has_surface = 22;
- optional bool is_ready_for_display = 23;
- optional .android.graphics.RectProto display_frame = 24;
- optional .android.graphics.RectProto overscan_frame = 25;
- optional .android.graphics.RectProto visible_frame = 26;
- optional .android.graphics.RectProto decor_frame = 27;
- optional .android.graphics.RectProto outset_frame = 28;
- optional .android.graphics.RectProto overscan_insets = 29;
- optional .android.graphics.RectProto visible_insets = 30;
- optional .android.graphics.RectProto stable_insets = 31;
- optional .android.graphics.RectProto outsets = 32;
- optional .android.view.DisplayCutoutProto cutout = 33;
- optional bool remove_on_exit = 34;
- optional bool destroying = 35;
- optional bool removed = 36;
- optional bool is_on_screen = 37;
- optional bool is_visible = 38;
+ optional WindowContainerProto window_container = 1;
+ optional IdentifierProto identifier = 2;
+ optional int32 display_id = 3;
+ optional int32 stack_id = 4;
+ optional .android.view.WindowLayoutParamsProto attributes = 5;
+ optional .android.graphics.RectProto given_content_insets = 6;
+ optional .android.graphics.RectProto frame = 7;
+ optional .android.graphics.RectProto containing_frame = 8;
+ optional .android.graphics.RectProto parent_frame = 9;
+ optional .android.graphics.RectProto content_frame = 10;
+ optional .android.graphics.RectProto content_insets = 11;
+ optional .android.graphics.RectProto surface_insets = 12;
+ optional WindowStateAnimatorProto animator = 13;
+ optional bool animating_exit = 14;
+ repeated WindowStateProto child_windows = 15;
+ optional .android.graphics.RectProto surface_position = 16;
+ optional int32 requested_width = 18;
+ optional int32 requested_height = 19;
+ optional int32 view_visibility = 20;
+ optional int32 system_ui_visibility = 21;
+ optional bool has_surface = 22;
+ optional bool is_ready_for_display = 23;
+ optional .android.graphics.RectProto display_frame = 24;
+ optional .android.graphics.RectProto overscan_frame = 25;
+ optional .android.graphics.RectProto visible_frame = 26;
+ optional .android.graphics.RectProto decor_frame = 27;
+ optional .android.graphics.RectProto outset_frame = 28;
+ optional .android.graphics.RectProto overscan_insets = 29;
+ optional .android.graphics.RectProto visible_insets = 30;
+ optional .android.graphics.RectProto stable_insets = 31;
+ optional .android.graphics.RectProto outsets = 32;
+ optional .android.view.DisplayCutoutProto cutout = 33;
+ optional bool remove_on_exit = 34;
+ optional bool destroying = 35;
+ optional bool removed = 36;
+ optional bool is_on_screen = 37;
+ optional bool is_visible = 38;
}
message IdentifierProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 hash_code = 1;
- optional int32 user_id = 2;
- optional string title = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 hash_code = 1;
+ optional int32 user_id = 2;
+ optional string title = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
/* represents WindowStateAnimator */
message WindowStateAnimatorProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.RectProto last_clip_rect = 1;
- optional WindowSurfaceControllerProto surface = 2;
- enum DrawState {
- NO_SURFACE = 0;
- DRAW_PENDING = 1;
- COMMIT_DRAW_PENDING = 2;
- READY_TO_SHOW = 3;
- HAS_DRAWN = 4;
- }
- optional DrawState draw_state = 3;
- optional .android.graphics.RectProto system_decor_rect = 4;
+ optional .android.graphics.RectProto last_clip_rect = 1;
+ optional WindowSurfaceControllerProto surface = 2;
+ enum DrawState {
+ NO_SURFACE = 0;
+ DRAW_PENDING = 1;
+ COMMIT_DRAW_PENDING = 2;
+ READY_TO_SHOW = 3;
+ HAS_DRAWN = 4;
+ }
+ optional DrawState draw_state = 3;
+ optional .android.graphics.RectProto system_decor_rect = 4;
}
/* represents WindowSurfaceController */
message WindowSurfaceControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool shown = 1;
- optional int32 layer = 2;
+ optional bool shown = 1;
+ optional int32 layer = 2;
}
/* represents ScreenRotationAnimation */
message ScreenRotationAnimationProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional bool started = 1;
- optional bool animation_running = 2;
+ optional bool started = 1;
+ optional bool animation_running = 2;
}
/* represents WindowContainer */
message WindowContainerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional ConfigurationContainerProto configuration_container = 1;
- optional int32 orientation = 2;
- optional bool visible = 3;
- optional SurfaceAnimatorProto surface_animator = 4;
+ optional ConfigurationContainerProto configuration_container = 1;
+ optional int32 orientation = 2;
+ optional bool visible = 3;
+ optional SurfaceAnimatorProto surface_animator = 4;
}
/* represents ConfigurationContainer */
message ConfigurationContainerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.content.ConfigurationProto override_configuration = 1;
- optional .android.content.ConfigurationProto full_configuration = 2;
- optional .android.content.ConfigurationProto merged_override_configuration = 3;
+ optional .android.content.ConfigurationProto override_configuration = 1;
+ optional .android.content.ConfigurationProto full_configuration = 2;
+ optional .android.content.ConfigurationProto merged_override_configuration = 3;
}
diff --git a/core/proto/android/service/appwidget.proto b/core/proto/android/service/appwidget.proto
index 3f46d2b..cd7173a 100644
--- a/core/proto/android/service/appwidget.proto
+++ b/core/proto/android/service/appwidget.proto
@@ -22,18 +22,18 @@
// represents the object holding the dump info of the app widget service
message AppWidgetServiceDumpProto {
- repeated WidgetProto widgets = 1; // the array of bound widgets
+ repeated WidgetProto widgets = 1; // the array of bound widgets
}
// represents a bound widget
message WidgetProto {
- optional bool isCrossProfile = 1; // true if host and provider belong to diff users
- optional bool isHostStopped = 2; // true if host has not called startListening yet
- optional string hostPackage = 3;
- optional string providerPackage = 4;
- optional string providerClass = 5;
- optional int32 minWidth = 6;
- optional int32 minHeight = 7;
- optional int32 maxWidth = 8;
- optional int32 maxHeight = 9;
+ optional bool isCrossProfile = 1; // true if host and provider belong to diff users
+ optional bool isHostStopped = 2; // true if host has not called startListening yet
+ optional string hostPackage = 3;
+ optional string providerPackage = 4;
+ optional string providerClass = 5;
+ optional int32 minWidth = 6;
+ optional int32 minHeight = 7;
+ optional int32 maxWidth = 8;
+ optional int32 maxHeight = 9;
}
diff --git a/core/proto/android/service/batterystats.proto b/core/proto/android/service/batterystats.proto
index e31e7f3..5586263 100644
--- a/core/proto/android/service/batterystats.proto
+++ b/core/proto/android/service/batterystats.proto
@@ -24,7 +24,7 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
message BatteryStatsServiceDumpProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional android.os.BatteryStatsProto batterystats = 1;
+ optional android.os.BatteryStatsProto batterystats = 1;
}
diff --git a/core/proto/android/service/network_watchlist.proto b/core/proto/android/service/network_watchlist.proto
index fb03b93..66d79bdb 100644
--- a/core/proto/android/service/network_watchlist.proto
+++ b/core/proto/android/service/network_watchlist.proto
@@ -23,14 +23,14 @@
// generate network watchlist report.
message NetworkWatchlistReportProto {
- optional int32 report_version = 1;
+ optional int32 report_version = 1;
- optional string watchlist_config_hash = 2;
+ optional string watchlist_config_hash = 2;
- repeated NetworkWatchlistAppResultProto app_result = 3;
+ repeated NetworkWatchlistAppResultProto app_result = 3;
}
message NetworkWatchlistAppResultProto {
- optional string app_digest = 1;
- optional bool encoded_result = 2;
+ optional string app_digest = 1;
+ optional bool encoded_result = 2;
}
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index 8240d8a..c363710 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -88,7 +88,7 @@
option (android.msg_privacy).dest = DEST_AUTOMATIC;
optional bool connected_to_adb = 1;
- optional string last_key_recevied = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ optional string last_key_received = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ];
optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ];
}
@@ -342,4 +342,4 @@
optional string manufacturer = 1;
optional string model = 2;
optional string version = 3;
-}
\ No newline at end of file
+}
diff --git a/core/proto/android/view/displaycutout.proto b/core/proto/android/view/displaycutout.proto
index ee258b7..f4744da 100644
--- a/core/proto/android/view/displaycutout.proto
+++ b/core/proto/android/view/displaycutout.proto
@@ -23,8 +23,8 @@
option java_multiple_files = true;
message DisplayCutoutProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.graphics.RectProto insets = 1;
- optional .android.graphics.RectProto bounds = 2;
+ optional .android.graphics.RectProto insets = 1;
+ optional .android.graphics.RectProto bounds = 2;
}
diff --git a/core/proto/android/view/displayinfo.proto b/core/proto/android/view/displayinfo.proto
index 2a03050..8583955 100644
--- a/core/proto/android/view/displayinfo.proto
+++ b/core/proto/android/view/displayinfo.proto
@@ -23,11 +23,11 @@
/* represents DisplayInfo */
message DisplayInfoProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 logical_width = 1;
- optional int32 logical_height = 2;
- optional int32 app_width = 3;
- optional int32 app_height = 4;
- optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 logical_width = 1;
+ optional int32 logical_height = 2;
+ optional int32 app_width = 3;
+ optional int32 app_height = 4;
+ optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
diff --git a/core/proto/android/view/remote_animation_target.proto b/core/proto/android/view/remote_animation_target.proto
index d5da0a9..9139f25 100644
--- a/core/proto/android/view/remote_animation_target.proto
+++ b/core/proto/android/view/remote_animation_target.proto
@@ -28,16 +28,16 @@
/** Proto representation for RemoteAnimationTarget.java class. */
message RemoteAnimationTargetProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 task_id = 1;
- optional int32 mode = 2;
- optional .android.view.SurfaceControlProto leash = 3;
- optional bool is_translucent = 4;
- optional .android.graphics.RectProto clip_rect = 5;
- optional .android.graphics.RectProto contentInsets = 6;
- optional int32 prefix_order_index = 7;
- optional .android.graphics.PointProto position = 8;
- optional .android.graphics.RectProto source_container_bounds = 9;
- optional .android.app.WindowConfigurationProto window_configuration = 10;
+ optional int32 task_id = 1;
+ optional int32 mode = 2;
+ optional .android.view.SurfaceControlProto leash = 3;
+ optional bool is_translucent = 4;
+ optional .android.graphics.RectProto clip_rect = 5;
+ optional .android.graphics.RectProto contentInsets = 6;
+ optional int32 prefix_order_index = 7;
+ optional .android.graphics.PointProto position = 8;
+ optional .android.graphics.RectProto source_container_bounds = 9;
+ optional .android.app.WindowConfigurationProto window_configuration = 10;
}
diff --git a/core/proto/android/view/surface.proto b/core/proto/android/view/surface.proto
index 8f5f695..e20b094 100644
--- a/core/proto/android/view/surface.proto
+++ b/core/proto/android/view/surface.proto
@@ -19,10 +19,10 @@
option java_multiple_files = true;
message SurfaceProto {
- enum Rotation {
- ROTATION_0 = 0;
- ROTATION_90 = 1;
- ROTATION_180 = 2;
- ROTATION_270 = 3;
- }
+ enum Rotation {
+ ROTATION_0 = 0;
+ ROTATION_90 = 1;
+ ROTATION_180 = 2;
+ ROTATION_270 = 3;
+ }
}
diff --git a/core/proto/android/view/surfacecontrol.proto b/core/proto/android/view/surfacecontrol.proto
index 665d688..8a252be 100644
--- a/core/proto/android/view/surfacecontrol.proto
+++ b/core/proto/android/view/surfacecontrol.proto
@@ -25,8 +25,8 @@
* Represents a {@link android.view.SurfaceControl} object.
*/
message SurfaceControlProto {
- option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 hash_code = 1;
- optional string name = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ optional int32 hash_code = 1;
+ optional string name = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
}
diff --git a/core/proto/android/view/windowlayoutparams.proto b/core/proto/android/view/windowlayoutparams.proto
index 0362ab1..586321d 100644
--- a/core/proto/android/view/windowlayoutparams.proto
+++ b/core/proto/android/view/windowlayoutparams.proto
@@ -25,43 +25,47 @@
/* represents WindowManager.LayoutParams */
message WindowLayoutParamsProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 type = 1;
- optional int32 x = 2;
- optional int32 y = 3;
- optional int32 width = 4;
- optional int32 height = 5;
- optional float horizontal_margin = 6;
- optional float vertical_margin = 7;
- optional int32 gravity = 8;
- optional int32 soft_input_mode = 9;
- optional .android.graphics.PixelFormatProto.Format format = 10;
- optional int32 window_animations = 11;
- optional float alpha = 12;
- optional float screen_brightness = 13;
- optional float button_brightness = 14;
- enum RotationAnimation {
- ROTATION_ANIMATION_UNSPECIFIED = -1;
- ROTATION_ANIMATION_CROSSFADE = 1;
- ROTATION_ANIMATION_JUMPCUT = 2;
- ROTATION_ANIMATION_SEAMLESS = 3;
- }
- optional RotationAnimation rotation_animation = 15;
- optional float preferred_refresh_rate = 16;
- optional int32 preferred_display_mode_id = 17;
- optional bool has_system_ui_listeners = 18;
- optional uint32 input_feature_flags = 19;
- optional int64 user_activity_timeout = 20;
- enum NeedsMenuState {
- NEEDS_MENU_UNSET = 0;
- NEEDS_MENU_SET_TRUE = 1;
- NEEDS_MENU_SET_FALSE = 2;
- }
- optional NeedsMenuState needs_menu_key = 22;
- optional .android.view.DisplayProto.ColorMode color_mode = 23;
- optional uint32 flags = 24;
- optional uint32 private_flags = 26;
- optional uint32 system_ui_visibility_flags = 27;
- optional uint32 subtree_system_ui_visibility_flags = 28;
+ optional int32 type = 1;
+ optional int32 x = 2;
+ optional int32 y = 3;
+ optional int32 width = 4;
+ optional int32 height = 5;
+ optional float horizontal_margin = 6;
+ optional float vertical_margin = 7;
+ optional int32 gravity = 8;
+ optional int32 soft_input_mode = 9;
+ optional .android.graphics.PixelFormatProto.Format format = 10;
+ optional int32 window_animations = 11;
+ optional float alpha = 12;
+ optional float screen_brightness = 13;
+ optional float button_brightness = 14;
+
+ enum RotationAnimation {
+ ROTATION_ANIMATION_UNSPECIFIED = -1;
+ ROTATION_ANIMATION_CROSSFADE = 1;
+ ROTATION_ANIMATION_JUMPCUT = 2;
+ ROTATION_ANIMATION_SEAMLESS = 3;
+ }
+ optional RotationAnimation rotation_animation = 15;
+
+ optional float preferred_refresh_rate = 16;
+ optional int32 preferred_display_mode_id = 17;
+ optional bool has_system_ui_listeners = 18;
+ optional uint32 input_feature_flags = 19;
+ optional int64 user_activity_timeout = 20;
+
+ enum NeedsMenuState {
+ NEEDS_MENU_UNSET = 0;
+ NEEDS_MENU_SET_TRUE = 1;
+ NEEDS_MENU_SET_FALSE = 2;
+ }
+ optional NeedsMenuState needs_menu_key = 22;
+
+ optional .android.view.DisplayProto.ColorMode color_mode = 23;
+ optional uint32 flags = 24;
+ optional uint32 private_flags = 26;
+ optional uint32 system_ui_visibility_flags = 27;
+ optional uint32 subtree_system_ui_visibility_flags = 28;
}
diff --git a/core/res/res/drawable/ic_corp_badge.xml b/core/res/res/drawable/ic_corp_badge.xml
index 915f5fb..1dad977 100644
--- a/core/res/res/drawable/ic_corp_badge.xml
+++ b/core/res/res/drawable/ic_corp_badge.xml
@@ -17,21 +17,20 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
- android:viewportWidth="20"
- android:viewportHeight="20">
+ android:viewportWidth="48"
+ android:viewportHeight="48">
<path
- android:fillColor="#fcfcfc"
- android:pathData="M 10 0 C 15.5228474983 0 20 4.47715250169 20 10 C 20 15.5228474983 15.5228474983 20 10 20 C 4.47715250169 20 0 15.5228474983 0 10 C 0 4.47715250169 4.47715250169 0 10 0 Z" />
- <path
- android:strokeColor="#e8eaed"
- android:strokeWidth="0.25"
- android:pathData="M 10 0.12 C 15.4565733283 0.12 19.88 4.54342667167 19.88 10 C 19.88 15.4565733283 15.4565733283 19.88 10 19.88 C 4.54342667167 19.88 0.12 15.4565733283 0.12 10 C 0.12 4.54342667167 4.54342667167 0.12 10 0.12 Z" />
- <path
- android:pathData="M 3.5 3.5 L 16.5 3.5 L 16.5 16.5 L 3.5 16.5 L 3.5 3.5 Z" />
- <path
- android:fillColor="#1a73e8"
- android:pathData="M14.46,6.58H12.23V5.5a1.09,1.09,0,0,0-1.11-1.08H8.89A1.09,1.09,0,0,0,7.77,5.5V6.58H5.54A1.09,1.09,0,0,0,4.43,7.65v5.91a1.09,1.09,0,0,0,1.11,1.08h8.91a1.09,1.09,0,0,0,1.11-1.08V7.65A1.09,1.09,0,0,0,14.46,6.58ZM10,11.42a1.08,1.08,0,1,1,1.11-1.08A1.1,1.1,0,0,1,10,11.42Zm1.11-4.84H8.89V5.5h2.23Z" />
- <path
- android:pathData="M 0 0 H 20 V 20 H 0 V 0 Z" />
+ android:fillType="evenOdd"
+ android:strokeColor="#1A73E8"
+ android:strokeWidth="4"
+ android:pathData="M 24 2 C 36.1502644963 2 46 11.8497355037 46 24 C 46 36.1502644963 36.1502644963 46 24 46 C 11.8497355037 46 2 36.1502644963 2 24 C 2 11.8497355037 11.8497355037 2 24 2 Z" />
+ <group
+ android:translateX="10.400000"
+ android:translateY="10.400000">
+ <path
+ android:fillColor="#1A73E8"
+ android:strokeWidth="1"
+ android:pathData="M24.2971429,5.38947368 L18.9485714,5.38947368 L18.9485714,2.80902256 C18.9485714,1.37687218 17.7585143,0.228571429 16.2742857,0.228571429 L10.9257143,0.228571429 C9.44148571,0.228571429 8.25142857,1.37687218 8.25142857,2.80902256 L8.25142857,5.38947368 L2.90285714,5.38947368 C1.41862857,5.38947368 0.241942857,6.53777444 0.241942857,7.96992481 L0.228571429,22.162406 C0.228571429,23.5945564 1.41862857,24.7428571 2.90285714,24.7428571 L24.2971429,24.7428571 C25.7813714,24.7428571 26.9714286,23.5945564 26.9714286,22.162406 L26.9714286,7.96992481 C26.9714286,6.53777444 25.7813714,5.38947368 24.2971429,5.38947368 Z M13.6,17.0015038 C12.1291429,17.0015038 10.9257143,15.8403008 10.9257143,14.4210526 C10.9257143,13.0018045 12.1291429,11.8406015 13.6,11.8406015 C15.0708571,11.8406015 16.2742857,13.0018045 16.2742857,14.4210526 C16.2742857,15.8403008 15.0708571,17.0015038 13.6,17.0015038 Z M16.2742857,5.38947368 L10.9257143,5.38947368 L10.9257143,2.80902256 L16.2742857,2.80902256 L16.2742857,5.38947368 Z" />
+ </group>
</vector>
\ No newline at end of file
diff --git a/core/res/res/layout/language_picker_section_header.xml b/core/res/res/layout/language_picker_section_header.xml
index 6cbd7c3..4fa4d9b 100644
--- a/core/res/res/layout/language_picker_section_header.xml
+++ b/core/res/res/layout/language_picker_section_header.xml
@@ -20,8 +20,8 @@
android:layout_width="match_parent"
android:layout_height="36dp"
android:gravity="center_vertical"
- android:paddingStart="18dp"
- android:paddingEnd="18dp"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:textColor="?android:attr/colorAccent"
android:textStyle="bold"
tools:text="@string/language_picker_section_all"/>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 10738e0..f5908f3 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Bel"</string>
<string name="dial_desc" msgid="6573723404985517250">"Bel gekose foonnommer"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Soek geselekteerde adres"</string>
<string name="browse" msgid="1245903488306147205">"Maak oop"</string>
<string name="browse_desc" msgid="8220976549618935044">"Maak gekose URL oop"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleer deur jou administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opgedateer deur jou administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Uitgevee deur jou administrateur"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Batterybespaarder verlaag jou toestel se werkverrigting en beperk of skakel vibrasie, liggingdienste en agtergronddata af om sodoende jou batterylewe te verleng. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer nie tensy jy hulle oopmaak.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel laai."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Om jou batterylewe te verleng, skakel Batterybespaarder sommige toestelkenmerke af en beperk programme."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Skakel Databespaarder aan?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Skakel aan"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle tale"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Allle streke"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Soek"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Handeling nie toegelaat nie"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Hierdie program <xliff:g id="APP_NAME">%1$s</xliff:g> is tans gedeaktiveer."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Meer besonderhede"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Skakel werkprofiel aan?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Jou werkprogramme, kennisgewings, data en ander werkprofielkenmerke sal aangeskakel word"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Skakel aan"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Oproepe en kennisgewings sal gedemp wees"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Stelselveranderinge"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Moenie Steur Nie"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Moenie Steur Nie versteek tans kennisgewings om jou te help om te fokus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dit is nuwe gedrag. Tik om te verander."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Nuut: Moenie Steur Nie versteek tans kennisgewings"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tik om meer te wete te kom en te verander."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Moenie Steur Nie het verander"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tik om te kyk wat geblokkeer word."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Stelsel"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 0f61664..f176c6d 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ጥሪ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ወደተመረጠውን ስልክ ቁጥር ደውል"</string>
<string name="map" msgid="5441053548030107189">"ካርታ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"የተመረጠውን አድራሻ ያለበትን አግኝ"</string>
<string name="browse" msgid="1245903488306147205">"ክፈት"</string>
<string name="browse_desc" msgid="8220976549618935044">"የተመረጠውን ዩአርኤል ክፈት"</string>
<string name="sms" msgid="4560537514610063430">"መልዕክት"</string>
@@ -1489,7 +1488,7 @@
<string name="default_audio_route_category_name" msgid="3722811174003886946">"ስርዓት"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"የብሉቱዝ ድምጽ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"ገመድ አልባ ማሳያ"</string>
- <string name="media_route_button_content_description" msgid="591703006349356016">"ውሰድ"</string>
+ <string name="media_route_button_content_description" msgid="591703006349356016">"Cast"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"ከመሳሪያ ጋር ያገናኙ"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"ማያ ገጽን ወደ መሣሪያ ይውሰዱ"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"መሳሪያዎችን በመፈለግ ላይ…"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"በእርስዎ አስተዳዳሪ ተጭኗል"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"በእርስዎ አስተዳዳሪ ተዘምኗል"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"በእርስዎ አስተዳዳሪ ተሰርዟል"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"የባትሪ ህይወትን ለማሻሻል ባትሪ ቆጣቢ የመሣሪያዎን አፈጻጸምን ይቀንስና ንዝረትን፣ የአካባቢ አገልግሎቶችን እና የጀርባ ውሂብን ይገድባል። ኢሜይል፣ መልዕክት መላላክ እና ሌሎች በስምረት ላይ የሚወሰኑ መተግበሪያዎች እስኪከፍቷቸው ድረስ ላያዘምኑ ይችላሉ።\n\nመሣሪያዎ ኃይል በሚሞላበት ማንኛውም ጊዜ ላይ ባትሪ ቆጣቢ በራስ-ሰር ይጠፋል።"</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"የእርስዎን ባትሪ ዕድሜ ለማራዘም ባትሪ ቆጣቢ አንዳንድ የመሣሪያ ባሕሪያትን ያጠፋል እንዲሁም መተግበሪያዎችን ይገድባል።"</string>
<string name="data_saver_description" msgid="6015391409098303235">"የውሂብ አጠቃቀም እንዲቀንስ ለማገዝ ውሂብ ቆጣቢ አንዳንድ መተግበሪያዎች ከበስተጀርባ ሆነው ውሂብ እንዳይልኩ ወይም እንዳይቀበሉ ይከለክላቸዋል። በአሁኑ ጊዜ እየተጠቀሙበት ያለ መተግበሪያ ውሂብ ሊደርስ ይችላል፣ ነገር ግን ባነሰ ተደጋጋሚነት ሊሆን ይችላል። ይሄ ማለት ለምሳሌ ምስሎችን መታ እስኪያደርጓቸው ድረስ ላይታዩ ይችላሉ ማለት ነው።"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ውሂብ ቆጣቢ ይጥፋ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"አብራ"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ሁሉም ቋንቋዎች"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ሁሉም ክልሎች"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ፈልግ"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"እርምጃ አይፈቀድም"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"መተግበሪያ <xliff:g id="APP_NAME">%1$s</xliff:g> አስቀድሞ ተሰናክሏል።"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"ተጨማሪ ዝርዝሮች"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"የስራ መገለጫ ይብራ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"የእርስዎ የስራ መተግበሪያዎች፣ ማሳወቂያዎች፣ ውሂብ እና ሌሎች የስራ መገለጫ ባህሪያት ይበራሉ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"አብራ"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ጥሪዎች እና ማሳወቂያዎች ድምፀ-ከል ይሆናሉ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"የሥርዓት ለውጦች"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"አትረብሽ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"እርስዎ ትኩረት እንዲሰጡ ለማገዝ አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ይህ አዲስ ባሕሪ ነው። ለመለወጥ መታ ያድርጉ።"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"አዲስ፦ አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"የበለጠ ለመረዳት እና ለመለወጥ መታ ያድርጉ።"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"አትረብሽ ተቀይሯል"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ምን እንደታገደ ለመፈተሽ መታ ያድርጉ።"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ሥርዓት"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d1a90c40..6a288ae 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1094,8 +1094,7 @@
<string name="dial" msgid="1253998302767701559">"اتصال"</string>
<string name="dial_desc" msgid="6573723404985517250">"الاتصال برقم الهاتف المختار"</string>
<string name="map" msgid="5441053548030107189">"خريطة"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"تحديد موقع العنوان المختار"</string>
<string name="browse" msgid="1245903488306147205">"فتح"</string>
<string name="browse_desc" msgid="8220976549618935044">"فتح عنوان URL المختار"</string>
<string name="sms" msgid="4560537514610063430">"رسالة"</string>
@@ -1791,7 +1790,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"تم التثبيت بواسطة المشرف"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"تم التحديث بواسطة المشرف"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"تم الحذف بواسطة المشرف"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"لإطالة عمر البطارية، تعمل ميزة \"توفير شحن البطارية\" على تقليل أداء الجهاز والحد من استخدام الاهتزاز وخدمات الموقع الجغرافي وبيانات الخلفية أو إيقافه. وقد لا يتم تحديث البريد الإلكتروني والمراسلة والتطبيقات الأخرى التي تعتمد على المزامنة ما لم يتم فتحها.\n\nيتم إيقاف ميزة \"توفير شحن البطارية\" تلقائيًا عند شحن الجهاز."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"لإطالة عمر البطارية، يؤدي وضع توفير شحن البطارية إلى إيقاف بعض ميزات الجهاز وتقييد التطبيقات."</string>
<string name="data_saver_description" msgid="6015391409098303235">"للمساعدة في خفض استخدام البيانات، يمنع توفير البيانات بعض التطبيقات من إرسال البيانات وتلقيها في الخلفية. يمكن للتطبيق الذي تستخدمه الآن الوصول إلى البيانات، ولكن لا يمكنه تنفيذ ذلك كثيرًا. وهذا يعني أن الصور على سبيل المثال لا تظهر حتى تنقر عليها."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"هل تريد تشغيل توفير البيانات؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"تشغيل"</string>
@@ -1914,6 +1913,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"جميع اللغات"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"كل المناطق"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"البحث"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"غير مسموح بهذا الإجراء"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"تم إيقاف التطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> حاليًا."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"المزيد من التفاصيل"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"تفعيل الملف الشخصي للعمل؟"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"سيتم تفعيل تطبيقات العمل التي تستخدمها والإشعارات والبيانات وغيرها من ميزات الملف الشخصي للعمل"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"تشغيل"</string>
@@ -2006,9 +2008,9 @@
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقي المكالمات والإشعارات"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"تغييرات النظام"</string>
- <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"الرجاء عدم الإزعاج"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"يؤدي تفعيل وضع \"الرجاء عدم الإزعاج\" إلى إخفاء الإشعارات لمساعدتك على التركيز."</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"هذا السلوك جديد. انقر لتغييره."</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"عدم الإزعاج"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"جديد: يؤدي تفعيل وضع \"الرجاء عدم الإزعاج\" إلى إخفاء الإشعارات."</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"انقر لمعرفة مزيد من المعلومات وإجراء التغيير."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"تم تغيير وضع \"الرجاء عدم الإزعاج\"."</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"انقر للاطّلاع على ما تم حظره."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"النظام"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index ff26222..52be669 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"কোনো ভইচ সেৱা নাই"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ধ্বনি সেৱা বা জৰুৰীকালীন কলৰ সেৱা উপলব্ধ নহয়"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"আপোনাৰ বাহকে সাময়িকভাৱে অফ কৰি থৈছে"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"আপোনাৰ বাহকে <xliff:g id="SIMNUMBER">%d</xliff:g> ছিমৰ বাবে সাময়িকভাৱে অফ কৰিছে"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ম\'বাইল নেটৱৰ্কৰ লগত সংযোগ কৰিব পৰা নাই"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"পচন্দৰ নেটৱৰ্ক সলনি কৰি চেষ্টা কৰি চাওক। সলনি কৰিবলৈ টিপক।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"জৰুৰীকালীন কল কৰাৰ সুবিধা উপলব্ধ নহয়"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"চিনাক্ত কৰিবপৰা নগ\'ল"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ফিংগাৰপ্ৰিণ্টৰ সত্যাপন কৰা হ’ল"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ নাই।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ফিংগাৰপ্ৰিণ্ট সঞ্চয় কৰিব পৰা নগ\'ল। পূর্বে সঞ্চিত ফিংগাৰপ্ৰিণ্ট এটা আঁতৰাওক।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ফিংগাৰপ্ৰিণ্ট গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string>
@@ -1015,10 +1013,8 @@
<string name="email_desc" msgid="3638665569546416795">"বাছনি কৰা ঠিকনাত ইমেইল কৰক"</string>
<string name="dial" msgid="1253998302767701559">"কল কৰক"</string>
<string name="dial_desc" msgid="6573723404985517250">"বাছনি কৰা ফ\'ন নাম্বাৰত কল কৰক"</string>
- <!-- no translation found for map (5441053548030107189) -->
- <skip />
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map" msgid="5441053548030107189">"মেপ"</string>
+ <string name="map_desc" msgid="1836995341943772348">"বাছনি কৰা ঠিকনাটো বিচাৰি উলিয়াওক"</string>
<string name="browse" msgid="1245903488306147205">"খোলক"</string>
<string name="browse_desc" msgid="8220976549618935044">"বাছনি কৰা URL খোলক"</string>
<string name="sms" msgid="4560537514610063430">"বাৰ্তা"</string>
@@ -1275,49 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>এ অইন এপবোৰৰ ওপৰত প্ৰদৰ্শিত হৈ আছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g>এ এই সুবিধাটো ব্যৱহাৰ কৰাটো নিবিচাৰে তেন্তে টিপি ছেটিংসমূহ খোলক আৰু ইয়াক অফ কৰক।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"অফ কৰক"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> পৰীক্ষা কৰি থকা হৈছে…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"বৰ্তমানৰ সমলৰ সমীক্ষা কৰি থকা হৈছে"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"নতুন <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ছেট আপ কৰিবলৈ টিপক"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফট\' আৰু মিডিয়া স্থানান্তৰণৰ বাবে"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>ত কিবা সমস্যা আছে"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"সমাধান কৰিবলৈ টিপক"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ব্যৱহাৰযোগ্য হৈ থকা নাই। ঠিক কৰিবলৈ বাছনি কৰক।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰি"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক ব্যৱহাৰ কৰিব নোৱাৰে। ব্যৱহাৰ কৰিব পৰা ফৰ্মেটত ছেট আপ কৰিবলৈ টিপক।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইচটোৱে <xliff:g id="NAME">%s</xliff:g>ক চলাব নোৱাৰে। চলাব পৰা কোনো ফৰ্মেটত ছেট আপ কৰিবলৈ বাছনি কৰক।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্ৰত্য়াশিতভাৱে আঁতৰোৱা হ\'ল"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"সমল হেৰুওৱাৰ পৰা হাত সাৰিবলৈ আঁতৰোৱাৰ আগতে মিডিয়া বাহিৰ কৰক"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> আঁতৰোৱা হ\'ল"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"কিছুমান কাৰ্যক্ষমতাই সঠিকভাৱে কাম নকৰিব পাৰে। নতুন সঞ্চয়াগাৰ ভৰাওক।"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> বাহিৰ কৰি থকা হৈছে"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"আঁতৰাই নিদিব"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"ছেট আপ কৰক"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"বাহিৰ কৰক"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"অন্বেষণ কৰক"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> উপলব্ধ নহয়"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"ডিভাইচ আকৌ ভৰাওক"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ক স্থানান্তৰ কৰি থকা হৈছে"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ডেটা স্থানান্তৰ কৰি থকা হৈছে"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"সমলৰ স্থানান্তৰণ সমাপ্ত হ\'ল"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"<xliff:g id="NAME">%s</xliff:g>লৈ সমল স্থানান্তৰ কৰা হ\'ল"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"সমল স্থানান্তৰ কৰিব পৰা নগ\'ল"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"সমল আকৌ স্থানান্তৰ কৰিবলৈ চেষ্টা কৰক"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"আঁতৰোৱা হ\'ল"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"বাহিৰলৈ উলিওৱা হ\'ল"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"পৰীক্ষা কৰি থকা হৈছে…"</string>
@@ -1709,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপোনাৰ প্ৰশাসকে ইনষ্টল কৰিছে"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপোনাৰ প্ৰশাসকে আপেডট কৰিছে"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপোনাৰ প্ৰশাসকে মচিছে"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"বেটাৰিৰ জীৱনকাল বৃদ্ধি কৰিবলৈ বেটাৰি সঞ্চয়কাৰী সুবিধাই আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা হ্ৰাস কৰে আৰু কম্পন, অৱস্থান সেৱা আৰু নেপথ্য ডেটা সীমিত কৰে বা বন্ধ কৰে। ছিংকৰ ওপৰত নির্ভৰশীল ইমেইল, মেছেজিং আৰু অন্য এপসমূহ আপুনি নোখোলা পৰ্যন্ত আপডেট নহ\'বও পাৰে।\n\nআপোনাৰ ডিভাইচ চ্চার্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী সুবিধা স্বয়ংক্ৰিয়ভাৱে বন্ধ হ\'ব।"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ডেটা ব্য়ৱহাৰ মাত্ৰা কম কৰিবৰ বাবে ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা ব্য়ৱহাৰ কৰিব পাৰে, কিন্তু সঘনাই এই কার্য কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ এইয়ে হ\'ব পাৰে যে, উদাহৰণস্বৰূপে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ\'ব।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সঞ্চয়কাৰী অন কৰিবনে?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"অন কৰক"</string>
@@ -1796,6 +1778,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"সকলো ভাষা"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"সকলো অঞ্চল"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"অনুসন্ধান কৰক"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"কৰ্মস্থানৰ প্ৰ\'ফাইল অন কৰিবনে?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"আপোনাৰ কৰ্মস্থানৰ এপসমূহ, জাননীসমূহ, ডেটা আৰু কৰ্মস্থানৰ প্ৰ\'ফাইলৰ অইন সুবিধাসমূহ অন কৰা হ\'ব"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"অন কৰক"</string>
@@ -1865,14 +1853,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ভইচৰ বাবে ছিমৰ প্ৰ\'ভিজন কৰা হোৱা নাই"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ভইচৰ বাবে ছিম ব্যৱহাৰৰ অনুমতি নাই"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ভইচৰ বাবে ফ\'ন ব্যৱহাৰৰ অনুমতি নাই"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"ছিম <xliff:g id="SIMNUMBER">%d</xliff:g> অনুমোদিত নহয়"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ছিম <xliff:g id="SIMNUMBER">%d</xliff:g>ৰ প্ৰ\'ভিজন কৰা হোৱা নাই"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"ছিম <xliff:g id="SIMNUMBER">%d</xliff:g> অনুমোদিত নহয়"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"ছিম <xliff:g id="SIMNUMBER">%d</xliff:g> অনুমোদিত নহয়"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"পপআপ ৱিণ্ড\'"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"এপৰ সংস্কৰণ অৱনমিত কৰা হৈছে, বা ই এই শ্বৰ্টকাটটোৰ লগত খাপ নাখায়"</string>
@@ -1889,8 +1873,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"কল আৰু জাননীসমূহ মিউট কৰা হ\'ব"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ছিষ্টেমৰ সালসলনি"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"অসুবিধা নিদিব"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"আপুনি যাতে মনোযোগ দিব পাৰে তাৰ কাৰণে অসুবিধা নিদিবই জাননীসমূহ লুকুৱাই থৈছে"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"এইটো এটা নতুন আচৰণ। সলনি কৰিবলৈ টিপক।"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"অসুবিধা নিদিব সলনি হৈছে"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"কি কি অৱৰোধ কৰা হৈছে জানিবলৈ টিপক।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ছিষ্টেম"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index e666583..f4c0606 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Zəng"</string>
<string name="dial_desc" msgid="6573723404985517250">"Seçilmiş telefon nömrəsinə zəng edin"</string>
<string name="map" msgid="5441053548030107189">"Xəritə"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Seçilmiş ünvanları tapın"</string>
<string name="browse" msgid="1245903488306147205">"Açın"</string>
<string name="browse_desc" msgid="8220976549618935044">"Seçilmiş linki açın"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Admin tərəfindən quraşdırıldı"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Admin tərəfindən yeniləndi"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Admin tərəfindən silindi"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Batareya istifdəsini təkmillədirmək üçün, Batareya Qənaəti cihazın performansını azaldır və vibrasiyanı, məkan xidmətləri və arxa fon datasını deaktiv edir. Sinxronizasiyadan istifadə edən e-poçt, mesajlaşma və digər proqramlar siz onları açmayana qədər yenilənməyə bilər.\n\nCihazınız doldurularkən batareya qənaəti avtomatik olaraq deaktiv edilir."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsini və qəbulunun qarşısını alır. Hazırda istifadə etdiyiniz tətbiq dataya daxil ola bilər, lakin çox az hissəsini tez-tez edə bilər. Bu o deməkdir ki, məsələn, üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Data Qənaəti aktiv edilsin?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivləşdirin"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Bütün dillər"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Bütün bölgələr"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Axtarın"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Əməliyyata icazə verilmir"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> hazırda deaktivdir."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Əlavə məlumatlar"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"İş profili aktiv edilsin?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"İş tətbiqləri, bildirişləri, data və digər iş profili funksiyaları aktiv ediləcək"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivləşdirin"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zəng və bildirişlər səssiz ediləcək"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem dəyişiklikləri"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Narahat Etməyin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\"Narahat Etməyin\" rejimi diqqətinizi yayındırmamaq üçün bildirişləri gizlədir"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Bu, yeni davranışdır. Dəyişmək üçün klikləyin."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Narahat Etməyin\" rejimi dəyişdirildi"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nəyin blok edildiyini yoxlamaq üçün klikləyin."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index fdf5cd7..43db28d 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -829,7 +829,7 @@
<string name="factorytest_not_system" msgid="4435201656767276723">"Radnja FACTORY_TEST je podržana samo za pakete instalirane u direktorijumu /system/app."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"Nije pronađen nijedan paket koji obezbeđuje radnju FACTORY_TEST."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Ponovo pokreni"</string>
- <string name="js_dialog_title" msgid="1987483977834603872">"Na stranici na adresi „<xliff:g id="TITLE">%s</xliff:g>“ piše sledeće:"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"Na stranici na adresi „<xliff:g id="TITLE">%s</xliff:g>“ piše:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Potvrda navigacije"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Zatvori ovu stranicu"</string>
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Pozovi"</string>
<string name="dial_desc" msgid="6573723404985517250">"Pozovite izabrani broj telefona"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Pronađite izabranu adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otvorite izabrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Pošalji SMS"</string>
@@ -1053,7 +1052,7 @@
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"Dodirnite za više informacija ili zaustavljanje aplikacije."</string>
- <string name="ok" msgid="5970060430562524910">"U redu"</string>
+ <string name="ok" msgid="5970060430562524910">"Potvrdi"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="yes" msgid="5362982303337969312">"Potvrdi"</string>
<string name="no" msgid="5141531044935541497">"Otkaži"</string>
@@ -1349,7 +1348,7 @@
<string name="ime_action_go" msgid="8320845651737369027">"Idi"</string>
<string name="ime_action_search" msgid="658110271822807811">"Pretraži"</string>
<string name="ime_action_send" msgid="2316166556349314424">"Pošalji"</string>
- <string name="ime_action_next" msgid="3138843904009813834">"Sledeće"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Dalje"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Gotovo"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Prethodno"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Izvrši"</string>
@@ -1716,7 +1715,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je administrator"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Da bi produžila trajanje baterije, Ušteda baterije smanjuje performanse uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Imejl, razmena poruka i druge aplikacije koje se oslanjaju na sinhronizaciju se možda neće ažurirati ako ih ne otvorite.\n\nUšteda baterije se automatski isključuje kada se uređaj puni."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1812,6 +1812,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Svi regioni"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Radnja nije dozvoljena"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je trenutno onemogućena."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Više detalja"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Da uključimo profil za Work?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Uključiće se poslovne aplikacije, obaveštenja, podaci i druge funkcije profila za Work"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string>
@@ -1902,8 +1905,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Melodija zvona za pozive i obaveštenje je isključena"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promene"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne uznemiravaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Ne uznemiravaj krije obaveštenja da bi vam pomogao da se fokusirate"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da biste promenili."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režim Ne uznemiravaj je promenjen"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da biste proverili šta je blokirano."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7808138..de2c28b 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -84,7 +84,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма сэрвісу галасавых выклікаў"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Галасавыя або экстранныя выклікі недаступныя"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Часова выключана аператарам сувязі"</string>
- <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Часова адключаны для SIM <xliff:g id="SIMNUMBER">%d</xliff:g> аператарам сувязі"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Часова адключана для SIM <xliff:g id="SIMNUMBER">%d</xliff:g> аператарам сувязі"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Сетка мабільнай сувязі недаступная"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Націсніце, каб выбраць іншую сетку."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Экстранныя выклікі недаступныя"</string>
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Выклікаць"</string>
<string name="dial_desc" msgid="6573723404985517250">"Звязацца з абанентам"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Паказаць выбраны адрас на карце"</string>
<string name="browse" msgid="1245903488306147205">"Адкрыць"</string>
<string name="browse_desc" msgid="8220976549618935044">"Адкрыць URL у браўзеры"</string>
<string name="sms" msgid="4560537514610063430">"Паведамленне"</string>
@@ -1321,7 +1320,7 @@
<string name="ext_media_new_notification_title" msgid="1621805083736634077">"Знойдзена новая прылада: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Дакраніцеся, каб наладзіць"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перадачы фатаграфій і медыяфайлаў"</string>
- <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Праблема з носьбітам <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Праблема з носьбітам (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Націсніце, каб выправіць"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Носьбіт <xliff:g id="NAME">%s</xliff:g> пашкоджаны. Выберыце, каб выправіць."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не падтрымліваецца"</string>
@@ -1329,8 +1328,8 @@
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Выберыце, каб наладзіць яго ў фармаце, які падтрымліваецца."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Носьбіт <xliff:g id="NAME">%s</xliff:g> нечакана выняты"</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Адключыце носьбіт перад тым, як дастаць яго, каб не страціць змесціва"</string>
- <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Носьбіт <xliff:g id="NAME">%s</xliff:g> прыбралі"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Некаторыя функцыі могуць кепска працаваць. Устаўце новае сховішча."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Носьбіт (<xliff:g id="NAME">%s</xliff:g>) выняты"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Некаторыя функцыі могуць кепска працаваць. Устаўце новы носьбіт."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> адключаецца"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не даставайце носьбіт"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Наладзіць"</string>
@@ -1341,7 +1340,7 @@
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Перамяшчэнне <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Перамяшчэнне даных"</string>
<string name="ext_media_move_success_title" msgid="7863652232242276066">"Перадача змесціва завершана"</string>
- <string name="ext_media_move_success_message" msgid="8939137931961728009">"Змесціва перанесена на сховішча <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Змесціва перанесена на носьбіт: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_failure_title" msgid="1604422634177382092">"Не ўдалося перамясціць змесціва"</string>
<string name="ext_media_move_failure_message" msgid="7388950499623016135">"Паспрабуйце перамясціць змесціва яшчэ раз"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Носьбіт выдалены"</string>
@@ -1390,7 +1389,7 @@
<string name="sync_binding_label" msgid="3687969138375092423">"Сінхранізацыя"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"Спецыяльныя магчымасці"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Шпалеры"</string>
- <string name="chooser_wallpaper" msgid="7873476199295190279">"Змена шпалер"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"Змяніць шпалеры"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"Слухач апавяшчэння"</string>
<string name="vr_listener_binding_label" msgid="4316591939343607306">"Сродак праслухоўвання ў рэжыме віртуальнай рэальнасці (VR)"</string>
<string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Пастаўшчык умоў"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Усталяваны вашым адміністратарам"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Абноўлены вашым адміністратарам"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Выдалены вашым адміністратарам"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Каб падоўжыць час працы акумулятара, у рэжыме эканоміі зараду памяншаецца прадукцыйнасць вашай прылады, абмяжоўваецца выкарыстанне вібрацыі, службаў вызначэння месцазнаходжання і большасці задач фонавай перадачы даных. Электронная пошта, абмен паведамленнямі і іншыя праграмы, якія патрабуюць сінхранізацыі, могуць абнаўляцца, толькі калі вы іх адкрыеце.\n\nРэжым эканоміі зараду адключаецца аўтаматычна, калі прылада зараджаецца."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Каб паменшыць выкарыстанне даных, Эканомія трафіку не дазваляе некаторым праграмам адпраўляць ці атрымліваць даныя ў фонавым рэжыме. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але можа рабіць гэта радзей. Гэта можа азначаць, напрыклад, што відарысы не паказваюцца, пакуль вы не дакраняцеся да іх."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Уключыць Эканомію трафіка?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Уключыць"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Усе мовы"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Усе рэгіёны"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Шукаць"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Дзеянне забаронена"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" у цяперашні час адключана."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Дадатковая інфармацыя"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Уключыць працоўны профіль?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Будуць уключаны вашы рабочыя праграмы, апавяшчэнні, даныя і іншыя функцыі працоўнага профілю"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Уключыць"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Для выклікаў і апавяшчэнняў гук выключаны"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Сістэмныя змены"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не турбаваць"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Рэжым \"Не турбаваць\" хавае апавяшчэнні, каб вы маглі сканцэнтравацца"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Гэта новае дзеянне. Націсніце, каб перайсці ў налады."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Зменены налады рэжыму \"Не турбаваць\""</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Націсніце, каб паглядзець заблакіраванае."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Сістэма"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 7299834..5c34137 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Обаждане"</string>
<string name="dial_desc" msgid="6573723404985517250">"Обаждане на избрания телефонен номер"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Намиране на избрания адрес"</string>
<string name="browse" msgid="1245903488306147205">"Отваряне"</string>
<string name="browse_desc" msgid="8220976549618935044">"Отваряне на избрания URL адрес"</string>
<string name="sms" msgid="4560537514610063430">"Съобщение"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано от администратора ви"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Актуализирано от администратора ви"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Изтрито от администратора ви"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"С цел удължаване на живота на батерията режимът за запазването й намалява ефективността на устройството ви и ограничава или изключва вибрирането, услугите за местоположение и преноса на данни на заден план. Приложенията за електронна поща, съобщения и др., които разчитат на синхронизиране, може да не се актуализират, освен ако не ги отворите.\n\nРежимът за запазване на батерията се изключва автоматично, когато устройството ви се зарежда."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ще вкл. ли Икономия на данни?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Включване"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Всички езици"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Всички региони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Търсене"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Непозволено действие"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Приложението <xliff:g id="APP_NAME">%1$s</xliff:g> понастоящем е деактивирано."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Още подробности"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Вкл. на служ. потр. профил?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Служебните ви приложения, известия и данни, както и другите функции на служебния потребителски профил ще бъдат включени"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Включване"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Обажданията и известията ще бъдат заглушени"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Промени в системата"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не безпокойте"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Режимът „Не безпокойте“ скрива известията, за да ви помогне да се съсредоточите"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Това е ново поведение. Докоснете за промяна."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройките за „Не безпокойте“ са променени"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Докоснете, за да проверите какво е блокирано."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 2b184a3..9fadbdd 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ভয়েস পরিষেবা নেই"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ভয়েস পরিষেবা অথবা জরুরি কলের সুবিধা নেই"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"পরিষেবা প্রদানকারী এই সুবিধা সাময়িকভাবে বন্ধ রেখেছে"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"আপনার পরিষেবা প্রদানকারী <xliff:g id="SIMNUMBER">%d</xliff:g> সিমটি অস্থায়ীভাবে বন্ধ করেছে"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"মোবাইল নেটওয়ার্কে কানেক্ট করা যাচ্ছে না"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"পছন্দের নেটওয়ার্ক পরিবর্তন করে দেখুন। অন্য নেটওয়ার্ক বেছে নিতে ট্যাপ করুন।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"জরুরি কল করা যাবে না"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"স্বীকৃত নয়"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"আঙ্গুলের ছাপ যাচাই করা হয়েছে"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার অনুপলব্ধ৷"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"কল"</string>
<string name="dial_desc" msgid="6573723404985517250">"বেছে নেওয়া ফোন নম্বরে কল করুন"</string>
<string name="map" msgid="5441053548030107189">"ম্যাপ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"বেছে নেওয়া ঠিকানাটি ম্যাপে দেখুন"</string>
<string name="browse" msgid="1245903488306147205">"খুলুন"</string>
<string name="browse_desc" msgid="8220976549618935044">"বেছে নেওয়া ইউআরএলে যান"</string>
<string name="sms" msgid="4560537514610063430">"মেসেজ"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের ওপর প্রদর্শিত হচ্ছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে, ট্যাপ করে সেটিংসে যান ও বৈশিষ্ট্যটি বন্ধ করে দিন।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"বন্ধ করুন"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> পরীক্ষা করা হচ্ছে…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"বর্তমান কন্টেন্টটি পর্যালোচনা করা হচ্ছে"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"নতুন <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"সেট-আপ করতে ট্যাপ করুন"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটো এবং মিডিয়া ট্রান্সফার"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> নিয়ে সমস্যা আছে"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ঠিক করতে ট্যাপ করুন"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ। মেরামত করতে বেছে নিন।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> অসমর্থিত"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে আলতো চাপুন।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে চাইলে বেছে নিন।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"মিডিয়া সরিয়ে নেওয়ার আগে সেটি সিস্টেম থেকে ইজেক্ট করুন, নাহলে কন্টেন্ট সেভ নাও হতে পারে"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"কিছু ক্রিয়াকলাপ সঠিকভাবে কাজ নাও করতে পারে। নতুন স্টোরেজ লাগান।"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ইজেক্ট করা হচ্ছে"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"সরাবেন না"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"সেট আপ করুন"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"বের করে নিন"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ঘুরে দেখুন"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> অনুপস্থিত"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"ডিভাইসটি আবার ঢোকান"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> সরানো হচ্ছে"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ডেটা সরানো হচ্ছে"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"কন্টেন্ট ট্রান্সফার করা হয়েছে"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"কন্টেন্ট <xliff:g id="NAME">%s</xliff:g>-তে সরানো হয়েছে"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"কন্টেন্ট সরানো যাচ্ছে না"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"আবার কন্টেন্ট সরানোর চেষ্টা করুন"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"সরানো হয়েছে"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"সরিয়ে দেওয়া হয়েছে"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"পরীক্ষা করা হচ্ছে..."</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপনার প্রশাসক ইনস্টল করেছেন"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ব্যাটারির চার্জ যাতে আরও বেশিক্ষণ থাকে, তার জন্য ব্যাটারি সেভার আপনার ডিভাইসের পারফরম্যান্স হ্রাস করে এবং ভাইব্রেশন, লোকেশন ভিত্তিক পরিষেবা ও ব্যাকগ্রাউন্ড ডেটা সীমিত অথবা বন্ধ করে দেয়৷ ইমেল, মেসেজ এবং সিঙ্কের উপর নির্ভরশীল অন্যান্য অ্যাপগুলি যতক্ষণ না আপনি নিজে চালু করবেন, ততক্ষণ সেগুলি আপডেট নাও হতে পারে।\n\nডিভাইস চার্জে বসালে ব্যাটারি সেভার নিজে থেকেই বন্ধ হয়ে যায়৷"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"চালু করুন"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"সকল ভাষা"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"সমস্ত অঞ্চল"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"খুঁজুন"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"কাজের প্রোফাইল চালু করবেন?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"আপনার কাজের অ্যাপ, বিজ্ঞপ্তি, ডেটা এবং কাজের প্রোফাইলের অন্যান্য বৈশিষ্ট্য চালু করা হবে"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"চালু করুন"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"সিমটি ভয়েস কলের জন্য প্রস্তুত নয়"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"এই সিম দিয়ে ভয়েস কল করা যাবে না"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"এই ফোন দিয়ে ভয়েস কল করা যাবে না"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> সিমটি অনুমোদিত নয়"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> সিমটি প্রস্তুত নয়"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> সিমটি অনুমোদিত নয়"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> সিমটি অনুমোদিত নয়"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"পপ-আপ উইন্ডো"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>টি"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"অ্যাপের ভার্সন ডাউনগ্রেড করা হয়েছে অথবা এই শর্টকাটের জন্য উপযুক্ত নয়"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"কল এবং বিজ্ঞপ্তিগুলি মিউট করা হবে"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"বিরক্ত করবেন না"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"আপনি যাতে মন দিয়ে কাজ করতে পারেন তার জন্য \'বিরক্ত করবেন না\' মোড বিজ্ঞপ্তি লুকিয়ে দিচ্ছে"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"এটি নতুন বৈশিষ্ট্য। পরিবর্তন করতে ট্যাপ করুন।"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"সিস্টেম"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 81b3f35..66c848b 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -165,8 +165,8 @@
<string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nije moguće sinhronizirati"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Pokušali ste izbrisati previše sadržaja iz kategorije <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pohrana tableta je puna. Izbrišite fajlove kako biste oslobodili prostor."</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"Prostor za gledanje je pun. Obrišite neke fajlove da oslobodite prostor."</string>
- <string name="low_memory" product="tv" msgid="516619861191025923">"Prostor TV-a za pohranu je pun. Obrišite neke fajlove da oslobodite prostor."</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"Prostor za gledanje je pun. Izbrišite neke fajlove da oslobodite prostor."</string>
+ <string name="low_memory" product="tv" msgid="516619861191025923">"Prostor TV-a za pohranu je pun. Izbrišite neke fajlove da oslobodite prostor."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"Pohrana telefona je puna. Izbrišite fajlove kako biste oslobodili prostor."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
<item quantity="one">Instalirane su ustanove za izdavanje certifikata</item>
@@ -316,8 +316,8 @@
<string name="permdesc_statusBar" msgid="8434669549504290975">"Dozvoljava aplikaciji onemogućavanje statusne trake ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"funkcioniranje u vidu statusne trake"</string>
<string name="permdesc_statusBarService" msgid="716113660795976060">"Dozvoljava aplikaciji da postane statusna traka."</string>
- <string name="permlab_expandStatusBar" msgid="1148198785937489264">"otvaranje/zatvaranje statusne trake"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Dozvoljava aplikaciji otvaranje ili zatvaranje statusne trake."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"proširivanje/sužavanje statusne trake"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Dozvoljava aplikaciji proširivanje ili sužavanje statusne trake."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"instaliranje prečica"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"Omogućava aplikaciji dodavanje prečice za početni ekran bez intervencije korisnika."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"uklanjanje prečica"</string>
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Pozovite"</string>
<string name="dial_desc" msgid="6573723404985517250">"Pozovite odabrani broj telefona"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Lociranje odabrane adrese"</string>
<string name="browse" msgid="1245903488306147205">"Otvorite"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otvorite odabrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Poruka"</string>
@@ -1419,7 +1418,7 @@
<string name="gpsVerifNo" msgid="1146564937346454865">"Ne"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"Granica za brisanje prekoračena"</string>
<string name="sync_too_many_deletes_desc" msgid="496551671008694245">"Izbrisano je <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> stavki za <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, račun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Šta želite uraditi?"</string>
- <string name="sync_really_delete" msgid="2572600103122596243">"Obriši stavke"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"Izbriši stavke"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"Poništiti brisanje"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Ne radi ništa za sada"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Odaberite račun"</string>
@@ -1718,7 +1717,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je vaš administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je vaš administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je vaš administrator"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Za produženje vijeka trajanja baterije, Ušteda umanjuje performanse uređaja i ograničava ili isključuje vibriranje, usluge lokacije i pozadinske podatke. Moguće je da se aplikacije za e-poštu, razmjenu poruka i druge aplikacije koje se oslanjaju na sinhronizaciju neće ažurirati dok ih ne otvorite.\n\nUšteda baterije se automatski isključuje prilikom punjenja uređaja."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Kako bi se produžio vijek trajanja baterije, Ušteda baterije isključuje neke funkcije uređaja i ograničava aplikacije."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio prijenos podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1767,7 +1766,7 @@
<string name="zen_mode_forever" msgid="931849471004038757">"Dok ne isključite"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dok ne isključite način rada Ne ometaj"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
- <string name="toolbar_collapse_description" msgid="2821479483960330739">"Skupi"</string>
+ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Suzi"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prestanak rada"</string>
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Radni dan uvečer"</string>
@@ -1787,7 +1786,7 @@
<string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promijenjeno u novi SS zahtjev"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za posao"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
- <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Suzi"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"aktiviraj/deaktiviraj proširenje"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ulaz za periferijske uređaje"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
@@ -1814,6 +1813,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pretraga"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Radnja nije dozvoljena"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno je onemogućena."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Više detalja"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Uključiti radni profil?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Uključit će se poslovne aplikacije, obavještenja, podaci i druge funkcije radnog profila"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string>
@@ -1904,8 +1906,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Pozivi i obavještenja će se isključiti"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promjene"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne ometaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način rada Ne ometaj sakriva obavještenja da se lakše fokusirate"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da promijenite."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novo: Način rada Ne ometaj sakriva obavještenja"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Dodirnite da saznate više i izvršite promjene."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način rada Ne ometaj je promijenjen"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da provjerite šta je blokirano."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index ce52f1b..1404b15 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sense servei de veu"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hi ha servei de veu ni trucades d\'emergència"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"L\'operador de telefonia mòbil ho ha desactivat temporalment"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"L\'operador de telefonia mòbil ho ha desactivat temporalment per a la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No es pot accedir a la xarxa mòbil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova de canviar de xarxa preferida. Toca per canviar-la."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Les trucades d\'emergència no estan disponibles"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"No s\'ha reconegut"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"L\'empremta digital s\'ha autenticat"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Truca"</string>
<string name="dial_desc" msgid="6573723404985517250">"Truca al número de telèfon seleccionat"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localitza l\'adreça seleccionada"</string>
<string name="browse" msgid="1245903488306147205">"Obre"</string>
<string name="browse_desc" msgid="8220976549618935044">"Obre l\'URL seleccionat"</string>
<string name="sms" msgid="4560537514610063430">"Missatge"</string>
@@ -1274,49 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactiva"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"S\'està comprovant el suport (<xliff:g id="NAME">%s</xliff:g>)…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"S\'està revisant el contingut actual"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Suport extern nou (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toca per configurar"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per transferir fotos i fitxers multimèdia"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema amb el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toca per solucionar el problema"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"La unitat següent està malmesa: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per solucionar-ho."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no és compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositiu no admet la unitat <xliff:g id="NAME">%s</xliff:g>. Toca per configurar-la amb un format compatible."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Aquest dispositiu no admet la unitat següent: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per configurar-la en un format compatible."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Expulsa el suport extern abans d\'extreure\'l per evitar perdre\'n el contingut"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"S\'ha suprimit el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Pot ser que algunes funcions no funcionin correctament. Insereix un altre dispositiu d\'emmagatzematge."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"S\'està expulsant el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"No extreguis el suport extern"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsa"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explora"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"No es detecta <xliff:g id="NAME">%s</xliff:g>"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Torna a inserir el dispositiu"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"S\'està desplaçant l\'aplicació <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"S\'estan desplaçant dades"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"S\'ha transferit el contingut"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"El contingut s\'ha transferit al suport extern (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"No s\'ha pogut transferir"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Torna a provar de transferir el contingut"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"S\'ha retirat"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"S\'ha expulsat"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"S\'està comprovant..."</string>
@@ -1708,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instal·lat per l\'administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualitzat per l\'administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Suprimit per l\'administrador"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Per tal d\'augmentar la durada de la bateria, la funció Estalvi de bateria redueix el rendiment del dispositiu i en limita o desactiva la vibració, els serveis d\'ubicació i les dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nLa funció Estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activar Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activa"</string>
@@ -1795,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Tots els idiomes"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Totes les regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Acció no permesa"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"L\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> està desactivada."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Més detalls"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Activar el perfil professional?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"S\'activaran les teves aplicacions per a la feina, les notificacions, les dades i altres funcions del perfil professional"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activa"</string>
@@ -1864,14 +1850,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"La SIM no està proporcionada per a la veu"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"La SIM no és compatible per a la veu"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"El telèfon no és compatible per a la veu"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"La SIM <xliff:g id="SIMNUMBER">%d</xliff:g> no s\'ha proporcionat"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"S\'ha canviat a una versió anterior de l\'aplicació o la versió actual no és compatible amb aquesta drecera"</string>
@@ -1888,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Les trucades i les notificacions se silenciaran"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Canvis del sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No molestis"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El mode No molestis amaga notificacions perquè no et desconcentris"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Aquest comportament és nou. Toca per canviar-lo."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"S\'ha canviat el mode No molestis"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca per consultar què s\'ha bloquejat."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 960f1f1..17e23cd 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -185,7 +185,7 @@
<string name="network_logging_notification_title" msgid="6399790108123704477">"Zařízení je spravováno"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Toto zařízení je spravováno vaší organizací, která může sledovat síťový provoz. Podrobnosti zobrazíte klepnutím."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Zařízení bude vymazáno"</string>
- <string name="factory_reset_message" msgid="9024647691106150160">"Aplikaci pro správu nelze použít. Zařízení nyní bude vymazáno.\n\nV případě dotazů vám pomůže administrátor organizace."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Aplikaci pro správu nelze použít. Zařízení teď bude vymazáno.\n\nV případě dotazů vám pomůže administrátor organizace."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Aplikace <xliff:g id="OWNER_APP">%s</xliff:g> tisk zakazuje."</string>
<string name="me" msgid="6545696007631404292">"Já"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Možnosti tabletu"</string>
@@ -775,9 +775,9 @@
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Tablet jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER_0">%1$d</xliff:g>krát. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech se v tabletu obnoví tovární nastavení a veškerá uživatelská data budou ztracena."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"<xliff:g id="NUMBER_0">%1$d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. Po dalších <xliff:g id="NUMBER_1">%2$d</xliff:g> neúspěšných pokusech bude v televizi obnoveno tovární nastavení a veškerá uživatelská data budou ztracena."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Telefon jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER_0">%1$d</xliff:g>krát. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech se v telefonu obnoví tovární nastavení a veškerá uživatelská data budou ztracena."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Tablet jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER">%d</xliff:g>krát. V tabletu se nyní obnoví výchozí tovární nastavení."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"<xliff:g id="NUMBER">%d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. V televizi nyní bude obnoveno tovární nastavení."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Telefon jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER">%d</xliff:g>krát. V telefonu se nyní obnoví výchozí tovární nastavení."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Tablet jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER">%d</xliff:g>krát. V tabletu se teď obnoví výchozí tovární nastavení."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"<xliff:g id="NUMBER">%d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. V televizi teď bude obnoveno tovární nastavení."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Telefon jste se pokusili nesprávným způsobem odemknout <xliff:g id="NUMBER">%d</xliff:g>krát. V telefonu se teď obnoví výchozí tovární nastavení."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Sekundy zbývající do dalšího pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zapomněli jste gesto?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Odemčení účtu"</string>
@@ -923,7 +923,7 @@
<string name="weeks" msgid="6509623834583944518">"týd."</string>
<string name="year" msgid="4001118221013892076">"rokem"</string>
<string name="years" msgid="6881577717993213522">"lety"</string>
- <string name="now_string_shortest" msgid="8912796667087856402">"nyní"</string>
+ <string name="now_string_shortest" msgid="8912796667087856402">"teď"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
<item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Zavolat"</string>
<string name="dial_desc" msgid="6573723404985517250">"Zavolat na vybrané telefonní číslo"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Vyhledat vybranou adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otevřít"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otevřít vybranou adresu URL"</string>
<string name="sms" msgid="4560537514610063430">"Zpráva"</string>
@@ -1377,7 +1376,7 @@
<string name="ime_action_default" msgid="2840921885558045721">"Spustit"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Vytočit číslo\n <xliff:g id="NUMBER">%s</xliff:g>."</string>
<string name="create_contact_using" msgid="4947405226788104538">"Vytvořit kontakt\npro <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Následující aplikace požadují oprávnění k přístupu do vašeho účtu (nyní i v budoucnu)."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Následující aplikace požadují oprávnění k přístupu do vašeho účtu (teď i v budoucnu)."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Chcete tento požadavek povolit?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"Žádost o přístup"</string>
<string name="allow" msgid="7225948811296386551">"Povolit"</string>
@@ -1588,9 +1587,9 @@
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech se v tabletu obnoví tovární nastavení a veškerá uživatelská data budou ztracena."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"<xliff:g id="NUMBER_0">%1$d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. Po dalších <xliff:g id="NUMBER_1">%2$d</xliff:g> neúspěšných pokusech bude v televizi obnoveno tovární nastavení a veškerá uživatelská data budou ztracena."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech se v telefonu obnoví tovární nastavení a veškerá uživatelská data budou ztracena."</string>
- <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. V tabletu se nyní obnoví výchozí tovární nastavení."</string>
- <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"<xliff:g id="NUMBER">%d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. V televizi nyní bude obnoveno tovární nastavení."</string>
- <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. V telefonu se nyní obnoví výchozí tovární nastavení."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. V tabletu se teď obnoví výchozí tovární nastavení."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"<xliff:g id="NUMBER">%d</xliff:g>× jste se neúspěšně pokusili odemknout televizi. V televizi teď bude obnoveno tovární nastavení."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. V telefonu se teď obnoví výchozí tovární nastavení."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%2$d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"<xliff:g id="NUMBER_0">%1$d</xliff:g>× jste nesprávně načrtli bezpečnostní gesto. Po dalších <xliff:g id="NUMBER_1">%2$d</xliff:g> neúspěšných pokusech budete požádáni o odemčení televize pomocí e-mailového účtu.\n\nOpakujte akci za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainstalováno administrátorem"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizováno administrátorem"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Smazáno administrátorem"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Spořič baterie za účelem prodloužení výdrže baterie snižuje výkon zařízení a omezuje nebo vypíná vibrace, služby určování polohy a data na pozadí. E-mail, aplikace pro zasílání zpráv a další aplikace, které používají synchronizaci, se nemusejí aktualizovat, dokud je neotevřete.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Spořič dat z důvodu snížení využití dat některým aplikacím brání v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnout Spořič dat?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnout"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Všechny jazyky"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Všechny oblasti"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Vyhledávání"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Akce není povolena"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> je momentálně deaktivována."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Další podrobnosti"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Zapnout pracovní profil?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Vaše pracovní aplikace, oznámení, data a ostatní funkce pracovního účtu budou zapnuty"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnout"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Volání a oznámení budou ztlumena"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Změny nastavení systému"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nerušit"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Nerušit skrývá oznámení, abyste se mohli soustředit"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Toto je nové chování. Změníte ho klepnutím."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavení režimu Nerušit se změnilo"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Klepnutím zkontrolujete, co je blokováno."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Systém"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 38f8cde..005c8a0 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Ring op"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ring til det valgte telefonnummer"</string>
<string name="map" msgid="5441053548030107189">"Kort"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Find den valgte adresse"</string>
<string name="browse" msgid="1245903488306147205">"Åbn"</string>
<string name="browse_desc" msgid="8220976549618935044">"Åbn den valgte webadresse"</string>
<string name="sms" msgid="4560537514610063430">"Besked"</string>
@@ -1284,7 +1283,7 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Tryk for at konfigurere det til et understøttet format."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Vælg for at konfigurere mediet i et understøttet format."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> blev fjernet uventet"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Skub mediet ud, inden du fjerner det, så du ikke mister dit indhold"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Demonter mediet, inden du fjerner det, så du ikke mister dit indhold"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> er fjernet"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Nogle funktioner virker muligvis ikke som de skal. Indsæt en ny lagerenhed."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Skubber <xliff:g id="NAME">%s</xliff:g> ud"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installeret af din administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opdateret af din administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet af din administrator"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Batterisparefunktionen forlænger batteritiden ved at reducere enhedens ydeevne og begrænse eller deaktivere vibration, placeringstjenester og baggrundsdata. Mail, beskedfunktioner og andre apps, der kræver synkronisering, opdateres muligvis ikke, medmindre du åbner dem.\n\nBatterisparefunktionen deaktiveres automatisk, når enheden oplader."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå Datasparefunktion til?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå til"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle sprog"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Søg"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Handlingen er ikke tilladt"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g>-appen er deaktiveret i øjeblikket."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Flere oplysninger"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Skal arbejdsprofilen slås til?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Dine arbejdsapps, underretninger, data og andre funktioner til din arbejdsprofil deaktiveres"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Slå til"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Der afspilles ikke lyd ved opkald og underretninger"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemændringer"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Forstyr ikke"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Forstyr ikke skjuler underretninger, så du bedre kan koncentrere dig"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dette er en ny adfærd. Tryk for at ændre den."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Tilstanden Forstyr ikke blev ændret"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tryk for at se, hvad der er blokeret."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 0bb17eb..53a1acb 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -82,7 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Keine Anrufe"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Keine Anrufe oder Notrufe"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Vorübergehend von deinem Mobilfunkanbieter deaktiviert"</string>
- <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Vorübergehend von deinem Mobilfunkanbieter für SIM <xliff:g id="SIMNUMBER">%d</xliff:g> deaktiviert"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Von deinem Mobilfunkanbieter für SIM <xliff:g id="SIMNUMBER">%d</xliff:g> vorübergehend deaktiviert"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilfunknetz nicht erreichbar"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Notrufe nicht möglich"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Anrufen"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ausgewählte Telefonnummer anrufen"</string>
<string name="map" msgid="5441053548030107189">"Karte"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Ausgewählte Adresse finden"</string>
<string name="browse" msgid="1245903488306147205">"Öffnen"</string>
<string name="browse_desc" msgid="8220976549618935044">"Ausgewählte URL öffnen"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
@@ -1274,7 +1273,7 @@
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktivieren"</string>
<string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> wird geprüft…"</string>
<string name="ext_media_checking_notification_message" msgid="410185170877285434">"Aktuelle Inhalte werden geprüft"</string>
- <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Neues Medium (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Neues Speichergerät (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Zum Einrichten tippen"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Zum Übertragen von Fotos und Medien"</string>
<string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem mit <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1284,9 +1283,9 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zum Einrichten in einem unterstützten Format tippen."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zur Einrichtung eines unterstützten Formats auswählen."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Trenne die Medien vor dem Entfernen, um Inhaltsverluste zu vermeiden"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Lass das Speichergerät vor dem Entfernen auswerfen, damit keine Daten verloren gehen"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Möglicherweise sind einige Funktionen fehlerhaft. Setze einen neuen Speicher ein."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Einige Funktionen können möglicherweise nicht richtig genutzt werden. Sorge dafür, dass ein neues Speichergerät genutzt werden kann."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> wird ausgeworfen"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nicht entfernen"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Einrichten"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Von deinem Administrator installiert"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Von deinem Administrator aktualisiert"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Von deinem Administrator gelöscht"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion, Standortdienste sowie die Hintergrunddaten einschränkt oder deaktiviert. E-Mail, Messaging und andere Apps, die auf deinem Gerät synchronisiert werden, werden möglicherweise nur aktualisiert, wenn du sie öffnest.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn dein Gerät aufgeladen wird."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Mit dem Datensparmodus wird die Datennutzung verringert, indem verhindert wird, dass im Hintergrund Daten von Apps gesendet oder empfangen werden. Datenzugriffe sind mit einer aktiven App zwar möglich, erfolgen aber seltener. Als Folge davon könnten Bilder beispielsweise erst dann sichtbar werden, wenn sie angetippt werden."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivieren"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle Sprachen"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle Regionen"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Suche"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Aktion nicht zulässig"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Die App \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ist derzeit deaktiviert."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Weitere Details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Arbeitsprofil aktivieren?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Deine geschäftlichen Apps, Benachrichtigungen, Daten und andere Funktionen des Arbeitsprofils werden aktiviert"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivieren"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Anrufe und Benachrichtigungen stummgeschaltet"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemänderungen"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Bitte nicht stören"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Mit \"Bitte nicht stören\" werden Benachrichtigungen ausgeblendet, damit du dich besser konzentrieren kannst"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Das ist ein neues Verhalten. Tippe, um die Einstellung zu ändern."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Bitte nicht stören\" wurde geändert"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 3c91e66..4fb5c8f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Κλήση"</string>
<string name="dial_desc" msgid="6573723404985517250">"Κλήση επιλεγμένου αριθμού τηλεφώνου"</string>
<string name="map" msgid="5441053548030107189">"Χάρτης"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Εντοπισμός επιλεγμένης διεύθυνσης"</string>
<string name="browse" msgid="1245903488306147205">"Άνοιγμα"</string>
<string name="browse_desc" msgid="8220976549618935044">"Άνοιγμα επιλεγμένου URL"</string>
<string name="sms" msgid="4560537514610063430">"Μήνυμα"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Εγκαταστάθηκε από τον διαχειριστή σας"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ενημερώθηκε από τον διαχειριστή σας"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Διαγράφηκε από τον διαχειριστή σας"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Προκειμένου να επεκτείνει τη διάρκεια ζωής της μπαταρίας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει ή απενεργοποιεί τη δόνηση, τις υπηρεσίες τοποθεσίας και τα δεδομένα παρασκηνίου. Οι εφαρμογές ηλεκτρονικού ταχυδρομείου, ανταλλαγής μηνυμάτων και άλλες, οι οποίες βασίζονται στον συγχρονισμό μπορεί να μην ενημερωθούν, εκτός εάν τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα κατά τη φόρτιση της συσκευής σας."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ενεργ.Εξοικονόμησης δεδομένων;"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ενεργοποίηση"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Όλες οι γλώσσες"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Όλες οι περιοχές"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Αναζήτηση"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Δεν επιτρέπεται η ενέργεια"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Αυτήν τη στιγμή, η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> είναι απενεργοποιημένη."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Περισσότερες λεπτομέρειες"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ενεργοποίηση προφίλ εργασίας;"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Οι εφαρμογές, οι ειδοποιήσεις και τα δεδομένα εργασίας σας, καθώς και άλλες λειτουργίες του προφίλ εργασίας, θα ενεργοποιηθούν"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ενεργοποίηση"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Οι κλήσεις και οι ειδοποιήσεις θα τεθούν σε παύση"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Αλλαγές στο σύστημα"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Μην ενοχλείτε"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις, για να μπορείτε να συγκεντρώνεστε καλύτερα"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Αυτή η συμπεριφορά είναι νέα. Πατήστε για αλλαγή."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Η λειτουργία \"Μην ενοχλείτε\" άλλαξε"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Πατήστε για να ελέγξετε το περιεχόμενο που έχει αποκλειστεί."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Σύστημα"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index edd19d7..e8db753 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Call"</string>
<string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Locate selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
<string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"To extend your battery life, Battery Saver turns off some device features and restricts apps."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action not allowed"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"The application <xliff:g id="APP_NAME">%1$s</xliff:g> is currently disabled."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"More details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string>
@@ -1866,9 +1868,9 @@
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do not disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"New: Do Not Disturb is hiding notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap to find out more and change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 856be3f..b13a25b 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Call"</string>
<string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Locate selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
<string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"To extend your battery life, Battery Saver turns off some device features and restricts apps."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action not allowed"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"The application <xliff:g id="APP_NAME">%1$s</xliff:g> is currently disabled."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"More details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string>
@@ -1866,9 +1868,9 @@
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do not disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"New: Do Not Disturb is hiding notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap to find out more and change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index edd19d7..e8db753 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Call"</string>
<string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Locate selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
<string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"To extend your battery life, Battery Saver turns off some device features and restricts apps."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action not allowed"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"The application <xliff:g id="APP_NAME">%1$s</xliff:g> is currently disabled."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"More details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string>
@@ -1866,9 +1868,9 @@
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do not disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"New: Do Not Disturb is hiding notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap to find out more and change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index edd19d7..e8db753 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Call"</string>
<string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Locate selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
<string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"To extend your battery life, Battery Saver turns off some device features and restricts apps."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action not allowed"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"The application <xliff:g id="APP_NAME">%1$s</xliff:g> is currently disabled."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"More details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string>
@@ -1866,9 +1868,9 @@
<string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do not disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"New: Do Not Disturb is hiding notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap to find out more and change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index e00e175..1335bf0 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1013,10 +1013,8 @@
<string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
<string name="dial" msgid="1253998302767701559">"Call"</string>
<string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
- <!-- no translation found for map (5441053548030107189) -->
- <skip />
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map" msgid="5441053548030107189">"Map"</string>
+ <string name="map_desc" msgid="1836995341943772348">"Locate selected address"</string>
<string name="browse" msgid="1245903488306147205">"Open"</string>
<string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1692,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, location services, and background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"To extend your battery life, Battery Saver turns off some device features and restricts apps."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1779,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action not allowed"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"The application <xliff:g id="APP_NAME">%1$s</xliff:g> is currently disabled."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"More details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data, and other work profile features will be turned on"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string>
@@ -1868,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is hiding notifications to help you focus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behavior. Tap to change."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"New: Do Not Disturb is hiding notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap to learn more and change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e48efb5..433aca3 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Llamar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Abrir la dirección seleccionada en el mapa"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abrir URL seleccionada"</string>
<string name="sms" msgid="4560537514610063430">"Mensaje"</string>
@@ -1286,7 +1285,7 @@
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Expulsa los dispositivos multimedia antes de extraerlos para evitar la pérdida de contenido"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Se quitó <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Es posible que algunas funciones no funcionen correctamente. Inserta un nuevo dispositivo de almacenamiento."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Es posible que algunas características no funcionen correctamente. Inserta un nuevo dispositivo de almacenamiento."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Expulsando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"No quites el medio externo"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Tu administrador instaló este paquete"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Tu administrador actualizó este paquete"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Tu administrador borró este paquete"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para extender la duración de la batería, el Ahorro de batería reduce el rendimiento del dispositivo y limita o desactiva la vibración, los servicios de ubicación y los datos en segundo plano. Es posible que las apps que se sincronizan, como las de correo electrónico y mensajes, no se actualicen a menos que las abras de forma manual.\n\nEl Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Para extender la duración de la batería, Ahorro de batería desactiva algunas funciones y restringe apps en el dispositivo."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para reducir el uso de datos, \"Reducir datos\" evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas las regiones"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Búsqueda"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Acción no permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"La aplicación de <xliff:g id="APP_NAME">%1$s</xliff:g> está inhabilitada."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Más detalles"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"¿Activar el perfil de trabajo?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Se activaran las apps de trabajo, los datos, las notificaciones y otras funciones del perfil de trabajo"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Se silenciarán las llamadas y notificaciones"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No interrumpir"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El modo No interrumpir oculta las notificaciones para que no pierdas la concentración"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Presiona para cambiarlo."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Nuevo: No interrumpir oculta las notificaciones"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Presiona para obtener más información y realizar cambios."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Se modificó la opción No interrumpir"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Presiona para consultar lo que está bloqueado."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index a07e6c1..1b4c4ca 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -601,7 +601,7 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exige que se cifren los datos de la aplicación almacenados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Inhabilitar cámaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar el uso de las cámaras del dispositivo"</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Inhab. alg. func. bloq. pant."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Inhabilitar algunas funciones del bloque de pantalla"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Evita el uso de algunas funciones del bloqueo de pantalla."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Llamar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Buscar la dirección seleccionada"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abrir la URL seleccionada"</string>
<string name="sms" msgid="4560537514610063430">"Mensaje"</string>
@@ -1261,7 +1260,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTIR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECHAZAR"</string>
<string name="select_input_method" msgid="8547250819326693584">"Cambiar teclado"</string>
- <string name="show_ime" msgid="2506087537466597099">"Sigue en pantalla mientras el teclado físico está activo"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Mantener en la pantalla mientras el teclado físico está activo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura el teclado físico"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string>
@@ -1691,8 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el administrador"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar la duración de la batería, la función Ahorro de batería reduce el rendimiento del dispositivo y limita o desactiva la vibración, los servicios de ubicación y los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Para aumentar la duración de la batería, el Ahorro de batería desactiva algunas funciones del dispositivo y limita aplicaciones."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se mostrarán hasta que las toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas las regiones"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Acción no permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"La aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> está inhabilitada en estos momentos."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Más información"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"¿Activar el perfil de trabajo?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Tus aplicaciones, notificaciones, datos y otras funciones del perfil de trabajo se activarán"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Las llamadas y las notificaciones se silenciarán"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No molestar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El modo No molestar oculta las notificaciones para no distraerte"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Toca para cambiarlo."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novedad: El modo No molestar oculta las notificaciones"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Toca para obtener más información y hacer cambios."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ha cambiado el modo No molestar"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para consultar lo que se está bloqueando."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 2e75289..cce160d 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -333,7 +333,7 @@
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Võimaldab rakendusel saada üksikasju praegu sünkroonitavate voogude kohta."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"saata ja vaadata SMS-sõnumeid"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"Võimaldab rakendusel saata SMS-sõnumeid. See võib kaasa tuua ootamatuid tasusid. Pahatahtlikud rakendused võivad teile tekitada kulusid, saates sõnumeid teie kinnituseta."</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"lugege oma tekstisõnumeid (SMS või MMS)"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"Tekstisõnumite (SMS või MMS) lugemine"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"See rakendus saab kõiki teie tahvelarvutisse salvestatud SMS-e (tekstsõnumeid) lugeda."</string>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"See rakendus saab kõiki teie telerisse salvestatud SMS-e (tekstsõnumeid) lugeda."</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"See rakendus saab kõiki teie telefoni salvestatud SMS-e (tekstsõnumeid) lugeda."</string>
@@ -373,7 +373,7 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Võimaldab rakendusel saata püsivaid edastusi, mis jäävad pärast saate lõppemist alles. Ülemäärane kasutamine võib muuta tahvelarvuti aeglaseks või ebastabiilseks, põhjustades selle liiga suure mälukasutuse."</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Lubab rakendusel saata püsiülekandeid, mis jäävad alles pärast ülekande lõppemist. Liigne kasutamine võib muuta teleri aeglaseks või ebastabiilseks, sest teler kasutab selleks liigselt mälu."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Võimaldab rakendusel saata püsivaid edastusi, mis jäävad pärast saate lõppemist alles. Ülemäärane kasutamine võib muuta telefoni aeglaseks või ebastabiilseks, põhjustades selle liiga suure mälukasutuse."</string>
- <string name="permlab_readContacts" msgid="8348481131899886131">"lugege oma kontakte"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"Kontaktide lugemine"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Võimaldab rakendusel lugeda andmeid teie tahvelarvutisse salvestatud kontaktide kohta, näiteks seda, kui tihti te kellelegi helistate, meilite või nendega muul viisil suhtlete. See luba võimaldab rakendustel salvestada teie kontaktandmeid ja pahatahtlikud rakendused võivad teie teadmata kontaktandmeid jagada."</string>
<string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Lubab rakendusel lugeda telerisse salvestatud kontaktide andmeid, sh seda, kui sageli olete konkreetsele isikule helistanud, meilinud või temaga muul viisil suhelnud. See luba võimaldab rakendustel kontaktandmeid salvestada ja pahatahtlikud rakendused võivad jagada kontaktandmeid teie teadmata."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Võimaldab rakendusel lugeda andmeid teie telefoni salvestatud kontaktide kohta, näiteks seda, kui tihti te kellelegi helistate, meilite või nendega muul viisil suhtlete. See luba võimaldab rakendustel salvestada teie kontaktandmeid ja pahatahtlikud rakendused võivad teie teadmata kontaktandmeid jagada."</string>
@@ -419,7 +419,7 @@
<string name="permdesc_callPhone" msgid="3740797576113760827">"Võimaldab rakendusel teie sekkumiseta telefoninumbritele helistada. See võib põhjustada ootamatuid tasusid või telefonikõnesid. Pange tähele, et see ei luba rakendusel helistada hädaabinumbritele. Pahatahtlikud rakendused võivad teile kulusid tekitada, tehes telefonikõnesid teie kinnituseta."</string>
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"juurdepääs IMS-kõneteenusele"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Võimaldab rakendusel kasutada IMS-teenust kõnede tegemiseks ilma, et peaksite sekkuma."</string>
- <string name="permlab_readPhoneState" msgid="9178228524507610486">"lugege telefoni olekut ja identiteeti"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"Telefoni oleku ja identiteedi lugemine"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Annab rakendusele juurdepääsu seadme telefonifunktsioonidele. See luba võimaldab rakendusel määrata telefoninumbri ja seadme ID-d ning kontrollida, kas kõne on aktiivne ja kaugnumber on kõne kaudu telefoniga ühendatud."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"kõnede marsruutimine süsteemi kaudu"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Võimaldab rakendusel kõnesid süsteemi kaudu marsruutida, et helistamiskogemust täiustada."</string>
@@ -518,8 +518,8 @@
<string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Võimaldab rakendusel muuta konto sünkroonimisseadeid. Näiteks saab seda kasutada, et lubada rakenduse Inimesed sünkroonimine kontoga."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"loe sünkroonimisstatistikat"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"Võimaldab rakendusel lugeda konto sünkroonimisstatistikat, sh sünkroonimissündmuste ajalugu ja sünkroonitud andmete hulka."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"lugege USB-salvestusruumi sisu"</string>
- <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"lugege oma SD-kaardi sisu"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"USB-salvestusruumi sisu lugemine"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"SD-kaardi sisu lugemine"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Lubab rakendusel lugeda USB-salvestusruumi sisu."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Lubab rakendusel lugeda SD-kaardi sisu."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"muutke, kustut. USB-ruumi sisu"</string>
@@ -853,9 +853,9 @@
<string name="autofill_parish" msgid="8202206105468820057">"Vald"</string>
<string name="autofill_area" msgid="3547409050889952423">"Piirkond"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"Emiraat"</string>
- <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"lugege oma veebijärjehoidjaid ja -ajalugu"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"Veebijärjehoidjate ja -ajaloo lugemine"</string>
<string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Võimaldab rakendusel lugeda kõikide URL-ide ajalugu, mida brauser on külastanud, ja kõiki brauseri järjehoidjaid. Märkus: see luba ei pruugi jõustuda kolmanda osapoole brauseritega või teiste veebisirvimisvõimega rakendustega."</string>
- <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"kirjutage veebijärjehoidjaid ja -ajalugu"</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"Veebijärjehoidjate ja -ajaloo kirjutamine"</string>
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Võimaldab rakendusel muuta tahvelarvutisse salvestatud brauseri ajalugu või järjehoidjaid. See võimaldab rakendusel kustutada või muuta brauseri andmeid. Märkus: see luba ei pruugi jõustuda kolmanda osapoole brauserites või teistes veebisirvimisvõimega rakendustes."</string>
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"Lubab rakendusel muuta telerisse salvestatud brauseri ajalugu või järjehoidjaid. See võib lubada rakendusel brauseri andmeid kustutada või muuta. Märkus: seda luba ei või jõustada kolmanda osapoole brauserid või muud veebisirvimise võimalustega rakendused."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Võimaldab rakendusel muuta telefoni salvestatud brauseri ajalugu või järjehoidjaid. See võimaldab rakendusel kustutada või muuta brauseri andmeid. Märkus: see luba ei pruugi jõustuda kolmanda osapoole brauserites või teistes veebisirvimisvõimega rakendustes."</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Helista"</string>
<string name="dial_desc" msgid="6573723404985517250">"Valitud telefoninumbrile helistamine"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Valitud aadressi leidmine"</string>
<string name="browse" msgid="1245903488306147205">"Ava"</string>
<string name="browse_desc" msgid="8220976549618935044">"Valitud URL-i avamine"</string>
<string name="sms" msgid="4560537514610063430">"Saada sõnum"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administraator on selle installinud"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administraator on seda värskendanud"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administraator on selle kustutanud"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Aku tööea parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibratsiooni, asukohateenuseid ja taustaandmeid (või lülitab need välja). E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui need avate.\n\nSeadme laadimise ajal lülitatakse akusäästja automaatselt välja."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmeside mahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks kujutised kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Lül. andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Lülita sisse"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Kõik keeled"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Kõik piirkonnad"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Otsing"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Keelatud toiming"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> on praegu keelatud."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Rohkem üksikasju"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Kas lülitada tööprofiil sisse?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Teie töörakendused, märguanded, andmed ja muud tööprofiili funktsioonid lülitatakse sisse"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Lülita sisse"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Kõned ja märguanded on vaigistatud"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Süsteemi muudatused"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Mitte segada"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režiim Mitte segada peidab märguanded, et saaksite keskenduda"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"See on uus käitumine. Puudutage muutmiseks."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režiimi Mitte segada muudeti"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Puudutage, et kontrollida, mis on blokeeritud."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Süsteem"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 510bcb3..b68fcf4 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Deitu"</string>
<string name="dial_desc" msgid="6573723404985517250">"Deitu hautatutako telefono-zenbakira"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Bilatu hautatutako helbidea"</string>
<string name="browse" msgid="1245903488306147205">"Ireki"</string>
<string name="browse_desc" msgid="8220976549618935044">"Ireki hautatutako URLa"</string>
<string name="sms" msgid="4560537514610063430">"Bidali mezua"</string>
@@ -1287,7 +1286,7 @@
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Kendu aurretik, kanporatu euskarria edukirik ez galtzeko"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Kendu egin da <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Funtzio batzuk agian ez dira behar bezala ibiliko. Sartu memoria-gailu berria."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Funtzio batzuek agian ez dute behar bezala funtzionatuko. Sartu biltegiratze-gailu berria."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> kanporatzen"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ez kendu"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguratu"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratzaileak instalatu du"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratzaileak eguneratu du"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administratzaileak ezabatu du"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Bateriak gehiago iraun dezan, bateria-aurrezleak gailuaren funtzionamendua murrizten du, eta dardara, kokapen-zerbitzuak eta atzeko planoko datuen erabilera mugatzen edo desaktibatzen du. Posta elektronikoa, mezuak eta sinkronizatzen diren gainerako zerbitzuak ez dira eguneratuko haiek ireki ezean.\n\nGailua kargatzen ezarri orduko desaktibatzen da bateria-aurrezlea."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzi ditzake datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datu-aurrezlea aktibatu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktibatu"</string>
@@ -1779,6 +1779,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Hizkuntza guztiak"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Lurralde guztiak"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Bilaketa"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Ez da onartzen ekintza"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Desgaituta dago <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Xehetasun gehiago"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Laneko profila aktibatu?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Laneko aplikazioak, jakinarazpenak, datuak eta laneko profileko bestelako eginbideak aktibatuko dira"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktibatu"</string>
@@ -1868,8 +1871,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Ez da joko tonurik deiak eta jakinarazpenak jasotzean"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistema-aldaketak"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ez molestatu"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\"Ez molestatu\" modua jakinarazpenak ezkutatzen ari da arreta gal ez dezazun"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Berria da portaera hau. Sakatu aldatzeko."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Ez molestatu\" modua aldatu da"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Sakatu zer dagoen blokeatuta ikusteko."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 121345c..afc4398 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"تماس"</string>
<string name="dial_desc" msgid="6573723404985517250">"تماس با شماره تلفن انتخابی"</string>
<string name="map" msgid="5441053548030107189">"نقشه"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"مکانیابی نشانی انتخابشده"</string>
<string name="browse" msgid="1245903488306147205">"باز کردن"</string>
<string name="browse_desc" msgid="8220976549618935044">"باز کردن نشانی وب انتخابی"</string>
<string name="sms" msgid="4560537514610063430">"پیام"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"توسط سرپرست سیستم نصب شد"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"توسط سرپرست سیستم بهروزرسانی شد"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"توسط سرپرست سیستم حذف شد"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"برای افزایش عمر باتری، «بهینهسازی باتری» عملکرد دستگاهتان را کاهش میدهد و لرزش، خدمات مکان و دادههای پسزمینه را محدود یا خاموش میکند. رایانامه، پیامرسانی و دیگر برنامههای وابسته به همگامسازی تا زمانی که آنها را باز نکنید، بهروزرسانی نمیشوند.\n\n«بهینهسازی باتری» بهطور خودکار در هنگام شارژ شدن دستگاه خاموش میشود."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"برای کمک به کاهش مصرف داده، «صرفهجویی داده» از ارسال و دریافت داده در پسزمینه از طرف بعضی برنامهها جلوگیری میکند. برنامهای که درحالحاضر استفاده میکنید میتواند به دادهها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تا زمانی که روی آنها ضربه نزنید نشان داده نمیشوند."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"صرفهجویی داده روشن شود؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"روشن کردن"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"همه زبانها"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"همه منطقهها"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"جستجو"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"عملکرد مجاز نیست"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"برنامه <xliff:g id="APP_NAME">%1$s</xliff:g> درحال حاضر غیرفعال است."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"جزئیات بیشتر"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"نمایه کاری روشن شود؟"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"برنامهها، اعلانها، دادهها و سایر قابلیتهای نمایه کاری شما روشن خواهد شد"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"روشن کردن"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"دستگاهتان برای تماسها و اعلانها بیصدا خواهد شد"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"تغییرات سیستم"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"مزاحم نشوید"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«مزاحم نشوید» اعلانها را پنهان میکند تا تمرکز شما به هم نریزد"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"این رفتار جدید است. برای تغییر ضربه بزنید."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«مزاحم نشوید» تغییر کرده است"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"برای بررسی موارد مسدودشده ضربه بزنید."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"سیستم"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index acbe970..07b4dae 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Soita"</string>
<string name="dial_desc" msgid="6573723404985517250">"Soita valittuun puhelinnumeroon"</string>
<string name="map" msgid="5441053548030107189">"Kartta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Etsi valittu osoite kartalta"</string>
<string name="browse" msgid="1245903488306147205">"Avaa"</string>
<string name="browse_desc" msgid="8220976549618935044">"Avaa valittu URL-osoite"</string>
<string name="sms" msgid="4560537514610063430">"Viesti"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Järjestelmänvalvoja asensi tämän."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Järjestelmänvalvoja päivitti tämän."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Järjestelmänvalvoja poisti tämän."</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Parantaakseen akun kestoa virransäästö vähentää laitteesi suorituskykyä ja rajoittaa värinää, sijaintipalveluita ja taustadataa tai poistaa ne käytöstä. Sähköposti, viestit ja muut synkronointiin perustuvat sovellukset eivät välttämättä päivity, ellet avaa niitä.\n\nVirransäästö poistuu käytöstä automaattisesti, kun laitteesi latautuu."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Otetaanko Data Saver käyttöön?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ota käyttöön"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Kaikki kielet"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Kaikki alueet"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Haku"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Toiminto ei ole sallittu"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Sovellus <xliff:g id="APP_NAME">%1$s</xliff:g> on tällä hetkellä poissa käytöstä."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Lisätietoja"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Otetaanko työprofiili käyttöön?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Työsovellukset, ‑ilmoitukset, ‑tiedot ja muut työprofiiliominaisuudet otetaan käyttöön"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ota käyttöön"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Puhelut ja ilmoitukset mykistetään"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Järjestelmän muutokset"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Älä häiritse"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Älä häiritse ‑tila piilottaa ilmoitukset, jotta voit keskittyä paremmin"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Tämä toiminto on muuttunut. Muuta napauttamalla."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Älä häiritse ‑tila muuttui"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Napauta niin näet, mitä on estetty."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Järjestelmä"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index cf0a734..d1907d1 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -82,7 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun de service vocal ni d\'appel d\'urgence"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Temporairement désactivé par votre fournisseur de services"</string>
- <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporairement désactivé par votre fournisseur de services pour la carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporairement désactivé par votre fournisseur de services pour la carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible de joindre le réseau cellulaire"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Appel"</string>
<string name="dial_desc" msgid="6573723404985517250">"Téléphoner au numéro sélectionné"</string>
<string name="map" msgid="5441053548030107189">"Carte"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localiser l\'adresse sélectionnée"</string>
<string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Ouvrir l\'adresse URL sélectionnée"</string>
<string name="sms" msgid="4560537514610063430">"Message"</string>
@@ -1274,7 +1273,7 @@
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
<string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Vérification de <xliff:g id="NAME">%s</xliff:g> en cours…"</string>
<string name="ext_media_checking_notification_message" msgid="410185170877285434">"Vérification du contenu actuel"</string>
- <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouveau/nouvelle <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouveau périphérique <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toucher pour configurer"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
<string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Il y a un problème avec <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1298,7 +1297,7 @@
<string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données..."</string>
<string name="ext_media_move_success_title" msgid="7863652232242276066">"Transfert de contenu terminé"</string>
<string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenu déplacé vers <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossible de déplacer contenu"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossible de déplacer le contenu"</string>
<string name="ext_media_move_failure_message" msgid="7388950499623016135">"Essayez de déplacer le contenu de nouveau"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Supprimée"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Éjectée"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mise à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Pour améliorer l\'autonomie de la pile, la fonction Économie d\'énergie réduit les performances de votre appareil et limite ou désactive la vibration, les services de localisation ainsi que la plupart des données en arrière-plan. Les applications de courriels, de messages et d\'autres qui reposent sur la synchronisation ne peuvent pas se mettre à jour, sauf si vous les ouvrez.\n\nLa fonction Économie d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Pour augmenter l\'autonomie de votre appareil, le mode Économie d\'énergie désactive certaines fonctionnalités et restreint les applications"</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pour aider à diminuer l\'utilisation des données, la fonction Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'Économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Toutes les régions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action interdite"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"L\'application <xliff:g id="APP_NAME">%1$s</xliff:g> est actuellement désactivée."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Plus de détails"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Activer le profil professionnel?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Vos applications professionnelles, vos notifications, vos données et les autres fonctionnalités de profil professionnel seront activées"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string>
@@ -1847,10 +1849,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ce téléphone n\'est pas autorisé pour la voix"</string>
- <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
- <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non configurée"</string>
- <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
- <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas configurée"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre contextuelle"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application a été rétrogradée ou n\'est pas compatible avec ce raccourci"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Les appels et les notifications seront silencieux"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Changements système"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne pas déranger"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Le mode Ne pas déranger masque les notifications pour vous aider à vous concentrer"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"C\'est un nouveau comportement. Touchez l\'écran pour changer vos options."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Nouveau : Le mode Ne pas déranger masque les notifications"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Touchez ici pour en savoir plus et changer les paramètres"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Les paramètres du mode Ne pas déranger ont changé"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Touchez l\'écran pour vérifier ce qui est bloqué."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Système"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 991e3ce..f1f4499 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Appeler"</string>
<string name="dial_desc" msgid="6573723404985517250">"Appeler le numéro de téléphone sélectionné"</string>
<string name="map" msgid="5441053548030107189">"Carte"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localiser l\'adresse sélectionnée"</string>
<string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Ouvrir l\'URL sélectionnée"</string>
<string name="sms" msgid="4560537514610063430">"Envoyer un message"</string>
@@ -1274,7 +1273,7 @@
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
<string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Vérification de \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
<string name="ext_media_checking_notification_message" msgid="410185170877285434">"Vérification du contenu actuel"</string>
- <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouvelle <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouveau périphérique : <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Appuyer pour configurer"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer photos et fichiers"</string>
<string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problème avec : <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1284,16 +1283,16 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\". Appuyez ici pour le configurer dans un format accepté."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Cet appareil n\'est pas compatible avec cette <xliff:g id="NAME">%s</xliff:g>. Sélectionnez cette option pour la configurer dans un format accepté."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Éjectez la mémoire de stockage externe avant de la retirer pour éviter toute perte de contenu"</string>
- <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> supprimée"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Certaines fonctionnalités risquent de ne pas s\'exécuter correctement. Insérez une nouvelle mémoire de stockage externe."</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Éjectez le périphérique externe avant de le retirer pour éviter toute perte de contenu"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> supprimé"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Certaines fonctionnalités risquent de ne pas s\'exécuter correctement. Insérez un nouveau périphérique de stockage externe."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Éjection de \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne retirez pas la mémoire de stockage"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne retirez pas le périphérique"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Parcourir"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" manquante"</string>
- <string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez de nouveau la mémoire"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez le périphérique"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfert de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données en cours"</string>
<string name="ext_media_move_success_title" msgid="7863652232242276066">"Le contenu a bien été déplacé"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mis à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances de votre appareil et limite le vibreur, les services de localisation et la plupart des données en arrière-plan. Vous devrez peut-être ouvrir manuellement vos applications d\'e-mail, de SMS/MMS et autres applications synchronisées pour les mettre à jour.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque l\'appareil est en charge."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'économiseur de données ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Toutes les régions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Action interdite"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"L\'application <xliff:g id="APP_NAME">%1$s</xliff:g> est actuellement désactivée."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Plus d\'informations"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Activer profil professionnel ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Vos applications professionnelles, notifications, données et d\'autres fonctionnalités de votre profil professionnel seront activées"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Sonnerie désactivée pour les appels et les notifications"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifications du système"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne pas déranger"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Le mode Ne pas déranger masque les notifications pour vous aider à vous concentrer"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Il s\'agit d\'un nouveau comportement. Appuyez pour modifier les paramètres."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Le mode Ne pas déranger a été modifié"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Appuyez pour vérifier les contenus bloqués."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Système"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 0440f3e..c690c18 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Chamar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Chama ao número de teléfono seleccionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizar o enderezo seleccionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abre o URL seleccionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensaxe"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado polo teu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado polo teu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado polo teu administrador"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para ampliar a duración da batería, a función Aforro de batería reduce o rendemento do teu dispositivo e limita ou apaga a vibración, os servizos de localización e os datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que as abras.\n\nA función Aforro de batería desactívase automaticamente cando pos a cargar o dispositivo."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para contribuír a reducir o uso de datos, o Economizador de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Queres activar o economizador de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1779,6 +1779,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas as rexións"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Acción non permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"A aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> está desactivada."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Máis detalles"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Activar o perfil de traballo?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Activaranse as túas aplicacións de traballo, as notificacións, os datos e outras funcións do perfil de traballo"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string>
@@ -1868,8 +1871,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"As chamadas e as notificacións estarán silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios no sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Non molestar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo Non molestar oculta as notificacións para axudarche a centrarte"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é un comportamento novo. Toca para cambialo."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Non molestar cambiou"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para comprobar o contido bloqueado."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index b92d702..515acb9 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"કોઈ વૉઇસ સેવા નથી"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"કોઈ વૉઇસ સેવા અથવા કટોકટીની કૉલિંગ સેવા નથી"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"તમારા કૅરિઅરે હંગામી રૂપે બંધ કરી છે"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"તમારા કૅરિઅર દ્વારા સિમ <xliff:g id="SIMNUMBER">%d</xliff:g> માટે હંગામી રૂપે બંધ કરેલ છે"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"મોબાઇલ નેટવર્ક સુધી પહોંચી શકાતું નથી"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"પસંદગીનું નેટવર્ક બદલવાનો પ્રયાસ કરો. બદલવા માટે ટૅપ કરો."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"કટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ઓળખાયેલ નથી"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ફિંગરપ્રિન્ટ પ્રમાણિત કરી"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ફિંગરપ્રિન્ટ હાર્ડવેર ઉપલબ્ધ નથી."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ફિંગરપ્રિન્ટ સંગ્રહિત કરી શકાતી નથી. કૃપા કરીને અસ્તિત્વમાંની ફિંગરપ્રિન્ટ દૂર કરો."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"કૉલ કરો"</string>
<string name="dial_desc" msgid="6573723404985517250">"પસંદ કરેલ ફોન નંબર પર કૉલ કરો"</string>
<string name="map" msgid="5441053548030107189">"નકશો"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"પસંદ કરેલ સરનામું શોધો"</string>
<string name="browse" msgid="1245903488306147205">"ખોલો"</string>
<string name="browse_desc" msgid="8220976549618935044">"પસંદ કરેલ URL ખોલો"</string>
<string name="sms" msgid="4560537514610063430">"સંદેશ મોકલો"</string>
@@ -1270,54 +1267,39 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"અન્ય ઍપ્લિકેશનોની ટોચે પ્રદર્શિત કરો"</string>
+ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"અન્ય ઍપથી ઉપર બતાવો"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનોની ઉપર પ્રદર્શિત થઈ રહ્યું છે"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર દેખાઈ છે"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"બંધ કરો"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> તપાસી રહ્યાં છીએ…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"હાલના કન્ટેન્ટને રિવ્યૂ કરવું"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"નવું <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"સેટ કરવા માટે ટૅપ કરો"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ફોટો અને મીડિયા ટ્રાન્સફર કરવા માટે"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>ની સમસ્યા"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ઠીક કરવા માટે ટૅપ કરો"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. સુધારવા માટે પસંદ કરો."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"અસમર્થિત <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફોર્મેટમાં સેટ કરવા માટે ટૅપ કરો."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફૉર્મેટમાં સેટ કરવા માટે પસંદ કરો."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> અનપેક્ષિત રીતે દૂર કર્યું"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"કન્ટેન્ટ ગુમાવવાનું ટાળવા માટે મીડિયાને દૂર કરતા પહેલાં બહાર કાઢો"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> કાઢી નાખ્યું"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"કેટલીક કાર્યક્ષમતા કદાચ યોગ્ય રીતે કામ ન કરી શકે. નવું સ્ટોરેજ દાખલ કરો."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>ને બહાર કાઢી રહ્યાં છીએ"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"કાઢી નાખશો નહીં"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"સેટ કરો"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"બહાર કાઢો"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"અન્વેષણ કરો"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ખૂટે છે"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"ફરીથી ઉપકરણ દાખલ કરો"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ખસેડી રહ્યાં છીએ"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ડેટાને ખસેડી રહ્યાં છીએ"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"કન્ટેન્ટ ટ્રાન્સફર કરવાનું પૂર્ણ થયું"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"કન્ટેન્ટ <xliff:g id="NAME">%s</xliff:g>માં ખસેડ્યું"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"કન્ટેન્ટ ખસેડી શક્યાં નથી"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ફરીથી કન્ટેન્ટ ખસેડવાનો પ્રયાસ કરો"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"દૂર કર્યું"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"બહાર કાઢ્યું"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"તપાસી રહ્યું છે..."</string>
@@ -1416,7 +1398,7 @@
<string name="sync_undo_deletes" msgid="2941317360600338602">"કાઢી નાખવાનું પૂર્વવત્ કરો"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"હાલ પૂરતું કંઈ કરશો નહીં"</string>
<string name="choose_account_label" msgid="5655203089746423927">"એક એકાઉન્ટ પસંદ કરો"</string>
- <string name="add_account_label" msgid="2935267344849993553">"એક એકાઉન્ટ ઉમેરો"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"એકાઉન્ટ ઉમેરો"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"એકાઉન્ટ ઉમેરો"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"વધારો"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"ઘટાડો"</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"તમારા વ્યવસ્થાપક દ્વારા ઇન્સ્ટૉલ કરવામાં આવેલ છે"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"બૅટરીની આવરદા વધારવામાં સહાય કરવા માટે, બૅટરી સેવર તમારા ઉપકરણના કાર્યપ્રદર્શનને ઘટાડે છે અને વાઇબ્રેશન, સ્થાન સેવાઓ અને બૅકગ્રાઉન્ડ ડેટાને સીમિત કરે છે અથવા બંધ કરે છે. ઇમેઇલ, મેસેજિંગ અને અન્ય ઍપ જે સિંક થવા પર આધાર રાખે છે, તેઓ કદાચ તમે ખોલો નહીં ત્યાં સુધી અપડેટ થશે નહીં.\n\nજ્યારે તમારું ઉપકરણ ચાર્જ થઈ રહ્યું હોય ત્યારે બૅટરી સેવર આપમેળે બંધ થઈ જતું હોય છે."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપ્લિકેશનોને પૃષ્ઠભૂમિમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ્લિકેશન ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ડેટા સેવર ચાલુ કરીએ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ચાલુ કરો"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"બધી ભાષાઓ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"તમામ પ્રદેશ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"શોધ"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"કાર્યાલયની પ્રોફાઇલ ચાલુ કરીએ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"તમારી કાર્યાલયની ઍપ, નોટિફિકેશન, ડેટા અને અન્ય કાર્યાલયની પ્રોફાઇલ સુવિધાઓ ચાલુ કરવામાં આવશે"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ચાલુ કરો"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"આ સિમમાં વૉઇસ માટે કોઈ જોગવાઈ નથી"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"વૉઇસ માટે આ સિમને મંજૂરી નથી"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"વૉઇસ માટે આ ફોનને મંજૂરી નથી"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"સિમ <xliff:g id="SIMNUMBER">%d</xliff:g>ને મંજૂરી નથી"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"સિમ <xliff:g id="SIMNUMBER">%d</xliff:g>ની જોગવાઈ કરી નથી"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"સિમ <xliff:g id="SIMNUMBER">%d</xliff:g>ને મંજૂરી નથી"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"સિમ <xliff:g id="SIMNUMBER">%d</xliff:g>ને મંજૂરી નથી"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"આ ઍપનું વર્ઝન ડાઉનગ્રેડ કરવામાં આવ્યું છે અથવા આ શૉર્ટકટ સાથે સુસંગત નથી"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"કૉલ અને નોટિફિકેશન મ્યૂટ કરવામાં આવશે"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"સિસ્ટમના ફેરફારો"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ખલેલ પાડશો નહીં"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"તમને ફોકસ કરવામાં સહાય કરવા માટે ખલેલ પાડશો નહીં નોટિફિકેશન છુપાવે છે"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"આ નવી વર્તણૂક છે. બદલવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"શું બ્લૉક કરેલ છે તે તપાસવા માટે ટૅપ કરો."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"સિસ્ટમ"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index e154a07..2ab54c9 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -54,7 +54,7 @@
<item quantity="one">सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> प्रयास शेष हैं.</item>
<item quantity="other">सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> प्रयास शेष हैं.</item>
</plurals>
- <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="imei" msgid="2625429890869005782">"आईएमईआई"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"इनकमिंग कॉलर आईडी"</string>
<string name="ClirMmi" msgid="7784673673446833091">"आउटगोइंग कॉलर आईडी"</string>
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कोई वॉइस सेवा नहीं है"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"सामान्य (वॉइस) कॉल या आपातकालीन कॉल पर रोक लगा दी गई है"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने सेवा पर कुछ समय के लिए रोक लगा दी है"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"सिम <xliff:g id="SIMNUMBER">%d</xliff:g> पर आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने कुछ समय के लिए सेवा बंद कर दी है"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क से कनेक्ट नहीं किया जा सका"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"पसंदीदा नेटवर्क बदलकर देखें. बदलने के लिए टैप करें."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आपातकालीन कॉल करने की सुविधा उपलब्ध नहीं है"</string>
@@ -285,7 +284,7 @@
<string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को एसएमएस (मैसेज) भेजने और देखने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"मेमोरी"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string>
- <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें देखने की अनुमति देना चाहते हैं?"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को डिवाइस पर मौजूद फ़ोटो, ऑडियो-वीडियो और फ़ाइलें एक्सेस करने की अनुमति दें?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडियो रिकॉर्ड करें"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को ऑडियो रिकॉर्ड करने की अनुमति देना चाहते हैं?"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"पहचाना नहीं गया"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"फ़िंगरप्रिंट की पुष्टि हो गई"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फ़िंगरप्रिंट हार्डवेयर उपलब्ध नहीं है."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहित नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string>
@@ -1016,12 +1014,11 @@
<string name="dial" msgid="1253998302767701559">"कॉल करें"</string>
<string name="dial_desc" msgid="6573723404985517250">"चुने गए फ़ोन नंबर पर कॉल करें"</string>
<string name="map" msgid="5441053548030107189">"मानचित्र"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"चुना गया पता मैप पर दिखाएं"</string>
<string name="browse" msgid="1245903488306147205">"खोलें"</string>
<string name="browse_desc" msgid="8220976549618935044">"चुना गया यूआरएल खोलें"</string>
<string name="sms" msgid="4560537514610063430">"मैसेज"</string>
- <string name="sms_desc" msgid="7526588350969638809">"चुने गए फ़ोन नंबर को मैसेज (एसएमएस) करें"</string>
+ <string name="sms_desc" msgid="7526588350969638809">"चुने गए फ़ोन नंबर को मैसेज करें"</string>
<string name="add_contact" msgid="7867066569670597203">"जोड़ें"</string>
<string name="add_contact_desc" msgid="4830217847004590345">"संपर्क सूची में जोड़ें"</string>
<string name="view_calendar" msgid="979609872939597838">"देखें"</string>
@@ -1274,49 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करें"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ढूंढा जा रहा है…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"मौजूदा सामग्री की जाँच की जा रही है"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"नया <xliff:g id="NAME">%s</xliff:g> लगाया गया"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"सेटअप करने के लिए टैप करें"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फ़ोटो और मीडिया ट्रांसफर करने के लिए"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> में गड़बड़ी है"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"समस्या ठीक करने के लिए टैप करें"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> काम नहीं कर रहा है. ठीक करने के लिए चुनें."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"यह डिवाइस इस <xliff:g id="NAME">%s</xliff:g> का समर्थन नहीं करता है. समर्थित प्रारूप में सेट करने के लिए टैप करें."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"इस डिवाइस पर <xliff:g id="NAME">%s</xliff:g> काम नहीं करता है. काम करने वाले प्रारूप में सेट अप करने के लिए चुनें."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूप से निकाला गया"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"पहले मीडिया डिवाइस निकालने का विकल्प चुनें, फिर उसे निकालें ताकि आपकी सामग्री सुरक्षित रहे"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> निकाला गया."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"हो सकता है कि कुछ सुविधाएं ठीक तरह से काम न करें. ज़्यादा जगह पाने के लिए नया एसडी कार्ड जोड़ें."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> बाहर निकाला जा रहा है…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"बाहर न निकालें"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"सेट करें"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"निकालें"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करें"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गुम है"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"डिवाइस को दोबारा लगाएं"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> को ले जाया जा रहा है"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"डेटा ले जाया जा रहा है"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"सामग्री ट्रांसफ़र की गई"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"सामग्री <xliff:g id="NAME">%s</xliff:g> में ट्रांसफ़र की गई"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"सामग्री ट्रांसफ़र नहीं की जा सकी"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"सामग्री दोबारा ट्रांसफ़र करने की कोशिश करें"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"निकाल दिया गया"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"निकाला गया"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"जाँच की जा रही है..."</string>
@@ -1708,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपके व्यवस्थापक ने इंस्टॉल किया है"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपके व्यवस्थापक ने हटा दिया है"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर आपके डिवाइस पर सिर्फ़ ज़रूरी ऐप्लिकेशन को काम करने देता है. इस सुविधा के चालू होने पर, वाइब्रेशन, जगह की जानकारी से जुड़ी सेवाओं और बैकग्राउंड डेटा का इस्तेमाल या तो बहुत कम हो जाता है या पूरी तरह से बंद हो जाता है. आपके डिवाइस पर ईमेल, मैसेज और ऐसे दूसरे ऐप्लिकेशन मौजूद होते हैं, जिनमें डेटा सिंक होता है. बैटरी सेवर चालू होने पर इन ऐप्लिकेशन में नए ईमेल, मैसेज और दूसरी जानकारी तब तक नहीं जुड़ेगी, जब तक आप इन्हें नहीं खोलेंगे.\n\nजब आपका डिवाइस चार्ज हो रहा होता है, तब बैटरी सेवर की सुविधा अपने आप बंद हो जाती है."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप को बैकग्राउंड में डेटा भेजने या पाने से रोकता है. आप फ़िलहाल जिस एेप का इस्तेमाल कर रहे हैं वह डेटा तक पहुंच सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इसे समझिये कि तस्वीर तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करें"</string>
@@ -1795,6 +1778,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"सभी भाषाएं"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"सभी क्षेत्र"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"सर्च करें"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफ़ाइल चालू करें?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"आपके काम से जुड़े ऐप्लिकेशन, सूचनाएं, डेटा और कार्य प्रोफ़ाइल से जुड़ी दूसरी सुविधाएं चालू हो जाएंगी"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करें"</string>
@@ -1864,14 +1853,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"सिम से कॉल करने की इजाज़त नहीं है"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"सिम से कॉल करने की इजाज़त नहीं है"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"फ़ोन से कॉल करने की इजाज़त नहीं है"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"सिम <xliff:g id="SIMNUMBER">%d</xliff:g> को कॉल के लिए इस्तेमाल नहीं किया जा सकता"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"सिम <xliff:g id="SIMNUMBER">%d</xliff:g> काम नहीं कर रहा है"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"सिम <xliff:g id="SIMNUMBER">%d</xliff:g> को कॉल के लिए इस्तेमाल नहीं किया जा सकता"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"सिम <xliff:g id="SIMNUMBER">%d</xliff:g> को कॉल के लिए इस्तेमाल नहीं किया जा सकता"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ऐप्लिकेशन का वर्शन पुराना हो चुका है या यह इस शॉर्टकट के साथ काम नहीं करता"</string>
@@ -1888,8 +1873,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कॉल अाैर सूचनाओं के लिए डिवाइस म्यूट रहेगा"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम में हुए बदलाव"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"परेशान न करें"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"आपका ध्यान न भटके, इसलिए परेशान न करें सुविधा सूचनाएं नहीं दिखा रही है"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यह नई सुविधा है. बदलने के लिए टैप करें."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"परेशान न करें की सुविधा बदल गई है"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"टैप करके देखें कि किन चीज़ों पर रोक लगाई गई है."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"सिस्टम"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index e59a43f..218a1b4 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Poziv"</string>
<string name="dial_desc" msgid="6573723404985517250">"Pozivanje odabranog telefonskog broja"</string>
<string name="map" msgid="5441053548030107189">"Karta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Prikaz odabrane adrese na karti"</string>
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otvaranje odabranog URL-a"</string>
<string name="sms" msgid="4560537514610063430">"Poruka"</string>
@@ -1716,7 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao administrator"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Da bi se produljilo trajanje baterije, Štednja baterije smanjuje rad uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nŠtednja baterije isključuje se automatski dok se uređaj puni."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Da bi se produljilo trajanje baterije, Štednja baterije isključuje neke značajke uređaja i ograničava aplikacije."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio podatkovni promet, Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1812,6 +1811,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Radnja nije dopuštena"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno je onemogućena."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Više pojedinosti"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Želite uključiti radni profil?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Uključit će se vaše radne aplikacije, obavijesti, podaci i druge značajke radnog profila"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string>
@@ -1902,8 +1904,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvučni signal poziva i obavijesti bit će isključen"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Promjene sustava"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne uznemiravaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način Ne uznemiravaj sakriva obavijesti da biste se lakše usredotočili"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da biste ga promijenili."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novo: način Ne uznemiravaj sakriva obavijesti"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Dodirnite da biste saznali više i promijenili postavke."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Promijenjena je postavka Ne uznemiravaj"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da biste provjerili što je blokirano."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sustav"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 98d91da..5f73c7b 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Hívás"</string>
<string name="dial_desc" msgid="6573723404985517250">"Kiválasztott telefonszám hívása"</string>
<string name="map" msgid="5441053548030107189">"Térkép"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Kiválasztott cím megkeresése a térképen"</string>
<string name="browse" msgid="1245903488306147205">"Megnyitás"</string>
<string name="browse_desc" msgid="8220976549618935044">"Kiválasztott URL megnyitása"</string>
<string name="sms" msgid="4560537514610063430">"Üzenet"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"A rendszergazda által telepítve"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"A rendszergazda által frissítve"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"A rendszergazda által törölve"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Az akkumulátor üzemidejének növelése érdekében az Akkumulátorkímélő mód csökkenti az eszköz teljesítményét, és korlátozza vagy kikapcsolja a rezgést, a helyszolgáltatásokat, valamint a háttéradatokat. Előfordulhat, hogy azok az e-mail-, üzenetküldő és egyéb alkalmazások, amelyek szinkronizálást használnak, csak akkor frissítenek, ha megnyitja őket.\n\nAz Akkumulátorkímélő mód automatikusan kikapcsol, ha az eszköz töltőn van."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által aktuálisan használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bekapcsolás"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Minden nyelv"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Minden régió"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Keresés"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Nem engedélyezett a művelet"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás jelenleg le van tiltva."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"További részletek"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Bekapcsolja a munkaprofilt?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"A munkahelyi alkalmazások, értesítések, adatok és a munkaprofilhoz tartozó egyéb funkciók be lesznek kapcsolva"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Bekapcsolás"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"A hívások és az értesítések némák"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Rendszermódosítások"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne zavarjanak"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"A Ne zavarjanak mód elrejti az értesítéseket, hogy segítsen az összpontosításban"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ez új viselkedés. Koppintson a módosításhoz."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Módosultak a Ne zavarjanak mód beállításai"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Koppintson a letiltott elemek megtekintéséhez."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Rendszer"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index ce3983a..c8e072d 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -366,7 +366,7 @@
<string name="permlab_writeSettings" msgid="2226195290955224730">"փոփոխել համակարգի կարգավորումները"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"Թույլ է տալիս հավելվածին փոփոխել համակարգի կարգավորումների տվյալները: Վնասարար հավելվածները կարող են վնասել ձեր համակարգի կարգավորումները:"</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"աշխատել մեկնարկային ռեժիմով"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Թույլ է տալիս հավելվածին ինքնաշխատ մեկնարկել համակարգի բեռնման ավարտից հետո: Սա կարող է երկարացնել պլանշետի մեկնարկը և թույլ տալ հավելավածին դանդաղեցնել ամբողջ պլանշետի աշխատանքը` միշտ աշխատելով:"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Թույլ է տալիս հավելվածին ավտոմատ մեկնարկել համակարգի բեռնման ավարտից հետո: Սա կարող է երկարացնել պլանշետի մեկնարկը և թույլ տալ հավելավածին դանդաղեցնել ամբողջ պլանշետի աշխատանքը` միշտ աշխատելով:"</string>
<string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"Թույլ է տալիս հավելվածին ինքնամեկնարկել համակարգի սկզբնաբեռնումից հետո: Սա կարող է երկարացնել հեռուստացույցի մեկնարկը և թույլ է տալիս հավելվածին դանդաղեցնել ողջ պլանշետի աշխատանքը՝ իր մշտական աշխատանքով:"</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Թույլ է տալիս հավելվածին ինքն իրեն սկսել` համակարգի բեռնումն ավարտվելուն պես: Սա կարող է հեռախոսի մեկնարկը դարձնել ավելի երկար և թույլ տալ, որ հավելվածը դանդաղեցնի ընդհանուր հեռախոսի աշխատանքը` միշտ աշխատելով:"</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"ուղարկել կպչուն հաղորդում"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Զանգել"</string>
<string name="dial_desc" msgid="6573723404985517250">"Զանգել ընտրված հեռախոսահամարին"</string>
<string name="map" msgid="5441053548030107189">"Քարտեզ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Գտնել ընտրված հասցեն քարտեզում"</string>
<string name="browse" msgid="1245903488306147205">"Բացել"</string>
<string name="browse_desc" msgid="8220976549618935044">"Բացել ընտրված URL-ը"</string>
<string name="sms" msgid="4560537514610063430">"SMS գրել"</string>
@@ -1550,15 +1549,15 @@
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Հեռացնել"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Ձայնը բարձրացնե՞լ խորհուրդ տրվող մակարդակից ավել:\n\nԵրկարատև բարձրաձայն լսելը կարող է վնասել ձեր լսողությունը:"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"Օգտագործե՞լ Մատչելիության դյուրանցումը։"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"Մատչելիության գործառույթն օգտագործելու համար սեղմեք և 3 վայրկյան սեղմած պահեք ձայնի ուժգնության երկու կոճակները, երբ գործառույթը միացված է։\n\n Մատչելիության ակտիվ գործառույթը՝\n<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n Գործառույթը կարող եք փոփոխել՝ անցնելով Կարգավորումներ > Մատչելիություն։"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"Մատչելիության գործառույթն օգտագործելու համար սեղմեք և 3 վայրկյան սեղմած պահեք ձայնի ուժգնության երկու կոճակները, երբ գործառույթը միացված է։\n\n Մատչելիության ակտիվ գործառույթը՝\n<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n Գործառույթը կարող եք փոփոխել՝ անցնելով Կարգավորումներ > Հատուկ գործառույթներ։"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"Անջատել դյուրանցումը"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"Օգտագործել դյուրանցումը"</string>
<string name="color_inversion_feature_name" msgid="4231186527799958644">"Գունաշրջում"</string>
<string name="color_correction_feature_name" msgid="6779391426096954933">"Գունաշտկում"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Մատչելիության դյուրանցումն միացրել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Մատչելիության դյուրանցումն անջատել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Ընտրեք որևէ գործառույթ, որը կօգտագործվի Մատչելիություն կոճակին հպելու դեպքում՝"</string>
- <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Գործառույթները փոխելու համար հպեք և պահեք Մատչելիություն կոճակը։"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Ընտրեք որևէ գործառույթ, որը կօգտագործվի Հատուկ գործառույթներ կոճակին հպելու դեպքում՝"</string>
+ <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Գործառույթները փոխելու համար հպեք և պահեք Հատուկ գործառույթներ կոճակը։"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Խոշորացում"</string>
<string name="user_switched" msgid="3768006783166984410">"Ներկայիս օգտատերը <xliff:g id="NAME">%1$s</xliff:g>:"</string>
<string name="user_switching_message" msgid="2871009331809089783">"Փոխարկվում է <xliff:g id="NAME">%1$s</xliff:g>-ին..."</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Տեղադրվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Մարտկոցի աշխատաժամանակը երկարացնելու համար տնտեսման ռեժիմում սահմանափակվում են սարքի աշխատանքը, թրթռոցը, տեղորոշման ծառայություններն ու տվյալների ֆոնային փոխանցումը: Տվյալների համաժամեցումից կախված՝ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nՍարքի լիցքավորման ժամանակ մարտկոցի տնտեսումն ավտոմատ անջատվում է։"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Միացնե՞լ թրաֆիկի խնայումը:"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Միացնել"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Բոլոր լեզուները"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Բոլոր տարածաշրջանները"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Որոնում"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Գործողությունը չի թույլատրվում"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն արգելափակված է:"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Մանրամասն"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Միացնե՞լ աշխատանքային պրոֆիլը"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Ձեր աշխատանքային հավելվածները, ծանուցումները, տվյալները և աշխատանքային պրոֆիլի մյուս գործառույթները կմիանան"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Միացնել"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Զանգերի և ծանուցումների համար ձայնն անջատած է"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Համակարգի փոփոխություններ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Չանհանգստացնել"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«Չանհանգստացնել» ռեժիմում ծանուցումները կթաքցվեն: Դա կօգնի ձեզ կենտրոնանալ:"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Սա նոր կարգավորում է: Հպեք՝ փոխելու համար:"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Հպեք՝ տեսնելու, թե ինչ է արգելափակվել:"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Համակարգ"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 0ef2889..61549a4 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Panggil"</string>
<string name="dial_desc" msgid="6573723404985517250">"Panggil nomor telepon yang dipilih"</string>
<string name="map" msgid="5441053548030107189">"Peta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Mencari alamat yang dipilih"</string>
<string name="browse" msgid="1245903488306147205">"Buka"</string>
<string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
<string name="sms" msgid="4560537514610063430">"Pesan"</string>
@@ -1691,8 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Diinstal oleh admin Anda"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Diupdate oleh admin Anda"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dihapus oleh admin Anda"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai mengurangi performa perangkat dan membatasi atau menonaktifkan getaran, layanan lokasi, dan data background. Email, messaging, dan aplikasi lain yang mengandalkan sinkronisasi mungkin tidak diupdate, kecuali jika dibuka.\n\nPenghemat Baterai nonaktif otomatis jika perangkat sedang diisi daya baterainya."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangi penggunaan data, Penghemat Kuota Internet mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah disentuh."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Untuk memperpanjang masa pakai baterai Anda, fitur Penghemat Baterai mematikan sebagian fitur perangkat dan membatasi aplikasi."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangi penggunaan data, Penghemat Kuota Internet mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah di-tap."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Aktifkan Penghemat Kuota Internet?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktifkan"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Semua wilayah"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Telusuri"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Tindakan tidak diizinkan"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> saat ini dinonaktifkan."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Detail selengkapnya"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Aktifkan profil kerja?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Aplikasi kerja, notifikasi, data, dan fitur profil kerja lainnya akan diaktifkan"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktifkan"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Suara panggilan dan notifikasi akan dinonaktifkan"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Jangan Ganggu"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Mode Jangan Ganggu menyembunyikan notifikasi untuk membantu Anda fokus"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ini adalah perilaku baru. Tap untuk mengubah."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Baru: Mode Jangan Ganggu menyembunyikan notifikasi"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap untuk mempelajari lebih lanjut dan mengubah."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap untuk memeriksa item yang diblokir."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 749dcba..94a6f852 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Símtöl eru ekki í boði"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Engin raddþjónusta eða neyðarsímtöl"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Símafyrirtækið slökkti tímabundið á þessu"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Símafyrirtækið slökkti tímabundið á þessu fyrir SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ekki næst samband við farsímakerfi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prófaðu að velja annað símkerfi. Ýttu til að breyta."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Neyðarsímtöl eru ekki í boði"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"Þekktist ekki"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingrafar staðfest"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Símtal"</string>
<string name="dial_desc" msgid="6573723404985517250">"Hringja í valið símanúmer"</string>
<string name="map" msgid="5441053548030107189">"Kort"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Finna valið heimilisfang"</string>
<string name="browse" msgid="1245903488306147205">"Opna"</string>
<string name="browse_desc" msgid="8220976549618935044">"Opna valda vefslóð"</string>
<string name="sms" msgid="4560537514610063430">"Skilaboð"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slökkva"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Athugar <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Fer yfir núverandi efni"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nýtt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Ýttu til að setja upp"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til að flytja myndir og aðrar skrár"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Vandamál með <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Ýttu til að lagfæra"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er skemmt. Veldu til að lagfæra."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Óstutt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Ýttu til að setja upp með studdu sniði."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Veldu til að setja upp með studdu sniði."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> fjarlægt án fyrirvara"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Aftengdu geymslumiðil áður en þú tekur hann úr sambandi til að koma í veg fyrir að þú glatir efni"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> fjarlægt"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ekki er víst að allt virki eðlilega. Tengdu nýjan geymslumiðil."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Aftengir <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ekki fjarlægja"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Setja upp"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Fjarlægja"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Kanna"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> vantar"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Tengdu tækið aftur"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytur <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Flytur gögn"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"Efni hefur verið flutt"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Efni flutt yfir í <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ekki var hægt að flytja efni"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Reyndu að flytja efni aftur"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Fjarlægð"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"Aftengd"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"Athugar…"</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Kerfisstjóri setti upp"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Kerfisstjóri uppfærði"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Kerfisstjóri eyddi"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Til að auka endingu rafhlöðunnar mun orkusparnaður draga úr afköstum tækisins og takmarka eða slökkva á titringi, staðsetningarþjónustu og bakgrunnsgögnum. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu uppfærist nema þú opnir þau.\n\nSjálfkrafa er slökkt á orkusparnaði þegar tækið er í hleðslu."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan gæti verið, svo dæmi sé tekið, að myndir séu ekki birtar fyrr en þú ýtir á þær."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Kveikja á gagnasparnaði?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Kveikja"</string>
@@ -1796,6 +1779,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Öll tungumál"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Öll svæði"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Leita"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Aðgerð ekki leyfileg"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Slökkt er á forritinu <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Frekari upplýsingar"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Kveikja á vinnusniði?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Kveikt verður á vinnuforritum, tilkynningum, gögnum og öðrum eiginleikum vinnusniðsins"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Kveikja"</string>
@@ -1865,14 +1851,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-korti er ekki úthlutað fyrir rödd"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort er ekki heimilað fyrir rödd"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Sími er ekki heimilaður fyrir rödd"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> hefur ekki verið úthlutað"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Sprettigluggi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Útgáfa forritsins er of gömul eða er ekki samhæf þessari flýtileið"</string>
@@ -1889,8 +1871,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Slökkt verður á hljóði símtala og tilkynninga"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Breytingar á kerfi"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ónáðið ekki"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„Ónáðið ekki“ felur tilkynningar til að hjálpa þér að einbeita þér"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Þetta er ný hegðun. Ýttu til að breyta."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„Ónáðið ekki“ var breytt"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Ýttu til að skoða hvað lokað hefur verið á."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Kerfi"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index fafde5c..42425c7 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -272,31 +272,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passa a profilo di lavoro"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedere ai contatti"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere ai tuoi contatti?"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere ai tuoi contatti?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Geolocalizzazione"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedere alla posizione di questo dispositivo"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alla posizione di questo dispositivo?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alla posizione di questo dispositivo?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedere al calendario"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere al tuo calendario?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere al tuo calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"inviare e visualizzare SMS"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di inviare e visualizzare SMS?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di inviare e visualizzare SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Archiviazione"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accedere a foto, contenuti multimediali e file sul dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"registrare audio"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di registrare audio?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di registrare audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotocamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"scattare foto e registrare video"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di scattare foto e registrare video?"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di scattare foto e registrare video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
- <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di effettuare e gestire telefonate?"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di effettuare e gestire telefonate?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensori per il corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
- <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Chiama"</string>
<string name="dial_desc" msgid="6573723404985517250">"Chiama il numero di telefono selezionato"</string>
<string name="map" msgid="5441053548030107189">"Mappa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizza l\'indirizzo selezionato"</string>
<string name="browse" msgid="1245903488306147205">"Apri"</string>
<string name="browse_desc" msgid="8220976549618935044">"Apri l\'URL selezionato"</string>
<string name="sms" msgid="4560537514610063430">"Invia messaggio"</string>
@@ -1272,12 +1271,12 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Disattiva"</string>
- <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Controllo della <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Controllo del dispositivo <xliff:g id="NAME">%s</xliff:g>…"</string>
<string name="ext_media_checking_notification_message" msgid="410185170877285434">"Controllo dei contenuti correnti"</string>
- <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nuova <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nuovo dispositivo <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tocca per configurare"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per trasferire foto e altri file"</string>
- <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema con la <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema con <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tocca per risolvere il problema"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Il supporto esterno <xliff:g id="NAME">%s</xliff:g> è danneggiato. Seleziona per risolvere il problema."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non supportata"</string>
@@ -1285,19 +1284,19 @@
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Il dispositivo non supporta questo tipo di <xliff:g id="NAME">%s</xliff:g>. Seleziona per eseguire la configurazione in un formato supportato."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Rimozione imprevista della <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Espelli il supporto prima di rimuoverlo per evitare di perdere contenuti"</string>
- <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> rimossa"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Dispositivo <xliff:g id="NAME">%s</xliff:g> rimosso"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Alcune funzionalità potrebbero non funzionare correttamente. Inserisci un nuovo supporto di archiviazione."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Espulsione della <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Espulsione di <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Non rimuovere"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Espelli"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Apri"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mancante"</string>
- <string name="ext_media_missing_message" msgid="4012389235250987930">"Inserisci di nuovo dispositivo"</string>
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"Reinserisci il dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Spostamento di <xliff:g id="NAME">%s</xliff:g> in corso"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Spostamento dei dati in corso"</string>
<string name="ext_media_move_success_title" msgid="7863652232242276066">"Trasferimento contenuti completo"</string>
- <string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenuti spostati sulla <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenuti spostati su <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossibile spostare i contenuti"</string>
<string name="ext_media_move_failure_message" msgid="7388950499623016135">"Riprova a spostare i contenuti"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Rimosso"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installato dall\'amministratore"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aggiornato dall\'amministratore"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminato dall\'amministratore"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Per prolungare la durata della batteria, la funzione Risparmio energetico riduce le prestazioni del dispositivo e limita o disattiva la vibrazione, i servizi di geolocalizzazione e i dati in background. Email, Messaggi e altre app basate sulla sincronizzazione potrebbero non essere aggiornate finché non le apri.\n\nLa funzione Risparmio energetico viene disattivata automaticamente quando il dispositivo è in carica."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Per aumentare la durata della batteria, il Risparmio energetico disattiva alcune funzioni del dispositivo e limita le app."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Attivare Risparmio dati?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Attiva"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Tutte le lingue"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Tutte le aree geografiche"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Azione non consentita"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"L\'app <xliff:g id="APP_NAME">%1$s</xliff:g> è attualmente disattivata."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Altri dettagli"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Attivare il profilo di lavoro?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Le tue app di lavoro, le notifiche, i dati e altri elementi del profilo di lavoro saranno attivati."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Attiva"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"L\'audio di chiamate e notifiche sarà disattivato"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifiche al sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Non disturbare"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"La modalità Non disturbare nasconde le notifiche per favorire la concentrazione"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Si tratta di un nuovo comportamento. Tocca per cambiarlo."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novità: la modalità Non disturbare nasconde le notifiche"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tocca per avere ulteriori informazioni e modificare."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"L\'impostazione Non disturbare è cambiata"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tocca per controllare le notifiche bloccate."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 78e54cbf..ce03fe3 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -503,7 +503,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"לא זוהתה"</string>
- <string name="fingerprint_authenticated" msgid="5309333983002526448">"טביעת אצבע אומתה"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"טביעת האצבע אומתה"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"החומרה בשביל טביעת אצבע אינה זמינה."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string>
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"שיחה"</string>
<string name="dial_desc" msgid="6573723404985517250">"התקשרות למספר הטלפון שנבחר"</string>
<string name="map" msgid="5441053548030107189">"מפה"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"מיקום הכתובת שנבחרה"</string>
<string name="browse" msgid="1245903488306147205">"פתיחה"</string>
<string name="browse_desc" msgid="8220976549618935044">"פתיחה של כתובת האתר שנבחרה"</string>
<string name="sms" msgid="4560537514610063430">"הודעה"</string>
@@ -1328,7 +1327,7 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"מכשיר זה אינו תומך ב-<xliff:g id="NAME">%s</xliff:g> זה. הקש כדי להגדיר בפורמט נתמך."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> לא נתמך במכשיר הזה. בחר כדי להגדיר בפורמט שנתמך."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> הוסר באופן בלתי צפוי"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"יש להוציא את המדיה לפני ההסרה, כדי לא לאבד תוכן"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"יש לבחור באפשרות להוצאת מדיה לפני ההסרה, כדי לא לאבד תוכן"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> הוסר"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ייתכן שפונקציונליות מסוימת לא תפעל כראוי. יש להכניס אמצעי אחסון חדש."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"הוצאה של <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1343,7 +1342,7 @@
<string name="ext_media_move_success_title" msgid="7863652232242276066">"העברת התוכן הסתיימה"</string>
<string name="ext_media_move_success_message" msgid="8939137931961728009">"התוכן הועבר אל <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_move_failure_title" msgid="1604422634177382092">"לא ניתן היה להעביר תוכן"</string>
- <string name="ext_media_move_failure_message" msgid="7388950499623016135">"יש לנסות להעביר שוב את התוכן"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"יש לנסות שוב להעביר את התוכן"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"הוסר"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"הוצא"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"בודק…"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"הותקנה על ידי מנהל המערכת"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"עודכנה על ידי מנהל המערכת"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"נמחקה על ידי מנהל המערכת"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"כדי להאריך את חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את ביצועי המכשיר ומגבילה רטט, שירותי מיקום ונתוני רקע, או מכבה אותם. הודעות אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתח/י אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה אתה משתמש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. משמעות הדבר היא, למשל, שתמונות יוצגו רק לאחר שתקיש עליהן."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"האם להפעיל את חוסך הנתונים (Data Saver)?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"הפעל"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"כל השפות"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"כל האזורים"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"חיפוש"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"הפעולה אינה מותרת"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מושבתת עכשיו."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"פרטים נוספים"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"להפעיל את פרופיל העבודה?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"אפליקציות העבודה, הודעות, נתונים ותכונות נוספות של פרופיל העבודה יופעלו"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"הפעל"</string>
@@ -1917,10 +1920,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ניהול התצורה של כרטיס ה-SIM לא מתאים לזיהוי קולי"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"כרטיס ה-SIM לא מורשה לזיהוי קולי"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"הטלפון לא מורשה לזיהוי קולי"</string>
- <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אסור"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
<string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"אין ניהול תצורה עבור SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
- <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אסור"</string>
- <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אסור"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> אינו מאושר לשימוש ברשת"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"חלון קופץ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"גרסת האפליקציה שודרגה לאחור או שאינה תואמת לקיצור דרך זה"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"שיחות והודעות יושתקו"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"שינויי מערכת"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"נא לא להפריע"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"מצב \'נא לא להפריע\' מסתיר הודעות כדי לעזור לך להתרכז"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"זו התנהגות חדשה. יש להקיש כדי לשנות."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ההגדרה \'נא לא להפריע\' השתנתה"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"יש להקיש כדי לבדוק מה חסום."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"מערכת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index f6d4e3a..1da44e1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"電話"</string>
<string name="dial_desc" msgid="6573723404985517250">"選択した電話番号に電話をかけます"</string>
<string name="map" msgid="5441053548030107189">"地図"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"選択した住所を探します"</string>
<string name="browse" msgid="1245903488306147205">"開く"</string>
<string name="browse_desc" msgid="8220976549618935044">"選択した URL を開きます"</string>
<string name="sms" msgid="4560537514610063430">"メッセージ"</string>
@@ -1284,7 +1283,7 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"この端末はこの <xliff:g id="NAME">%s</xliff:g>に対応していません。タップして、対応している形式でセットアップしてください。"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"この端末はこの <xliff:g id="NAME">%s</xliff:g>に対応していません。サポートされるフォーマットで設定するには選択してください。"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>が不適切に取り外されました"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"コンテンツを消去しないようメディアを取り出してから取り外してください"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"コンテンツの喪失を防ぐため、メディアを取り出してから取り外してください"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>の取り外し"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"一部の機能が正しく動作しない可能性があります。新しいストレージを挿入してください。"</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>を取り出しています"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"管理者によりインストールされています"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"管理者により更新されています"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"管理者により削除されています"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"バッテリーを長持ちさせるため、バッテリー セーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、バックグラウンド データを制限したり、OFF にしたりします。同期を使用するメールやメッセージなどのアプリは起動しないと更新されない場合があります。\n\nバッテリー セーバーは端末の充電中は自動的に OFF になります。"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータにアクセスすることはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ON にする"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"すべての言語"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"すべての地域"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"検索"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"操作が許可されていません"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"アプリ <xliff:g id="APP_NAME">%1$s</xliff:g> は現在無効です。"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"詳細"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"仕事用プロファイルの有効化"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"仕事用のアプリ、通知、データなど、仕事用プロファイルの機能が ON になります"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ON にする"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"着信音と通知音をミュートします"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"システムの変更"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"マナーモード"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"マナーモードでは、集中できるよう通知が非表示になります"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"これが新しい動作です。変更するにはタップしてください。"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"マナーモードが変わりました"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"タップしてブロック対象をご確認ください。"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"システム"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 05f1687..6489004 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ზარი"</string>
<string name="dial_desc" msgid="6573723404985517250">"არჩეულ ტელეფონის ნომერზე დარეკვა"</string>
<string name="map" msgid="5441053548030107189">"რუკა"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"არჩეული მისამართის მდებარეობის დადგენა"</string>
<string name="browse" msgid="1245903488306147205">"გახსნა"</string>
<string name="browse_desc" msgid="8220976549618935044">"არჩეული URL-ის გახსნა"</string>
<string name="sms" msgid="4560537514610063430">"შეტყობინება"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"დაინსტალირებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ბატარეის მუშაობის გასახანგრძლივებლად, ბატარეის დამზოგი ამცირებს თქვენი მოწყობილობის ფუნქციონალობას და ზღუდავს ან თიშავს ვიბრაციას, მდებარეობის სერვისებს და ფონურ მონაცემებს. ელფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დამოკიდებული აპები მათ გახსნამდე არ განახლდება.\n\nბატარეის დამზოგი ავტომატურად გამოირთვება, როცა თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ჩართვა"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ყველა ენა"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ყველა რეგიონი"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ძიება"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"მოქმედება არ არის ნებადართული"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"აპლიკაცია „<xliff:g id="APP_NAME">%1$s</xliff:g>“ ამჟამად გათიშულია."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"დაწვრილებით"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"ჩაირთოს სამსახურის პროფილი?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"თქვენი სამსახურის აპები, შეტყობინებები, მონაცემები და სამსახურის პროფილის ყველა სხვა ფუნქცია ჩაირთვება"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ჩართვა"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ზარები და შეტყობინებები დადუმებული იქნება"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"სისტემის ცვლილებები"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"არ შემაწუხოთ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს, რათა კონცენტრირებაში დაგეხმაროთ"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ეს ახალი ქცევაა. შეეხეთ შესაცვლელად."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„არ შემაწუხოთ“ რეჟიმი შეცვლილია"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"შეეხეთ იმის სანახავად, თუ რა არის დაბლოკილი."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"სისტემა"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 5f4a4e6..8c97ef4 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Қоңырау шалу"</string>
<string name="dial_desc" msgid="6573723404985517250">"Таңдалған телефон нөміріне қоңырау шалу"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Таңдалған мекенжайдың орналасқан жерін анықтау"</string>
<string name="browse" msgid="1245903488306147205">"Ашу"</string>
<string name="browse_desc" msgid="8220976549618935044">"Таңдалған URL мекенжайын ашу"</string>
<string name="sms" msgid="4560537514610063430">"Хабар"</string>
@@ -1278,17 +1277,17 @@
<string name="ext_media_new_notification_title" msgid="1621805083736634077">"Жаңа <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Реттеу үшін түртіңіз"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Фотосуреттер мен медиа файлдарын тасымалдау үшін"</string>
- <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> арқылы шығарыңыз"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> ақаулы"</string>
<string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Түзету үшін түртіңіз"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> бүлінген. Түзету үшін оны түртіңіз."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Қолданылмайтын <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бұл құрылғы <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетеді. Қолдау көрсетілетін пішімде орнату үшін түртіңіз."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Бұл құрылғыда <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетілмейді. Қолдау көрсетілетін форматта реттеуді таңдаңыз."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> кенеттен шығарылды"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Мазмұнды жоғалтып алмау үшін ақпарат тасығышты алдымен шығарыңыз, одан кейін алыңыз."</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Мазмұнды жоғалтып алмау үшін ақпарат тасығышты алдымен ажыратыңыз, содан кейін барып шығарыңыз."</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Кейбір функциялар дұрыс жұмыс істемеуі мүмкін. Жаңа жад құрылғысын енгізіңіз."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> шығарылуда"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ажыратылуда"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Шығармаңыз"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Реттеу"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Шығару"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Әкімші орнатқан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Әкімші жаңартқан"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Әкімші жойған"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver құрылғының жұмыс өнімділігін төмендетеді және діріл функциясын, орынды анықтау қызметтерін, фондық деректі өшіреді. Синхрондауға негізделген электрондық пошта, хабар алмасу және басқа қолданбалар ашылмайынша жаңартылмайды.\n\nҚұрылғы зарядталып жатқанда, Battery Saver автоматты түрде өшеді."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Деректердің пайдаланылуын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге немесе қабылдауға жол бермейді. Қазір қолданылып жатқан қолданба деректерді пайдалануы мүмкін, бірақ жиі емес. Мысалы, кескіндер оларды түрткенге дейін көрсетілмейді."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Data Saver функциясын қосу керек пе?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Қосу"</string>
@@ -1779,6 +1779,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Барлық тілдер"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Барлық аймақтар"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Іздеу"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Бұл әрекетке рұқсат жоқ"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы әзірге өшірулі."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Қосымша мәліметтер"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Жұмыс профилі қосылсын ба?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Жұмыс қолданбалары, хабарландырулар, деректер және басқа да жұмыс профильдерінің мүмкіндіктері қосылады"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Қосу"</string>
@@ -1868,8 +1871,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Жүйе өзгерістері"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"\"Мазаламау\" режимі"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Көңіліңізді бөлмеу үшін \"Мазаламау\" режимі хабарландыруларды жасырады"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Бұл – жаңа параметр. Оны өзгерту үшін түртіңіз."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Мазаламау\" режимі өзгерді"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Түймені түртіп, неге тыйым салынатынын көріңіз."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Жүйе"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 25d6287..7c9dc83 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ហៅទូរសព្ទ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ហៅទូរសព្ទទៅលេខដែលបានជ្រើសរើស"</string>
<string name="map" msgid="5441053548030107189">"ផែនទី"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"កំណត់ទីតាំងអាសយដ្ឋានដែលបានជ្រើសរើស"</string>
<string name="browse" msgid="1245903488306147205">"បើក"</string>
<string name="browse_desc" msgid="8220976549618935044">"បើក URL ដែលបានជ្រើសរើស"</string>
<string name="sms" msgid="4560537514610063430">"សារ"</string>
@@ -1693,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ដំឡើងដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"លុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ដើម្បីជួយឱ្យកម្រិតថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិត ឬបិទការញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយ។ អ៊ីមែល ការផ្ញើសារ និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនដំឡើងជំនាន់ទេ ប្រសិនបើអ្នកមិនបើកពួកវា។\n\nកម្មវិធីសន្សំថ្មបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"បើក"</string>
@@ -1780,6 +1780,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ភាសាទាំងអស់"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"តំបន់ទាំងអស់"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ស្វែងរក"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"សកម្មភាពមិនត្រូវបានអនុញ្ញាត"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"បច្ចុប្បន្ន កម្មវិធី <xliff:g id="APP_NAME">%1$s</xliff:g> ត្រូវបានបិទ។"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"ព័ត៌មានលម្អិតបន្ថែម"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"បើកកម្រងព័ត៌មានការងារ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"កម្មវិធីការងារ ការជូនដំណឹង ទិន្នន័យ និងមុខងារកម្រងព័ត៌មានការងារផ្សេងទៀតរបស់អ្នកនឹងត្រូវបានបើក"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"បើក"</string>
@@ -1869,8 +1872,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ការហៅទូរសព្ទ និងការជូនដំណឹងនឹងបិទសំឡេង"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ការផ្លាស់ប្ដូរប្រព័ន្ធ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"កុំរំខាន"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"មុខងារកុំរំខានកំពុងលាក់ការជូនដំណឹងដើម្បីជួយអ្នកផ្តោតអារម្មណ៍"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"នេះគឺជាសកម្មភាពថ្មី។ សូមចុចដើម្បីផ្លាស់ប្ដូរ។"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"មុខងារកុំរំខានត្រូវបានប្ដូរ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"សូមចុចដើម្បីមើលថាបានទប់ស្កាត់អ្វីខ្លះ។"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ប្រព័ន្ធ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 582a674..94fffe3 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ಕರೆ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ಆಯ್ಕೆಮಾಡಿದ ಫೋನ್ ಸಂಖ್ಯೆಗೆ ಕರೆ ಮಾಡಿ"</string>
<string name="map" msgid="5441053548030107189">"ನಕ್ಷೆ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"ಆಯ್ಕೆ ಮಾಡಿದ ವಿಳಾಸವನ್ನು ಗುರುತಿಸಿ"</string>
<string name="browse" msgid="1245903488306147205">"ತೆರೆ"</string>
<string name="browse_desc" msgid="8220976549618935044">"ಆಯ್ಕೆ ಮಾಡಿದ URL ತೆರೆಯಿರಿ"</string>
<string name="sms" msgid="4560537514610063430">"ಸಂದೇಶ"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ಕಂಪನ, ಸ್ಥಳದ ಸೇವೆಗಳು ಹಾಗೂ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಅವಲಂಬಿಸಿರುವಂತಹ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನೀವು ಅದನ್ನು ತೆರೆಯದ ಹೊರತು ಅಪ್ಡೇಟ್ ಆಗುವುದಿಲ್ಲ.\n\nಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಫ್ ಆಗುತ್ತದೆ."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ಆನ್ ಮಾಡಿ"</string>
@@ -1779,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕಿ"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ನಿಮ್ಮ ಕೆಲಸದ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಅಧಿಸೂಚನೆಗಳು, ಡೇಟಾ ಮತ್ತು ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡಿ"</string>
@@ -1868,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ಗಮನವನ್ನು ಕೇಂದ್ರೀಕರಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು \"ಅಡಚಣೆ ಮಾಡಬೇಡ\" ಮೋಡ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡುತ್ತಿದೆ"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ಇದು ವೈಶಿಷ್ಟ್ಯದ ಹೊಸ ಬದಲಾವಣೆಯ ಸೆಟ್ಟಿಂಗ್ ಆಗಿದೆ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ಏನನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ಸಿಸ್ಟಂ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index f2af6e5..7b3511b 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"전화"</string>
<string name="dial_desc" msgid="6573723404985517250">"선택한 전화번호로 전화 걸기"</string>
<string name="map" msgid="5441053548030107189">"지도"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"선택한 주소 위치 확인"</string>
<string name="browse" msgid="1245903488306147205">"열기"</string>
<string name="browse_desc" msgid="8220976549618935044">"선택한 URL 열기"</string>
<string name="sms" msgid="4560537514610063430">"메시지"</string>
@@ -1285,9 +1284,9 @@
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"이 기기는 이 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 선택하여 지원되는 형식으로 설정하세요."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>이(가) 예기치 않게 삭제됨"</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"콘텐츠 손실을 피하려면 미디어를 제거하기 전에 마운트 해제하세요."</string>
- <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>이(가) 제거됨"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> 제거됨"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"일부 기능이 제대로 작동하지 않을 수 있습니다. 새로운 저장소를 삽입하세요."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>을(를) 마운트 해제하는 중"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> 마운트 해제 중"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"외부 미디어를 제거하지 마세요."</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"설정"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"마운트 해제"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"관리자에 의해 설치되었습니다."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"관리자에 의해 업데이트되었습니다."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"관리자에 의해 삭제되었습니다."</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"배터리 세이버는 배터리 수명 연장을 위해 기기 성능을 줄이며 진동, 위치 서비스 및 백그라운드 데이터를 제한하거나 사용 중지합니다. 이메일, 메시지 및 동기화가 필요한 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n기기가 충전 중일 때는 자동으로 배터리 세이버가 사용 중지됩니다."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"데이터 절약 모드를 사용할까요?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"사용 설정"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"모든 언어"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"모든 지역"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"검색"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"허용되지 않는 작업"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> 애플리케이션이 현재 사용 중지되어 있습니다."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"세부정보 더보기"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"직장 프로필을 사용 설정하시겠어요?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"업무용 앱, 알림, 데이터 및 기타 직장 프로필 기능이 사용 설정됩니다."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"사용 설정"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"전화 및 알림 소리가 음소거됩니다."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"시스템 변경사항"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"알림 일시중지"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"집중할 수 있도록 알림 일시중지 기능으로 알림 숨김"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"새로운 동작입니다. 변경하려면 탭하세요."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"알림 일시중지 변경"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"차단된 항목을 확인하려면 탭하세요."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"시스템"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 8d4d20b..04b9830 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -82,7 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Аудио чалуу кызматы бөгөттөлгөн"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Чалуу жана шашылыш чалуу кызматы бөгөттөлгөн"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"Байланыш оператору убактылуу бөгөттөп койгон"</string>
- <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-картасы үчүн байланыш оператору тарабынан убактылуу бөгөттөлгөн"</string>
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> үчүн байланыш оператору тарабынан убактылуу бөгөттөлгөн"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобилдик тармакка туташпай жатат"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Тандалган тармакты өзгөртүп көрүңүз. Өзгөртүү үчүн таптаңыз."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Шашылыш чалуу жеткиликсиз"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Чалуу"</string>
<string name="dial_desc" msgid="6573723404985517250">"Тандалган телефон номерине чалуу"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Тандалган даректи картада табуу"</string>
<string name="browse" msgid="1245903488306147205">"Ачуу"</string>
<string name="browse_desc" msgid="8220976549618935044">"Тандалган URL\'ди ачуу"</string>
<string name="sms" msgid="4560537514610063430">"Билдирүү"</string>
@@ -1286,10 +1285,10 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн таптап коюңуз."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн тандаңыз."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> күтүүсүздөн алынып салынды"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Мазмунду жоготуунун алдын алуу үчүн алып салуудан мурда медианы чыгарыңыз"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Мазмунду жоготуп албаш үчүн алып салуудан мурда медианы өчүрүңүз"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> чыгарылды"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Айрым функциялар талаптагыдай иштебей калышы мүмкүн. Жаңы сактагычты салыңыз."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> чыгарылууда"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> өчүрүлүүдө"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Чыгарбаңыз"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Орнотуу"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Чыгаруу"</string>
@@ -1299,7 +1298,7 @@
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулууда"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"Дайындар ооштурулууда…"</string>
<string name="ext_media_move_success_title" msgid="7863652232242276066">"Мазмунду өткөрүү аягына чыкты"</string>
- <string name="ext_media_move_success_message" msgid="8939137931961728009">"Мазмун <xliff:g id="NAME">%s</xliff:g> SD-картасына жылдырылды"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"Мазмун <xliff:g id="NAME">%s</xliff:g> сактагычына жылдырылды"</string>
<string name="ext_media_move_failure_title" msgid="1604422634177382092">"Мазмун жылдырылбай койду"</string>
<string name="ext_media_move_failure_message" msgid="7388950499623016135">"Мазмунду кайра жылдырып көрүңүз"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"Өчүрүлдү"</string>
@@ -1399,9 +1398,9 @@
<string name="sync_really_delete" msgid="2572600103122596243">"Элементтерди жок кылуу"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"Жок кылынганды кайтаруу"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Азырынча эч нерсе кылбайм"</string>
- <string name="choose_account_label" msgid="5655203089746423927">"Каттоо эсебин тандаңыз"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Каттоо эсебин кошуу"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Каттоо эсебин кошуу"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"Аккаунт тандаңыз"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Аккаунт кошуу"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Аккаунт кошуу"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Жогорулатуу"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Төмөндөтүү"</string>
<string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> жолу басып, кармап туруңуз."</string>
@@ -1693,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Администраторуңуз орнотуп койгон"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Администраторуңуз жаңыртып койгон"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Администраторуңуз жок кылып салган"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Батареянын кубатынын мөөнөтүн узартуу үчүн Батареяны үнөмдөгүч режиминде түзмөгүңүздүн ишинин майнаптуулугу азайып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгү чектелип же өчүрүлөт. Электрондук почта, жазышуу жана башка шайкештирилүүчү колдонмолор ачылмайынча, жаңыртылбашы мүмкүн.\n\nБатареяны үнөмдөгүч режими түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Трафикти үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Дайындарды үнөмдөгүч күйсүнбү?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Күйгүзүү"</string>
@@ -1780,6 +1780,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Бардык тилдер"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Бардык аймактар"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Издөө"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Аракетке уруксат жок"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу учурда өчүрүлгөн."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Толук маалымат"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Жумуш профили күйгүзүлсүнбү?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Жумуш колдонмолоруңуз, эскертмелериңиз, дайындарыңыз жана жумуш профилинин башка функциялары күйгүзүлөт."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Күйгүзүү"</string>
@@ -1849,10 +1852,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-карта сүйлөшүү үчүн таанылган жок"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-картаны сүйлөшүү үчүн колдонууга тыюу салынган"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефонду сүйлөшүү үчүн колдонууга тыюу салынган"</string>
- <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> номериндеги SIM-картасына уруксат берилген жок"</string>
- <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> номериндеги SIM-карта таанылган жок"</string>
- <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> номериндеги SIM-картасына уруксат берилген жок"</string>
- <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> номериндеги SIM-картасына уруксат берилген жок"</string>
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасына уруксат берилген жок"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасы таанылган жок"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасына уруксат берилген жок"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> картасына уруксат берилген жок"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Калкып чыкма терезе"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Колдонмонун мурунку версиясын иштетип жатасыз же ал бул шилтемеге шайкеш эмес"</string>
@@ -1869,8 +1872,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Чалуулар менен эскертмелердин үнү өчүрүлөт"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Тутум өзгөрүүлөрү"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Тынчымды алба"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Сизди алаксытпоо үчүн \"Тынчымды алба\" режими эскертмелерди жашырууда"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Бул жаңы тартип. Өзгөртүү үчүн таптаңыз."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Тынчымды алба\" режими өзгөрдү"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Бөгөттөлгөн нерселерди көрүү үчүн таптаңыз."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Тутум"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index e08e50a..3e061b2 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ໂທ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ໂທຫາເບີໂທລະສັບທີ່ເລືອກ"</string>
<string name="map" msgid="5441053548030107189">"ແຜນທີ່"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"ຊອກຫາທີ່ຢູ່ທີ່ເລືອກ"</string>
<string name="browse" msgid="1245903488306147205">"ເປີດ"</string>
<string name="browse_desc" msgid="8220976549618935044">"ເປີດ URL ທີ່ເລືອກ"</string>
<string name="sms" msgid="4560537514610063430">"ຂໍ້ຄວາມ"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ຖືກຕິດຕັ້ງໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ຖືກອັບໂຫລດໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ຖືກລຶບອອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດແບັດເຕີຣີຈະຫຼຸດປະສິດທິພາບອຸປະກອນຂອງທ່ານ ແລະ ຈຳກັດ ຫຼື ປິດການສັ່ນເຕືອນ, ບໍລິການສະຖານທີ່ ແລະ ຂໍ້ມູນພື້ນຫຼັງໄວ້. ອີເມວ, ຂໍ້ຄວາມ ແລະ ແອັບອື່ນໆທີ່ອີງອາໃສການຊິ້ງຂໍ້ມູນອາດຈະບໍ່ອັບເດດເວັ້ນເສຍແຕ່ທ່ານຈະເປີດພວກມັນ.\n\nຕົວປະຢັດບັດເຕີຣີຈະປິດອັດຕະໂນມັດເມື່ອສາກໄຟອຸປະກອນຂອງທ່ານ."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ເປີດໃຊ້ຕົວປະຢັດຂໍ້ມູນບໍ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ເປີດໃຊ້"</string>
@@ -1778,6 +1778,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ທຸກພາສາ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ທຸກຂົງເຂດ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ຄົ້ນຫາ"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"ເປີດໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກບໍ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ແອັບວຽກຂອງທ່ານ, ການແຈ້ງເຕືອນ, ຂໍ້ມູນ ແລະ ຄຸນສົມບັດໂປຣໄຟລ໌ວຽກຈະຖືກເປີດໃຊ້"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ເປີດ"</string>
@@ -1867,8 +1873,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະບໍ່ມີສຽງ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ການປ່ຽນແປງລະບົບ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ຫ້າມລົບກວນ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ໂໝດຫ້າມລົບກວນຈະເຊື່ອງການແຈ້ງເຕືອນເພື່ອຊ່ວຍໃຫ້ທ່ານສຸມໃສ່ວຽກໄດ້"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ນີ້ເປັນພຶດຕິກຳໃໝ່. ແຕະເພື່ອປ່ຽນແປງ."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ແຕະເພື່ອກວດສອບວ່າມີຫຍັງຖືກບລັອກໄວ້ແດ່."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ລະບົບ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 9e5a705..afeb80e 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Skambinti"</string>
<string name="dial_desc" msgid="6573723404985517250">"Skambinti pasirinktu telefono numeriu"</string>
<string name="map" msgid="5441053548030107189">"Žemėlapis"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Rasti vietą pasirinktu adresu"</string>
<string name="browse" msgid="1245903488306147205">"Atidaryti"</string>
<string name="browse_desc" msgid="8220976549618935044">"Atidaryti pasirinktą URL"</string>
<string name="sms" msgid="4560537514610063430">"Pranešimas"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Įdiegė administratorius"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atnaujino administratorius"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Ištrynė administratorius"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Kad akumuliatorius veiktų ilgiau, akumuliatoriaus tausojimo priemonė sumažina įrenginio našumą ir apriboja arba išjungia vibravimą, vietovės paslaugas bei foninius duomenis. El. pašto, susirašinėjimo ir kitos programos, kurios veikia sinchronizavimo pagrindu, gali būti neatnaujintos, kol jų neatidarysite.\n\nAkumuliatoriaus tausojimo priemonė automatiškai išjungiama, kai įrenginys įkraunamas."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Įj. Duomenų taupymo priemonę?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Įjungti"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Visos kalbos"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Visi regionai"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Paieška"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Veiksmas neleidžiamas"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ šiuo metu yra išjungta."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Daugiau išsamios informacijos"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Įjungti darbo profilį?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Darbo programos, pranešimai, duomenys ir kitos darbo profilio funkcijos bus išjungtos"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Įjungti"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Skambučiai ir pranešimai bus nutildyti"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemos pakeitimai"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Netrukdymo režimas"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Netrukdymo režimu slepiami pranešimai, kad galėtumėte susikaupti"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Tai naujas veiksmas. Palieskite, kad pakeistumėte."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Netrukdymo režimas pakeistas"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Palieskite, kad patikrintumėte, kas blokuojama."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 667a65e..95aabaa 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Zvanīt"</string>
<string name="dial_desc" msgid="6573723404985517250">"Zvanīt uz atlasīto tālruņa numuru"</string>
<string name="map" msgid="5441053548030107189">"Maps"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Atrast atlasīto adresi"</string>
<string name="browse" msgid="1245903488306147205">"Atvērt"</string>
<string name="browse_desc" msgid="8220976549618935044">"Atvērt atlasīto URL"</string>
<string name="sms" msgid="4560537514610063430">"Īsziņa"</string>
@@ -1716,7 +1715,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalēja administrators"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atjaunināja administrators"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dzēsa administrators"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek samazināta ierīces veiktspēja un ierobežota vai izslēgta vibrācija, atrašanās vietu pakalpojumi un fona dati. E-pasta, ziņojumapmaiņas un citas lietotnes, kurām ir nepieciešama sinhronizācija, var netikt atjauninātas, ja tās neatverat.\n\nTiklīdz tiek sākta ierīces uzlāde, akumulatora jaudas taupīšanas režīms tiek automātiski izslēgts."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vai ieslēgt datu lietojuma samazinātāju?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ieslēgt"</string>
@@ -1812,6 +1812,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Visas valodas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Visi reģioni"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Meklēt"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Darbība nav atļauta"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Lietojumprogramma <xliff:g id="APP_NAME">%1$s</xliff:g> pašlaik ir atspējota."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Vairāk detalizētas informācijas"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Vai ieslēgt darba profilu?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Tiks ieslēgtas jūsu darba lietotnes, paziņojumi, dati un citas darba profila funkcijas."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ieslēgt"</string>
@@ -1902,8 +1905,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvanu un paziņojumu signāla skaņa būs izslēgta."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistēmas izmaiņas"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Netraucēt"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režīmā “Netraucēt” paziņojumi tiek paslēpti, lai palīdzētu jums koncentrēties"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Šāda darbība ir jauna. Pieskarieties, lai mainītu iestatījumus."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režīms “Netraucēt” ir mainīts"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Pieskarieties, lai uzzinātu, kas tiek bloķēts."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistēma"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 4fa37f9..f2bb667 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Повикај"</string>
<string name="dial_desc" msgid="6573723404985517250">"Го повикува избраниот телефонски број"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Лоцирај ја избраната адреса"</string>
<string name="browse" msgid="1245903488306147205">"Отвори"</string>
<string name="browse_desc" msgid="8220976549618935044">"Ја отвора избраната URL"</string>
<string name="sms" msgid="4560537514610063430">"Порака"</string>
@@ -1285,10 +1284,10 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Уредот не ја поддржува оваа <xliff:g id="NAME">%s</xliff:g>. Допрете за поставување во поддржан формат."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Уредов не ја поддржува оваа <xliff:g id="NAME">%s</xliff:g>. Изберете за поставување во поддржан формат."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> неочекувано е отстранета"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Откачете ја надворешната меморија пред да ја отстраните за да избегнете губење содржини"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Исклучете ја надворешната меморија пред да ја отстраните за да избегнете губење содржини"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> е отстранета"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Некои функции можеби нема да работат правилно. Вметнете нова надворешна меморија."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Се откачува <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Се исклучува <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Не отстранувајте"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Постави"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Извади"</string>
@@ -1694,7 +1693,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано од администраторот"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ажурирано од администраторот"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Избришано од администраторот"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"За да се продолжи трајноста на батеријата, штедачот на батерија ги намалува перформансите на вашиот уред и ги ограничува или исклучува вибрациите, услугите за локација и податоците од заднина. Е-поштата, пораките и другите апликации што се потпираат на синхронизирањето може да не се ажурираат освен ако не ги отворите.\n\nШтедачот на батерија се исклучува автоматски кога уредот се полни."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"За да се намали користењето интернет, Штедачот на интернет спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Вклучете Штедач на интернет?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Вклучи"</string>
@@ -1781,6 +1781,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Сите јазици"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Сите региони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Пребарај"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Дејството не е дозволено"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> моментално е оневозможена."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Повеќе детали"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Да се вклучи работниот профил?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Вашите работни апликации, известувања, податоци и други функции на работниот профил ќе бидат вклучени"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Вклучи"</string>
@@ -1870,8 +1873,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Повиците и известувањата нема да имаат звук"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системски промени"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не вознемирувај"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„Не вознемирувај“ ги крие известувањата за да ви помогне да се фокусирате"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ова е ново однесување. Допрете за промена."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Поставките за „Не вознемирувај“ се изменија"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Допрете за да проверите што е блокирано."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index ad39d8f..8a02098 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -245,8 +245,8 @@
<string name="global_action_lockdown" msgid="1099326950891078929">"ലോക്ക്ഡൗൺ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"പുതിയ അറിയിപ്പ്"</string>
- <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോർഡ്"</string>
- <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"കീബോർഡ്"</string>
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോഡ്"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ഫിസിക്കൽ കീബോഡ്"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"സുരക്ഷ"</string>
<string name="notification_channel_car_mode" msgid="3553380307619874564">"കാർ മോഡ്"</string>
<string name="notification_channel_account" msgid="7577959168463122027">"അക്കൗണ്ട് നില"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"വിളിക്കുക"</string>
<string name="dial_desc" msgid="6573723404985517250">"തിരഞ്ഞെടുത്ത നമ്പറിലേക്ക് കോൾ ചെയ്യുക"</string>
<string name="map" msgid="5441053548030107189">"മാപ്പ്"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"തിരഞ്ഞെടുത്ത വിലാസം കണ്ടെത്തുക"</string>
<string name="browse" msgid="1245903488306147205">"തുറക്കുക"</string>
<string name="browse_desc" msgid="8220976549618935044">"തിരഞ്ഞെടുത്ത URL ഓപ്പൺ ചെയ്യുക"</string>
<string name="sms" msgid="4560537514610063430">"സന്ദേശം"</string>
@@ -1300,7 +1299,7 @@
<string name="ext_media_move_success_title" msgid="7863652232242276066">"ഉള്ളടക്ക കൈമാറ്റം പൂർത്തിയായി"</string>
<string name="ext_media_move_success_message" msgid="8939137931961728009">"ഉള്ളടക്കം <xliff:g id="NAME">%s</xliff:g>-ലേക്ക് നീക്കി"</string>
<string name="ext_media_move_failure_title" msgid="1604422634177382092">"ഉള്ളടക്കം നീക്കാനായില്ല"</string>
- <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ഉള്ളടക്കം നീക്കുന്നതിന് വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ഉള്ളടക്കം നീക്കാൻ വീണ്ടും ശ്രമിക്കുക"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"നീക്കംചെയ്തു"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ഇജക്റ്റുചെയ്തു"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"പരിശോധിക്കുന്നു…"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"നിങ്ങളുടെ അഡ്മിൻ ഇൻസ്റ്റാൾ ചെയ്യുന്നത്"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"നിങ്ങളുടെ അഡ്മിൻ അപ്ഡേറ്റ് ചെയ്യുന്നത്"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"നിങ്ങളുടെ അഡ്മിൻ ഇല്ലാതാക്കുന്നത്"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ബാറ്ററി ലൈഫ് വർദ്ധിപ്പിക്കാൻ, \'ബാറ്ററി സംരക്ഷിക്കൽ\' നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനം കുറയ്ക്കുകയും വൈബ്രേഷൻ, ലൊക്കേഷൻ സേവനങ്ങൾ, പശ്ചാത്തല ഡാറ്റ, എന്നിവ പരിമിതപ്പെടുത്തുകയോ ഒാഫാക്കുകയോ ചെയ്യുന്നു. ഇമെയിൽ, സന്ദേശമയയ്ക്കൽ, സമന്വയിപ്പിക്കലിനെ ആശ്രയിച്ചുള്ള മറ്റ് ആപ്പുകൾ എന്നിവ നിങ്ങൾ തുറക്കുന്നതുവരെ അപ്ഡേറ്റ് ചെയ്യാനിടയില്ല.\n\nനിങ്ങളുടെ ഉപകരണം ചാർജ് ചെയ്യുമ്പോൾ \'ബാറ്ററി സംരക്ഷിക്കൽ\' സ്വമേധയാ ഓഫാകും."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിന്, പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്സിനെ ഡാറ്റ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്സസ്സ് ചെയ്യാൻ കഴിയും, എന്നാൽ കുറഞ്ഞ ആവൃത്തിയിലാണിത് നടക്കുക. ഇതിനർത്ഥം, നിങ്ങൾ ടാപ്പുചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ കാണിക്കുകയില്ല എന്നാണ്."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ഓണാക്കുക"</string>
@@ -1779,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"എല്ലാ ഭാഷകളും"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"എല്ലാ പ്രദേശങ്ങളും"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"തിരയുക"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"ഔദ്യോഗിക പ്രൊഫൈൽ ഓണാക്കണോ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"നിങ്ങളുടെ ഔദ്യോഗിക ആപ്പുകൾ, അറിയിപ്പുകൾ, ഡാറ്റ, മറ്റ് ഔദ്യോഗിക പ്രൊഫൈൽ ഫീച്ചറുകൾ എന്നിവ ഓണാക്കും"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ഓണാക്കുക"</string>
@@ -1868,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"കോളുകളും അറിയിപ്പുകളും മ്യൂട്ട് ചെയ്യപ്പെടും"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"സിസ്റ്റത്തിലെ മാറ്റങ്ങൾ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ശല്യപ്പെടുത്തരുത്"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"നിങ്ങളെ ഫോക്കസ് ചെയ്യാൻ സഹായിക്കുന്ന അറിയിപ്പുകളെ \'ശല്യപ്പെടുത്തരുത്\' അദൃശ്യമാക്കുന്നു"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ഇത് പുതിയ പ്രവർത്തനരീതിയാണ്. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"എന്തിനെയാണ് ബ്ലോക്ക് ചെയ്തതെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"സിസ്റ്റം"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 18c665d..263d971 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -236,7 +236,7 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Тэжээл хэмнэгч"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Батарей хэмнэгч"</string>
<string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Тэжээл хэмнэгч УНТРААЛТТАЙ байна"</string>
<string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Тэжээл хэмнэгч АСААЛТТАЙ байна"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string>
@@ -282,7 +282,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"Мессеж"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS мессежийг илгээх, харах"</string>
<string name="permgrouprequest_sms" msgid="7168124215838204719">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д SMS мессеж илгээх болон харахыг зөвшөөрөх үү?"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"Сан"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"Хадгалах сан"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"Tөхөөрөмж дээрх зураг, медиа болон файлд хандалт хийх"</string>
<string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д таны төхөөрөмжийн зураг, медиа болон файлд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Залгах"</string>
<string name="dial_desc" msgid="6573723404985517250">"Сонгосон утасны дугаар руу залгах"</string>
<string name="map" msgid="5441053548030107189">"Газрын зураг"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Сонгосон хаягийг байршуулах"</string>
<string name="browse" msgid="1245903488306147205">"Нээх"</string>
<string name="browse_desc" msgid="8220976549618935044">"Сонгосон URL-г нээх"</string>
<string name="sms" msgid="4560537514610063430">"Зурвас"</string>
@@ -1273,22 +1272,22 @@
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглахыг хүсэхгүй байгаа бол тохиргоог нээгээд, унтраана уу."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Унтраах"</string>
<string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>-г шалгаж байна…"</string>
- <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Одоогийн агуулгыг харж байна"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Одоогийн агуулгыг хянаж байна"</string>
<string name="ext_media_new_notification_title" msgid="1621805083736634077">"Шинэ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"Тохируулахын тулд товшино уу"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Зураг, медиа шилжүүлэхэд зориулсан"</string>
- <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>-р олгоно уу"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> алдаатай байна"</string>
<string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Засахын тулд товшино уу"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> эвдэрсэн байна. Засахын тулд сонгоно уу."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Дэмжээгүй <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Энэ төхөөрөмж нь <xliff:g id="NAME">%s</xliff:g>-г дэмждэггүй. Дэмжигдсэн хэлбэршүүлэлтэд тохируулахын тулд товшино уу."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Энэ төхөөрөмж <xliff:g id="NAME">%s</xliff:g>-г дэмждэггүй. Дэмжсэн хэлбэршүүлэлтэд тохируулахын тулд сонгоно уу."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ыг гэнэт гаргасан байна"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Агуулга алдахаас сэргийлэхийн тулд медиаг устгахаасаа өмнө салгана уу"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Агуулга алдахаас сэргийлэхийн тулд медиаг төхөөрөмжөөс салгахаасаа өмнө холболтыг салгана уу"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>-г устгасан"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Зарим функц зөв ажиллахгүй байж болзошгүй. Шинэ хадгалах сан оруулна уу."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>-г салгаж байна"</string>
- <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Бүү устга"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Бүү салга"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Тохируулах"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Салгах"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Судлах"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Таны админ суулгасан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Таны админ шинэчилсэн"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Таны админ устгасан"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Батерейны амийг уртасгахын тулд Батерей хэмнэгч таны төхөөрөмжийн гүйцэтгэлийг багасгаж, чичиргээ, байршлын үйлчилгээ болон цаана өгөгдлийг хязгаарлах буюу эсвэл унтраадаг. Синкээр ажилладаг имэйл, зурвас болон бусад аппыг нээхээс нааш шинэчлэх боломжгүй. \n\nТаны төхөөрөмжийг цэнэглэж байх үед Батерей хэмнэгч автоматаар унтарна."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь зарим апп-г өгөгдлийг дэвсгэрт илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч цөөн үйлдэл хийнэ. Жишээлбэл зураг харахын тулд та товших шаардлагатай болно."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Өгөгдөл хамгаалагчийг асаах уу?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Асаах"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Бүх хэл"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Бүх бүс нутаг"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Хайх"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Үйлдлийг зөвшөөрөөгүй"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> аппыг одоогоор цуцалсан байна"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Дэлгэрэнгүй мэдээлэл"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ажлын профайлыг асаах уу?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Таны ажлын апп, мэдэгдэл, өгөгдөл болон бусад ажлын профайлын онцлогийг асаана"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Асаах"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Дуудлага болон мэдэгдлийн дууг хаана"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системийн өөрчлөлт"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Бүү саад бол"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Бүү саад бол горим нь таныг төвлөрөхөд туслахын тулд мэдэгдлийг нууж байна"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Энэ нь шинэ төлөв юм. Өөрчлөхийн тулд товшино уу."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Бүү саад бол горимыг өөрчилсөн"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Блоклосон зүйлийг шалгахын тулд товшино уу."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index aa54aca4..1fad3b0 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"व्हॉइस सेवा नाही"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"व्हॉइस सेवा किंवा आणीबाणी कॉलिंग नाही"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"तुमच्या वाहकाने तात्पुरते बंद केले आहे"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g> सिमसाठी तुमच्या वाहकाने तात्पुरते बंद केले आहे"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"प्राधान्य दिलेले नेटवर्क बदलण्याचा प्रयत्न करा. बदलण्यासाठी टॅप करा."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आणीबाणी कॉलिंग अनुपलब्ध"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ओळखले नाही"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिंट ऑथेंटिकेट केली आहे"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फिंगरप्रिंट हार्डवेअर उपलब्ध नाही."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट स्टोअर केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट टाइमआउट झाले. पुन्हा प्रयत्न करा."</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"कॉल करा"</string>
<string name="dial_desc" msgid="6573723404985517250">"निवडलेल्या फोन नंबरवर कॉल करा"</string>
<string name="map" msgid="5441053548030107189">"नकाशा"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"निवडलेला पत्ता शोधा"</string>
<string name="browse" msgid="1245903488306147205">"उघडा"</string>
<string name="browse_desc" msgid="8220976549618935044">"निवडलेली URL उघडा"</string>
<string name="sms" msgid="4560537514610063430">"संदेश"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अॅप्सवर प्रदर्शित करत आहे"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपण इच्छित असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करा"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> तपासत आहे…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"सध्याच्या आशयाचे पुनरावलोकन करत आहे"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"नवीन <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"सेट करण्यासाठी टॅप करा"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फोटो आणि मीडिया स्थानांतरित करण्यासाठी"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> सह समस्या"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"दुरुस्त करण्यासाठी टॅप करा"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> दूषित आहे. निश्चित करण्यासाठी निवडा."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> असमर्थित"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी टॅप करा."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला सपोर्ट करत नाही. सपोर्ट असलेल्या फॉरमॅटमध्ये सेट करण्यासाठी निवडा."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अनपेक्षितरित्या काढले"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"आशय गमावणे टाळण्यासाठी काढून टाकण्यापूर्वी मीडिया इजेक्ट करा"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> काढून टाकले आहे."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"काही कार्यक्षमता कदाचीत योग्यरित्या कार्य करू करणार नाहीत. नवीन स्टोरेज घाला."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> बाहेर काढत आहे"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"काढू नका"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"सेट करा"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"बाहेर काढा"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करा"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गहाळ आहे"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"डिव्हाइस पुन्हा घाला"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> हलवित आहे"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"डेटा हलवित आहे"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"आशय ट्रांसफर झाला आहे"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"<xliff:g id="NAME">%s</xliff:g> वर आशय हलवला आहे"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"आशय हलवू शकलो नाही"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"पुन्हा आशय हलवून पहा"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"काढले"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"बाहेर काढले"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"तपासत आहे..."</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपल्या प्रशासकाने इंस्टॉल केले"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपल्या प्रशासकाने अपडेट केले"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपल्या प्रशासकाने हटवले"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"बॅटरीचे आयुष्य वाढवण्यासाठी, बॅटरी बचतकर्ता तुमच्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अॅप्स तुम्ही उघडल्याशिवाय अपडेट होऊ शकत नाहीत.\n\nतुमचे डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा प्राप्त करण्यास प्रतिबंधित करतो. आपण सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, आपण इमेज टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचतकर्ता चालू करायचा?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करा"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"सर्व भाषा"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"सर्व प्रदेश"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"शोध"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफाइल चालू ठेवायची?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"तुमची कार्य अॅप्स, सूचना, डेटा आणि अन्य कार्य प्रोफाइल वैशिष्ट्ये चालू केली जातील"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करा"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"सिममध्ये व्हॉइसची तरतूद नाही"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"व्हॉइसची सिमला अनुमती नाही"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"व्हॉइसची फोनला अनुमती नाही"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> सिमला अनुमती नाही"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> सिमची तरतूद केलेली नाही"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> सिमला अनुमती नाही"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> सिमला अनुमती नाही"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"अॅपची आवृत्ती डाउनग्रेड केली, किंवा ती या शॉर्टकटशी कंपॅटिबल नाही"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कॉल आणि सूचना म्युट केल्या जातील"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम बदल"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"व्यत्यय आणू नका"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"तुम्हाला लक्ष केंद्रित करण्यात मदत करण्यासाठी व्यत्यय आणू नका सूचना लपवत आहे"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"हे नवीन वर्तन आहे. बदलण्यासाठी टॅप करा."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"व्यत्यय आणू नका बदलले आहे"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"काय ब्लॉक केले आहे हे तपासण्यासाठी टॅप करा."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"सिस्टम"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e015daf..67015f3 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Panggil"</string>
<string name="dial_desc" msgid="6573723404985517250">"Panggil nombor telefon yang dipilih"</string>
<string name="map" msgid="5441053548030107189">"Peta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Cari alamat yang dipilih"</string>
<string name="browse" msgid="1245903488306147205">"Buka"</string>
<string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
<string name="sms" msgid="4560537514610063430">"Mesej"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Dipasang oleh pentadbir anda"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Dikemas kini oleh pentadbir anda"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dipadamkan oleh pentadbir anda"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Untuk melanjutkan hayat bateri, Penjimat Bateri mengurangkan prestasi peranti anda dan mengehadkan atau mematikan getaran, perkhidmatan lokasi dan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung pada penyegerakan mungkin tidak dikemas kini, melainkan anda membuka apl itu.\n\nPenjimat Bateri dimatikan secara automatik apabila peranti anda sedang dicas."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Hidupkan Penjimat Data?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Hidupkan"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Semua rantau"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Cari"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Tindakan tidak dibenarkan"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Pada masa ini, aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> dilumpuhkan."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Butiran lanjut"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Hidupkan profil kerja?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Apl kerja, pemberitahuan, data dan ciri profil kerja anda yang lain akan dihidupkan"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Hidupkan"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Panggilan dan pemberitahuan akan diredamkan"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Jangan Ganggu"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Jangan Ganggu menyembunyikan pemberitahuan untuk membantu anda menumpukan perhatian"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ini merupakan gelagat baharu. Ketik untuk menukar."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Ketik untuk menyemak item yang disekat."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index e802f0c..d2919e8 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -220,7 +220,7 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း"</string>
<string name="global_action_logout" msgid="935179188218826050">"သတ်မှတ်ပေးထားသည့်အချိန် ပြီးဆုံးပြီ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းအား ယူရန်"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"ချွတ်ယွင်းမှုမှတ်တမ်း ယူခြင်း"</string>
<string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"လက်ငင်းတုံ့ပြန်နိုင်သည့် အစီရင်ခံချက်"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"အခြေအနေတော်တော်များများတွင် ၎င်းကိုအသုံးပြုပါ။ ၎င်းသည် အစီရင်ခံစာကို မှတ်သားခြင်း၊ ပြဿနာအကြောင်း နောက်ထပ်အသေးစိတ်များကို ထည့်သွင်းခြင်းနှင့် မျက်နှာပြင်ပုံဖမ်းယူခြင်းတို့ကို ပြုလုပ်ခွင့်ပေးပါသည်။ ပေးပို့ရန် အလွန်ကြာပြီး အသုံးပြုခြင်းနည်းပါးသည့်အပိုင်းကို ၎င်းက ချန်ခဲ့နိုင်ပါသည်။"</string>
@@ -497,7 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"အသိအမှတ်မပြုပါ"</string>
- <string name="fingerprint_authenticated" msgid="5309333983002526448">"လက်ဗွေကို အထောက်အထားစိစစ်ပြီးပါပြီ"</string>
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"လက်ဗွေကို အထောက်အထား စိစစ်ပြီးပါပြီ"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လက်ဗွေရာ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"လက်ဗွေရာ သိုလှောင်၍မရပါ။ ကျေးဇူးပြု၍ ရှိပြီးလက်ဗွေရာအား ဖယ်ရှားပါ။"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ခေါ်ဆိုရန်"</string>
<string name="dial_desc" msgid="6573723404985517250">"ရွေးထားသည့် ဖုန်းနံပါတ်ကို ခေါ်ရန်"</string>
<string name="map" msgid="5441053548030107189">"မြေပုံ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"ရွေးထားသည့် လိပ်စာကို ရှာဖွေရန်"</string>
<string name="browse" msgid="1245903488306147205">"ဖွင့်ရန်"</string>
<string name="browse_desc" msgid="8220976549618935044">"ရွေးထားသည့် URL ကို ဖွင့်ရန်"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
@@ -1654,7 +1653,7 @@
<string name="mediasize_unknown_landscape" msgid="4876995327029361552">"အလျားလိုက် အရွယ်မသိ"</string>
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ဖျက်သိမ်းလိုက်ပြီး"</string>
<string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"အချက်အလက်များ ရိုက်ကူးစဉ် အမှားပေါ်နေ"</string>
- <string name="reason_unknown" msgid="6048913880184628119">"အကြောင်းအရာ မသိရှိပါ"</string>
+ <string name="reason_unknown" msgid="6048913880184628119">"မသိပါ"</string>
<string name="reason_service_unavailable" msgid="7824008732243903268">"စာထုတ်သောဆားဗစ်အားဖွင့်မထားပါ"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> ဆားဗစ် ထည့်သွင်းပြီး"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"ထိတို့ခြင်းဖြင့် ဖွင့်ပါ"</string>
@@ -1692,7 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"သင်၏ စီမံခန့်ခွဲသူက ထည့်သွင်းထားသည်"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ဘက်ထရီသက်တမ်း တိုးရန် \'ဘက်ထရီအားထိန်း\' သည် သင့်စက်ပစ္စည်း၏ စွမ်းဆောင်ရည်ကို လျှော့ချပေးပြီး တုန်ခါမှု၊ တည်နေရာ ဝန်ဆောင်မှုများနှင့် နောက်ခံဒေတာများကို ကန့်သတ်ခြင်း သို့မဟုတ် ပိတ်ခြင်းများ ပြုလုပ်ပေးပါသည်။ စင့်ခ်လုပ်ခြင်းအပေါ် အားထားနေရသည့် အီးမေးလ်၊ မက်ဆေ့ဂျ်ပို့ခြင်းနှင့် အခြားအက်ပ်များကို သင်မဖွင့်လျှင် အပ်ဒိတ်ဖြစ်တော့မည် မဟုတ်ပါ။\n\nသင့်စက်ပစ္စည်းကို အားသွင်းနေသည့်အခါ \'ဘက်ထရီအားထိန်း\' ကို အလိုအလျောက် ပိတ်သွားပါမည်။"</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"ဘက်ထရီသက်တမ်း တိုးလာစေရန် \'ဘက်ထရီအားထိန်း\' သည် အချို့သော စက်ပစ္စည်းဝန်ဆောင်မှုများကို ပိတ်ပြီး အက်ပ်များကို ကန့်သတ်ပေးပါသည်။"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ဒေတာအသုံးလျှော့ချနိုင်ရန် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမရှိစေရန် ဒေတာချွေတာမှုစနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင် မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ဖွင့်ပါ"</string>
@@ -1779,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ဘာသာစကားများအားလုံး"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ဒေသအားလုံး"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ရှာဖွေရန်"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"လုပ်ဆောင်ချက်ကို ခွင့်မပြုပါ"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> အပလီကေးရှင်းကို လက်ရှိ ပိတ်ထားပါသည်။"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"နောက်ထပ် အသေးစိတ်များ"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"အလုပ်ပရိုဖိုင် ဖွင့်လိုသလား။"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"သင်၏ အလုပ်အက်ပ်၊ အကြောင်းကြားချက်၊ ဒေတာနှင့် အခြားအလုပ်ပရိုဖိုင် ဝန်ဆောင်မှုများကို ဖွင့်လိုက်ပါမည်"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ဖွင့်ပါ"</string>
@@ -1868,8 +1870,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များကို အသံပိတ်ထားပါမည်"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"စနစ် အပြောင်းအလဲများ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"မနှောင့်ယှက်ရ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"သင်အာရုံစိုက်နိုင်စေရန် \'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"၎င်းသည် အမူအကျင့်အသစ်ဖြစ်သည်။ ပြောင်းရန် တို့ပါ။"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"အသစ်− \'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"ပိုမိုလေ့လာရန်နှင့် ပြောင်းလဲရန် တို့ပါ။"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ပိတ်ထားသည့်အရာများကို ကြည့်ရန် တို့ပါ။"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"စနစ်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 1bdcd73..10431bf 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Ring"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ring det valgte telefonnummeret"</string>
<string name="map" msgid="5441053548030107189">"Kart"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Finn den valgte adressen"</string>
<string name="browse" msgid="1245903488306147205">"Åpne"</string>
<string name="browse_desc" msgid="8220976549618935044">"Åpne den valgte nettadressen"</string>
<string name="sms" msgid="4560537514610063430">"Melding"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installert av administratoren din"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Oppdatert av administratoren din"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet av administratoren din"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Med Batterisparing reduseres enhetens ytelse, og vibrering, posisjonstjenester og bakgrunnsdata begrenses eller slås av. Apper for e-post, meldinger og andre funksjoner som er avhengige av synkronisering, oppdateres kanskje ikke med mindre du åpner dem.\n\nBatterisparing slås av automatisk når enheten lades."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Datasparing hindrer at apper kan sende og motta data i bakgrunnen. Apper du bruker i øyeblikket, bruker ikke data i like stor grad – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå på"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle språk"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Søk"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Handlingen er ikke tillatt"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Appen <xliff:g id="APP_NAME">%1$s</xliff:g> er deaktivert for øyeblikket."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mer informasjon"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Vil du slå på jobbprofilen?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Jobbappene dine samt varsler, data og andre funksjoner i jobbprofilen din blir slått på"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Slå på"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Anrop og varsler er lydløse"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemendringer"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ikke forstyrr"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«Ikke forstyrr» skjuler varsler for å gjøre det enklere å fokusere"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dette er ny atferd. Trykk for å endre."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ikke forstyrr er endret"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Trykk for å sjekke hva som er blokkert."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index e4354dd..11914e6 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"कल"</string>
<string name="dial_desc" msgid="6573723404985517250">"चयन गरिएको फोन नम्बरमा कल गर्नुहोस्"</string>
<string name="map" msgid="5441053548030107189">"नक्सा"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"चयन गरिएको ठेगाना पत्ता लगाउनुहोस्"</string>
<string name="browse" msgid="1245903488306147205">"खोल्नुहोस्"</string>
<string name="browse_desc" msgid="8220976549618935044">"चयन गरिएको URL खोल्नुहोस्"</string>
<string name="sms" msgid="4560537514610063430">"सन्देश"</string>
@@ -1697,7 +1696,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"तपाईंका प्रशासकले स्थापना गर्नुभएको"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"तपाईंका प्रशासकले मेट्नुभएको"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ब्याट्री सेभरले ब्याट्रीको आयु लम्ब्याउनका लागि तपाईंको यन्त्रको कार्यसम्पादन घटाउनुका साथै कम्पन, स्थानसम्बन्धी सेवा र पृष्ठभूमिको डेटालाई सीमित वा निष्क्रिय पार्छ। इमेल, सन्देश प्रवाह तथा सिंक प्रक्रियामा निर्भर अन्य अनुप्रयोगहरू तपाईंले खोल्नुभएको अवस्थामाबाहेक स्वतः अद्यावधिक नहुन सक्छन्।\n\nतपाईंको यन्त्र चार्ज हुन थालेपछि ब्याट्री सेभर स्वतः निष्क्रिय हुन्छ।"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटाको प्रयोगलाई कम गर्नमा मद्दतका लागि डेटा सर्भरले केही अनुप्रयोगहरूलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्नबाट रोक्दछ। तपाईँले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटामाथि पहुँच राख्न सक्छ, तर त्यसले यो काम थोरै पटक गर्न सक्छ। उदाहरणका लागि यसको मतलब यो हुन सक्छ: तपाईँले छविहरूलाई ट्याप नगरेसम्म ती प्रदर्शन हुँदैनन्।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा सेभरलाई सक्रिय गर्ने हो?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"सक्रिय गर्नुहोस्"</string>
@@ -1784,6 +1784,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"सम्पूर्ण भाषाहरू"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"सबै क्षेत्रहरू"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"खोज"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफाइल सक्रिय गर्ने?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"तपाईंका कार्यसम्बन्धी अनुप्रयोग, सूचना, डेटा र कार्य प्रोफाइलका अन्य सुविधाहरू सक्रिय गरिने छन्"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"सक्रिय गर्नुहोस्"</string>
@@ -1873,8 +1879,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कल तथा सूचनाहरूलाई म्युट गरिने छ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"प्रणालीसम्बन्धी परिवर्तनहरू"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"बाधा नपुऱ्याउनुहोस्"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"तपाईंलाई ध्यान केन्द्रित गर्नमा मद्दत गर्नाका लागि बाधा नपुर्याउनुहोस् मोडले सूचनाहरू लुकाइरहेको छ"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यो नयाँ व्यवहार हो। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"बाधा नपुर्याउनुहोस् मोड परिवर्तन भएको छ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"रोक लगाइएका कुराहरू जाँच गर्न ट्याप गर्नुहोस्।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"प्रणाली"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index ddd4111..9131f58 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -287,7 +287,7 @@
<string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot foto\'s, media en bestanden op je apparaat?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfoon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"audio opnemen"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om audio op te nemen?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> het volgende toestaan: audio opnemen."</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s maken en video opnemen"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toestaan om foto\'s te maken en video op te nemen?"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Bellen"</string>
<string name="dial_desc" msgid="6573723404985517250">"Geselecteerd telefoonnummer bellen"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Geselecteerde adres zoeken"</string>
<string name="browse" msgid="1245903488306147205">"Openen"</string>
<string name="browse_desc" msgid="8220976549618935044">"Geselecteerde URL openen"</string>
<string name="sms" msgid="4560537514610063430">"Bericht"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleerd door je beheerder"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Geüpdatet door je beheerder"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Verwijderd door je beheerder"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Batterijbesparing verlengt de batterijduur door de prestaties van je apparaat te verlagen en de trilfunctie, locatieservices en achtergrondgegevens te beperken of uit te schakelen. E-mail, berichten en andere apps die afhankelijk zijn van synchronisatie, worden niet geüpdatet (tenzij je ze opent).\n\nBatterijbesparing wordt automatisch uitgeschakeld wanneer je apparaat wordt opgeladen."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Databesparing inschakelen?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Inschakelen"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle talen"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle regio\'s"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Zoeken"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Actie niet toegestaan"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"De app <xliff:g id="APP_NAME">%1$s</xliff:g> is momenteel uitgeschakeld."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Meer details"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Werkprofiel inschakelen?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Je werk-apps, meldingen, gegevens en andere functies van je werkprofiel worden uitgeschakeld"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Inschakelen"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Oproepen en meldingen zijn gedempt"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systeemwijzigingen"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Niet storen"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\'Niet storen\' verbergt meldingen zodat je je kunt concentreren"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dit is nieuw gedrag. Tik om te wijzigen."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'Niet storen\' is gewijzigd"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tik om te controleren wat er is geblokkeerd."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Systeem"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index b660c20..a4f8766 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"କୌଣସି ଭଏସ୍ ସେବା ନାହିଁ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"କୌଣସି ଭଏସ୍ ସେବା କିମ୍ବା ଜରୁରୀକାଳୀନ କଲିଙ୍ଗ ନାହିଁ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ଆପଣଙ୍କ କେରିଅର୍ଙ୍କ ଦ୍ୱାରା ଅସ୍ଥାୟୀ ରୂପେ ବନ୍ଦ କରାଯାଇଛି"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ପାଇଁ ଆପଣଙ୍କ କେରିଅର୍ ଦ୍ୱାରା ଅସ୍ଥାୟୀ ରୂପେ ବନ୍ଦ କରାଯାଇଛି"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ମିଳୁନାହିଁ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ନିଜ ପସନ୍ଦର ନେଟ୍ୱର୍କକୁ ଯିବାପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ଚିହ୍ନଟ ହେଲା ନାହିଁ"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ପ୍ରମାଣୀକୃତ ହେଲା"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି ପୂର୍ବରୁ ଥିବା ଆଙ୍ଗୁଠି ଚିହ୍ନକୁ ବାହାର କରିଦିଅନ୍ତୁ।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ଆଙ୍ଗୁଠି ଚିହ୍ନର ସମୟ ଶେଷ ହେଲା । ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
@@ -1015,10 +1013,8 @@
<string name="email_desc" msgid="3638665569546416795">"ବାଛି ନେଇଥିବା ଠିକଣାରେ ଇମେଲ୍ ପଠାନ୍ତୁ"</string>
<string name="dial" msgid="1253998302767701559">"କଲ୍ କରନ୍ତୁ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ବାଛି ନେଇଥିବା ଫୋନ୍ ନମ୍ବର୍ରେ କଲ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for map (5441053548030107189) -->
- <skip />
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map" msgid="5441053548030107189">"ମାନଚିତ୍ର"</string>
+ <string name="map_desc" msgid="1836995341943772348">"ଚୟନିତ ଠିକଣାକୁ ଖୋଜନ୍ତୁ"</string>
<string name="browse" msgid="1245903488306147205">"ଖୋଲନ୍ତୁ"</string>
<string name="browse_desc" msgid="8220976549618935044">"ବାଛି ନେଇଥିବା URL ଖୋଲନ୍ତୁ"</string>
<string name="sms" msgid="4560537514610063430">"ମେସେଜ୍"</string>
@@ -1275,49 +1271,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ଅନ୍ୟ ଆପ୍ ଉପରେ ଦେଖାଯାଉଛି"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ଏହି ବୈଶିଷ୍ଟ୍ୟ <xliff:g id="NAME">%s</xliff:g> ବ୍ୟବହାର ନକରିବାକୁ ଯଦି ଆପଣ ଚାହାଁନ୍ତି, ସେଟିଙ୍ଗ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଏହା ଅଫ୍ କରିଦିଅନ୍ତୁ।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>ର ଯାଞ୍ଚ କରାଯାଉଛି…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ସାମ୍ପ୍ରତିକ କଣ୍ଟେଣ୍ଟର ଯାଞ୍ଚ କରାଯାଉଛି"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"ନୂଆ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ସେଟଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ଫଟୋ ଓ ମିଡିଆ ସ୍ଥାନାନ୍ତର କରାଯିବା ପାଇଁ"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> ସହ ସମସ୍ୟା"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ଠିକ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ଖରାପ ହୋଇଯାଇଛି। ଠିକ୍ କରିବାକୁ ଚୟନ କରନ୍ତୁ।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> ସପୋର୍ଟ କରୁନାହିଁ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟ୍ରେ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ଏହି ଡିଭାଇସ୍ ଏହି <xliff:g id="NAME">%s</xliff:g>କୁ ସପୋର୍ଟ କରେ ନାହିଁ। ଗୋଟିଏ ସପୋର୍ଟ କରୁଥିବା ଫର୍ମାଟରେ ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>କୁ ହଠାତ୍ କାଢ଼ିଦିଆଗଲା"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"କଣ୍ଟେଣ୍ତ ହରାଇବାକୁ ଏଡ଼ାଇବା ପାଇଁ କାଢ଼ିବା ପୂର୍ବରୁ ମିଡିଆକୁ ଇଜେକ୍ଟ କରନ୍ତୁ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>କୁ କାଢ଼ିଦିଆଗଲା"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"କିଛି କାର୍ଯ୍ୟକ୍ଷମତା ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ। ନୂଆ ଷ୍ଟୋରେଜ୍ ଭର୍ତ୍ତି କରନ୍ତୁ।"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>କୁ ଇଜେକ୍ଟ କରାଯାଉଛି"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"କାଢ଼ନ୍ତୁ ନାହିଁ"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ବାହାର କରନ୍ତୁ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ଖୋଜନ୍ତୁ"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ନାହିଁ"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"ଡିଭାଇସ୍କୁ ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ନିଆଯାଉଛି"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ଡାଟା ନିଆଯାଉଛି"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"କଣ୍ଟେଣ୍ଟ ସ୍ଥାନାନ୍ତର ହୋଇଗଲା"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"କଣ୍ଟେଣ୍ଟକୁ <xliff:g id="NAME">%s</xliff:g>କୁ ନିଆଗଲା"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"କଣ୍ଟେଣ୍ଟକୁ ନେଇହେବ ନାହିଁ"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"କଣ୍ଟେଣ୍ଟକୁ ପୁଣିଥରେ ନେବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ବାହାର କରିଦିଆଗଲା"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ବାହାର କରାଗଲା"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string>
@@ -1709,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ଆପଣଙ୍କ ଆଡମିନ୍ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ଆପଣଙ୍କ ଆଡମିନ୍ ଅପଡେଟ୍ କରିଛନ୍ତି"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ଆପଣଙ୍କ ଆଡମିନ୍ ଡିଲିଟ୍ କରିଛନ୍ତି"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ବ୍ୟାଟେରୀ ଜୀବନକୁ ବଢ଼ାଇବା ପାଇଁ, ବ୍ୟାଟେରୀ ସେଭର୍ ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ କେବଳ ଜରୁରୀ ଆପ୍ଗୁଡ଼ିକୁ କାର୍ଯ୍ୟକ୍ଷମ ରଖିଥାଏ। ଏହି ସୁବିଧା ଚାଲୁ ହେବା ଦ୍ଵାରା ଭାଇବ୍ରେଶନ୍, ଅବସ୍ଥିତି ସେବା ଓ ବ୍ୟାକଗ୍ରାଉଣ୍ଡ ଡାଟାର ବ୍ୟବହାର କମ୍ କିମ୍ବା ବନ୍ଦ ହୋଇଯାଏ। ଇମେଲ୍, ମେସେଜିଙ୍ଗ ଓ ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ, ଯାହା ସିଙ୍କ ଉପରେ ନିର୍ଭର କରିଥା’ନ୍ତି, ସେଗୁଡ଼ିକୁ ନଖୋଲିବା ପର୍ଯ୍ୟନ୍ତ ଅପଡେଟ୍ ହେବେନାହିଁ। \n\n ଆପଣଙ୍କ ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଥିବାବେଳେ ବ୍ୟାଟେରୀ ସେଭର୍ ସ୍ଵଚାଳିତ ଭାବେ ବନ୍ଦ ହୋଇଯାଇଥାଏ।"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବ୍ଲକ୍ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ସମୟରେ କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ, ଯେପରି, ଆପଣ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଯେଉଁ ଇମେଜ୍ ଦେଖାଯାଏ ନାହିଁ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ଡାଟା ସେଭର୍ ଅନ୍ କରିବେ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ଅନ୍ କରନ୍ତୁ"</string>
@@ -1796,6 +1778,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ସମସ୍ତ ଭାଷା"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ସମସ୍ତ ଅଞ୍ଚଳ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"ୱର୍କ ପ୍ରୋଫାଇଲ୍କୁ ଚାଲୁ କରିବେ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ଆପଣଙ୍କର କାର୍ଯ୍ୟକାରୀ ଆପ୍, ବିଜ୍ଞପ୍ତି, ଡାଟା ଓ ଅନ୍ୟ ୱର୍କ ପ୍ରୋଫାଇଲ୍ଗୁଡ଼ିକ ଚାଲୁ ହୋଇଯିବ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ଅନ୍ କରନ୍ତୁ"</string>
@@ -1865,14 +1853,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM କାର୍ଡକୁ ଭଏସ୍ ପାଇଁ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM କାର୍ଡକୁ ଭଏସ୍ ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ଫୋନକୁ ଭଏସ୍ ପାଇଁ ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>ର ଅନୁମତି ନାହିଁ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>ର ପ୍ରାବଧାନ ନାହିଁ"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>ର ଅନୁମତି ନାହିଁ"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>ର ଅନୁମତି ନାହିଁ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ପପ-ଅପ୍ ୱିଣ୍ଡୋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ଆପ୍ ଭର୍ସନ୍ ପୁରୁଣା ହୋଇଯାଇଛି କିମ୍ବା ଏହି ଶର୍ଟକଟ୍ ସହିତ କାମ କରୁନାହିଁ।"</string>
@@ -1889,8 +1873,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିଃଶବ୍ଦ କରିଦିଆଯିବ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ସିଷ୍ଟମ୍ରେ ପରିବର୍ତ୍ତନ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ଆପଣଙ୍କ ଧ୍ୟାନକୁ ଲଗାଇ ରଖିବା ପାଇଁ, ’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଲୁଚାଇଦେଉଛି"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ଏହା ନୂତନ କାର୍ଯ୍ୟକଳାପ ଅଟେ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ସିଷ୍ଟମ୍"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6e429a5..eb4a6dd 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ਕੋਈ ਆਵਾਜ਼ੀ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ਕੋਈ ਅਵਾਜ਼ੀ ਸੇਵਾ ਜਾਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਨਹੀਂ"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਬੰਦ ਹੈ"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ਸਿਮ <xliff:g id="SIMNUMBER">%d</xliff:g> ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਬੰਦ ਹੈ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੌਜੂਦਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਟਾਓ।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"ਕਾਲ ਕਰੋ"</string>
<string name="dial_desc" msgid="6573723404985517250">"ਚੁਣੇ ਗਏ ਫ਼ੋਨ ਨੰਬਰ \'ਤੇ ਕਾਲ ਕਰੋ"</string>
<string name="map" msgid="5441053548030107189">"ਨਕਸ਼ਾ ਖੋਲ੍ਹੋ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"ਚੁਣਿਆ ਗਿਆ ਪਤਾ ਨਕਸ਼ੇ \'ਤੇ ਦਿਖਾਓ"</string>
<string name="browse" msgid="1245903488306147205">"ਖੋਲ੍ਹੋ"</string>
<string name="browse_desc" msgid="8220976549618935044">"ਚੁਣਿਆ ਗਿਆ URL ਖੋਲ੍ਹੋ"</string>
<string name="sms" msgid="4560537514610063430">"ਸੁਨੇਹਾ ਭੇਜੋ"</string>
@@ -1035,7 +1032,7 @@
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"ਹੋਰ ਜਾਣਕਾਰੀ ਜਾਂ ਐਪ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="ok" msgid="5970060430562524910">"ਠੀਕ"</string>
+ <string name="ok" msgid="5970060430562524910">"ਠੀਕ ਹੈ"</string>
<string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
<string name="yes" msgid="5362982303337969312">"ਠੀਕ"</string>
<string name="no" msgid="5141531044935541497">"ਰੱਦ ਕਰੋ"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ਬੰਦ ਕਰੋ"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ਵਰਤਮਾਨ ਸਮੱਗਰੀ ਦੀ ਸਮੀਖਿਆ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"ਨਵਾਂ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਲਈ"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ਠੀਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ਖਰਾਬ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ਅਸਮਰਥਿਤ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫਾਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਚੁਣੋ।"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਅਚਨਚੇਤ ਹਟਾਇਆ ਗਿਆ"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ਸਮੱਗਰੀ ਗੁਆਉਣ ਤੋਂ ਬਚਣ ਲਈ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਮੀਡੀਆ ਕੱਢੋ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਹਟਾਇਆ ਗਿਆ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ਸ਼ਾਇਦ ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ। ਨਵੀਂ ਸਟੋਰੇਜ ਸ਼ਾਮਲ ਕਰੋ।"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਬਾਹਰ ਕੱਢਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ਨਾ ਹਟਾਓ"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ਬਾਹਰ ਕੱਢੋ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ਐਕਸਪਲੋਰ ਕਰੋ"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ਲਾਪਤਾ"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"ਦੁਬਾਰਾ ਡੀਵਾਈਸ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">" ਡਾਟਾ ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"ਸਮੱਗਰੀ ਟ੍ਰਾਂਸਫ਼ਰ ਪੂਰਾ ਹੋਇਆ"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"ਸਮੱਗਰੀ <xliff:g id="NAME">%s</xliff:g> ਵਿੱਚ ਲਿਜਾਈ ਗਈ"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ਸਮੱਗਰੀ ਲਿਜਾਈ ਨਹੀਂ ਜਾ ਸਕੀ"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ਦੁਬਾਰਾ ਸਮੱਗਰੀ ਲਿਜਾ ਕੇ ਦੇਖੋ"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ਹਟਾਏ ਗਏ"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"ਹਟਾਇਆ ਗਿਆ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ..."</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"ਬੈਟਰੀ ਲਾਈਫ਼ ਨੂੰ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਦਰਸ਼ਨ ਘਟਾਉਂਦਾ ਹੈ ਅਤੇ ਥਰਥਰਾਹਟ, ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਨੂੰ ਸੀਮਤ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ। ਈਮੇਲ, ਸੁਨੇਹਾ ਭੇਜਣੇ ਵਾਲੀਆਂ ਐਪਾਂ ਅਤੇ ਹੋਰ ਐਪਾਂ, ਜੋ ਸਮਕਾਲੀਕਰਨ \'ਤੇ ਨਿਰਭਰ ਹਨ, ਉਹ ਉਦੋਂ ਤੱਕ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਖੋਲ੍ਹਦੇ ਨਹੀਂ।\n\nਬੈਟਰੀ ਸੇਵਰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੁੰਦਾ ਹੈ।"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ਚਾਲੂ ਕਰੋ"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ਸਾਰੇ ਖੇਤਰ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜੋ"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"ਕੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਚਾਲੂ ਕਰਨੀ ਹੈ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ਤੁਹਾਡੀਆਂ ਕਾਰਜ-ਸਥਾਨ ਐਪਾਂ, ਸੂਚਨਾਵਾਂ, ਡਾਟਾ ਅਤੇ ਹੋਰ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਚਾਲੂ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ਚਾਲੂ ਕਰੋ"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ਸਿਮ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਕਰਨ ਦੀ ਵਿਵਸਥਾ ਨਹੀਂ ਹੈ"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"ਸਿਮ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ਫ਼ੋਨ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"ਸਿਮ <xliff:g id="SIMNUMBER">%d</xliff:g> ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ਸਿਮ <xliff:g id="SIMNUMBER">%d</xliff:g> ਦੀ ਵਿਵਸਥਾ ਨਹੀਂ ਹੈ"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"ਸਿਮ <xliff:g id="SIMNUMBER">%d</xliff:g> ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"ਸਿਮ <xliff:g id="SIMNUMBER">%d</xliff:g> ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ਪੌਪਅੱਪ ਵਿੰਡੋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ਐਪ ਦਾ ਵਰਜਨ ਡਾਊਨਗ੍ਰੇਡ ਕੀਤਾ ਗਿਆ, ਜਾਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਮਿਊਟ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ਸਿਸਟਮ ਬਦਲਾਅ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ਧਿਆਨ ਲਗਾਉਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਨ ਲਈ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਮੋਡ ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾ ਰਿਹਾ ਹੈ"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ਇਹ ਨਵਾਂ ਵਤੀਰਾ ਹੈ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ਟੈਪ ਕਰਕੇ ਦੋਖੋ ਕਿ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ਸਿਸਟਮ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 343d8b8..74f6e0c 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Zadzwoń"</string>
<string name="dial_desc" msgid="6573723404985517250">"Zadzwoń pod wybrany numer telefonu"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Pokaż wybrany adres na mapie"</string>
<string name="browse" msgid="1245903488306147205">"Otwórz"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otwórz wybrany adres URL"</string>
<string name="sms" msgid="4560537514610063430">"Wyślij SMS-a"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Zainstalowany przez administratora"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Zaktualizowany przez administratora"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Usunięty przez administratora"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza bądź wyłącza wibracje, usługi lokalizacyjne i przetwarzanie danych w tle. Poczta e-mail, SMS-y i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Włączyć Oszczędzanie danych?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Włącz"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Wszystkie języki"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Wszystkie kraje"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Szukaj"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Niedozwolona czynność"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> jest obecnie zablokowana."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Więcej szczegółów"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Włączyć profil służbowy?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Aplikacje do pracy, powiadomienia, dane i inne funkcje profilu do pracy zostaną włączone"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Włącz"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Wyciszenie połączeń i powiadomień"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmiany w systemie"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nie przeszkadzać"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"W trybie Nie przeszkadzać powiadomienia są ukrywane, by Cię nie rozpraszać"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"To nowe działanie. Kliknij, by zmienić."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Zmiany w trybie Nie przeszkadzać"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Kliknij, by sprawdzić, co jest zablokowane."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 36ba740..b5cdf98 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Ligar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizar endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita ou desativa a vibração, os serviços de localização e os dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização só podem ser atualizados se estão abertos.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"A Economia de bateria desativa alguns recursos do dispositivo e restringe apps para aumentar a duração da bateria."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas as regiões"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Ação não permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está desativado no momento."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mais detalhes"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Seus apps, notificações, dados e outros recursos do perfil de trabalho serão ativados"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não perturbe"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo \"Não perturbe\" está ocultando notificações para ajudar você a se concentrar"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novo: o modo Não perturbe está ocultando as notificações"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Toque para saber mais e fazer alterações."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index b6e2e57..96ef820 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Telefonar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Telefonar para o número de telefone selecionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizar o endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abrir o URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
@@ -1286,7 +1285,7 @@
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
<string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ejete o armazenamento multimédia antes de o remover para evitar a perda de conteúdos."</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Algumas funcionalidades podem não funcionar corretamente. Insira um novo armazenamento."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Algumas funcionalidades podem não funcionar corretamente. Insira um novo dispositivo de armazenamento."</string>
<string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"A ejetar <xliff:g id="NAME">%s</xliff:g>…"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Não remova."</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu gestor"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu gestor"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado pelo seu gestor"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para prolongar a autonomia da bateria, a Poupança de bateria reduz o desempenho do dispositivo e limita ou desativa a vibração, os serviços de localização e os dados de segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização podem não ser atualizados, exceto se os abrir.\n\nA Poupança de bateria desliga-se automaticamente quando o dispositivo está a carregar."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Para prolongar a autonomia da bateria, a Poupança de bateria desativa algumas funcionalidades do dispositivo e restringe aplicações."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada aplicação que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas as regiões"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Ação não permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"A aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> está atualmente desativada."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mais detalhes"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"As aplicações de trabalho, as notificações, os dados e outras funcionalidades do perfil de trabalho serão desativados"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string>
@@ -1848,7 +1850,7 @@
<string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM não permitido para voz"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telemóvel não permitido para voz"</string>
<string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
- <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não aprovisionado"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não fornecido"</string>
<string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
<string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"É desativado o som das chamadas e das notificações."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações ao sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não incomodar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Para se concentrar, o modo Não incomodar está a ocultar as notificações"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um comportamento novo. Toque para alterar."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novo: o modo Não incomodar está a ocultar as notificações"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Toque para saber mais e alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Não incomodar foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 36ba740..b5cdf98 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Ligar"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizar endereço selecionado"</string>
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
<string name="sms" msgid="4560537514610063430">"Mensagem"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita ou desativa a vibração, os serviços de localização e os dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização só podem ser atualizados se estão abertos.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"A Economia de bateria desativa alguns recursos do dispositivo e restringe apps para aumentar a duração da bateria."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas as regiões"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Ação não permitida"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está desativado no momento."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mais detalhes"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Seus apps, notificações, dados e outros recursos do perfil de trabalho serão ativados"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não perturbe"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo \"Não perturbe\" está ocultando notificações para ajudar você a se concentrar"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novo: o modo Não perturbe está ocultando as notificações"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Toque para saber mais e fazer alterações."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 34e1c82..4209908 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Apelați"</string>
<string name="dial_desc" msgid="6573723404985517250">"Apelați numărul de telefon selectat"</string>
<string name="map" msgid="5441053548030107189">"Hartă"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Localizați adresa selectată"</string>
<string name="browse" msgid="1245903488306147205">"Deschideți"</string>
<string name="browse_desc" msgid="8220976549618935044">"Deschideți adresa URL selectată"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
@@ -1306,10 +1305,10 @@
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Atingeți pentru configurare într-un format compatibil."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Selectați pentru configurare într-un format compatibil."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> scos pe neașteptate"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Îndepărtați dispozitivele media înainte de a le elimina pentru a evita pierderea conținutului"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Deconectați din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"S-a eliminat <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Este posibil ca unele funcții să nu funcționeze corespunzător. Introduceți un spațiu de stocare nou."</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Se scoate <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Funcționarea ar putea fi necorespunzătoare. Introduceți un dispozitiv de stocare nou."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Se deconectează <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nu scoateți"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurați"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Scoateți"</string>
@@ -1716,7 +1715,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalat de administratorul dvs."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizat de administratorul dvs."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Șters de administratorul dvs."</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Pentru a prelungi autonomia bateriei, Economisirea bateriei reduce performanțele dispozitivului și limitează sau dezactivează vibrațiile, serviciile de localizare și datele de fundal. Este posibil ca e-mailurile, mesageria și alte aplicații care depind de sincronizare să nu se actualizeze dacă nu le deschideți.\n\nEconomisirea bateriei se dezactivează automat când dispozitivul se încarcă."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Pentru a prelungi autonomia bateriei, Economisirea bateriei dezactivează anumite funcții ale dispozitivului și restricționează aplicații."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activați Economizorul de date?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activați"</string>
@@ -1812,6 +1811,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Toate limbile"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Toate regiunile"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Căutați"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Acțiunea nu este permisă"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Momentan, aplicația <xliff:g id="APP_NAME">%1$s</xliff:g> este dezactivată."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mai multe detalii"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Activați profilul de serviciu?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Se vor activa aplicațiile dvs. de serviciu, notificările, datele și alte funcții ale profilului de serviciu"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activați"</string>
@@ -1902,8 +1904,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Apelurile și notificările vor avea sunetul dezactivat"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modificări de sistem"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nu deranja"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Funcția Nu deranja ascunde notificările pentru a vă ajuta să vă concentrați"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Acesta este un comportament nou. Atingeți pentru a schimba."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Funcția nouă Nu deranja ascunde notificările"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Atingeți ca să aflați mai multe și să modificați"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Funcția Nu deranja s-a schimbat"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Atingeți pentru a verifica ce este blocat."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index dc23cba..505af13 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Позвонить"</string>
<string name="dial_desc" msgid="6573723404985517250">"Позвонить по выбранному номеру"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Показать на карте выбранный адрес"</string>
<string name="browse" msgid="1245903488306147205">"Открыть"</string>
<string name="browse_desc" msgid="8220976549618935044">"Открыть выбранный URL"</string>
<string name="sms" msgid="4560537514610063430">"Написать SMS"</string>
@@ -1741,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Установлено администратором"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Обновлено администратором"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Удалено администратором"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Чтобы продлить время работы устройства от батареи, в режиме энергосбережения снижается производительность, а также ограничивается использование вибросигнала, геолокации и фоновой передачи данных (эти функции могут быть выключены). Данные, требующие синхронизации, могут обновляться только после того, как вы откроете приложение.\n\nРежим энергосбережения автоматически отключается во время зарядки устройства."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Чтобы продлить время работы от батареи, в режиме энергосбережения ограничивается работа приложений и отключаются некоторые функции устройства."</string>
<string name="data_saver_description" msgid="6015391409098303235">"В режиме экономии трафика фоновая передача для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Включить экономию трафика?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Включить"</string>
@@ -1846,6 +1845,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Все языки"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Все регионы"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Поиск"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Действие запрещено"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" отключено."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Подробнее"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Включить рабочий профиль?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Будут включены корпоративные приложения, уведомления, данные и другие функции рабочего профиля."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Включить"</string>
@@ -1937,8 +1939,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Для звонков и уведомлений отключен звук."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системные изменения"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не беспокоить"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Уведомления в режиме \"Не беспокоить\" отключены"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Этот параметр применяется впервые. Нажмите, чтобы перейти к настройкам."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Теперь в режиме \"Не беспокоить\" уведомления не приходят"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Нажмите, чтобы узнать больше и изменить настройки."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройки режима \"Не беспокоить\" изменены"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Нажмите, чтобы проверить настройки."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 5bdd5a8..b8e686a 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1016,8 +1016,7 @@
<string name="dial" msgid="1253998302767701559">"අමතන්න"</string>
<string name="dial_desc" msgid="6573723404985517250">"තෝරා ගත් දුරකථන අංකය අමතන්න"</string>
<string name="map" msgid="5441053548030107189">"සිතියම"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"තෝරා ගත් ලිපිනය සොයා ගන්න"</string>
<string name="browse" msgid="1245903488306147205">"විවෘත කරන්න"</string>
<string name="browse_desc" msgid="8220976549618935044">"තෝරා ගත් URL විවෘත කරන්න"</string>
<string name="sms" msgid="4560537514610063430">"පණිවිඩය"</string>
@@ -1693,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ඔබගේ පරිපාලක මඟින් ස්ථාපනය කර ඇත"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ඔබගේ පරිපාලක මඟින් මකා දමා ඇත"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"බැටරි ආයු කාලය දිගු කිරීමට, බැටරි සුරැකුම ඔබේ උපාංගයේ ක්රියාකාරීත්වය අඩු කරන අතර කම්පනය, ස්ථාන සේවා, සහ පසුබිම් දත්ත සීමා කරයි. ඔබ ඒවා විවෘත නොකරන්නේ නම් මිස ඊ-තැපැල්, පණිවිඩකරණය, සහ සමමුහුර්ත කිරීම මත රඳා පවතින වෙනත් යෙදුම් යාවත්කාලීන නොවිය හැකිය.\n\nඔබේ උපාංගය ආරෝපණය වන විට බැටරි සුරැකුම ස්වයංක්රියව ක්රියාවිරහිත වේ."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"දත්ත සුරැකුම ක්රියාත්මක කරන්නද?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ක්රියාත්මක කරන්න"</string>
@@ -1780,6 +1780,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"සියලු භාෂා"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"සියලු ප්රදේශ"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"සෙවීම"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"ක්රියාව ඉඩ නොදේ"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"අයදුම්පත <xliff:g id="APP_NAME">%1$s</xliff:g> දැනට අබල කර ඇත."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"වැඩි විස්තර"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"කාර්යාල පැතිකඩ ක්රියාත්මක කරන්නද?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ඔබගේ වැඩ යෙදුම්, දැනුම්දීම්, දත්ත සහ වෙනත් කාර්යාල පැතිකඩ විශේෂාංග ක්රියාත්මක කරනු ඇත"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ක්රියාත්මක කරන්න"</string>
@@ -1869,8 +1872,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ඇමතුම් සහ දැනුම්දීම් නිහඬ වනු ඇත"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"පද්ධති වෙනස් කිරීම්"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"බාධා නොකරන්න"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"බාධා නොකරන්න ඔබට අවධානය යොමු කිරීමට උදවු කිරීම සඳහා දැනුම් දීම් සඟවමින්"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"මෙය නව හැසිරීමකි. වෙනස් කිරීමට තට්ටු කරන්න."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"බාධා නොකරන්න වෙනස් කර ඇත"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"අවහිර කර ඇති දේ පරීක්ෂා කිරීමට තට්ටු කරන්න."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"පද්ධතිය"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 324d60b..3206572 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Volať"</string>
<string name="dial_desc" msgid="6573723404985517250">"Zavolať na vybraté telefónne číslo"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Nájsť vybranú adresu"</string>
<string name="browse" msgid="1245903488306147205">"Otvoriť"</string>
<string name="browse_desc" msgid="8220976549618935044">"Otvoriť vybratú webovú adresu"</string>
<string name="sms" msgid="4560537514610063430">"Správa"</string>
@@ -1741,7 +1740,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainštaloval správca"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizoval správca"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Odstránil správca"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Šetrič batérie zníži výkonnosť zariadenia a obmedzí alebo vypne vibrácie, služby určovania polohy a dátové prenosy na pozadí, aby predĺžil výdrž batérie. Pošta, SMS a MMS i ďalšie aplikácie, ktoré sú založené na synchronizácii, sa možno nebudú aktualizovať, dokým ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"S cieľom predĺžiť výdrž batérie vypne Šetrič batérie niektoré funkcie zariadenia a obmedzí aplikácie."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Šetrič dát bráni niektorým aplikáciám odosielať alebo prijímať dáta na pozadí s cieľom znížiť spotrebu dát. Aplikácia, ktorú momentálne používate, môže prenášať dáta, ale môže to robiť menej často. Znamená to napríklad, že sa nezobrazia obrázky, kým na ne neklepnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnúť šetrič dát?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnúť"</string>
@@ -1846,6 +1845,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Všetky jazyky"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Všetky regióny"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Vyhľadávanie"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Akcia nie je povolená"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> je momentálne deaktivovaná."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Ďalšie podrobnosti"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Zapnúť pracovný profil?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Pracovné aplikácie, upozornenia, dáta a ďalšie funkcie pracovného profilu sa zapnú"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnúť"</string>
@@ -1937,8 +1939,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Hovory a upozornenia budú stlmené"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmeny systému"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nerušiť"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režim Nerušiť skrýva upozornenia, aby vám pomáhal sústrediť sa"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Toto je nové správanie. Zmeníte ho klepnutím."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Novinka: režim Nerušiť skrýva upozornenia"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Klepnutím získate ďalšie informácie a budete môcť vykonať zmeny."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavenie Nerušiť sa zmenilo"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Klepnutím skontrolujete, čo je blokované."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Systém"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index b1f0639..54a1d3e 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Pokliči"</string>
<string name="dial_desc" msgid="6573723404985517250">"Pokliči izbrano telefonsko številko"</string>
<string name="map" msgid="5441053548030107189">"Zemljevid"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Poišči izbrani naslov na zemljevidu"</string>
<string name="browse" msgid="1245903488306147205">"Odpri"</string>
<string name="browse_desc" msgid="8220976549618935044">"Odpri izbrani URL"</string>
<string name="sms" msgid="4560537514610063430">"Sporočilo"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Namestil skrbnik"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Posodobil skrbnik"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisal skrbnik"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Varčevanje z energijo akumulatorja podaljša čas njegovega delovanja tako, da zmanjša zmogljivost delovanja naprave in omeji ali izklopi vibriranje, lokacijske storitve ter prenos podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo akumulatorja se samodejno izklopi med polnjenjem akumulatorja naprave."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Zaradi zmanjševanja prenesene količine podatkov varčevanje s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko prenaša podatke, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vklop varčevanja s podatki?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Vklop"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Vsi jeziki"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Vse regije"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Išči"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Dejanje ni dovoljeno"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je trenutno onemogočena."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Več podrobnosti"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Želite vklopiti delovni profil?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Vklopili boste svoje delovne aplikacije, obvestila, podatke in druge funkcije delovnega profila"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Vklop"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvonjenje bo izklopljeno za klice in obvestila"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske spremembe"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne moti"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način »ne moti« skriva obvestila, da se lažje osredotočite"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"To je novo vedenje. Dotaknite se, če ga želite spremeniti."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način »ne moti« je spremenjen"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dotaknite se, da preverite, kaj je blokirano."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 8de7d05..f2ab998 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Telefono"</string>
<string name="dial_desc" msgid="6573723404985517250">"Telefono në numrin e zgjedhur të telefonit"</string>
<string name="map" msgid="5441053548030107189">"Harta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Gjej adresën e zgjedhur"</string>
<string name="browse" msgid="1245903488306147205">"Hap"</string>
<string name="browse_desc" msgid="8220976549618935044">"Hap URL-në e zgjedhur"</string>
<string name="sms" msgid="4560537514610063430">"Mesazh"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instaluar nga administratori"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Përditësuar nga administratori"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Fshirë nga administratori"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Për të zgjatur jetëgjatësinë e baterisë, \"Kursyesi i baterisë\" ul cilësinë e funksionimit të pajisjes sate si dhe kufizon ose çaktivizon dridhjet, shërbimet e vendndodhjes dhe të dhënat në sfond. Email-i, mesazhet dhe aplikacionet e tjera që mbështeten te sinkronizimi mund të mos përditësohen nëse nuk i hap.\n\n\"Kursyesi i baterisë\" çaktivizohet automatikisht kur pajisja është në ngarkim."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivizo"</string>
@@ -1779,6 +1779,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Të gjitha gjuhët"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Të gjitha rajonet"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Kërko"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Veprimi nuk lejohet"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Aplikacioni <xliff:g id="APP_NAME">%1$s</xliff:g> është aktualisht i çaktivizuar."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Më shumë detaje"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Të aktivizohet profili i punës?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Aplikacionet e punës, njoftimet, të dhënat e tua dhe funksionet e tjera të profilit të punës do të aktivizohen"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivizo"</string>
@@ -1868,8 +1871,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Do të hiqet zëri për telefonatat dhe njoftimet"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Ndryshimet e sistemit"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Mos shqetëso"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Modaliteti \"Mos shqetëso\" po fsheh njoftimet për të të ndihmuar të përqendrohesh"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Kjo është sjellje e re. Trokit për ta ndryshuar."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Mos shqetëso\" ka ndryshuar"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Trokit për të shënuar atë që është bllokuar"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistemi"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 9f6e6cf..55113c0 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -829,7 +829,7 @@
<string name="factorytest_not_system" msgid="4435201656767276723">"Радња FACTORY_TEST је подржана само за пакете инсталиране у директоријуму /system/app."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"Није пронађен ниједан пакет који обезбеђује радњу FACTORY_TEST."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Поново покрени"</string>
- <string name="js_dialog_title" msgid="1987483977834603872">"На страници на адреси „<xliff:g id="TITLE">%s</xliff:g>“ пише следеће:"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"На страници на адреси „<xliff:g id="TITLE">%s</xliff:g>“ пише:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Потврда навигације"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Затвори ову страницу"</string>
@@ -1034,8 +1034,7 @@
<string name="dial" msgid="1253998302767701559">"Позови"</string>
<string name="dial_desc" msgid="6573723404985517250">"Позовите изабрани број телефона"</string>
<string name="map" msgid="5441053548030107189">"Мапа"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Пронађите изабрану адресу"</string>
<string name="browse" msgid="1245903488306147205">"Отвори"</string>
<string name="browse_desc" msgid="8220976549618935044">"Отворите изабрани URL"</string>
<string name="sms" msgid="4560537514610063430">"Пошаљи SMS"</string>
@@ -1053,7 +1052,7 @@
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је покренута"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"Додирните за више информација или заустављање апликације."</string>
- <string name="ok" msgid="5970060430562524910">"У реду"</string>
+ <string name="ok" msgid="5970060430562524910">"Потврди"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="yes" msgid="5362982303337969312">"Потврди"</string>
<string name="no" msgid="5141531044935541497">"Откажи"</string>
@@ -1349,7 +1348,7 @@
<string name="ime_action_go" msgid="8320845651737369027">"Иди"</string>
<string name="ime_action_search" msgid="658110271822807811">"Претражи"</string>
<string name="ime_action_send" msgid="2316166556349314424">"Пошаљи"</string>
- <string name="ime_action_next" msgid="3138843904009813834">"Следеће"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Даље"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Претходно"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Изврши"</string>
@@ -1716,7 +1715,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирао је администратор"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ажурирао је администратор"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Избрисао је администратор"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Да би продужила трајање батерије, Уштеда батерије смањује перформансе уређаја и ограничава или искључује вибрацију, услуге локације и позадинске податке. Имејл, размена порука и друге апликације које се ослањају на синхронизацију се можда неће ажурирати ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Укључити Уштеду података?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Укључи"</string>
@@ -1812,6 +1812,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Сви језици"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Сви региони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Претражи"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Радња није дозвољена"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је тренутно онемогућена."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Више детаља"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Да укључимо профил за Work?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Укључиће се пословне апликације, обавештења, подаци и друге функције профила за Work"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Укључи"</string>
@@ -1902,8 +1905,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Мелодија звона за позиве и обавештење је искључена"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системске промене"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не узнемиравај"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Режим Не узнемиравај крије обавештења да би вам помогао да се фокусирате"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ово је ново понашање. Додирните да бисте променили."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Режим Не узнемиравај је промењен"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Додирните да бисте проверили шта је блокирано."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index af4e905..dfb530a 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Ring"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ring valt telefonnummer"</string>
<string name="map" msgid="5441053548030107189">"Karta"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Hitta den valda adressen"</string>
<string name="browse" msgid="1245903488306147205">"Öppna"</string>
<string name="browse_desc" msgid="8220976549618935044">"Öppna vald webbadress"</string>
<string name="sms" msgid="4560537514610063430">"Sms:a"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratören installerade paketet"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratören uppdaterade paketet"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administratören raderade paketet"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre. Vibration, platstjänster och bakgrundsdata begränsas eller inaktiveras. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Aktivera Databesparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivera"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alla språk"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alla regioner"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Söka"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Åtgärden är inte tillåten"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Appen <xliff:g id="APP_NAME">%1$s</xliff:g> är inaktiverad just nu."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Mer information"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Vill du aktivera jobbprofilen?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Jobbappar, aviseringar, data och andra funktioner i jobbprofilen aktiveras"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivera"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Ljudet stängs av för samtal och aviseringar"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemändringar"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Stör ej"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"I läget Stör ej döljs aviseringar så att du kan fokusera på det viktigaste"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Detta är en ny inställning. Tryck om du vill ändra."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Stör ej har ändrats"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tryck om du vill se vad som blockeras."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 92552e3..cf404f68 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1012,8 +1012,7 @@
<string name="dial" msgid="1253998302767701559">"Simu"</string>
<string name="dial_desc" msgid="6573723404985517250">"Piga simu kwa nambari uliyochagua"</string>
<string name="map" msgid="5441053548030107189">"Ramani"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Fungua anwani uliyochagua"</string>
<string name="browse" msgid="1245903488306147205">"Fungua"</string>
<string name="browse_desc" msgid="8220976549618935044">"Fungua URL uliyochagua"</string>
<string name="sms" msgid="4560537514610063430">"Ujumbe"</string>
@@ -1689,7 +1688,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Imesakinishwa na msimamizi wako"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Imesasishwa na msimamizi wako"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Imefutwa na msimamizi wako"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Ili kuboresha muda wa matumizi ya betri, Kiokoa Betri hupunguza utendaji wa kifaa chako na kupunguza au kuzima mitetemo, huduma za utambuzi wa mahali na data inayotumika chinichini. Huenda haitasasisha programu za barua pepe, ujumbe na programu zinginezo zinazotegemea usawazishaji, usipozifungua.\n\nKiokoa Betri hujizima kiotomatiki wakati kifaa chako kinachaji."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chini chini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ungependa Kuwasha Kiokoa Data?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Washa"</string>
@@ -1776,6 +1776,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Lugha zote"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Maeneo yote"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Tafuta"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Kitendo hiki hakiruhusiwi"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Kwa sasa, programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> imezimwa."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Maelezo zaidi"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ungependa kuwasha wasifu wa kazini?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Hatua hii itawasha data, arifa, programu za kazini, arifa na vipengele vingine vya wasifu wa kazini"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Washa"</string>
@@ -1865,8 +1868,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Haitatoa mlio arifa ikitumwa au simu ikipigwa"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Mabadiliko kwenye mfumo"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Usisumbue"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Kipengele cha Usinisumbue kinaficha arifa ili kukusaidia kuwa makini zaidi"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Hii ni mipangilio mipya. Gusa ili uibadilishe."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Kipengele cha Usinisumbue kimebadilishwa"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Gusa ili uangalie kipengee ambacho kimezuiwa."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Mfumo"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index d710876..edb1652 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"குரல் சேவை இல்லை"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"குரல் சேவையைப் பயன்படுத்த முடியாது அல்லது அவசர அழைப்பைச் செய்ய முடியாது"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"உங்கள் மொபைல் நிறுவனம் தற்காலிகமாக ஆஃப் செய்துள்ளது"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g>ஐ, உங்கள் மொபைல் நிறுவனம் தற்காலிகமாக ஆஃப் செய்துள்ளது"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"விருப்ப நெட்வொர்க்கை மாற்றவும். மாற்ற, தட்டவும்."</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
@@ -122,12 +121,13 @@
<string name="roamingText11" msgid="4154476854426920970">"ரோமிங் பேனர் இயக்கத்தில் உள்ளது"</string>
<string name="roamingText12" msgid="1189071119992726320">"ரோமிங் பேனர் முடக்கப்பட்டது"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"சேவையைத் தேடுகிறது"</string>
- <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
- <skip />
+ <string name="wfcRegErrorTitle" msgid="3855061241207182194">"வைஃபை அழைப்பை அமைக்க முடியவில்லை"</string>
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"வைஃபை மூலம் அழைக்கவும் செய்திகளை அனுப்பவும், முதலில் தொலைத்தொடர்பு நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும். (பிழைக் குறியீடு <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ <item msgid="7372514042696663278">"உங்கள் மொபைல் நிறுவனத்துடன் வைஃபை அழைப்பைப் பதிவுசெய்வதில் சிக்கல்: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+ </string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s வைஃபை அழைப்பு"</item>
@@ -497,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"அறியப்படவில்லை"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"கைரேகை அங்கீகரிக்கப்பட்டது"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"கைரேகை வன்பொருள் இல்லை."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string>
@@ -1015,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"அழை"</string>
<string name="dial_desc" msgid="6573723404985517250">"தேர்ந்தெடுத்த ஃபோன் எண்ணை அழைக்கும்"</string>
<string name="map" msgid="5441053548030107189">"வரைபடம்"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"தேர்ந்தெடுத்த முகவரிக்கான வரைபடத்தைத் திறக்கும்"</string>
<string name="browse" msgid="1245903488306147205">"திற"</string>
<string name="browse_desc" msgid="8220976549618935044">"தேர்ந்தெடுத்த URLஐத் திறக்கும்"</string>
<string name="sms" msgid="4560537514610063430">"செய்தி"</string>
@@ -1157,8 +1155,7 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கவும்"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"தொலைத்தொடர்பு சேவை வழங்கும் நிறுவனத்தின் வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string>
- <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
- <skip />
+ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"வைஃபை நெட்வொர்க்குடன் இணைக்கப்பட்டது"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"வைஃபை நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ஆஃப் செய்"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>ஐச் சரிபார்க்கிறது…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"தற்போதைய உள்ளடக்கத்தை மதிப்பாய்வு செய்கிறது"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"புதிய <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"அமைக்க, தட்டவும்"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"படங்களையும் மீடியாவையும் மாற்றலாம்"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> இல் சிக்கல்"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"சரிசெய்ய, தட்டவும்"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது. சரிசெய்ய, தேர்ந்தெடுக்கவும்."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ஆதரிக்கப்படாத <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"சாதனம் இந்த <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தட்டவும்."</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"சாதனம் இந்த <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தேர்ந்தெடுக்கவும்."</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"உள்ளடக்கத்தை இழக்காமலிருக்க, அகற்றும் முன்பாக மீடியாவை வெளியேற்றவும்"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"சில செயல்பாடு சரியாக வேலைசெய்யாமல் போகலாம். புதிய சேமிப்பகத்தைச் செருகவும்."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>ஐ வெளியேற்றுகிறது"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"அகற்ற வேண்டாம்"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"அமை"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"வெளியேற்று"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"உலாவுக"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> இல்லை"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"மீண்டும் சாதனத்தைச் செருகவும்"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ஐ நகர்த்துகிறது"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"தரவு நகர்த்தப்படுகிறது"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"உள்ளடக்கம் இடமாற்றப்பட்டது"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"<xliff:g id="NAME">%s</xliff:g>க்கு, உள்ளடக்கம் நகர்த்தப்பட்டது"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"உள்ளடக்கத்தை நகர்த்த முடியவில்லை"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"மீண்டும் உள்ளடக்கத்தை நகர்த்தி முயலவும்"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"அகற்றப்பட்டது"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"வெளியேற்றப்பட்டது"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"சரிபார்க்கிறது..."</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"உங்கள் நிர்வாகி நிறுவியுள்ளார்"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"சாதனத்தின் பேட்டரி ஆயுளை அதிகரிப்பதற்காக, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வு, இருப்பிடச் சேவைகள் மற்றும் பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது அல்லது ஆஃப் செய்கிறது. ஒத்திசைவைச் சார்ந்திருக்கும் மின்னஞ்சல், செய்தியிடல் மற்றும் பிற ஆப்ஸைத் திறக்காதவரை, அவை ஒத்திசைக்கப்படாமல் இருக்கும்.\n\nசாதனம் சார்ஜ் ஆகும் போது பேட்டரி சேமிப்பான் தானாகவே ஆஃப் ஆகிவிடும்."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"டேட்டா பயன்பாட்டைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில பயன்பாடுகளை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் பயன்பாடானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"டேட்டா சேமிப்பானை இயக்கவா?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"இயக்கு"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"எல்லா மொழிகளும்"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"எல்லா மண்டலங்களும்"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"தேடு"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"பணிச் சுயவிவரத்தை ஆன் செய்யவா?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"பணி ஆப்ஸ், அறிவிப்புகள், தரவு மற்றும் பிற பணிச் சுயவிவர அம்சங்கள் ஆன் செய்யப்படும்"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"இயக்கு"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"குரல் அழைப்பை மேற்கொள்ளும் வசதி இந்த சிம்மிற்கு இல்லை"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"குரல் அழைப்பை மேற்கொள்ள இந்த சிம்மிற்கு அனுமதி இல்லை"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"குரல் அழைப்பை மேற்கொள்ள இந்த ஃபோனுக்கு அனுமதி இல்லை"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g> அனுமதிக்கப்படவில்லை"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g> அமைக்கப்படவில்லை"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g> அனுமதிக்கப்படவில்லை"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"சிம் <xliff:g id="SIMNUMBER">%d</xliff:g> அனுமதிக்கப்படவில்லை"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"பயன்பாடு முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்தக் குறுக்குவழி வேலை செய்யவில்லை"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியை முடக்கும்"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"சிஸ்டம் மாற்றங்கள்"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"தொந்தரவு செய்ய வேண்டாம்"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"உங்கள் கவனம் சிதறாமல் இருப்பதற்கு, \'தொந்தரவு செய்ய வேண்டாம்\' பயன்முறையானது அறிவிப்புகளை மறைக்கிறது"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"இது புதிய செயல்பாடாகும். மாற்ற, தட்டவும்."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"எவற்றையெல்லாம் தடுக்கிறது என்பதைப் பார்க்க, தட்டவும்."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"சிஸ்டம்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 821e603..180a75d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"కాల్ చేయండి"</string>
<string name="dial_desc" msgid="6573723404985517250">"ఎంచుకున్న ఫోన్ నంబర్కు కాల్ చేస్తుంది"</string>
<string name="map" msgid="5441053548030107189">"మ్యాప్"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"ఎంచుకున్న చిరునామాను గుర్తించు"</string>
<string name="browse" msgid="1245903488306147205">"తెరవండి"</string>
<string name="browse_desc" msgid="8220976549618935044">"ఎంచుకున్న URLని తెరుస్తుంది"</string>
<string name="sms" msgid="4560537514610063430">"సందేశం"</string>
@@ -1692,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"మీ నిర్వాహకులు ఇన్స్టాల్ చేసారు"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"మీ నిర్వాహకులు నవీకరించారు"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"మీ నిర్వాహకులు తొలగించారు"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"బ్యాటరీ జీవితకాలాన్ని పొడిగించడం కోసం, బ్యాటరీ సేవర్ మీ పరికరం యొక్క పనితీరుని తగ్గిస్తుంది మరియు వైబ్రేషన్ని, స్థాన సేవలను మరియు నేపథ్య డేటాని పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది. సమకాలీకరణపై ఆధాపరపడిన ఇమెయిల్, సందేశం మరియు ఇతర యాప్లు మీరు వాటిని తెరిచే వరకు అప్డేట్ కాకపోవచ్చు.\n\nపరికరాన్ని ఛార్జింగ్లో ఉంచినప్పుడు బ్యాటరీ సేవర్ ఆటోమేటిక్గా ఆఫ్ అవుతుంది."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"డేటా వినియోగాన్ని తగ్గించడంలో సహాయకరంగా ఉండటానికి, డేటా సేవర్ కొన్ని యాప్లను నేపథ్యంలో డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తున్న యాప్ డేటాను యాక్సెస్ చేయగలదు కానీ అలా అరుదుగా చేయవచ్చు. అంటే, ఉదాహరణకు, మీరు ఆ చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"డేటా సేవర్ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ఆన్ చేయి"</string>
@@ -1779,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"అన్ని భాషలు"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"అన్ని ప్రాంతాలు"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"వెతుకు"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"కార్యాలయ ప్రొఫైల్ని ఆన్ చేయాలా?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"మీ కార్యాలయ యాప్లు, నోటిఫికేషన్లు, డేటా మరియు ఇతర కార్యాలయ ప్రొఫైల్ ఫీచర్లు ఆన్ చేయబడతాయి"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ఆన్ చేయి"</string>
@@ -1868,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"కాల్లు మరియు నోటిఫికేషన్లు మ్యూట్ చేయబడతాయి"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"సిస్టమ్ మార్పులు"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"అంతరాయం కలిగించవద్దు"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"అంతరాయం కలిగించవద్దు అనేది మీరు దృష్టి సారించడంలో సహాయపడేందుకు నోటిఫికేషన్లను దాస్తుంది"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ఇది కొత్త ప్రవర్తన. మార్చడానికి నొక్కండి."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"బ్లాక్ చేయబడిన దాన్ని తనిఖీ చేయడానికి నొక్కండి."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"సిస్టమ్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index beaef94..13d4852 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"โทร"</string>
<string name="dial_desc" msgid="6573723404985517250">"โทรหาหมายเลขโทรศัพท์ที่เลือก"</string>
<string name="map" msgid="5441053548030107189">"แผนที่"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"หาที่อยู่ที่เลือก"</string>
<string name="browse" msgid="1245903488306147205">"เปิด"</string>
<string name="browse_desc" msgid="8220976549618935044">"เปิด URL ที่เลือก"</string>
<string name="sms" msgid="4560537514610063430">"ข้อความ"</string>
@@ -1277,17 +1276,17 @@
<string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> ใหม่"</string>
<string name="ext_media_new_notification_message" msgid="3673685270558405087">"แตะเพื่อตั้งค่า"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"สำหรับการโอนรูปภาพและสื่อ"</string>
- <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ปัญหาที่พบจาก <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ปัญหาเกี่ยวกับ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"แตะเพื่อแก้ไข"</string>
<string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> เสียหาย เลือกเพื่อแก้ไข"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"อุปกรณ์นี้ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g> นี้ แตะเพื่อตั้งค่าในรูปแบบที่สนับสนุน"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"อุปกรณ์นี้ไม่รองรับ <xliff:g id="NAME">%s</xliff:g> นี้ เลือกเพื่อตั้งค่าในรูปแบบที่รองรับ"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออกไปโดยไม่คาดคิด"</string>
- <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ดีดสื่อออกก่อนการนำออกเพื่อหลีกเลี่ยงเนื้อหาสูญหาย"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ยกเลิกการต่อเชื่อมสื่อก่อนที่จะนำออกเพื่อหลีกเลี่ยงไม่ให้เนื้อหาสูญหาย"</string>
<string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string>
<string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ฟังก์ชันการทำงานบางอย่างอาจทำงานไม่ถูกต้อง โปรดใส่พื้นที่เก็บข้อมูลใหม่"</string>
- <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"กำลังดีด <xliff:g id="NAME">%s</xliff:g> ออก"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"กำลังยกเลิกการต่อเชื่อม <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ห้ามนำออก"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"ตั้งค่า"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"นำอุปกรณ์ออก"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ติดตั้งโดยผู้ดูแลระบบ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"อัปเดตโดยผู้ดูแลระบบ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ลบโดยผู้ดูแลระบบ"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"เพื่อช่วยยืดอายุการใช้งานแบตเตอรี่ โหมดประหยัดแบตเตอรี่จะลดการทำงานของอุปกรณ์และจำกัดหรือปิดการสั่น บริการตำแหน่ง และข้อมูลแบ็กกราวด์ นอกจากนี้ อีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์ก็จะไม่อัปเดตหากคุณไม่เปิดขึ้นมา\n\nโหมดประหยัดแบตเตอรี่จะปิดโดยอัตโนมัติขณะชาร์จอุปกรณ์"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลเครือข่ายมือถือในการทำงานเบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงข้อมูลเครือข่ายมือถือได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"เปิด"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ทุกภาษา"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ภูมิภาคทั้งหมด"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"ไม่อนุญาตให้ดำเนินการนี้"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"แอปพลิเคชัน <xliff:g id="APP_NAME">%1$s</xliff:g> ปิดการใช้งานอยู่ในขณะนี้"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"รายละเอียดเพิ่มเติม"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"เปิดโปรไฟล์งานไหม"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"ระบบจะเปิดแอปงาน การแจ้งเตือน ข้อมูล และฟีเจอร์อื่นๆ ในโปรไฟล์งาน"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"เปิด"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"สายเรียกเข้าและการแจ้งเตือนจะไม่ส่งเสียง"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"การเปลี่ยนแปลงระบบ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ห้ามรบกวน"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"โหมดห้ามรบกวนซ่อนการแจ้งเตือนไว้เพื่อให้คุณจดจ่อกับสิ่งที่สนใจได้"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"นี่คือการทำงานใหม่ แตะเพื่อเปลี่ยน"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"เปลี่ยน \"ห้ามรบกวน\" แล้ว"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"แตะเพื่อดูรายการที่ถูกบล็อก"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ระบบ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 9119c32..3b36aef 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Tawagan"</string>
<string name="dial_desc" msgid="6573723404985517250">"Tawagan ang piniling numero ng telepono"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Hanapin ang piniling address"</string>
<string name="browse" msgid="1245903488306147205">"Buksan"</string>
<string name="browse_desc" msgid="8220976549618935044">"Buksan ang piniling URL"</string>
<string name="sms" msgid="4560537514610063430">"Padalhan ng Mensahe"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Na-install ng iyong admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Na-update ng iyong admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Na-delete ng iyong admin"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Para mapatagal ang baterya, binabawasan ng Pangtipid sa Baterya ang performance ng iyong device at nililimitahan at ino-off nito ang pag-vibrate, mga serbisyo ng lokasyon, at data ng background. Maaaring hindi ma-update ang email, pagmemensahe, at iba pang app na umaasa sa pag-sync hangga\'t hindi mo binubuksan ang mga ito.\n\nAwtomatikong mag-o-off ang Pangtipid sa Baterya kapag naka-charge ang iyong device."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"I-on ang Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"I-on"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Lahat ng wika"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Lahat ng rehiyon"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Maghanap"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Hindi pinayagan ang pagkilos"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Kasalukuyang naka-disable ang application na <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Higit pang detalye"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"I-on ang profile sa trabaho?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Mao-on ang iyong mga app sa trabaho, notification, data, at iba pang feature sa profile sa trabaho"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"I-on"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Mamu-mute ang mga tawag at notification"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Mga pagbabago sa system"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Huwag Istorbohin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Itinatago ng Huwag Istorbohin ang mga notification para tulungan kang tumuon"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ito ang bagong gawi. I-tap para baguhin."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Binago ang Huwag Istorbohin"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"I-tap para tingnan kung ano ang naka-block."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 72751bc..5799ca3 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Telefon et"</string>
<string name="dial_desc" msgid="6573723404985517250">"Seçilen telefon numarasını ara"</string>
<string name="map" msgid="5441053548030107189">"Harita"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Seçilen adresi bul"</string>
<string name="browse" msgid="1245903488306147205">"Aç"</string>
<string name="browse_desc" msgid="8220976549618935044">"Seçilen URL\'yi aç"</string>
<string name="sms" msgid="4560537514610063430">"Mesaj"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Yöneticiniz tarafından yüklendi"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Yöneticiniz tarafından güncellendi"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Yöneticiniz tarafından silindi"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Pil Tasarrufu pil ömrünü uzatmak için cihazınızın performansını azaltır, ayrıca titreşimi, konum hizmetlerini ve arka plan verileri sınırlar. Senkronizasyona dayalı olarak çalışan e-posta, mesajlaşma ve diğer uygulamalar, açılmadıkları sürece güncellenmeyebilir.\n\nCihazınız şarj olurken, Pil Tasarrufu otomatik olarak kapanır."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Şu anda kullandığınız bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Veri Tasarrufu açılsın mı?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aç"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Tüm diller"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Tüm bölgeler"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Ara"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"İşleme izin verilmedi"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması şu anda devre dışı bırakıldı."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Diğer ayrıntılar"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"İş profili açılsın mı?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"İş uygulamalarınız, bildirimleriniz, verileriniz ve diğer iş profili özellikleriniz açılacak"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aç"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Çağrılar ve bildirimlerin sesi kapalı olacak"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem değişiklikleri"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Rahatsız Etmeyin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Konsantre olmanıza yardımcı olmak için, Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Yeni davranış bu şekildedir. Değiştirmek için dokunun."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Rahatsız Etmeyin modu değişti"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nelerin engellendiğini kontrol etmek için dokunun."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index b5a276f..71933fa 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1054,8 +1054,7 @@
<string name="dial" msgid="1253998302767701559">"Зателефонувати"</string>
<string name="dial_desc" msgid="6573723404985517250">"Набрати вибраний номер телефону"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Знайти вибрану адресу"</string>
<string name="browse" msgid="1245903488306147205">"Відкрити"</string>
<string name="browse_desc" msgid="8220976549618935044">"Відкрити вибрану URL-адресу"</string>
<string name="sms" msgid="4560537514610063430">"Повідомлення"</string>
@@ -1741,7 +1740,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Установлено адміністратором"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Оновлено адміністратором"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Видалено адміністратором"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Щоб пристрій працював довше, у режимі економії заряду акумулятора знижується його продуктивність і обмежуються або вимикаються вібрація, служби локації й фоновий режим обміну даними. Електронна пошта, чати й інші додатки, які мають синхронізуватися, можуть не оновлюватися, доки ви їх не відкриєте.\n\nРежим економії заряду акумулятора автоматично вимикається під час заряджання пристрою."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Увімкнути Заощадження трафіку?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Увімкнути"</string>
@@ -1846,6 +1846,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Усі мови"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Усі регіони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Пошук"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Дію не дозволено"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Наразі додаток <xliff:g id="APP_NAME">%1$s</xliff:g> вимкнено."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Докладніше"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Увімкнути робочий профіль?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Додатки, сповіщення, дані й інші функції робочого профілю буде ввімкнено"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Увімкнути"</string>
@@ -1937,8 +1940,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Звуковий сигнал для викликів і сповіщень вимкнено"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системні зміни"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не турбувати"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"У режимі \"Не турбувати\" сповіщення ховаються, щоб ви могли зосередитись"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Це нова поведінка. Торкніться, щоб змінити."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Налаштування режиму \"Не турбувати\" змінено"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Торкніться, щоб перевірити, що заблоковано."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 5f351842..2268bcb 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -82,8 +82,7 @@
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"کوئی صوتی سروس نہیں"</string>
<string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"کوئی صوتی سروس یا ہنگامی کالنگ دستیاب نہیں ہے"</string>
<string name="RestrictedStateContent" msgid="6538703255570997248">"آپ کے کیریئر نے عارضی طور پر آف کر دیا ہے"</string>
- <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
- <skip />
+ <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کے لئے آپ کے کیریئر نے عارضی طور پر آف کر دیا ہے"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"موبائل نیٹ ورک تک رسائی نہیں ہو سکتی"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ترجیحی نیٹ ورک تبدیل کر کے دیکھیں۔ تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ہنگامی کالنگ دستیاب نہیں ہے"</string>
@@ -498,8 +497,7 @@
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_not_recognized" msgid="2690661881608146617">"تسلیم شدہ نہیں ہے"</string>
- <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
- <skip />
+ <string name="fingerprint_authenticated" msgid="5309333983002526448">"فنگر پرنٹ کی تصدیق ہو گئی"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"فنگر پرنٹ ہارڈ ویئر دستیاب نہیں ہے۔"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string>
@@ -1016,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"کال کریں"</string>
<string name="dial_desc" msgid="6573723404985517250">"منتخب کردہ فون نمبر پر کال کریں"</string>
<string name="map" msgid="5441053548030107189">"نقشہ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"منتخب کردہ پتہ تلاش کریں"</string>
<string name="browse" msgid="1245903488306147205">"کھولیں"</string>
<string name="browse_desc" msgid="8220976549618935044">"منتخب کردہ URL کھولیں"</string>
<string name="sms" msgid="4560537514610063430">"پیغام"</string>
@@ -1275,49 +1272,34 @@
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> دیگر ایپس پر ڈسپلے ہو رہی ہے"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے بند کریں۔"</string>
<string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"آف کریں"</string>
- <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> کو چیک کیا جا رہا ہے…"</string>
+ <string name="ext_media_checking_notification_message" msgid="410185170877285434">"موجودہ مواد کا جائزہ لیا جا رہا ہے"</string>
+ <string name="ext_media_new_notification_title" msgid="1621805083736634077">"نیا <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_new_notification_message" msgid="3673685270558405087">"سیٹ اپ کرنے کیلئے تھپتھپائیں"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"تصاویر اور میڈیا منتقل کرنے کیلئے"</string>
- <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
- <skip />
+ <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> کے ساتھ مسئلہ"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"درست کرنے کیلئے تھپتھپائیں"</string>
+ <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> خراب ہے۔ اسے ٹھیک کرنے کیلئے منتخب کریں۔"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"غیر تعاون یافتہ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"یہ آلہ <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"یہ آلہ اس <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا ہے۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے منتخب کریں۔"</string>
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> غیر متوقع طور پر ہٹا دیا گیا"</string>
- <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
- <skip />
+ <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"مواد کھونے سے بچنے کے لئے ہٹانے سے پہلے میڈیا خارج کریں"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"شاید کچھ فنکشن ٹھیک طرح سے کام نہ کریں۔ نیا اسٹوریج داخل کریں۔"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> کو خارج کیا جا رہا ہے"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"نہ ہٹائیں"</string>
<string name="ext_media_init_action" msgid="7952885510091978278">"سیٹ اپ کریں"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"خارج کریں"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"دریافت کریں"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> غائب ہے"</string>
- <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
- <skip />
+ <string name="ext_media_missing_message" msgid="4012389235250987930">"آلہ دوبارہ داخل کریں"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> کو منتقل کیا جا رہا ہے"</string>
<string name="ext_media_move_title" msgid="1022809140035962662">"ڈیٹا منتقل کیا جا رہا ہے…"</string>
- <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
- <skip />
- <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
- <skip />
- <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
- <skip />
+ <string name="ext_media_move_success_title" msgid="7863652232242276066">"مواد کی منتقلی مکمل ہو گئی"</string>
+ <string name="ext_media_move_success_message" msgid="8939137931961728009">"مواد کو <xliff:g id="NAME">%s</xliff:g> میں منتقل کر دیا گیا"</string>
+ <string name="ext_media_move_failure_title" msgid="1604422634177382092">"مواد منتقل نہیں کیا جا سکا"</string>
+ <string name="ext_media_move_failure_message" msgid="7388950499623016135">"دوبارہ مواد کو منتقل کرنے کی کوشش کریں"</string>
<string name="ext_media_status_removed" msgid="6576172423185918739">"ہٹا دیا گیا"</string>
<string name="ext_media_status_unmounted" msgid="2551560878416417752">"اخراج شدہ"</string>
<string name="ext_media_status_checking" msgid="6193921557423194949">"چیک کیا جا رہا ہے…"</string>
@@ -1709,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"آپ کے منتظم کے ذریعے انسٹال کیا گیا"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"آپ کے منتظم کے ذریعے اپ ڈیٹ کیا گیا"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"آپ کے منتظم کے ذریعے حذف کیا گیا"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"بیٹری لائف کی توسیع کیلئے، بیٹری سیور آپ کے آلہ کی کارکردگی میں تخفیف کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کے ڈیٹا کو محدود کر دیتی ہے یا بند کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر انحصار کرنے والی دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآپ کا آلہ چارج ہوتے وقت بیٹری سیور خود بخود آف ہو جاتی ہے۔"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتا ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا پر رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا زیادہ نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ڈیٹا سیور آن کریں؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"آن کریں"</string>
@@ -1796,6 +1779,12 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"سبھی زبانیں"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"تمام علاقے"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"تلاش"</string>
+ <!-- no translation found for app_suspended_title (5360409799785895488) -->
+ <skip />
+ <!-- no translation found for app_suspended_default_message (5876776530189983288) -->
+ <skip />
+ <!-- no translation found for app_suspended_more_details (2901244470963918402) -->
+ <skip />
<string name="work_mode_off_title" msgid="1118691887588435530">"دفتری پروفائل آن کریں؟"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"آپ کی دفتری ایپس، اطلاعات، ڈیٹا اور دفتری پروفائل کی دیگر خصوصیات آن کر دی جائیں گی"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"آن کریں"</string>
@@ -1865,14 +1854,10 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM میں آواز کیلئے سہولت نہیں ہے"</string>
<string name="mmcc_illegal_ms" msgid="807334478177362062">"آواز کیلئے SIM کو اجازت نہیں ہے"</string>
<string name="mmcc_illegal_me" msgid="1950705155760872972">"آواز کیلئے فون کو اجازت نہیں ہے"</string>
- <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
- <skip />
- <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
- <skip />
- <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
- <skip />
- <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
- <skip />
+ <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو اجازت نہیں ہے"</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> فراہم کردہ نہیں ہے"</string>
+ <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو اجازت نہیں ہے"</string>
+ <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو اجازت نہیں ہے"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"پاپ اپ ونڈو"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ایپ کے ورژن کا درجہ کم ہے یا اس شارٹ کٹ کے ساتھ مطابقت پذیر نہیں ہے"</string>
@@ -1889,8 +1874,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"کالز اور اطلاعات کی آواز خاموش کر دی جائے گی"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"سسٹم کی تبدیلیاں"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ڈسٹرب نہ کریں"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"توجہ مرکوز کرنے میں آپ کی مدد کرنے کے لیے، \'ڈسٹرب نہ کریں\' اطلاعات کو چھپا رہی ہے"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"یہ نیا برتاؤ ہے۔ تبدیل کرنے کے لیے تھتھپائيں۔"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"مسدود کی گئی چیزوں کو چیک کرنے کے لیے تھپتھپائیں۔"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"سسٹم"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 6b5ab8b..055aeb3 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Chaqiruv"</string>
<string name="dial_desc" msgid="6573723404985517250">"Belgilangan raqamga telefon qilish"</string>
<string name="map" msgid="5441053548030107189">"Xarita"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Belgilangan manzilni xaritadan topish"</string>
<string name="browse" msgid="1245903488306147205">"Ochish"</string>
<string name="browse_desc" msgid="8220976549618935044">"Belgilangan URL manzilini ochish"</string>
<string name="sms" msgid="4560537514610063430">"Xabar"</string>
@@ -1692,7 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administrator tomonidan o‘rnatilgan"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administrator tomonidan yangilangan"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administrator tomonidan o‘chirilgan"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi, joylashuv xizmatlari va orqa fonda internetdan foydalanishini cheklaydi yoki faolsizlantiradi. Sinxronlanishni talab qiladigan e-pochta, xabar almashinuv va boshqa ilovalar esa qachonki ularni ishga tushirganingizda yangilanadi.\n\nQurilma quvvat olayotganda quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Batareya quvvatini tejash maqsadida Quvvat tejash rejimida ayrim qurilma funksiyalari faolsizlantiriladi va ilovalar ishlashi cheklanadi."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Trafik tejash rejimida ayrim ilovalar uchun orqa fondan internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Trafik tejash yoqilsinmi?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Yoqish"</string>
@@ -1779,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Barcha tillar"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Barcha hududlar"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Qidiruv"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Bu amalga ruxsat berilmagan"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi hozirda faolsizlantirilgan."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Batafsil"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Ishchi profil yoqilsinmi?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Ishchi ilovalar, bildirishnomalar, ma’lumotlar va boshqa ishchi profil imkoniyatlari yoqiladi"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Yoqish"</string>
@@ -1868,8 +1870,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chaqiruvlar va bildirishnomalar ovozsiz qilinadi"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Tizimga oid o‘zgarishlar"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Bezovta qilinmasin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Bezovta qilinmasin rejimi diqqatingizni jamlash uchun bildirishnomalarni berkitadi"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Bu yangi xatti-harakat. O‘zgartirish uchun bosing."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Yangi: Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Batafsil axborot olish va o‘zgartirish uchun bosing."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nimalar bloklanganini tekshirish uchun bosing"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Tizim"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index a46541e..4a6f78f 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Gọi"</string>
<string name="dial_desc" msgid="6573723404985517250">"Gọi đến số điện thoại đã chọn"</string>
<string name="map" msgid="5441053548030107189">"Bản đồ"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Tìm địa chỉ đã chọn"</string>
<string name="browse" msgid="1245903488306147205">"Mở"</string>
<string name="browse_desc" msgid="8220976549618935044">"Mở URL đã chọn"</string>
<string name="sms" msgid="4560537514610063430">"Gửi tin nhắn"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Do quản trị viên của bạn cài đặt"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Do quản trị viên của bạn cập nhật"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Do quản trị viên của bạn xóa"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Để kéo dài thời lượng pin, Trình tiết kiệm pin sẽ giảm mức hoạt động của thiết bị, hạn chế hoặc tắt chế độ rung, dịch vụ vị trí và dữ liệu nền. Ứng dụng email, nhắn tin và các ứng dụng khác sử dụng đồng bộ hóa có thể không cập nhật nếu bạn không mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể truy cập dữ liệu nhưng có thể thực hiện việc đó ít thường xuyên hơn. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bật"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Tất cả ngôn ngữ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Tất cả khu vực"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Tìm kiếm"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Hành động không được phép"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> hiện đã bị vô hiệu hóa."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Chi tiết khác"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Bạn muốn bật hồ sơ công việc?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Ứng dụng công việc, thông báo, dữ liệu và các tính năng khác của hồ sơ công việc sẽ được bật"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Bật"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Cuộc gọi và thông báo sẽ tắt tiếng"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Thay đổi hệ thống"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Không làm phiền"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Chế độ Không làm phiền sẽ ẩn thông báo để giúp bạn tập trung"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Đây là hành vi mới. Hãy nhấn để thay đổi."</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Cài đặt Không làm phiền đã thay đổi"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nhấn để xem những thông báo bị chặn."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Hệ thống"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index b15e306..9fd0b58 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"拨打电话"</string>
<string name="dial_desc" msgid="6573723404985517250">"拨打所选电话号码"</string>
<string name="map" msgid="5441053548030107189">"地图"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"找到所选地址"</string>
<string name="browse" msgid="1245903488306147205">"打开"</string>
<string name="browse_desc" msgid="8220976549618935044">"打开所选网址"</string>
<string name="sms" msgid="4560537514610063430">"发短信"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理员安装"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理员更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理员删除"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"为了延长电池的续航时间,省电模式会降低设备的性能,并限制或关闭振动、位置信息服务和后台流量。对于电子邮件、聊天工具等依赖于同步功能的应用,可能要打开这类应用时才能收到新信息。\n\n省电模式会在设备充电时自动关闭。"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"为了减少流量消耗,流量节省程序会阻止某些应用在后台收发数据。您当前使用的应用可以收发数据,但频率可能会降低。举例而言,这可能意味着图片只有在您点按之后才会显示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要开启流量节省程序吗?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"开启"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"所有语言"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"所有国家/地区"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"搜索"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"不允许执行此操作"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"目前已停用应用<xliff:g id="APP_NAME">%1$s</xliff:g>。"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"更多详情"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"要开启工作资料吗?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"您的工作应用、通知、数据及其他工作资料功能将会开启"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"开启"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有来电和通知时会静音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系统变更"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"勿扰"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"“勿扰”模式将会隐藏通知,以帮助您集中注意力"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"这是新行为。点按即可更改。"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"“勿扰”设置有变更"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"点按即可查看屏蔽内容。"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"系统"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 8249de1..da304a1 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"通話"</string>
<string name="dial_desc" msgid="6573723404985517250">"打指定電話號碼"</string>
<string name="map" msgid="5441053548030107189">"地圖"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"搵出指定地址"</string>
<string name="browse" msgid="1245903488306147205">"開啟"</string>
<string name="browse_desc" msgid="8220976549618935044">"打開指定網址"</string>
<string name="sms" msgid="4560537514610063430">"短訊"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理員刪除"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"為延長電池壽命,省電模式會降低裝置效能,並限制或關閉震動功能、位置資訊服務和背景數據。此外,如果未開啟電郵、短訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n省電模式會在裝置充電時自動關閉。"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟「數據節省模式」嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"所有國家/地區"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"不允許此操作"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"<xliff:g id="APP_NAME">%1$s</xliff:g> 應用程式目前已停用。"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"更多詳情"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"要開啟工作設定檔嗎?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"系統將開啟您的工作應用程式、通知、資料和其他工作設定檔功能"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"請勿騷擾"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"「請勿騷擾」模式目前隱藏通知,協助您集中注意力"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"這是新行為。輕按即可變更。"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"請勿騷擾已變更"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"輕按即可查看封鎖內容。"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"系統"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 92b5ec4..985489a 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"通話"</string>
<string name="dial_desc" msgid="6573723404985517250">"撥打所選電話號碼"</string>
<string name="map" msgid="5441053548030107189">"地圖"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"尋找所選地址"</string>
<string name="browse" msgid="1245903488306147205">"開啟"</string>
<string name="browse_desc" msgid="8220976549618935044">"開啟所選網址"</string>
<string name="sms" msgid="4560537514610063430">"訊息"</string>
@@ -1691,7 +1690,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由你的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由你的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由你的管理員刪除"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"為了延長電池續航力,節約耗電量模式會降低裝置效能,並限制或關閉震動、定位服務及背景數據傳輸。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當你為裝置充電時,節約耗電量模式會自動關閉。"</string>
+ <!-- no translation found for battery_saver_description (769989536172631582) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1778,6 +1778,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"所有地區"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"不允許此動作"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"應用程式 <xliff:g id="APP_NAME">%1$s</xliff:g> 目前已停用。"</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"更多詳細資料"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"要開啟 Work 設定檔嗎?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"系統將開啟你的辦公應用程式、通知、資料和其他 Work 設定檔功能"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string>
@@ -1867,8 +1870,10 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"零打擾"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"「零打擾」模式會隱藏通知,協助你集中注意力"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"這是新的行為。輕觸即可變更。"</string>
+ <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
+ <skip />
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"「零打擾」設定已變更"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"輕觸即可查看遭封鎖的項目。"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"系統"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index fb794fd..be929a1 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -275,7 +275,7 @@
<string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithole ukufinyelela koxhumana nabo?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Indawo"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"finyelela kundawo yale divayisi"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele indawo yale divayisi?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ingene kundawo yale divayisi?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"finyelela kukhalenda yakho"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kukhalenda yakho?"</string>
@@ -1014,8 +1014,7 @@
<string name="dial" msgid="1253998302767701559">"Shaya"</string>
<string name="dial_desc" msgid="6573723404985517250">"Ikholi ikhethe inombolo yefoni"</string>
<string name="map" msgid="5441053548030107189">"Imephu"</string>
- <!-- no translation found for map_desc (1836995341943772348) -->
- <skip />
+ <string name="map_desc" msgid="1836995341943772348">"Thola ikheli elikhethiwe"</string>
<string name="browse" msgid="1245903488306147205">"Vula"</string>
<string name="browse_desc" msgid="8220976549618935044">"Vula i-URL ekhethiwe"</string>
<string name="sms" msgid="4560537514610063430">"Umlayezo"</string>
@@ -1691,7 +1690,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Kufakwe umlawuli wakho"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Kubuyekezwe umlawuli wakho"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Kususwe umlawuli wakho"</string>
- <string name="battery_saver_description" msgid="4660824093877546730">"Ukuze kunwetshwe impilo yebhethri, Isilondolozi sebhethri sehlisa ukusebenza kwedivayisi yakho siphinde sikhawulele noma sivale ukudlidliza, amasevisi endawo, nedatha engemuva. I-imeyili, ukulayeza, nezinye izinhlelo zokusebenza ezithembele ekuvunyelanisweni kungenzeka zingabuyekezi ngaphandle kokuthi uzivule.\n\nIsilondolozi sebhethri sivalwa ngokuzenzakalela uma idivayisi yakho ishaja."</string>
+ <string name="battery_saver_description" msgid="769989536172631582">"Ukuze unwebise impilo yebhethri, iseva yebhethri iyavala ezinye izici zedivayisi futhi ikhawulele izinhlelo zokusebenza."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vula iseva yedatha?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Vula"</string>
@@ -1778,6 +1777,9 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Zonke izilimi"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Zonke izifunda"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Sesha"</string>
+ <string name="app_suspended_title" msgid="5360409799785895488">"Isenzo asivunyelwe"</string>
+ <string name="app_suspended_default_message" msgid="5876776530189983288">"Uhlelo lokusebenza <xliff:g id="APP_NAME">%1$s</xliff:g> okwamanje likhutshaziwe."</string>
+ <string name="app_suspended_more_details" msgid="2901244470963918402">"Eminye imininingwane"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Vula iphrofayela yomsebenzi?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Izinhlelo zakho zokusebenza zomsebenzi, izaziso, idatha, nezinye izici zephrofayela yomsebenzi kuzovulwa"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Vula"</string>
@@ -1867,8 +1869,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Amakholi nezaziso zizothuliswa"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Ushintsho lwesistimu"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ungaphazamasi"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Okuthi Ungaphazamisi kufihla izaziso ukukusiza ukuthi ugxile"</string>
- <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Lokhu ukuziphatha okusha. Thepha ukuze ushintshe."</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Ukungaphazamisi kufihle izaziso"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Thepha ukuze ufunde kabanzi futhi ushintshe."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ukungaphazamisi kushintshile"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Thepha ukuze uhlole ukuthi yini evinjelwe."</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"Isistimu"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fe34d98..21c10ce 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3089,6 +3089,9 @@
See {@link android.view.View#setAccessibilityPaneTitle(CharSequence)} -->
<attr name="accessibilityPaneTitle" format="string" />
+ <!-- Whether or not this view is a heading for accessibility purposes. -->
+ <attr name="accessibilityHeading" format="boolean"/>
+
<!-- Sets the color of the spot shadow that is drawn when the view has a positive Z or
elevation value.
<p>
@@ -4956,8 +4959,6 @@
<!-- Justification by stretching word spacing. -->
<enum name="inter_word" value = "1" />
</attr>
- <!-- Whether or not this view is a heading for accessibility purposes. -->
- <attr name="accessibilityHeading" format="boolean"/>
</declare-styleable>
<declare-styleable name="TextViewAppearance">
<!-- Base text color, typeface, size, and style. -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index bd824de..04f4d6e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4704,11 +4704,13 @@
<string name="locale_search_menu">Search</string>
<!-- Title of the dialog that is shown when the user tries to launch a suspended application [CHAR LIMIT=30] -->
- <string name="app_suspended_title">Action not allowed</string>
+ <string name="app_suspended_title">Can\u2019t open app</string>
<!-- Default message shown in the dialog that is shown when the user tries to launch a suspended application [CHAR LIMIT=NONE] -->
- <string name="app_suspended_default_message">The application <xliff:g id="app_name" example="GMail">%1$s</xliff:g> is currently disabled.</string>
+ <string name="app_suspended_default_message">
+ The app <xliff:g id="app_name" example="Gmail">%1$s</xliff:g> isn\u2019t available right now. This is managed by <xliff:g id="app_name" example="Settings">%2$s</xliff:g>.
+ </string>
<!-- Title of the button to show users more details about why the app has been suspended [CHAR LIMIT=50]-->
- <string name="app_suspended_more_details">More details</string>
+ <string name="app_suspended_more_details">Learn more</string>
<!-- Title of a dialog. The string is asking if the user wants to turn on their work profile, which contains work apps that are managed by their employer. "Work" is an adjective. [CHAR LIMIT=30] -->
<string name="work_mode_off_title">Turn on work profile?</string>
diff --git a/core/res/res/xml/default_zen_mode_config.xml b/core/res/res/xml/default_zen_mode_config.xml
index f1b61a7..dce8a65 100644
--- a/core/res/res/xml/default_zen_mode_config.xml
+++ b/core/res/res/xml/default_zen_mode_config.xml
@@ -18,7 +18,7 @@
-->
<!-- Default configuration for zen mode. See android.service.notification.ZenModeConfig. -->
-<zen version="6">
+<zen version="7">
<allow alarms="true" media="true" system="false" calls="false" messages="false" reminders="false"
events="false" />
<!-- all visual effects that exist as of P -->
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index b150a79..96ac589 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -247,6 +247,7 @@
Settings.Global.HDMI_CONTROL_ENABLED,
Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
+ Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE,
Settings.Global.HIDDEN_API_POLICY_P_APPS,
Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS,
Settings.Global.HIDE_ERROR_DIALOGS,
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index 2fe7db4..be3a0be 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -31,11 +31,6 @@
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.util.Patterns;
-import android.view.textclassifier.SystemTextClassifier;
-import android.view.textclassifier.TextClassificationConstants;
-import android.view.textclassifier.TextClassifier;
-import android.view.textclassifier.TextClassifierImpl;
-import android.view.textclassifier.TextLinks.TextLinkSpan;
import android.widget.TextView;
import org.junit.After;
@@ -43,11 +38,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
import java.util.Locale;
-import java.util.Set;
/**
* LinkifyTest tests {@link Linkify}.
@@ -158,55 +149,4 @@
assertEquals("android.com should be linkified", 1, spans.length);
assertEquals("https://android.com", spans[0].getURL());
}
-
- @Test
- public void testAddLinksAsync_useLegacyIfSmartDisabled_localTextClassifier()
- throws Exception {
- final TextClassificationConstants settings =
- TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
- final TextClassifier classifier = new TextClassifierImpl(mContext, settings);
- testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
- }
-
- @Test
- public void testAddLinksAsync_useLegacyIfSmartDisabled_systemTextClassifier()
- throws Exception {
- final TextClassificationConstants settings =
- TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
- final TextClassifier classifier = new SystemTextClassifier(mContext, settings);
- testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
- }
-
- private void testAddLinksAsync_useLegacyIfSmartDisabled(TextClassifier classifier)
- throws Exception {
- final int linkMask = Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS;
- final String string = "example@android.com\n"
- + "(415) 555-1212\n"
- + "http://android.com\n"
- + "100 Android Rd California";
- final Spannable expected = new SpannableString(string);
- final Spannable actual = new SpannableString(string);
-
- Linkify.addLinks(expected, linkMask); // legacy.
- Linkify.addLinksAsync(actual, classifier, linkMask).get();
-
- final URLSpan[] expectedSpans = expected.getSpans(0, expected.length(), URLSpan.class);
- final TextLinkSpan[] actualSpans = actual.getSpans(0, actual.length(), TextLinkSpan.class);
- assertEquals(expectedSpans.length, actualSpans.length);
- final Set<List> expectedLinkSpec = new HashSet<>();
- final Set<List> actualLinkSpec = new HashSet<>();
- for (int i = 0; i < expectedSpans.length; i++) {
- final URLSpan expectedSpan = expectedSpans[i];
- final TextLinkSpan actualSpan = actualSpans[i];
- expectedLinkSpec.add(Arrays.asList(
- expected.getSpanStart(expectedSpan),
- expected.getSpanEnd(expectedSpan),
- expectedSpan.getURL()));
- actualLinkSpec.add(Arrays.asList(
- actual.getSpanStart(actualSpan),
- actual.getSpanEnd(actualSpan),
- actualSpan.getUrl()));
- }
- assertEquals(expectedLinkSpec, actualLinkSpec);
- }
}
diff --git a/keystore/java/android/security/KeyStoreException.java b/keystore/java/android/security/KeyStoreException.java
index 88e768c..30389a29d 100644
--- a/keystore/java/android/security/KeyStoreException.java
+++ b/keystore/java/android/security/KeyStoreException.java
@@ -16,12 +16,15 @@
package android.security;
+import android.annotation.TestApi;
+
/**
* KeyStore/keymaster exception with positive error codes coming from the KeyStore and negative
* ones from keymaster.
*
* @hide
*/
+@TestApi
public class KeyStoreException extends Exception {
private final int mErrorCode;
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index d95feb0..b2e0f67 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -19,6 +19,7 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.app.KeyguardManager;
import android.hardware.fingerprint.FingerprintManager;
import android.security.GateKeeper;
@@ -594,6 +595,14 @@
/**
* Returns {@code true} if the key is authorized to be used only if a test of user presence has
* been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
+ * It requires that the KeyStore implementation have a direct way to validate the user presence
+ * for example a KeyStore hardware backed strongbox can use a button press that is observable
+ * in hardware. A test for user presence is tangential to authentication. The test can be part
+ * of an authentication step as long as this step can be validated by the hardware protecting
+ * the key and cannot be spoofed. For example, a physical button press can be used as a test of
+ * user presence if the other pins connected to the button are not able to simulate a button
+ * press. There must be no way for the primary processor to fake a button press, or that
+ * button must not be used as a test of user presence.
*/
public boolean isUserPresenceRequired() {
return mUserPresenceRequired;
@@ -1180,6 +1189,14 @@
/**
* Sets whether a test of user presence is required to be performed between the
* {@code Signature.initSign()} and {@code Signature.sign()} method calls.
+ * It requires that the KeyStore implementation have a direct way to validate the user
+ * presence for example a KeyStore hardware backed strongbox can use a button press that
+ * is observable in hardware. A test for user presence is tangential to authentication. The
+ * test can be part of an authentication step as long as this step can be validated by the
+ * hardware protecting the key and cannot be spoofed. For example, a physical button press
+ * can be used as a test of user presence if the other pins connected to the button are not
+ * able to simulate a button press.There must be no way for the primary processor to fake a
+ * button press, or that button must not be used as a test of user presence.
*/
@NonNull
public Builder setUserPresenceRequired(boolean required) {
@@ -1227,6 +1244,7 @@
*
* Sets whether to include a temporary unique ID field in the attestation certificate.
*/
+ @TestApi
@NonNull
public Builder setUniqueIdIncluded(boolean uniqueIdIncluded) {
mUniqueIdIncluded = uniqueIdIncluded;
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 92bee8d..fdcad85 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -448,7 +448,12 @@
* been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
* It requires that the KeyStore implementation have a direct way to validate the user presence
* for example a KeyStore hardware backed strongbox can use a button press that is observable
- * in hardware.
+ * in hardware. A test for user presence is tangential to authentication. The test can be part
+ * of an authentication step as long as this step can be validated by the hardware protecting
+ * the key and cannot be spoofed. For example, a physical button press can be used as a test of
+ * user presence if the other pins connected to the button are not able to simulate a button
+ * press. There must be no way for the primary processor to fake a button press, or that
+ * button must not be used as a test of user presence.
*/
public boolean isUserPresenceRequired() {
return mUserPresenceRequred;
@@ -845,7 +850,15 @@
/**
* Sets whether a test of user presence is required to be performed between the
- * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
+ * {@code Signature.initSign()} and {@code Signature.sign()} method calls. It requires that
+ * the KeyStore implementation have a direct way to validate the user presence for example
+ * a KeyStore hardware backed strongbox can use a button press that is observable in
+ * hardware. A test for user presence is tangential to authentication. The test can be part
+ * of an authentication step as long as this step can be validated by the hardware
+ * protecting the key and cannot be spoofed. For example, a physical button press can be
+ * used as a test of user presence if the other pins connected to the button are not able
+ * to simulate a button press. There must be no way for the primary processor to fake a
+ * button press, or that button must not be used as a test of user presence.
*/
@NonNull
public Builder setUserPresenceRequired(boolean required) {
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index de4eaf5..a27d519 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -340,33 +340,21 @@
srcs: [
"tests/unit/main.cpp",
- "tests/unit/BakedOpDispatcherTests.cpp",
- "tests/unit/BakedOpRendererTests.cpp",
- "tests/unit/BakedOpStateTests.cpp",
"tests/unit/CacheManagerTests.cpp",
"tests/unit/CanvasContextTests.cpp",
"tests/unit/CanvasStateTests.cpp",
"tests/unit/ClipAreaTests.cpp",
"tests/unit/DamageAccumulatorTests.cpp",
"tests/unit/DeferredLayerUpdaterTests.cpp",
- "tests/unit/DeviceInfoTests.cpp",
"tests/unit/FatVectorTests.cpp",
- "tests/unit/FontRendererTests.cpp",
- "tests/unit/FrameBuilderTests.cpp",
- "tests/unit/GlopBuilderTests.cpp",
"tests/unit/GpuMemoryTrackerTests.cpp",
- "tests/unit/GradientCacheTests.cpp",
"tests/unit/GraphicsStatsServiceTests.cpp",
"tests/unit/LayerUpdateQueueTests.cpp",
- "tests/unit/LeakCheckTests.cpp",
"tests/unit/LinearAllocatorTests.cpp",
"tests/unit/MatrixTests.cpp",
- "tests/unit/MeshStateTests.cpp",
- "tests/unit/OffscreenBufferPoolTests.cpp",
"tests/unit/OpDumperTests.cpp",
"tests/unit/PathInterpolatorTests.cpp",
"tests/unit/RenderNodeDrawableTests.cpp",
- "tests/unit/RecordingCanvasTests.cpp",
"tests/unit/RenderNodeTests.cpp",
"tests/unit/RenderPropertiesTests.cpp",
"tests/unit/ShaderCacheTests.cpp",
@@ -378,8 +366,6 @@
"tests/unit/SnapshotTests.cpp",
"tests/unit/StringUtilsTests.cpp",
"tests/unit/TestUtilsTests.cpp",
- "tests/unit/TextDropShadowCacheTests.cpp",
- "tests/unit/TextureCacheTests.cpp",
"tests/unit/ThreadBaseTests.cpp",
"tests/unit/TypefaceTests.cpp",
"tests/unit/VectorDrawableTests.cpp",
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 7b14322..0d1257f 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -193,15 +193,12 @@
}
char prop[PROPERTY_VALUE_MAX];
property_get(PROPERTY_RENDERER, prop, "skiagl");
- if (!strcmp(prop, "skiagl")) {
- ALOGD("Skia GL Pipeline");
- sRenderPipelineType = RenderPipelineType::SkiaGL;
- } else if (!strcmp(prop, "skiavk")) {
+ if (!strcmp(prop, "skiavk")) {
ALOGD("Skia Vulkan Pipeline");
sRenderPipelineType = RenderPipelineType::SkiaVulkan;
- } else { //"opengl"
- ALOGD("HWUI GL Pipeline");
- sRenderPipelineType = RenderPipelineType::OpenGL;
+ } else { //"skiagl"
+ ALOGD("Skia GL Pipeline");
+ sRenderPipelineType = RenderPipelineType::SkiaGL;
}
return sRenderPipelineType;
}
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 1a0bdfd..03a3e36 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -206,7 +206,7 @@
enum class StencilClipDebug { Hide, ShowHighlight, ShowRegion };
-enum class RenderPipelineType { OpenGL = 0, SkiaGL, SkiaVulkan, NotInitialized = 128 };
+enum class RenderPipelineType { SkiaGL, SkiaVulkan, NotInitialized = 128 };
/**
* Renderthread-only singleton which manages several static rendering properties. Most of these
diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp
index 5d33860..b03fa3c 100644
--- a/libs/hwui/hwui/MinikinSkia.cpp
+++ b/libs/hwui/hwui/MinikinSkia.cpp
@@ -81,7 +81,6 @@
skPaint.getFontMetrics(&metrics);
extent->ascent = metrics.fAscent;
extent->descent = metrics.fDescent;
- extent->line_gap = metrics.fLeading;
}
SkTypeface* MinikinFontSkia::GetSkTypeface() const {
diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index 5b69bb7..a785591 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -78,8 +78,7 @@
const minikin::EndHyphenEdit endHyphen = minikin::endHyphenEdit(hyphenEdit);
return minikin::Layout::measureText(textBuf, range, bidiFlags, minikinPaint, startHyphen,
- endHyphen, advances, nullptr /* extent */,
- nullptr /* layout pieces */);
+ endHyphen, advances, nullptr /* layout pieces */);
}
bool MinikinUtils::hasVariationSelector(const Typeface* typeface, uint32_t codepoint, uint32_t vs) {
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index d983200..a0fc83e 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -65,9 +65,6 @@
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- return new CanvasContext(thread, translucent, rootRenderNode, contextFactory,
- std::make_unique<OpenGLPipeline>(thread));
case RenderPipelineType::SkiaGL:
return new CanvasContext(thread, translucent, rootRenderNode, contextFactory,
std::make_unique<skiapipeline::SkiaOpenGLPipeline>(thread));
@@ -82,28 +79,13 @@
}
void CanvasContext::destroyLayer(RenderNode* node) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::destroyLayer(node);
- break;
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan:
- skiapipeline::SkiaPipeline::destroyLayer(node);
- break;
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
- }
+ skiapipeline::SkiaPipeline::destroyLayer(node);
}
void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor) {
ATRACE_CALL();
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::invokeFunctor(thread, functor);
- break;
case RenderPipelineType::SkiaGL:
skiapipeline::SkiaOpenGLPipeline::invokeFunctor(thread, functor);
break;
@@ -117,19 +99,7 @@
}
void CanvasContext::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::prepareToDraw(thread, bitmap);
- break;
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan:
- skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap);
- break;
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
- }
+ skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap);
}
CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
@@ -582,37 +552,15 @@
}
void CanvasContext::trimMemory(RenderThread& thread, int level) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL: {
- // No context means nothing to free
- if (!thread.eglManager().hasEglContext()) return;
- ATRACE_CALL();
- if (level >= TRIM_MEMORY_COMPLETE) {
- thread.renderState().flush(Caches::FlushMode::Full);
- thread.eglManager().destroy();
- } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
- thread.renderState().flush(Caches::FlushMode::Moderate);
- }
- break;
- }
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan: {
- // No context means nothing to free
- if (!thread.getGrContext()) return;
- ATRACE_CALL();
- if (level >= TRIM_MEMORY_COMPLETE) {
- thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
- thread.eglManager().destroy();
- thread.vulkanManager().destroy();
- } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
- thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
- }
- break;
- }
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
+ ATRACE_CALL();
+ if (!thread.getGrContext()) return;
+ ATRACE_CALL();
+ if (level >= TRIM_MEMORY_COMPLETE) {
+ thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
+ thread.eglManager().destroy();
+ thread.vulkanManager().destroy();
+ } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
+ thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
}
}
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 4b154e6..f4d230e 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -175,16 +175,6 @@
String8 pipeline;
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL: {
- if (Caches::hasInstance()) {
- cachesOutput.appendFormat("Caches:\n");
- Caches::getInstance().dumpMemoryUsage(cachesOutput);
- } else {
- cachesOutput.appendFormat("No caches instance.");
- }
- pipeline.appendFormat("FrameBuilder");
- break;
- }
case RenderPipelineType::SkiaGL: {
mCacheManager->dumpMemoryUsage(cachesOutput, mRenderState);
pipeline.appendFormat("Skia (OpenGL)");
@@ -208,9 +198,6 @@
if (!mReadback) {
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- mReadback = new OpenGLReadbackImpl(*this);
- break;
case RenderPipelineType::SkiaGL:
mReadback = new skiapipeline::SkiaOpenGLReadback(*this);
break;
@@ -344,8 +331,6 @@
sk_sp<Bitmap> RenderThread::allocateHardwareBitmap(SkBitmap& skBitmap) {
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- return OpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
case RenderPipelineType::SkiaGL:
return skiapipeline::SkiaOpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
case RenderPipelineType::SkiaVulkan:
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 4723759..62f820a 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -239,11 +239,14 @@
mQueueSubmit(mBackendContext->fQueue, 1, &submitInfo, backbuffer->mUsageFences[0]);
// We need to notify Skia that we changed the layout of the wrapped VkImage
- GrVkImageInfo* imageInfo;
sk_sp<SkSurface> skSurface = surface->mImageInfos[backbuffer->mImageIndex].mSurface;
- skSurface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
- SkSurface::kFlushRead_BackendHandleAccess);
- imageInfo->updateImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ GrBackendRenderTarget backendRT = skSurface->getBackendRenderTarget(
+ SkSurface::kFlushRead_BackendHandleAccess);
+ if (!backendRT.isValid()) {
+ SkASSERT(backendRT.isValid());
+ return nullptr;
+ }
+ backendRT.setVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
surface->mBackbuffer = std::move(skSurface);
return surface->mBackbuffer.get();
@@ -608,16 +611,21 @@
SkASSERT(surface->mBackbuffers);
VulkanSurface::BackbufferInfo* backbuffer =
surface->mBackbuffers + surface->mCurrentBackbufferIndex;
- GrVkImageInfo* imageInfo;
+
SkSurface* skSurface = surface->mImageInfos[backbuffer->mImageIndex].mSurface.get();
- skSurface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
- SkSurface::kFlushRead_BackendHandleAccess);
+ GrBackendRenderTarget backendRT = skSurface->getBackendRenderTarget(
+ SkSurface::kFlushRead_BackendHandleAccess);
+ SkASSERT(backendRT.isValid());
+
+ GrVkImageInfo imageInfo;
+ SkAssertResult(backendRT.getVkImageInfo(&imageInfo));
+
// Check to make sure we never change the actually wrapped image
- SkASSERT(imageInfo->fImage == surface->mImages[backbuffer->mImageIndex]);
+ SkASSERT(imageInfo.fImage == surface->mImages[backbuffer->mImageIndex]);
// We need to transition the image to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR and make sure that all
// previous work is complete for before presenting. So we first add the necessary barrier here.
- VkImageLayout layout = imageInfo->fImageLayout;
+ VkImageLayout layout = imageInfo.fImageLayout;
VkPipelineStageFlags srcStageMask = layoutToPipelineStageFlags(layout);
VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
VkAccessFlags srcAccessMask = layoutToSrcAccessMask(layout);
diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp
index 0306498..f51e7cc 100644
--- a/libs/hwui/tests/common/TestUtils.cpp
+++ b/libs/hwui/tests/common/TestUtils.cpp
@@ -53,9 +53,7 @@
sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
renderthread::RenderThread& renderThread) {
android::uirenderer::renderthread::IRenderPipeline* pipeline;
- if (Properties::getRenderPipelineType() == RenderPipelineType::OpenGL) {
- pipeline = new renderthread::OpenGLPipeline(renderThread);
- } else if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
+ if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
pipeline = new skiapipeline::SkiaOpenGLPipeline(renderThread);
} else {
pipeline = new skiapipeline::SkiaVulkanPipeline(renderThread);
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 1bfa046..707d61a 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -60,18 +60,6 @@
Properties::overrideRenderPipelineType(oldType); \
};
-/**
- * Like gtests' TEST, but only runs with the OpenGL RenderPipelineType
- */
-#define OPENGL_PIPELINE_TEST(test_case_name, test_name) \
- class test_case_name##_##test_name##_HwuiTest { \
- public: \
- static void doTheThing(); \
- }; \
- INNER_PIPELINE_TEST(test_case_name, test_name, OpenGL, \
- test_case_name##_##test_name##_HwuiTest::doTheThing()) \
- void test_case_name##_##test_name##_HwuiTest::doTheThing()
-
#define INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, pipeline) \
INNER_PIPELINE_TEST(test_case_name, test_name, pipeline, \
TestUtils::runOnRenderThread( \
@@ -86,7 +74,6 @@
public: \
static void doTheThing(renderthread::RenderThread& renderThread); \
}; \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, OpenGL); \
INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaGL); \
/* Temporarily disabling Vulkan until we can figure out a way to stub out the driver */ \
/* INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); */ \
@@ -94,18 +81,6 @@
renderthread::RenderThread& renderThread)
/**
- * Like RENDERTHREAD_TEST, but only runs with the OpenGL RenderPipelineType
- */
-#define RENDERTHREAD_OPENGL_PIPELINE_TEST(test_case_name, test_name) \
- class test_case_name##_##test_name##_RenderThreadTest { \
- public: \
- static void doTheThing(renderthread::RenderThread& renderThread); \
- }; \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, OpenGL); \
- void test_case_name##_##test_name##_RenderThreadTest::doTheThing( \
- renderthread::RenderThread& renderThread)
-
-/**
* Like RENDERTHREAD_TEST, but only runs with the Skia RenderPipelineTypes
*/
#define RENDERTHREAD_SKIA_PIPELINE_TEST(test_case_name, test_name) \
diff --git a/libs/hwui/tests/macrobench/main.cpp b/libs/hwui/tests/macrobench/main.cpp
index 072719b..6f3d922 100644
--- a/libs/hwui/tests/macrobench/main.cpp
+++ b/libs/hwui/tests/macrobench/main.cpp
@@ -66,7 +66,7 @@
--onscreen Render tests on device screen. By default tests
are offscreen rendered
--benchmark_format Set output format. Possible values are tabular, json, csv
- --renderer=TYPE Sets the render pipeline to use. May be opengl, skiagl, or skiavk
+ --renderer=TYPE Sets the render pipeline to use. May be skiagl or skiavk
--render-ahead=NUM Sets how far to render-ahead. Must be 0 (default), 1, or 2.
)");
}
@@ -147,9 +147,7 @@
}
static bool setRenderer(const char* renderer) {
- if (!strcmp(renderer, "opengl")) {
- Properties::overrideRenderPipelineType(RenderPipelineType::OpenGL);
- } else if (!strcmp(renderer, "skiagl")) {
+ if (!strcmp(renderer, "skiagl")) {
Properties::overrideRenderPipelineType(RenderPipelineType::SkiaGL);
} else if (!strcmp(renderer, "skiavk")) {
Properties::overrideRenderPipelineType(RenderPipelineType::SkiaVulkan);
diff --git a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
deleted file mode 100644
index 09f0b06..0000000
--- a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpDispatcher.h>
-#include <BakedOpRenderer.h>
-#include <FrameBuilder.h>
-#include <LayerUpdateQueue.h>
-#include <RecordedOp.h>
-#include <hwui/Paint.h>
-#include <tests/common/TestUtils.h>
-#include <utils/Color.h>
-
-#include <SkBlurDrawLooper.h>
-#include <SkDashPathEffect.h>
-#include <SkPath.h>
-
-using namespace android::uirenderer;
-
-static BakedOpRenderer::LightInfo sLightInfo;
-const FrameBuilder::LightGeometry sLightGeometry = {{100, 100, 100}, 50};
-
-class ValidatingBakedOpRenderer : public BakedOpRenderer {
-public:
- ValidatingBakedOpRenderer(RenderState& renderState,
- std::function<void(const Glop& glop)> validator)
- : BakedOpRenderer(Caches::getInstance(), renderState, true, false, sLightInfo)
- , mValidator(validator) {
- mGlopReceiver = ValidatingGlopReceiver;
- }
-
-private:
- static void ValidatingGlopReceiver(BakedOpRenderer& renderer, const Rect* dirtyBounds,
- const ClipBase* clip, const Glop& glop) {
- auto vbor = reinterpret_cast<ValidatingBakedOpRenderer*>(&renderer);
- vbor->mValidator(glop);
- }
- std::function<void(const Glop& glop)> mValidator;
-};
-
-typedef void (*TestBakedOpReceiver)(BakedOpRenderer&, const BakedOpState&);
-
-static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, RecordedOp* op,
- std::function<void(const Glop& glop)> glopVerifier,
- int expectedGlopCount = 1) {
- // Create op, and wrap with basic state.
- LinearAllocator allocator;
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 100));
- auto state = BakedOpState::tryConstruct(allocator, *snapshot, *op);
- ASSERT_NE(nullptr, state);
-
- int glopCount = 0;
- auto glopReceiver = [&glopVerifier, &glopCount, &expectedGlopCount](const Glop& glop) {
- ASSERT_LE(glopCount++, expectedGlopCount) << expectedGlopCount << "glop(s) expected";
- glopVerifier(glop);
- };
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), glopReceiver);
-
-// Dispatch based on op type created, similar to Frame/LayerBuilder dispatch behavior
-#define X(Type) \
- [](BakedOpRenderer& renderer, const BakedOpState& state) { \
- BakedOpDispatcher::on##Type(renderer, static_cast<const Type&>(*(state.op)), state); \
- },
- static TestBakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
-#undef X
- unmergedReceivers[op->opId](renderer, *state);
- ASSERT_EQ(expectedGlopCount, glopCount) << "Exactly " << expectedGlopCount
- << "Glop(s) expected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, pathTexture_positionOvalArc) {
- SkPaint strokePaint;
- strokePaint.setStyle(SkPaint::kStroke_Style);
- strokePaint.setStrokeWidth(4);
-
- float intervals[] = {1.0f, 1.0f};
- strokePaint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0));
-
- auto textureGlopVerifier = [](const Glop& glop) {
- // validate glop produced by renderPathTexture (so texture, unit quad)
- auto texture = glop.fill.texture.texture;
- ASSERT_NE(nullptr, texture);
- float expectedOffset = floor(4 * 1.5f + 0.5f);
- EXPECT_EQ(expectedOffset, reinterpret_cast<PathTexture*>(texture)->offset)
- << "Should see conservative offset from PathCache::computeBounds";
- Rect expectedBounds(10, 15, 20, 25);
- expectedBounds.outset(expectedOffset);
-
- Matrix4 expectedModelView;
- expectedModelView.loadTranslate(10 - expectedOffset, 15 - expectedOffset, 0);
- expectedModelView.scale(10 + 2 * expectedOffset, 10 + 2 * expectedOffset, 1);
- EXPECT_EQ(expectedModelView, glop.transform.modelView)
- << "X and Y offsets, and scale both applied to model view";
- };
-
- // Arc and Oval will render functionally the same glop, differing only in texture content
- ArcOp arcOp(Rect(10, 15, 20, 25), Matrix4::identity(), nullptr, &strokePaint, 0, 270, true);
- testUnmergedGlopDispatch(renderThread, &arcOp, textureGlopVerifier);
-
- OvalOp ovalOp(Rect(10, 15, 20, 25), Matrix4::identity(), nullptr, &strokePaint);
- testUnmergedGlopDispatch(renderThread, &ovalOp, textureGlopVerifier);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, onLayerOp_bufferless) {
- SkPaint layerPaint;
- layerPaint.setAlpha(128);
- OffscreenBuffer* buffer = nullptr; // no providing a buffer, should hit rect fallback case
- LayerOp op(Rect(10, 10), Matrix4::identity(), nullptr, &layerPaint, &buffer);
- testUnmergedGlopDispatch(renderThread, &op,
- [](const Glop& glop) { ADD_FAILURE() << "Nothing should happen"; }, 0);
-}
-
-static int getGlopTransformFlags(renderthread::RenderThread& renderThread, RecordedOp* op) {
- int result = 0;
- testUnmergedGlopDispatch(renderThread, op, [&result](const Glop& glop) {
- result = glop.transform.transformFlags;
- });
- return result;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, offsetFlags) {
- Rect bounds(10, 15, 20, 25);
- SkPaint paint;
- SkPaint aaPaint;
- aaPaint.setAntiAlias(true);
-
- RoundRectOp roundRectOp(bounds, Matrix4::identity(), nullptr, &paint, 0, 270);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &roundRectOp))
- << "Expect no offset for round rect op.";
-
- const float points[4] = {0.5, 0.5, 1.0, 1.0};
- PointsOp antiAliasedPointsOp(bounds, Matrix4::identity(), nullptr, &aaPaint, points, 4);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &antiAliasedPointsOp))
- << "Expect no offset for AA points.";
- PointsOp pointsOp(bounds, Matrix4::identity(), nullptr, &paint, points, 4);
- EXPECT_EQ(TransformFlags::OffsetByFudgeFactor, getGlopTransformFlags(renderThread, &pointsOp))
- << "Expect an offset for non-AA points.";
-
- LinesOp antiAliasedLinesOp(bounds, Matrix4::identity(), nullptr, &aaPaint, points, 4);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &antiAliasedLinesOp))
- << "Expect no offset for AA lines.";
- LinesOp linesOp(bounds, Matrix4::identity(), nullptr, &paint, points, 4);
- EXPECT_EQ(TransformFlags::OffsetByFudgeFactor, getGlopTransformFlags(renderThread, &linesOp))
- << "Expect an offset for non-AA lines.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, renderTextWithShadow) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- android::Paint shadowPaint;
- shadowPaint.setColor(SK_ColorRED);
-
- SkScalar sigma = Blur::convertRadiusToSigma(5);
- shadowPaint.setLooper(SkBlurDrawLooper::Make(SK_ColorWHITE, sigma, 3, 3));
-
- TestUtils::drawUtf8ToCanvas(&canvas, "A", shadowPaint, 25, 25);
- TestUtils::drawUtf8ToCanvas(&canvas, "B", shadowPaint, 50, 50);
- });
-
- int glopCount = 0;
- auto glopReceiver = [&glopCount](const Glop& glop) {
- if (glopCount < 2) {
- // two white shadows
- EXPECT_EQ(FloatColor({1, 1, 1, 1}), glop.fill.color);
- } else {
- // two text draws merged into one, drawn after both shadows
- EXPECT_EQ(FloatColor({1, 0, 0, 1}), glop.fill.color);
- }
- glopCount++;
- };
-
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), glopReceiver);
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- ASSERT_EQ(3, glopCount) << "Exactly three glops expected";
-}
-
-static void validateLayerDraw(renderthread::RenderThread& renderThread,
- std::function<void(const Glop& glop)> validator) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
-
- // provide different blend mode, so decoration draws contrast
- props.mutateLayerProperties().setXferMode(SkBlendMode::kSrc);
- canvas.drawColor(Color::Black, SkBlendMode::kSrcOver);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- auto syncedNode = TestUtils::getSyncedNode(node);
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
- {
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(0, 0, 100, 100));
-
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), validator);
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- }
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-static FloatColor makeFloatColor(uint32_t color) {
- FloatColor c;
- c.set(color);
- return c;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, layerUpdateProperties) {
- for (bool debugOverdraw : {false, true}) {
- for (bool debugLayersUpdates : {false, true}) {
- ScopedProperty<bool> ovdProp(Properties::debugOverdraw, debugOverdraw);
- ScopedProperty<bool> lupProp(Properties::debugLayersUpdates, debugLayersUpdates);
-
- int glopCount = 0;
- validateLayerDraw(renderThread, [&glopCount, &debugLayersUpdates](const Glop& glop) {
- if (glopCount == 0) {
- // 0 - Black layer fill
- EXPECT_TRUE(glop.fill.colorEnabled);
- EXPECT_EQ(makeFloatColor(Color::Black), glop.fill.color);
- } else if (glopCount == 1) {
- // 1 - Uncolored (textured) layer draw
- EXPECT_FALSE(glop.fill.colorEnabled);
- } else if (glopCount == 2) {
- // 2 - layer overlay, if present
- EXPECT_TRUE(glop.fill.colorEnabled);
- // blend srcover, different from that of layer
- EXPECT_EQ(GLenum(GL_ONE), glop.blend.src);
- EXPECT_EQ(GLenum(GL_ONE_MINUS_SRC_ALPHA), glop.blend.dst);
- EXPECT_EQ(makeFloatColor(debugLayersUpdates ? 0x7f00ff00 : 0), glop.fill.color)
- << "Should be transparent green if debugLayersUpdates";
- } else if (glopCount < 7) {
- // 3 - 6 - overdraw indicator overlays, if present
- EXPECT_TRUE(glop.fill.colorEnabled);
- uint32_t expectedColor = Caches::getInstance().getOverdrawColor(glopCount - 2);
- ASSERT_EQ(makeFloatColor(expectedColor), glop.fill.color);
- } else {
- ADD_FAILURE() << "Too many glops observed";
- }
- glopCount++;
- });
- int expectedCount = 2;
- if (debugLayersUpdates || debugOverdraw) expectedCount++;
- if (debugOverdraw) expectedCount += 4;
- EXPECT_EQ(expectedCount, glopCount);
- }
- }
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, pathTextureSnapping) {
- Rect bounds(10, 15, 20, 25);
- SkPaint paint;
- SkPath path;
- path.addRect(SkRect::MakeXYWH(1.5, 3.8, 100, 90));
- PathOp op(bounds, Matrix4::identity(), nullptr, &paint, &path);
- testUnmergedGlopDispatch(renderThread, &op, [](const Glop& glop) {
- auto texture = glop.fill.texture.texture;
- ASSERT_NE(nullptr, texture);
- EXPECT_EQ(1, reinterpret_cast<PathTexture*>(texture)->left);
- EXPECT_EQ(3, reinterpret_cast<PathTexture*>(texture)->top);
- });
-}
diff --git a/libs/hwui/tests/unit/BakedOpRendererTests.cpp b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
deleted file mode 100644
index 1a3ec39..0000000
--- a/libs/hwui/tests/unit/BakedOpRendererTests.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpRenderer.h>
-#include <GlopBuilder.h>
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-
-const BakedOpRenderer::LightInfo sLightInfo = {128, 128};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, startRepaintLayer_clear) {
- BakedOpRenderer renderer(Caches::getInstance(), renderThread.renderState(), true, false,
- sLightInfo);
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200u, 200u);
-
- layer.dirty(Rect(200, 200));
- {
- renderer.startRepaintLayer(&layer, Rect(200, 200));
- EXPECT_TRUE(layer.region.isEmpty()) << "Repaint full layer should clear region";
- renderer.endLayer();
- }
-
- layer.dirty(Rect(200, 200));
- {
- renderer.startRepaintLayer(&layer, Rect(100, 200)); // repainting left side
- EXPECT_TRUE(layer.region.isRect());
- // ALOGD("bounds %d %d %d %d", RECT_ARGS(layer.region.getBounds()));
- EXPECT_EQ(android::Rect(100, 0, 200, 200), layer.region.getBounds())
- << "Left side being repainted, so right side should be clear";
- renderer.endLayer();
- }
-
- // right side is now only dirty portion
- {
- renderer.startRepaintLayer(&layer, Rect(100, 0, 200, 200)); // repainting right side
- EXPECT_TRUE(layer.region.isEmpty())
- << "Now right side being repainted, so region should be entirely clear";
- renderer.endLayer();
- }
-}
-
-static void drawFirstOp(RenderState& renderState, int color, SkBlendMode mode) {
- BakedOpRenderer renderer(Caches::getInstance(), renderState, true, false, sLightInfo);
-
- renderer.startFrame(100, 100, Rect(100, 100));
- SkPaint paint;
- paint.setColor(color);
- paint.setBlendMode(mode);
-
- Rect dest(0, 0, 100, 100);
- Glop glop;
- GlopBuilder(renderState, Caches::getInstance(), &glop)
- .setRoundRectClipState(nullptr)
- .setMeshUnitQuad()
- .setFillPaint(paint, 1.0f)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewMapUnitToRectSnap(dest)
- .build();
- renderer.renderGlop(nullptr, nullptr, glop);
- renderer.endFrame(Rect(100, 100));
-}
-
-static void verifyBlend(RenderState& renderState, GLenum expectedSrc, GLenum expectedDst) {
- EXPECT_TRUE(renderState.blend().getEnabled());
- GLenum src;
- GLenum dst;
- renderState.blend().getFactors(&src, &dst);
- EXPECT_EQ(expectedSrc, src);
- EXPECT_EQ(expectedDst, dst);
-}
-
-static void verifyBlendDisabled(RenderState& renderState) {
- EXPECT_FALSE(renderState.blend().getEnabled());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_clear) {
- // initialize blend state to nonsense value
- renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
-
- drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kClear);
- verifyBlend(renderThread.renderState(), GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_srcover) {
- // initialize blend state to nonsense value
- renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
-
- drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kSrcOver);
- verifyBlendDisabled(renderThread.renderState());
-}
diff --git a/libs/hwui/tests/unit/BakedOpStateTests.cpp b/libs/hwui/tests/unit/BakedOpStateTests.cpp
deleted file mode 100644
index 6f8e249..0000000
--- a/libs/hwui/tests/unit/BakedOpStateTests.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpState.h>
-#include <ClipArea.h>
-#include <RecordedOp.h>
-#include <tests/common/TestUtils.h>
-
-namespace android {
-namespace uirenderer {
-
-TEST(ResolvedRenderState, construct) {
- LinearAllocator allocator;
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
- RectOp recordedOp(Rect(30, 40, 100, 200), translate10x20, &clip, &paint);
- {
- // recorded with transform, no parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_MATRIX_APPROX_EQ(state.transform, translate10x20);
- EXPECT_EQ(Rect(100, 200), state.clipRect());
- EXPECT_EQ(Rect(40, 60, 100, 200), state.clippedBounds); // translated and also clipped
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }
- {
- // recorded with transform and parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
-
- Matrix4 expectedTranslate;
- expectedTranslate.loadTranslate(20, 40, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedTranslate, state.transform);
-
- // intersection of parent & transformed child clip
- EXPECT_EQ(Rect(10, 20, 100, 200), state.clipRect());
-
- // translated and also clipped
- EXPECT_EQ(Rect(50, 80, 100, 200), state.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }
-}
-
-TEST(ResolvedRenderState, computeLocalSpaceClip) {
- LinearAllocator allocator;
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
- RectOp recordedOp(Rect(1000, 1000), translate10x20, &clip, &paint);
- {
- // recorded with transform, no parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_EQ(Rect(-10, -20, 90, 180), state.computeLocalSpaceClip())
- << "Local clip rect should be 100x200, offset by -10,-20";
- }
- {
- // recorded with transform + parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_EQ(Rect(-10, -20, 80, 160), state.computeLocalSpaceClip())
- << "Local clip rect should be 90x190, offset by -10,-20";
- }
-}
-
-const float HAIRLINE = 0.0f;
-
-// Note: bounds will be conservative, but not precise for non-hairline
-// - use approx bounds checks for these
-const float SEMI_HAIRLINE = 0.3f;
-
-struct StrokeTestCase {
- float scale;
- float strokeWidth;
- const std::function<void(const ResolvedRenderState&)> validator;
-};
-
-const static StrokeTestCase sStrokeTestCases[] = {
- {1, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(49.5f, 49.5f, 150.5f, 150.5f), state.clippedBounds);
- }},
- {1, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(49.5f, 49.5f, 150.5f, 150.5f));
- EXPECT_TRUE(Rect(49, 49, 151, 151).contains(state.clippedBounds));
- }},
- {1, 20,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(40, 40, 160, 160), state.clippedBounds);
- }},
-
- // 3x3 scale:
- {3, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(149.5f, 149.5f, 200, 200), state.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }},
- {3, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(149.5f, 149.5f, 200, 200));
- EXPECT_TRUE(Rect(149, 149, 200, 200).contains(state.clippedBounds));
- }},
- {3, 20,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(120, 120, 200, 200));
- EXPECT_TRUE(Rect(119, 119, 200, 200).contains(state.clippedBounds));
- }},
-
- // 0.5f x 0.5f scale
- {0.5f, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(24.5f, 24.5f, 75.5f, 75.5f), state.clippedBounds);
- }},
- {0.5f, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(24.5f, 24.5f, 75.5f, 75.5f));
- EXPECT_TRUE(Rect(24, 24, 76, 76).contains(state.clippedBounds));
- }},
- {0.5f, 20, [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(19.5f, 19.5f, 80.5f, 80.5f));
- EXPECT_TRUE(Rect(19, 19, 81, 81).contains(state.clippedBounds));
- }}};
-
-TEST(ResolvedRenderState, construct_expandForStroke) {
- LinearAllocator allocator;
- // Loop over table of test cases and verify different combinations of stroke width and transform
- for (auto&& testCase : sStrokeTestCases) {
- SkPaint strokedPaint;
- strokedPaint.setAntiAlias(true);
- strokedPaint.setStyle(SkPaint::kStroke_Style);
- strokedPaint.setStrokeWidth(testCase.strokeWidth);
-
- ClipRect clip(Rect(200, 200));
- RectOp recordedOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &strokedPaint);
-
- Matrix4 snapshotMatrix;
- snapshotMatrix.loadScale(testCase.scale, testCase.scale, 1);
- auto parentSnapshot = TestUtils::makeSnapshot(snapshotMatrix, Rect(200, 200));
-
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, true, false);
- testCase.validator(state);
- }
-}
-
-TEST(BakedOpState, tryConstruct) {
- Matrix4 translate100x0;
- translate100x0.loadTranslate(100, 0, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
-
- LinearAllocator allocator;
- RectOp successOp(Rect(30, 40, 100, 200), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- EXPECT_NE(nullptr, BakedOpState::tryConstruct(allocator, *snapshot, successOp))
- << "successOp NOT rejected by clip, so should be constructed";
- size_t successAllocSize = allocator.usedSize();
- EXPECT_LE(64u, successAllocSize) << "relatively large alloc for non-rejected op";
-
- RectOp rejectOp(Rect(30, 40, 100, 200), translate100x0, &clip, &paint);
- EXPECT_EQ(nullptr, BakedOpState::tryConstruct(allocator, *snapshot, rejectOp))
- << "rejectOp rejected by clip, so should not be constructed";
-
- // NOTE: this relies on the clip having already been serialized by the op above
- EXPECT_EQ(successAllocSize, allocator.usedSize()) << "no extra allocation used for rejected op";
-}
-
-TEST(BakedOpState, tryShadowOpConstruct) {
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- LinearAllocator allocator;
- {
- auto snapshot = TestUtils::makeSnapshot(translate10x20, Rect()); // Note: empty clip
- BakedOpState* bakedState =
- BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234);
-
- EXPECT_EQ(nullptr, bakedState) << "op should be rejected by clip, so not constructed";
- EXPECT_EQ(0u, allocator.usedSize()) << "no serialization, even for clip,"
- "since op is quick rejected based on snapshot clip";
- }
- {
- auto snapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- BakedOpState* bakedState =
- BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234);
-
- ASSERT_NE(nullptr, bakedState) << "NOT rejected by clip, so op should be constructed";
- EXPECT_LE(64u, allocator.usedSize()) << "relatively large alloc for non-rejected op";
-
- EXPECT_MATRIX_APPROX_EQ(translate10x20, bakedState->computedState.transform);
- EXPECT_EQ(Rect(100, 200), bakedState->computedState.clippedBounds);
- }
-}
-
-TEST(BakedOpState, tryStrokeableOpConstruct) {
- LinearAllocator allocator;
- {
- // check regular rejection
- SkPaint paint;
- paint.setStyle(SkPaint::kStrokeAndFill_Style);
- paint.setStrokeWidth(0.0f);
- ClipRect clip(Rect(100, 200));
- RectOp rejectOp(Rect(100, 200), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect()); // Note: empty clip
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::StyleDefined, false);
-
- EXPECT_EQ(nullptr, bakedState);
- EXPECT_GT(8u,
- allocator.usedSize()); // no significant allocation space used for rejected op
- }
- {
- // check simple unscaled expansion
- SkPaint paint;
- paint.setStyle(SkPaint::kStrokeAndFill_Style);
- paint.setStrokeWidth(10.0f);
- ClipRect clip(Rect(200, 200));
- RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200));
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::StyleDefined, false);
-
- ASSERT_NE(nullptr, bakedState);
- EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds);
- EXPECT_EQ(0, bakedState->computedState.clipSideFlags);
- }
- {
- // check simple unscaled expansion, and fill style with stroke forced
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setStrokeWidth(10.0f);
- ClipRect clip(Rect(200, 200));
- RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200));
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::Forced, false);
-
- ASSERT_NE(nullptr, bakedState);
- EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds);
- EXPECT_EQ(0, bakedState->computedState.clipSideFlags);
- }
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/DeviceInfoTests.cpp b/libs/hwui/tests/unit/DeviceInfoTests.cpp
deleted file mode 100644
index af37938..0000000
--- a/libs/hwui/tests/unit/DeviceInfoTests.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <DeviceInfo.h>
-
-#include <gtest/gtest.h>
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-OPENGL_PIPELINE_TEST(DeviceInfo, basic) {
- // can't assert state before init - another test may have initialized the singleton
- DeviceInfo::initialize();
- const DeviceInfo* di = DeviceInfo::get();
- ASSERT_NE(nullptr, di) << "DeviceInfo initialization failed";
- EXPECT_EQ(2048, di->maxTextureSize()) << "Max texture size didn't match";
-}
diff --git a/libs/hwui/tests/unit/FontRendererTests.cpp b/libs/hwui/tests/unit/FontRendererTests.cpp
deleted file mode 100644
index c78f131..0000000
--- a/libs/hwui/tests/unit/FontRendererTests.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include "GammaFontRenderer.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android::uirenderer;
-
-static bool isZero(uint8_t* data, int size) {
- for (int i = 0; i < size; i++) {
- if (data[i]) return false;
- }
- return true;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FontRenderer, renderDropShadow) {
- SkPaint paint;
- paint.setTextSize(10);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- GammaFontRenderer gammaFontRenderer;
- FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer();
- fontRenderer.setFont(&paint, SkMatrix::I());
-
- std::vector<glyph_t> glyphs;
- std::vector<float> positions;
- float totalAdvance;
- Rect bounds;
- TestUtils::layoutTextUnscaled(paint, "This is a test", &glyphs, &positions, &totalAdvance,
- &bounds);
-
- for (int radius : {28, 20, 2}) {
- auto result = fontRenderer.renderDropShadow(&paint, glyphs.data(), glyphs.size(), radius,
- positions.data());
- ASSERT_NE(nullptr, result.image);
- EXPECT_FALSE(isZero(result.image, result.width * result.height));
- EXPECT_LE(bounds.getWidth() + radius * 2, (int)result.width);
- EXPECT_LE(bounds.getHeight() + radius * 2, (int)result.height);
- delete result.image;
- }
-}
diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp
deleted file mode 100644
index 4eb7751..0000000
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ /dev/null
@@ -1,2705 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpState.h>
-#include <DeferredLayerUpdater.h>
-#include <FrameBuilder.h>
-#include <GlLayer.h>
-#include <LayerUpdateQueue.h>
-#include <RecordedOp.h>
-#include <RecordingCanvas.h>
-#include <tests/common/TestUtils.h>
-
-#include <unordered_map>
-
-namespace android {
-namespace uirenderer {
-
-const FrameBuilder::LightGeometry sLightGeometry = {{100, 100, 100}, 50};
-
-/**
- * Virtual class implemented by each test to redirect static operation / state transitions to
- * virtual methods.
- *
- * Virtual dispatch allows for default behaviors to be specified (very common case in below tests),
- * and allows Renderer vs Dispatching behavior to be merged.
- *
- * onXXXOp methods fail by default - tests should override ops they expect
- * startRepaintLayer fails by default - tests should override if expected
- * startFrame/endFrame do nothing by default - tests should override to intercept
- */
-class TestRendererBase {
-public:
- virtual ~TestRendererBase() {}
- virtual OffscreenBuffer* startTemporaryLayer(uint32_t, uint32_t) {
- ADD_FAILURE() << "Temporary layers not expected in this test";
- return nullptr;
- }
- virtual void recycleTemporaryLayer(OffscreenBuffer*) {
- ADD_FAILURE() << "Temporary layers not expected in this test";
- }
- virtual void startRepaintLayer(OffscreenBuffer*, const Rect& repaintRect) {
- ADD_FAILURE() << "Layer repaint not expected in this test";
- }
- virtual void endLayer() { ADD_FAILURE() << "Layer updates not expected in this test"; }
- virtual void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) {}
- virtual void endFrame(const Rect& repaintRect) {}
-
-// define virtual defaults for single draw methods
-#define X(Type) \
- virtual void on##Type(const Type&, const BakedOpState&) { \
- ADD_FAILURE() << #Type " not expected in this test"; \
- }
- MAP_RENDERABLE_OPS(X)
-#undef X
-
-// define virtual defaults for merged draw methods
-#define X(Type) \
- virtual void onMerged##Type##s(const MergedBakedOpList& opList) { \
- ADD_FAILURE() << "Merged " #Type "s not expected in this test"; \
- }
- MAP_MERGEABLE_OPS(X)
-#undef X
-
- int getIndex() { return mIndex; }
-
-protected:
- int mIndex = 0;
-};
-
-/**
- * Dispatches all static methods to similar formed methods on renderer, which fail by default but
- * are overridden by subclasses per test.
- */
-class TestDispatcher {
-public:
-// define single op methods, which redirect to TestRendererBase
-#define X(Type) \
- static void on##Type(TestRendererBase& renderer, const Type& op, const BakedOpState& state) { \
- renderer.on##Type(op, state); \
- }
- MAP_RENDERABLE_OPS(X);
-#undef X
-
-// define merged op methods, which redirect to TestRendererBase
-#define X(Type) \
- static void onMerged##Type##s(TestRendererBase& renderer, const MergedBakedOpList& opList) { \
- renderer.onMerged##Type##s(opList); \
- }
- MAP_MERGEABLE_OPS(X);
-#undef X
-};
-
-class FailRenderer : public TestRendererBase {};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simple) {
- class SimpleTestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, width);
- EXPECT_EQ(200u, height);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(3, mIndex++); }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(25, 25));
- canvas.drawRect(0, 0, 100, 200, SkPaint());
- canvas.drawBitmap(*bitmap, 10, 10, nullptr);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex()); // 2 ops + start + end
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleStroke) {
- class SimpleStrokeTestRenderer : public TestRendererBase {
- public:
- void onPointsOp(const PointsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- // even though initial bounds are empty...
- EXPECT_TRUE(op.unmappedBounds.isEmpty())
- << "initial bounds should be empty, since they're unstroked";
- EXPECT_EQ(Rect(45, 45, 55, 55), state.computedState.clippedBounds)
- << "final bounds should account for stroke";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint strokedPaint;
- strokedPaint.setStrokeWidth(10);
- canvas.drawPoint(50, 50, strokedPaint);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleStrokeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, arcStrokeClip) {
- class ArcStrokeClipTestRenderer : public TestRendererBase {
- public:
- void onArcOp(const ArcOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(25, 25, 175, 175), op.unmappedBounds);
- EXPECT_EQ(Rect(25, 25, 175, 175), state.computedState.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Full, state.computedState.clipSideFlags)
- << "Arc op clipped conservatively, since path texture may be expanded";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.clipRect(25, 25, 175, 175, SkClipOp::kIntersect);
- SkPaint aaPaint;
- aaPaint.setAntiAlias(true);
- canvas.drawArc(25, 25, 175, 175, 40, 180, true, aaPaint);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ArcStrokeClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleRejection) {
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 200, 200, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(200, 200, 400, 400, SkClipOp::kIntersect); // intersection should be empty
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleBatching) {
- const int LOOPS = 5;
- class SimpleBatchingTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ >= LOOPS) << "Bitmaps should be above all rects";
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ < LOOPS) << "Rects should be below all bitmaps";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(
- 10, 10,
- kAlpha_8_SkColorType)); // Disable merging by using alpha 8 bitmap
-
- // Alternate between drawing rects and bitmaps, with bitmaps overlapping rects.
- // Rects don't overlap bitmaps, so bitmaps should be brought to front as a group.
- canvas.save(SaveFlags::MatrixClip);
- for (int i = 0; i < LOOPS; i++) {
- canvas.translate(0, 10);
- canvas.drawRect(0, 0, 10, 10, SkPaint());
- canvas.drawBitmap(*bitmap, 5, 0, nullptr);
- }
- canvas.restore();
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleBatchingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2 * LOOPS, renderer.getIndex()) << "Expect number of ops = 2 * loop count";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferRenderNode_translateClip) {
- class DeferRenderNodeTranslateClipTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(5, 10, 55, 60), state.computedState.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom,
- state.computedState.clipSideFlags);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(5, 10, Rect(50, 50), // translate + clip node
- *TestUtils::getSyncedNode(node));
-
- DeferRenderNodeTranslateClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferRenderNodeScene) {
- class DeferRenderNodeSceneTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const Rect& clippedBounds = state.computedState.clippedBounds;
- Matrix4 expected;
- switch (mIndex++) {
- case 0:
- // background - left side
- EXPECT_EQ(Rect(600, 100, 700, 500), clippedBounds);
- expected.loadTranslate(100, 100, 0);
- break;
- case 1:
- // background - top side
- EXPECT_EQ(Rect(100, 400, 600, 500), clippedBounds);
- expected.loadTranslate(100, 100, 0);
- break;
- case 2:
- // content
- EXPECT_EQ(Rect(100, 100, 700, 500), clippedBounds);
- expected.loadTranslate(-50, -50, 0);
- break;
- case 3:
- // overlay
- EXPECT_EQ(Rect(0, 0, 800, 200), clippedBounds);
- break;
- default:
- ADD_FAILURE() << "Too many rects observed";
- }
- EXPECT_EQ(expected, state.computedState.transform);
- }
- };
-
- std::vector<sp<RenderNode>> nodes;
- SkPaint transparentPaint;
- transparentPaint.setAlpha(128);
-
- // backdrop
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 100, 100, 700, 500, // 600x400
- [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 600, 400, transparentPaint);
- }));
-
- // content
- Rect contentDrawBounds(150, 150, 650, 450); // 500x300
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 600, [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 800, 600, transparentPaint);
- }));
-
- // overlay
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 600, [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 800, 200, transparentPaint);
- }));
-
- for (auto& node : nodes) {
- TestUtils::syncHierarchyPropertiesAndDisplayList(node);
- }
-
- {
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 600), 800, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNodeScene(nodes, contentDrawBounds);
-
- DeferRenderNodeSceneTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
- }
-
- for (auto& node : nodes) {
- EXPECT_TRUE(node->isValid());
- EXPECT_FALSE(node->nothingToDraw());
- node->setStagingDisplayList(nullptr);
- EXPECT_FALSE(node->isValid());
- EXPECT_FALSE(node->nothingToDraw());
- node->destroyHardwareResources();
- EXPECT_TRUE(node->nothingToDraw());
- EXPECT_FALSE(node->isValid());
- }
-
- {
- // Validate no crashes if any nodes are missing DisplayLists
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 600), 800, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNodeScene(nodes, contentDrawBounds);
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- }
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, empty_noFbo0) {
- class EmptyNoFbo0TestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- void endFrame(const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- };
-
- // Use layer update constructor, so no work is enqueued for Fbo0
- LayerUpdateQueue emptyLayerUpdateQueue;
- FrameBuilder frameBuilder(emptyLayerUpdateQueue, sLightGeometry, Caches::getInstance());
- EmptyNoFbo0TestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, empty_withFbo0) {
- class EmptyWithFbo0TestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(1, mIndex++); }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- // no drawn content
- });
-
- // Draw, but pass node without draw content, so no work is done for primary frame
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EmptyWithFbo0TestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "No drawing content produced,"
- " but fbo0 update lifecycle should still be observed";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, avoidOverdraw_rects) {
- class AvoidOverdrawRectsTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(mIndex++, 0) << "Should be one rect";
- EXPECT_EQ(Rect(10, 10, 190, 190), op.unmappedBounds)
- << "Last rect should occlude others.";
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.drawRect(10, 10, 190, 190, SkPaint());
- });
-
- // Damage (and therefore clip) is same as last draw, subset of renderable area.
- // This means last op occludes other contents, and they'll be rejected to avoid overdraw.
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 10, 190, 190), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EXPECT_EQ(3u, node->getDisplayList()->getOps().size())
- << "Recording must not have rejected ops, in order for this test to be valid";
-
- AvoidOverdrawRectsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Expect exactly one op";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, avoidOverdraw_bitmaps) {
- static sk_sp<Bitmap> opaqueBitmap(
- TestUtils::createBitmap(50, 50, SkColorType::kRGB_565_SkColorType));
- static sk_sp<Bitmap> transpBitmap(
- TestUtils::createBitmap(50, 50, SkColorType::kAlpha_8_SkColorType));
- class AvoidOverdrawBitmapsTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- switch (mIndex++) {
- case 0:
- EXPECT_EQ(opaqueBitmap.get(), op.bitmap);
- break;
- case 1:
- EXPECT_EQ(transpBitmap.get(), op.bitmap);
- break;
- default:
- ADD_FAILURE() << "Only two ops expected.";
- }
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 50, 50, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawBitmap(*transpBitmap, 0, 0, nullptr);
-
- // only the below draws should remain, since they're
- canvas.drawBitmap(*opaqueBitmap, 0, 0, nullptr);
- canvas.drawBitmap(*transpBitmap, 0, 0, nullptr);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(50, 50), 50, 50, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EXPECT_EQ(5u, node->getDisplayList()->getOps().size())
- << "Recording must not have rejected ops, in order for this test to be valid";
-
- AvoidOverdrawBitmapsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "Expect exactly two ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clippedMerging) {
- class ClippedMergingTestRenderer : public TestRendererBase {
- public:
- void onMergedBitmapOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(4u, opList.count);
- EXPECT_EQ(Rect(10, 10, 90, 90), opList.clip);
- EXPECT_EQ(OpClipSideFlags::Left | OpClipSideFlags::Top | OpClipSideFlags::Right,
- opList.clipSideFlags);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(20, 20));
-
- // left side clipped (to inset left half)
- canvas.clipRect(10, 0, 50, 100, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 0, 40, nullptr);
-
- // top side clipped (to inset top half)
- canvas.clipRect(0, 10, 100, 50, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 40, 0, nullptr);
-
- // right side clipped (to inset right half)
- canvas.clipRect(50, 0, 90, 100, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 80, 40, nullptr);
-
- // bottom not clipped, just abutting (inset bottom half)
- canvas.clipRect(0, 50, 100, 90, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 40, 70, nullptr);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClippedMergingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, regionClipStopsMerge) {
- class RegionClipStopsMergeTestRenderer : public TestRendererBase {
- public:
- void onTextOp(const TextOp& op, const BakedOpState& state) override { mIndex++; }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPath path;
- path.addCircle(200, 200, 200, SkPath::kCW_Direction);
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipPath(&path, SkClipOp::kIntersect);
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 200);
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- RegionClipStopsMergeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textMerging) {
- class TextMergingTestRenderer : public TestRendererBase {
- public:
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(2u, opList.count);
- EXPECT_EQ(OpClipSideFlags::Top, opList.clipSideFlags);
- EXPECT_EQ(OpClipSideFlags::Top, opList.states[0]->computedState.clipSideFlags);
- EXPECT_EQ(OpClipSideFlags::None, opList.states[1]->computedState.clipSideFlags);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 400, 400, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 0); // will be top clipped
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100); // not clipped
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextMergingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "Expect 2 ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textStrikethrough) {
- const int LOOPS = 5;
- class TextStrikethroughTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ >= LOOPS) << "Strikethrough rects should be above all text";
- }
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(5u, opList.count);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 2000, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint textPaint;
- textPaint.setAntiAlias(true);
- textPaint.setTextSize(20);
- textPaint.setFlags(textPaint.getFlags() | SkPaint::kStrikeThruText_ReserveFlag);
- for (int i = 0; i < LOOPS; i++) {
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", textPaint, 10, 100 * (i + 1));
- }
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 2000), 200, 2000, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextStrikethroughTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2 * LOOPS, renderer.getIndex()) << "Expect number of ops = 2 * loop count";
-}
-
-static auto styles = {SkPaint::kFill_Style, SkPaint::kStroke_Style, SkPaint::kStrokeAndFill_Style};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textStyle) {
- class TextStyleTestRenderer : public TestRendererBase {
- public:
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- ASSERT_EQ(0, mIndex);
- ASSERT_EQ(3u, opList.count);
- mIndex += opList.count;
-
- int index = 0;
- for (auto style : styles) {
- auto state = opList.states[index++];
- ASSERT_EQ(style, state->op->paint->getStyle())
- << "Remainder of validation relies upon stable merged order";
- ASSERT_EQ(0, state->computedState.clipSideFlags)
- << "Clipped bounds validation requires unclipped ops";
- }
-
- Rect fill = opList.states[0]->computedState.clippedBounds;
- Rect stroke = opList.states[1]->computedState.clippedBounds;
- EXPECT_EQ(stroke, opList.states[2]->computedState.clippedBounds)
- << "Stroke+Fill should be same as stroke";
-
- EXPECT_TRUE(stroke.contains(fill));
- EXPECT_FALSE(fill.contains(stroke));
-
- // outset by half the stroke width
- Rect outsetFill(fill);
- outsetFill.outset(5);
- EXPECT_EQ(stroke, outsetFill);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- paint.setStrokeWidth(10);
-
- // draw 3 copies of the same text overlapping, each with a different style.
- // They'll get merged, but with
- for (auto style : styles) {
- paint.setStyle(style);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100);
- }
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- TextStyleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex()) << "Expect 3 ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_clipLocalMatrix) {
- class TextureLayerClipLocalMatrixTestRenderer : public TestRendererBase {
- public:
- void onTextureLayerOp(const TextureLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clipRect());
- EXPECT_EQ(Rect(50, 50, 105, 105), state.computedState.clippedBounds);
-
- Matrix4 expected;
- expected.loadTranslate(5, 5, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- };
-
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(50, 50, 150, 150, SkClipOp::kIntersect);
- canvas.drawLayer(layerUpdater.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextureLayerClipLocalMatrixTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_combineMatrices) {
- class TextureLayerCombineMatricesTestRenderer : public TestRendererBase {
- public:
- void onTextureLayerOp(const TextureLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
-
- Matrix4 expected;
- expected.loadTranslate(35, 45, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- };
-
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(30, 40);
- canvas.drawLayer(layerUpdater.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextureLayerCombineMatricesTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_reject) {
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
- EXPECT_EQ(Layer::Api::OpenGL, layerUpdater->backingLayer()->getApi());
-
- GlLayer* glLayer = static_cast<GlLayer*>(layerUpdater->backingLayer());
- glLayer->setRenderTarget(GL_NONE); // Should be rejected
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawLayer(layerUpdater.get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, functor_reject) {
- class FunctorTestRenderer : public TestRendererBase {
- public:
- void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- }
- };
- Functor noopFunctor;
-
- // 1 million pixel tall view, scrolled down 80%
- auto scrolledFunctorView = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 1000000, [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.translate(0, -800000);
- canvas.callDrawGLFunction(&noopFunctor, nullptr);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(scrolledFunctorView));
-
- FunctorTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferColorOp_unbounded) {
- class ColorTestRenderer : public TestRendererBase {
- public:
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds)
- << "Color op should be expanded to bounds of surrounding";
- }
- };
-
- auto unclippedColorView = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 10, 10, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setClipToBounds(false);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(unclippedColorView));
-
- ColorTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "ColorOp should not be rejected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderNode) {
- class RenderNodeTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- switch (mIndex++) {
- case 0:
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds);
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- break;
- case 1:
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clippedBounds);
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- break;
- default:
- ADD_FAILURE();
- }
- }
- };
-
- auto child = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&child](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(0, 0, 200, 200, paint);
-
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(40, 40);
- canvas.drawRenderNode(child.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- RenderNodeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clipped) {
- class ClippedTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 20, 30, 40), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(10, 20, 30, 40), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(200, 200));
- canvas.drawBitmap(*bitmap, 0, 0, nullptr);
- });
-
- // clip to small area, should see in receiver
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 20, 30, 40), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClippedTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_simple) {
- class SaveLayerSimpleTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(180u, width);
- EXPECT_EQ(180u, height);
- return nullptr;
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), op.unmappedBounds);
- EXPECT_EQ(Rect(180, 180), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(180, 180), state.computedState.clipRect());
-
- Matrix4 expectedTransform;
- expectedTransform.loadTranslate(-10, -10, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedTransform, state.computedState.transform);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(4, mIndex++);
- EXPECT_EQ(nullptr, offscreenBuffer);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(10, 10, 190, 190, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_nested) {
- /* saveLayer1 { rect1, saveLayer2 { rect2 } } will play back as:
- * - startTemporaryLayer2, rect2 endLayer2
- * - startTemporaryLayer1, rect1, drawLayer2, endLayer1
- * - startFrame, layerOp1, endFrame
- */
- class SaveLayerNestedTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- const int index = mIndex++;
- if (index == 0) {
- EXPECT_EQ(400u, width);
- EXPECT_EQ(400u, height);
- return (OffscreenBuffer*)0x400;
- } else if (index == 3) {
- EXPECT_EQ(800u, width);
- EXPECT_EQ(800u, height);
- return (OffscreenBuffer*)0x800;
- } else {
- ADD_FAILURE();
- }
- return (OffscreenBuffer*)nullptr;
- }
- void endLayer() override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 6);
- }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(7, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(9, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
- if (index == 1) {
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds); // inner rect
- } else if (index == 4) {
- EXPECT_EQ(Rect(800, 800), op.unmappedBounds); // outer rect
- } else {
- ADD_FAILURE();
- }
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
- if (index == 5) {
- EXPECT_EQ((OffscreenBuffer*)0x400, *op.layerHandle);
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds); // inner layer
- } else if (index == 8) {
- EXPECT_EQ((OffscreenBuffer*)0x800, *op.layerHandle);
- EXPECT_EQ(Rect(800, 800), op.unmappedBounds); // outer layer
- } else {
- ADD_FAILURE();
- }
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- const int index = mIndex++;
- // order isn't important, but we need to see both
- if (index == 10) {
- EXPECT_EQ((OffscreenBuffer*)0x400, offscreenBuffer);
- } else if (index == 11) {
- EXPECT_EQ((OffscreenBuffer*)0x800, offscreenBuffer);
- } else {
- ADD_FAILURE();
- }
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 800, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 800, 800, 128, SaveFlags::ClipToLayer);
- {
- canvas.drawRect(0, 0, 800, 800, SkPaint());
- canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer);
- { canvas.drawRect(0, 0, 400, 400, SkPaint()); }
- canvas.restore();
- }
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 800), 800, 800, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerNestedTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(12, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_contentRejection) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(200, 200, 400, 400, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(200, 200, 400, 400, 128, SaveFlags::ClipToLayer);
-
- // draw within save layer may still be recorded, but shouldn't be drawn
- canvas.drawRect(200, 200, 400, 400, SkPaint());
-
- canvas.restore();
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- // should see no ops, even within the layer, since the layer should be rejected
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_simple) {
- class SaveLayerUnclippedSimpleTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_CLIP_RECT(Rect(200, 200), state.computedState.clipState);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, op.paint);
- ASSERT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint));
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- EXPECT_EQ(Rect(200, 200), op.unmappedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_CLIP_RECT(Rect(200, 200), state.computedState.clipState);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_round) {
- class SaveLayerUnclippedRoundTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds)
- << "Bounds rect should round out";
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {}
- void onRectOp(const RectOp& op, const BakedOpState& state) override {}
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds)
- << "Bounds rect should round out";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 200, 200, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10.95f, 10.5f, 189.75f, 189.25f, // values should all round out
- 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedRoundTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_mergedClears) {
- class SaveLayerUnclippedMergedClearsTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_GT(4, index);
- EXPECT_EQ(5, op.unmappedBounds.getWidth());
- EXPECT_EQ(5, op.unmappedBounds.getHeight());
- if (index == 0) {
- EXPECT_EQ(Rect(10, 10), state.computedState.clippedBounds);
- } else if (index == 1) {
- EXPECT_EQ(Rect(190, 0, 200, 10), state.computedState.clippedBounds);
- } else if (index == 2) {
- EXPECT_EQ(Rect(0, 190, 10, 200), state.computedState.clippedBounds);
- } else if (index == 3) {
- EXPECT_EQ(Rect(190, 190, 200, 200), state.computedState.clippedBounds);
- }
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- ASSERT_EQ(op.vertexCount, 16u);
- for (size_t i = 0; i < op.vertexCount; i++) {
- auto v = op.vertices[i];
- EXPECT_TRUE(v.x == 0 || v.x == 10 || v.x == 190 || v.x == 200);
- EXPECT_TRUE(v.y == 0 || v.y == 10 || v.y == 190 || v.y == 200);
- }
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(5, mIndex++);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_LT(5, mIndex++);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- int restoreTo = canvas.save(SaveFlags::MatrixClip);
- canvas.scale(2, 2);
- canvas.saveLayerAlpha(0, 0, 5, 5, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(95, 0, 100, 5, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(0, 95, 5, 100, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(95, 95, 100, 100, 128, SaveFlags::MatrixClip);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restoreToCount(restoreTo);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedMergedClearsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(10, renderer.getIndex())
- << "Expect 4 copyTos, 4 copyFroms, 1 clear SimpleRects, and 1 rect.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_clearClip) {
- class SaveLayerUnclippedClearClipTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, op.paint);
- EXPECT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint));
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clippedBounds)
- << "Expect dirty rect as clip";
- ASSERT_NE(nullptr, state.computedState.clipState);
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clipState->rect);
- EXPECT_EQ(ClipMode::Rectangle, state.computedState.clipState->mode);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // save smaller than clip, so we get unclipped behavior
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- // draw with partial screen dirty, and assert we see that rect later
- FrameBuilder frameBuilder(SkRect::MakeLTRB(50, 50, 150, 150), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedClearClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_reject) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // unclipped savelayer + rect both in area that won't intersect with dirty
- canvas.saveLayerAlpha(100, 100, 200, 200, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(100, 100, 200, 200, SkPaint());
- canvas.restore();
- });
-
- // draw with partial screen dirty that doesn't intersect with savelayer
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-/* saveLayerUnclipped { saveLayer { saveLayerUnclipped { rect } } } will play back as:
- * - startTemporaryLayer, onCopyToLayer, onSimpleRects, onRect, onCopyFromLayer, endLayer
- * - startFrame, onCopyToLayer, onSimpleRects, drawLayer, onCopyFromLayer, endframe
- */
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_complex) {
- class SaveLayerUnclippedComplexTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) {
- EXPECT_EQ(0, mIndex++); // savelayer first
- return (OffscreenBuffer*)0xabcd;
- }
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 1 || index == 7);
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 8);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- Matrix4 expected;
- expected.loadTranslate(-100, -100, 0);
- EXPECT_EQ(Rect(100, 100, 200, 200), state.computedState.clippedBounds);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 4 || index == 10);
- }
- void endLayer() override { EXPECT_EQ(5, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(6, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(9, mIndex++);
- EXPECT_EQ((OffscreenBuffer*)0xabcd, *op.layerHandle);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(11, mIndex++); }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(12, mIndex++);
- EXPECT_EQ((OffscreenBuffer*)0xabcd, offscreenBuffer);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 600, 600, // 500x500 triggers clipping
- [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 500, 500, 128, (SaveFlags::Flags)0); // unclipped
- canvas.saveLayerAlpha(100, 100, 400, 400, 128, SaveFlags::ClipToLayer); // clipped
- canvas.saveLayerAlpha(200, 200, 300, 300, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(200, 200, 300, 300, SkPaint());
- canvas.restore();
- canvas.restore();
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(600, 600), 600, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedComplexTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(13, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, hwLayer_simple) {
- class HwLayerSimpleTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- EXPECT_EQ(Rect(25, 25, 75, 75), repaintRect);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- EXPECT_TRUE(state.computedState.transform.isIdentity())
- << "Transform should be reset within layer";
-
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipRect())
- << "Damage rect should be used to clip layer content";
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(3, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(5, mIndex++); }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(node);
-
- // only enqueue partial damage
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(25, 25, 75, 75));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- HwLayerSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, hwLayer_complex) {
- /* parentLayer { greyRect, saveLayer { childLayer { whiteRect } } } will play back as:
- * - startRepaintLayer(child), rect(grey), endLayer
- * - startTemporaryLayer, drawLayer(child), endLayer
- * - startRepaintLayer(parent), rect(white), drawLayer(saveLayer), endLayer
- * - startFrame, drawLayer(parent), endLayerb
- */
- class HwLayerComplexTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) {
- EXPECT_EQ(3, mIndex++); // savelayer first
- return (OffscreenBuffer*)0xabcd;
- }
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- int index = mIndex++;
- if (index == 0) {
- // starting inner layer
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- } else if (index == 6) {
- // starting outer layer
- EXPECT_EQ(200u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(200u, offscreenBuffer->viewportHeight);
- } else {
- ADD_FAILURE();
- }
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- if (index == 1) {
- // inner layer's rect (white)
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- } else if (index == 7) {
- // outer layer's rect (grey)
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- } else {
- ADD_FAILURE();
- }
- }
- void endLayer() override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 5 || index == 9);
- }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(10, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- OffscreenBuffer* layer = *op.layerHandle;
- int index = mIndex++;
- if (index == 4) {
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(100u, layer->viewportHeight);
- } else if (index == 8) {
- EXPECT_EQ((OffscreenBuffer*)0xabcd, *op.layerHandle);
- } else if (index == 11) {
- EXPECT_EQ(200u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
- } else {
- ADD_FAILURE();
- }
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(12, mIndex++); }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(13, mIndex++);
- }
- };
-
- auto child = TestUtils::createNode<RecordingCanvas>(
- 50, 50, 150, 150, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- OffscreenBuffer childLayer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *(child->getLayerHandle()) = &childLayer;
-
- RenderNode* childPtr = child.get();
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [childPtr](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(0, 0, 200, 200, paint);
-
- canvas.saveLayerAlpha(50, 50, 150, 150, 128, SaveFlags::ClipToLayer);
- canvas.drawRenderNode(childPtr);
- canvas.restore();
- });
- OffscreenBuffer parentLayer(renderThread.renderState(), Caches::getInstance(), 200, 200);
- *(parent->getLayerHandle()) = &parentLayer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
-
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(child.get(), Rect(100, 100));
- layerUpdateQueue.enqueueLayerWithDamage(parent.get(), Rect(200, 200));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- HwLayerComplexTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(14, renderer.getIndex());
-
- // clean up layer pointers, so we can safely destruct RenderNodes
- *(child->getLayerHandle()) = nullptr;
- *(parent->getLayerHandle()) = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, buildLayer) {
- class BuildLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- EXPECT_EQ(Rect(25, 25, 75, 75), repaintRect);
- }
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- EXPECT_TRUE(state.computedState.transform.isIdentity())
- << "Transform should be reset within layer";
-
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipRect())
- << "Damage rect should be used to clip layer content";
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- void endFrame(const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
-
- TestUtils::syncHierarchyPropertiesAndDisplayList(node);
-
- // only enqueue partial damage
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(25, 25, 75, 75));
-
- // Draw, but pass empty node list, so no work is done for primary frame
- FrameBuilder frameBuilder(layerUpdateQueue, sLightGeometry, Caches::getInstance());
- BuildLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-namespace {
-
-static void drawOrderedRect(Canvas* canvas, uint8_t expectedDrawOrder) {
- SkPaint paint;
- // order put in blue channel, transparent so overlapped content doesn't get rejected
- paint.setColor(SkColorSetARGB(1, 0, 0, expectedDrawOrder));
- canvas->drawRect(0, 0, 100, 100, paint);
-}
-static void drawOrderedNode(Canvas* canvas, uint8_t expectedDrawOrder, float z) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [expectedDrawOrder](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedRect(&canvas, expectedDrawOrder);
- });
- node->mutateStagingProperties().setTranslationZ(z);
- node->setPropertyFieldsDirty(RenderNode::TRANSLATION_Z);
- canvas->drawRenderNode(node.get()); // canvas takes reference/sole ownership
-}
-
-static void drawOrderedNode(
- Canvas* canvas, uint8_t expectedDrawOrder,
- std::function<void(RenderProperties& props, RecordingCanvas& canvas)> setup) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100,
- [expectedDrawOrder, setup](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedRect(&canvas, expectedDrawOrder);
- if (setup) {
- setup(props, canvas);
- }
- });
- canvas->drawRenderNode(node.get()); // canvas takes reference/sole ownership
-}
-
-class ZReorderTestRenderer : public TestRendererBase {
-public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int expectedOrder = SkColorGetB(op.paint->getColor()); // extract order from blue channel
- EXPECT_EQ(expectedOrder, mIndex++) << "An op was drawn out of order";
- }
-};
-
-} // end anonymous namespace
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, zReorder) {
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- drawOrderedNode(&canvas, 0,
- 10.0f); // in reorder=false at this point, so played inorder
- drawOrderedRect(&canvas, 1);
- canvas.insertReorderBarrier(true);
- drawOrderedNode(&canvas, 6, 2.0f);
- drawOrderedRect(&canvas, 3);
- drawOrderedNode(&canvas, 4, 0.0f);
- drawOrderedRect(&canvas, 5);
- drawOrderedNode(&canvas, 2, -2.0f);
- drawOrderedNode(&canvas, 7, 2.0f);
- canvas.insertReorderBarrier(false);
- drawOrderedRect(&canvas, 8);
- drawOrderedNode(&canvas, 9,
- -10.0f); // in reorder=false at this point, so played inorder
- canvas.insertReorderBarrier(true); // reorder a node ahead of drawrect op
- drawOrderedRect(&canvas, 11);
- drawOrderedNode(&canvas, 10, -1.0f);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(true); // test with two empty reorder sections
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- drawOrderedRect(&canvas, 12);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(13, renderer.getIndex());
-};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorder) {
- static const int scrollX = 5;
- static const int scrollY = 10;
- class ProjectionReorderTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
-
- Matrix4 expectedMatrix;
- switch (index) {
- case 0:
- EXPECT_EQ(Rect(100, 100), op.unmappedBounds);
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- expectedMatrix.loadIdentity();
- EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask);
- break;
- case 1:
- EXPECT_EQ(Rect(-10, -10, 60, 60), op.unmappedBounds);
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- expectedMatrix.loadTranslate(50 - scrollX, 50 - scrollY, 0);
- ASSERT_NE(nullptr, state.computedState.localProjectionPathMask);
- EXPECT_EQ(Rect(-35, -30, 45, 50),
- Rect(state.computedState.localProjectionPathMask->getBounds()));
- break;
- case 2:
- EXPECT_EQ(Rect(100, 50), op.unmappedBounds);
- EXPECT_EQ(SK_ColorBLUE, op.paint->getColor());
- expectedMatrix.loadTranslate(-scrollX, 50 - scrollY, 0);
- EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask);
- break;
- default:
- ADD_FAILURE();
- }
- EXPECT_EQ(expectedMatrix, state.computedState.transform);
- }
- };
-
- /**
- * Construct a tree of nodes, where the root (A) has a receiver background (B), and a child (C)
- * with a projecting child (P) of its own. P would normally draw between B and C's "background"
- * draw, but because it is projected backwards, it's drawn in between B and C.
- *
- * The parent is scrolled by scrollX/scrollY, but this does not affect the background
- * (which isn't affected by scroll).
- */
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 50, 0, 100, 50, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(-10, -10, 60, 60, paint);
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 0, 50, 100, 100,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorBLUE);
- canvas.drawRect(0, 0, 100, 50, paint);
- canvas.drawRenderNode(projectingRipple.get());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- // Set a rect outline for the projecting ripple to be masked against.
- properties.mutableOutline().setRoundRect(10, 10, 90, 90, 5, 1.0f);
-
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ProjectionReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionHwLayer) {
- static const int scrollX = 5;
- static const int scrollY = 10;
- class ProjectionHwLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onArcOp(const ArcOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- void onOvalOp(const OvalOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- ASSERT_NE(nullptr, state.computedState.localProjectionPathMask);
- Matrix4 expected;
- expected.loadTranslate(100 - scrollX, 100 - scrollY, 0);
- EXPECT_EQ(expected, state.computedState.transform);
- EXPECT_EQ(Rect(-85, -80, 295, 300),
- Rect(state.computedState.localProjectionPathMask->getBounds()));
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(5, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- };
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
-
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- canvas.drawOval(100, 100, 300, 300, SkPaint()); // drawn mostly out of layer bounds
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 100, 100, 300, 300,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.drawRenderNode(projectingRipple.get());
- canvas.drawArc(0, 0, 200, 200, 0.0f, 280.0f, true, SkPaint());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- // Set a rect outline for the projecting ripple to be masked against.
- properties.mutableOutline().setRoundRect(10, 10, 390, 390, 0, 1.0f);
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- });
-
- OffscreenBuffer** layerHandle = child->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would, setting windowTransform
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200, 200);
- Matrix4 windowTransform;
- windowTransform.loadTranslate(100, 100, 0); // total transform of layer's origin
- layer.setWindowTransform(windowTransform);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
-
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(child.get(), Rect(200, 200));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- ProjectionHwLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionChildScroll) {
- static const int scrollX = 500000;
- static const int scrollY = 0;
- class ProjectionChildScrollTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onOvalOp(const OvalOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, state.computedState.clipState);
- ASSERT_EQ(ClipMode::Rectangle, state.computedState.clipState->mode);
- ASSERT_EQ(Rect(400, 400), state.computedState.clipState->rect);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& properties, RecordingCanvas& canvas) {
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- canvas.drawOval(0, 0, 200, 200, SkPaint());
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- // Record time clip will be ignored by projectee
- canvas.clipRect(100, 100, 300, 300, SkClipOp::kIntersect);
-
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(projectingRipple.get());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ProjectionChildScrollTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-// creates a 100x100 shadow casting node with provided translationZ
-static sp<RenderNode> createWhiteRectShadowCaster(float translationZ) {
- return TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [translationZ](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setTranslationZ(translationZ);
- properties.mutableOutline().setRoundRect(0, 0, 100, 100, 0.0f, 1.0f);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadow) {
- class ShadowTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_FLOAT_EQ(1.0f, op.casterAlpha);
- EXPECT_TRUE(op.shadowTask->casterPerimeter.isRect(nullptr));
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), op.shadowTask->transformXY);
-
- Matrix4 expectedZ;
- expectedZ.loadTranslate(0, 0, 5);
- EXPECT_MATRIX_APPROX_EQ(expectedZ, op.shadowTask->transformZ);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowSaveLayer) {
- class ShadowSaveLayerTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- return nullptr;
- }
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_FLOAT_EQ(50, op.shadowTask->lightCenter.x);
- EXPECT_FLOAT_EQ(40, op.shadowTask->lightCenter.y);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endLayer() override { EXPECT_EQ(3, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(5, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // save/restore outside of reorderBarrier, so they don't get moved out of place
- canvas.translate(20, 10);
- int count = canvas.saveLayerAlpha(30, 50, 130, 150, 128, SaveFlags::ClipToLayer);
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.insertReorderBarrier(false);
- canvas.restoreToCount(count);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowSaveLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowHwLayer) {
- class ShadowHwLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_FLOAT_EQ(50, op.shadowTask->lightCenter.x);
- EXPECT_FLOAT_EQ(40, op.shadowTask->lightCenter.y);
- EXPECT_FLOAT_EQ(30, op.shadowTask->lightRadius);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endLayer() override { EXPECT_EQ(3, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 50, 60, 150, 160, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.insertReorderBarrier(true);
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(20, 10);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.restore();
- });
- OffscreenBuffer** layerHandle = parent->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would, setting windowTransform
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- Matrix4 windowTransform;
- windowTransform.loadTranslate(50, 60, 0); // total transform of layer's origin
- layer.setWindowTransform(windowTransform);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(parent.get(), Rect(100, 100));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 30},
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- ShadowHwLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowLayering) {
- class ShadowLayeringTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 0 || index == 1);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 3);
- }
- };
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0001f).get());
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowLayeringTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowClipping) {
- class ShadowClippingTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipState->rect)
- << "Shadow must respect pre-barrier canvas clip value.";
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- };
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- // Apply a clip before the reorder barrier/shadow casting child is drawn.
- // This clip must be applied to the shadow cast by the child.
- canvas.clipRect(25, 25, 75, 75, SkClipOp::kIntersect);
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowClippingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-static void testProperty(
- std::function<void(RenderProperties&)> propSetupCallback,
- std::function<void(const RectOp&, const BakedOpState&)> opValidateCallback) {
- class PropertyTestRenderer : public TestRendererBase {
- public:
- explicit PropertyTestRenderer(
- std::function<void(const RectOp&, const BakedOpState&)> callback)
- : mCallback(callback) {}
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(mIndex++, 0);
- mCallback(op, state);
- }
- std::function<void(const RectOp&, const BakedOpState&)> mCallback;
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [propSetupCallback](RenderProperties& props, RecordingCanvas& canvas) {
- propSetupCallback(props);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- PropertyTestRenderer renderer(opValidateCallback);
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Should have seen one op";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropOverlappingRenderingAlpha) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setAlpha(0.5f);
- properties.setHasOverlappingRendering(false);
- },
- [](const RectOp& op, const BakedOpState& state) {
- EXPECT_EQ(0.5f, state.alpha) << "Alpha should be applied directly to op";
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropClipping) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setClipToBounds(true);
- properties.setClipBounds(Rect(10, 20, 300, 400));
- },
- [](const RectOp& op, const BakedOpState& state) {
- EXPECT_EQ(Rect(10, 20, 100, 100), state.computedState.clippedBounds)
- << "Clip rect should be intersection of node bounds and clip bounds";
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropRevealClip) {
- testProperty(
- [](RenderProperties& properties) {
- properties.mutableRevealClip().set(true, 50, 50, 25);
- },
- [](const RectOp& op, const BakedOpState& state) {
- ASSERT_NE(nullptr, state.roundRectClipState);
- EXPECT_TRUE(state.roundRectClipState->highPriority);
- EXPECT_EQ(25, state.roundRectClipState->radius);
- EXPECT_EQ(Rect(50, 50, 50, 50), state.roundRectClipState->innerRect);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropOutlineClip) {
- testProperty(
- [](RenderProperties& properties) {
- properties.mutableOutline().setShouldClip(true);
- properties.mutableOutline().setRoundRect(10, 20, 30, 40, 5.0f, 0.5f);
- },
- [](const RectOp& op, const BakedOpState& state) {
- ASSERT_NE(nullptr, state.roundRectClipState);
- EXPECT_FALSE(state.roundRectClipState->highPriority);
- EXPECT_EQ(5, state.roundRectClipState->radius);
- EXPECT_EQ(Rect(15, 25, 25, 35), state.roundRectClipState->innerRect);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropTransform) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setLeftTopRightBottom(10, 10, 110, 110);
-
- SkMatrix staticMatrix = SkMatrix::MakeScale(1.2f, 1.2f);
- properties.setStaticMatrix(&staticMatrix);
-
- // ignored, since static overrides animation
- SkMatrix animationMatrix = SkMatrix::MakeTrans(15, 15);
- properties.setAnimationMatrix(&animationMatrix);
-
- properties.setTranslationX(10);
- properties.setTranslationY(20);
- properties.setScaleX(0.5f);
- properties.setScaleY(0.7f);
- },
- [](const RectOp& op, const BakedOpState& state) {
- Matrix4 matrix;
- matrix.loadTranslate(10, 10, 0); // left, top
- matrix.scale(1.2f, 1.2f, 1); // static matrix
- // ignore animation matrix, since static overrides it
-
- // translation xy
- matrix.translate(10, 20);
-
- // scale xy (from default pivot - center)
- matrix.translate(50, 50);
- matrix.scale(0.5f, 0.7f, 1);
- matrix.translate(-50, -50);
- EXPECT_MATRIX_APPROX_EQ(matrix, state.computedState.transform)
- << "Op draw matrix must match expected combination of transformation "
- "properties";
- });
-}
-
-struct SaveLayerAlphaData {
- uint32_t layerWidth = 0;
- uint32_t layerHeight = 0;
- Rect rectClippedBounds;
- Matrix4 rectMatrix;
- Matrix4 drawLayerMatrix;
-};
-/**
- * Constructs a view to hit the temporary layer alpha property implementation:
- * a) 0 < alpha < 1
- * b) too big for layer (larger than maxTextureSize)
- * c) overlapping rendering content
- * returning observed data about layer size and content clip/transform.
- *
- * Used to validate clipping behavior of temporary layer, where requested layer size is reduced
- * (for efficiency, and to fit in layer size constraints) based on parent clip.
- */
-void testSaveLayerAlphaClip(SaveLayerAlphaData* outObservedData,
- std::function<void(RenderProperties&)> propSetupCallback) {
- class SaveLayerAlphaClipTestRenderer : public TestRendererBase {
- public:
- explicit SaveLayerAlphaClipTestRenderer(SaveLayerAlphaData* outData) : mOutData(outData) {}
-
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- mOutData->layerWidth = width;
- mOutData->layerHeight = height;
- return nullptr;
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- mOutData->rectClippedBounds = state.computedState.clippedBounds;
- mOutData->rectMatrix = state.computedState.transform;
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- mOutData->drawLayerMatrix = state.computedState.transform;
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(4, mIndex++);
- }
-
- private:
- SaveLayerAlphaData* mOutData;
- };
-
- ASSERT_GT(10000, DeviceInfo::get()->maxTextureSize())
- << "Node must be bigger than max texture size to exercise saveLayer codepath";
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 10000, 10000,
- [&propSetupCallback](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setHasOverlappingRendering(true);
- properties.setAlpha(0.5f); // force saveLayer, since too big for HW layer
- // apply other properties
- propSetupCallback(properties);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 10000, 10000, paint);
- });
- auto syncedNode = TestUtils::getSyncedNode(node); // sync before querying height
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*syncedNode);
-
- SaveLayerAlphaClipTestRenderer renderer(outObservedData);
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-
- // assert, since output won't be valid if we haven't seen a save layer triggered
- ASSERT_EQ(5, renderer.getIndex()) << "Test must trigger saveLayer alpha behavior.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaClipBig) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- properties.setTranslationX(10); // offset rendering content
- properties.setTranslationY(-2000); // offset rendering content
- });
- EXPECT_EQ(190u, observedData.layerWidth);
- EXPECT_EQ(200u, observedData.layerHeight);
- EXPECT_EQ(Rect(190, 200), observedData.rectClippedBounds)
- << "expect content to be clipped to screen area";
- Matrix4 expected;
- expected.loadTranslate(0, -2000, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, observedData.rectMatrix)
- << "expect content to be translated as part of being clipped";
- expected.loadTranslate(10, 0, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, observedData.drawLayerMatrix)
- << "expect drawLayer to be translated as part of being clipped";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaRotate) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- // Translate and rotate the view so that the only visible part is the top left corner of
- // the view. It will form an isosceles right triangle with a long side length of 200 at the
- // bottom of the viewport.
- properties.setTranslationX(100);
- properties.setTranslationY(100);
- properties.setPivotX(0);
- properties.setPivotY(0);
- properties.setRotation(45);
- });
- // ceil(sqrt(2) / 2 * 200) = 142
- EXPECT_EQ(142u, observedData.layerWidth);
- EXPECT_EQ(142u, observedData.layerHeight);
- EXPECT_EQ(Rect(142, 142), observedData.rectClippedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), observedData.rectMatrix);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaScale) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- properties.setPivotX(0);
- properties.setPivotY(0);
- properties.setScaleX(2);
- properties.setScaleY(0.5f);
- });
- EXPECT_EQ(100u, observedData.layerWidth);
- EXPECT_EQ(400u, observedData.layerHeight);
- EXPECT_EQ(Rect(100, 400), observedData.rectClippedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), observedData.rectMatrix);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clip_replace) {
- class ClipReplaceTestRenderer : public TestRendererBase {
- public:
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_TRUE(op.localClip->intersectWithRoot);
- EXPECT_EQ(Rect(20, 10, 30, 40), state.computedState.clipState->rect)
- << "Expect resolved clip to be intersection of viewport clip and clip op";
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 20, 20, 30, 30, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace_deprecated);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 10, 40, 40), 50, 50, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClipReplaceTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedInMiddle) {
- /* R is backward projected on B
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectLast) {
- /* R is backward projected on E
- A
- / | \
- / | \
- B C E
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 3, [](RenderProperties& props,
- RecordingCanvas& canvas) { // drawn as 2
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // drawn as 3
- props.setProjectionReceiver(true);
- }); // nodeE
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderNoReceivable) {
- /* R is backward projected without receiver
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- // not having a projection receiver is an undefined behavior
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderParentReceivable) {
- /* R is backward projected on C
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderSameNodeReceivable) {
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- // having a node that is projected on itself is an
- // undefined/unexpected behavior
- props.setProjectionReceiver(true);
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling) {
- // TODO: this test together with the next "projectionReorderProjectedSibling2" likely expose a
- // bug in HWUI. First test draws R, while the second test does not draw R for a nearly identical
- // tree setup. The correct behaviour is to not draw R, because the receiver cannot be a sibling
- /* R is backward projected on B. R is not expected to be drawn (see Sibling2 outcome below),
- but for some reason it is drawn.
- A
- /|\
- / | \
- B C R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) {}); // nodeC
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling2) {
- /* R is set to project on B, but R is not drawn because projecting on a sibling is not allowed.
- A
- |
- G
- /|\
- / | \
- B C R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props,
- RecordingCanvas& canvas) { // G
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) { // C
- }); // nodeC
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeG
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderGrandparentReceivable) {
- /* R is backward projected on B
- A
- |
- B
- |
- C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeB
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivables) {
- /* B and G are receivables, R is backward projected
- A
- / \
- B C
- / \
- G R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 3,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- }); // nodeG
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesLikelyScenario) {
- /* B and G are receivables, G is backward projected
- A
- / \
- B C
- / \
- G R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeG
- drawOrderedNode(&canvas, 3,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesDeeper) {
- /* B and G are receivables, R is backward projected
- A
- / \
- B C
- / \
- G D
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- }); // nodeG
- drawOrderedNode(
- &canvas, 4, [](RenderProperties& props, RecordingCanvas& canvas) { // D
- drawOrderedNode(&canvas, 3, [](RenderProperties& props,
- RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeD
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/GlopBuilderTests.cpp b/libs/hwui/tests/unit/GlopBuilderTests.cpp
deleted file mode 100644
index c8bfc99..0000000
--- a/libs/hwui/tests/unit/GlopBuilderTests.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include "Glop.h"
-#include "GlopBuilder.h"
-#include "Rect.h"
-#include "tests/common/TestUtils.h"
-#include "utils/Color.h"
-
-#include <SkPaint.h>
-
-using namespace android::uirenderer;
-
-static void expectFillEq(Glop::Fill& expectedFill, Glop::Fill& builtFill) {
- EXPECT_EQ(expectedFill.colorEnabled, builtFill.colorEnabled);
- if (expectedFill.colorEnabled) EXPECT_EQ(expectedFill.color, builtFill.color);
-
- EXPECT_EQ(expectedFill.filterMode, builtFill.filterMode);
- if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Blend) {
- EXPECT_EQ(expectedFill.filter.color, builtFill.filter.color);
- } else if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Matrix) {
- Glop::Fill::Filter::Matrix& expectedMatrix = expectedFill.filter.matrix;
- Glop::Fill::Filter::Matrix& builtMatrix = expectedFill.filter.matrix;
- EXPECT_TRUE(std::memcmp(expectedMatrix.matrix, builtMatrix.matrix,
- sizeof(Glop::Fill::Filter::Matrix::matrix)));
- EXPECT_TRUE(std::memcmp(expectedMatrix.vector, builtMatrix.vector,
- sizeof(Glop::Fill::Filter::Matrix::vector)));
- }
- EXPECT_EQ(expectedFill.skiaShaderData.skiaShaderType, builtFill.skiaShaderData.skiaShaderType);
- EXPECT_EQ(expectedFill.texture.clamp, builtFill.texture.clamp);
- EXPECT_EQ(expectedFill.texture.filter, builtFill.texture.filter);
- EXPECT_TRUE((expectedFill.texture.texture && builtFill.texture.texture) ||
- (!expectedFill.texture.texture && !builtFill.texture.texture));
- if (expectedFill.texture.texture) {
- EXPECT_EQ(expectedFill.texture.texture->target(), builtFill.texture.texture->target());
- }
- EXPECT_EQ(expectedFill.texture.textureTransform, builtFill.texture.textureTransform);
-}
-
-static void expectBlendEq(Glop::Blend& expectedBlend, Glop::Blend& builtBlend) {
- EXPECT_EQ(expectedBlend.src, builtBlend.src);
- EXPECT_EQ(expectedBlend.dst, builtBlend.dst);
-}
-
-static void expectMeshEq(Glop::Mesh& expectedMesh, Glop::Mesh& builtMesh) {
- EXPECT_EQ(expectedMesh.elementCount, builtMesh.elementCount);
- EXPECT_EQ(expectedMesh.primitiveMode, builtMesh.primitiveMode);
- EXPECT_EQ(expectedMesh.indices.indices, builtMesh.indices.indices);
- EXPECT_EQ(expectedMesh.indices.bufferObject, builtMesh.indices.bufferObject);
- EXPECT_EQ(expectedMesh.vertices.attribFlags, builtMesh.vertices.attribFlags);
- EXPECT_EQ(expectedMesh.vertices.bufferObject, builtMesh.vertices.bufferObject);
- EXPECT_EQ(expectedMesh.vertices.color, builtMesh.vertices.color);
- EXPECT_EQ(expectedMesh.vertices.position, builtMesh.vertices.position);
- EXPECT_EQ(expectedMesh.vertices.stride, builtMesh.vertices.stride);
- EXPECT_EQ(expectedMesh.vertices.texCoord, builtMesh.vertices.texCoord);
-
- if (builtMesh.vertices.position) {
- for (int i = 0; i < 4; i++) {
- TextureVertex& expectedVertex = expectedMesh.mappedVertices[i];
- TextureVertex& builtVertex = builtMesh.mappedVertices[i];
- EXPECT_EQ(expectedVertex.u, builtVertex.u);
- EXPECT_EQ(expectedVertex.v, builtVertex.v);
- EXPECT_EQ(expectedVertex.x, builtVertex.x);
- EXPECT_EQ(expectedVertex.y, builtVertex.y);
- }
- }
-}
-
-static void expectTransformEq(Glop::Transform& expectedTransform, Glop::Transform& builtTransform) {
- EXPECT_EQ(expectedTransform.canvas, builtTransform.canvas);
- EXPECT_EQ(expectedTransform.modelView, builtTransform.modelView);
- EXPECT_EQ(expectedTransform.transformFlags, expectedTransform.transformFlags);
-}
-
-static void expectGlopEq(Glop& expectedGlop, Glop& builtGlop) {
- expectBlendEq(expectedGlop.blend, builtGlop.blend);
- expectFillEq(expectedGlop.fill, builtGlop.fill);
- expectMeshEq(expectedGlop.mesh, builtGlop.mesh);
- expectTransformEq(expectedGlop.transform, builtGlop.transform);
-}
-
-static std::unique_ptr<Glop> blackUnitQuadGlop(RenderState& renderState) {
- std::unique_ptr<Glop> glop(new Glop());
- glop->blend = {GL_ZERO, GL_ZERO};
- glop->mesh.elementCount = 4;
- glop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- glop->mesh.indices.indices = nullptr;
- glop->mesh.indices.bufferObject = GL_ZERO;
- glop->mesh.vertices = {renderState.meshState().getUnitQuadVBO(),
- VertexAttribFlags::None,
- nullptr,
- nullptr,
- nullptr,
- kTextureVertexStride};
- glop->transform.modelView.loadIdentity();
- glop->fill.colorEnabled = true;
- glop->fill.color.set(Color::Black);
- glop->fill.skiaShaderData.skiaShaderType = kNone_SkiaShaderType;
- glop->fill.filterMode = ProgramDescription::ColorFilterMode::None;
- glop->fill.texture = {nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
- return glop;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(GlopBuilder, rectSnapTest) {
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
- SkPaint paint;
- Rect dest(1, 1, 100, 100);
- Matrix4 simpleTranslate;
- simpleTranslate.loadTranslate(0.7, 0.7, 0);
- Glop glop;
- GlopBuilder(renderState, caches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshUnitQuad()
- .setFillPaint(paint, 1.0f)
- .setTransform(simpleTranslate, TransformFlags::None)
- .setModelViewMapUnitToRectSnap(dest)
- .build();
-
- std::unique_ptr<Glop> goldenGlop(blackUnitQuadGlop(renderState));
- // Rect(1,1,100,100) is the set destination,
- // so unit quad should be translated by (1,1) and scaled by (99, 99)
- // Tricky part: because translate (0.7, 0.7) and snapping were set in glopBuilder,
- // unit quad also should be translate by additional (0.3, 0.3) to snap to exact pixels.
- goldenGlop->transform.modelView.loadTranslate(1.3, 1.3, 0);
- goldenGlop->transform.modelView.scale(99, 99, 1);
- goldenGlop->transform.canvas = simpleTranslate;
- goldenGlop->fill.texture.filter = GL_NEAREST;
- expectGlopEq(*goldenGlop, glop);
-}
diff --git a/libs/hwui/tests/unit/GradientCacheTests.cpp b/libs/hwui/tests/unit/GradientCacheTests.cpp
deleted file mode 100644
index 6710c71..0000000
--- a/libs/hwui/tests/unit/GradientCacheTests.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include "Extensions.h"
-#include "GradientCache.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(GradientCache, addRemove) {
- Extensions extensions;
- GradientCache cache(extensions);
- ASSERT_LT(1000u, cache.getMaxSize()) << "Expect non-trivial size";
-
- SkColor colors[] = {0xFF00FF00, 0xFFFF0000, 0xFF0000FF};
- float positions[] = {1, 2, 3};
- Texture* texture = cache.get(colors, positions, 3);
- ASSERT_TRUE(texture);
- ASSERT_FALSE(texture->cleanup);
- ASSERT_EQ((uint32_t)texture->objectSize(), cache.getSize());
- ASSERT_TRUE(cache.getSize());
- cache.clear();
- ASSERT_EQ(cache.getSize(), 0u);
-}
diff --git a/libs/hwui/tests/unit/LeakCheckTests.cpp b/libs/hwui/tests/unit/LeakCheckTests.cpp
deleted file mode 100644
index 20ec084..0000000
--- a/libs/hwui/tests/unit/LeakCheckTests.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
-#include "FrameBuilder.h"
-#include "LayerUpdateQueue.h"
-#include "RecordingCanvas.h"
-#include "tests/common/TestUtils.h"
-
-#include <gtest/gtest.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-const FrameBuilder::LightGeometry sLightGeometery = {{100, 100, 100}, 50};
-const BakedOpRenderer::LightInfo sLightInfo = {128, 128};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(LeakCheck, saveLayer_overdrawRejection) {
- auto node = TestUtils::createNode(0, 0, 100, 100, [](RenderProperties& props, Canvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restore();
-
- // opaque draw, rejects saveLayer beneath
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometery,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(LeakCheck, saveLayerUnclipped_simple) {
- auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, Canvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometery,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
-}
diff --git a/libs/hwui/tests/unit/MeshStateTests.cpp b/libs/hwui/tests/unit/MeshStateTests.cpp
deleted file mode 100644
index 1573fd3..0000000
--- a/libs/hwui/tests/unit/MeshStateTests.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <debug/MockGlesDriver.h>
-#include <debug/ScopedReplaceDriver.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <renderstate/MeshState.h>
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-using namespace testing;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(MeshState, genOrUpdate) {
- debug::ScopedReplaceDriver<debug::MockGlesDriver> driverRef;
- auto& mockGlDriver = driverRef.get();
- EXPECT_CALL(mockGlDriver, glGenBuffers_(_, _)).WillOnce(SetArgPointee<1>(35));
- EXPECT_CALL(mockGlDriver, glBindBuffer_(_, 35));
- EXPECT_CALL(mockGlDriver, glBufferData_(_, _, _, _));
-
- GLuint buffer = 0;
- renderThread.renderState().meshState().genOrUpdateMeshBuffer(&buffer, 10, nullptr,
- GL_DYNAMIC_DRAW);
-}
diff --git a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
deleted file mode 100644
index 0d47367..0000000
--- a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <Rect.h>
-#include <gtest/gtest.h>
-#include <renderstate/OffscreenBufferPool.h>
-
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-
-TEST(OffscreenBuffer, computeIdealDimension) {
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(1));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(31));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(33));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(64));
- EXPECT_EQ(1024u, OffscreenBuffer::computeIdealDimension(1000));
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, construct) {
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 49u, 149u);
- EXPECT_EQ(49u, layer.viewportWidth);
- EXPECT_EQ(149u, layer.viewportHeight);
-
- EXPECT_EQ(64u, layer.texture.width());
- EXPECT_EQ(192u, layer.texture.height());
-
- EXPECT_EQ(64u * 192u * 4u, layer.getSizeInBytes());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, constructWideColorGamut) {
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 49u, 149u, true);
- EXPECT_EQ(49u, layer.viewportWidth);
- EXPECT_EQ(149u, layer.viewportHeight);
-
- EXPECT_EQ(64u, layer.texture.width());
- EXPECT_EQ(192u, layer.texture.height());
-
- EXPECT_TRUE(layer.wideColorGamut);
-
- EXPECT_EQ(64u * 192u * 8u, layer.getSizeInBytes());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, getTextureCoordinates) {
- OffscreenBuffer layerAligned(renderThread.renderState(), Caches::getInstance(), 256u, 256u);
- EXPECT_EQ(Rect(0, 1, 1, 0), layerAligned.getTextureCoordinates());
-
- OffscreenBuffer layerUnaligned(renderThread.renderState(), Caches::getInstance(), 200u, 225u);
- EXPECT_EQ(Rect(0, 225.0f / 256.0f, 200.0f / 256.0f, 0), layerUnaligned.getTextureCoordinates());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, dirty) {
- OffscreenBuffer buffer(renderThread.renderState(), Caches::getInstance(), 256u, 256u);
- buffer.dirty(Rect(-100, -100, 100, 100));
- EXPECT_EQ(android::Rect(100, 100), buffer.region.getBounds());
-}
-
-RENDERTHREAD_TEST(OffscreenBufferPool, construct) {
- OffscreenBufferPool pool;
- EXPECT_EQ(0u, pool.getCount()) << "pool must be created empty";
- EXPECT_EQ(0u, pool.getSize()) << "pool must be created empty";
- // TODO: Does this really make sense as a test?
- EXPECT_EQ(DeviceInfo::multiplyByResolution(4 * 4), pool.getMaxSize());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, getPutClear) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 100u, 200u);
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
-
- ASSERT_LT(layer->getSizeInBytes(), pool.getMaxSize());
-
- pool.putOrDelete(layer);
- ASSERT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- auto layer2 = pool.get(renderThread.renderState(), 102u, 202u);
- EXPECT_EQ(layer, layer2) << "layer should be recycled";
- ASSERT_EQ(0u, pool.getSize()) << "pool should have been emptied by removing only layer";
-
- pool.putOrDelete(layer);
- EXPECT_EQ(1u, pool.getCount());
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, getPutClearWideColorGamut) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 100u, 200u, true);
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
- EXPECT_TRUE(layer->wideColorGamut);
-
- ASSERT_LT(layer->getSizeInBytes(), pool.getMaxSize());
-
- pool.putOrDelete(layer);
- ASSERT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- auto layer2 = pool.get(renderThread.renderState(), 102u, 202u, true);
- EXPECT_EQ(layer, layer2) << "layer should be recycled";
- ASSERT_EQ(0u, pool.getSize()) << "pool should have been emptied by removing only layer";
-
- pool.putOrDelete(layer2);
- EXPECT_EQ(1u, pool.getCount());
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-
- // add non wide gamut layer
- auto layer3 = pool.get(renderThread.renderState(), 100u, 200u);
- EXPECT_FALSE(layer3->wideColorGamut);
- pool.putOrDelete(layer3);
- EXPECT_EQ(1u, pool.getCount());
-
- auto layer4 = pool.get(renderThread.renderState(), 100u, 200u, true);
- EXPECT_TRUE(layer4->wideColorGamut);
- EXPECT_EQ(1u, pool.getCount());
- ASSERT_NE(layer3, layer4);
-
- pool.putOrDelete(layer4);
-
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, resize) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 64u, 64u);
- layer->dirty(Rect(64, 64));
-
- // resize in place
- ASSERT_EQ(layer, pool.resize(layer, 60u, 55u));
- EXPECT_TRUE(layer->region.isEmpty()) << "In place resize should clear usage region";
- EXPECT_EQ(60u, layer->viewportWidth);
- EXPECT_EQ(55u, layer->viewportHeight);
- EXPECT_EQ(64u, layer->texture.width());
- EXPECT_EQ(64u, layer->texture.height());
-
- // resized to use different object in pool
- auto layer2 = pool.get(renderThread.renderState(), 128u, 128u);
- layer2->dirty(Rect(128, 128));
- EXPECT_FALSE(layer2->region.isEmpty());
- pool.putOrDelete(layer2);
- ASSERT_EQ(1u, pool.getCount());
-
- ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u));
- EXPECT_TRUE(layer2->region.isEmpty()) << "Swap resize should clear usage region";
- EXPECT_EQ(120u, layer2->viewportWidth);
- EXPECT_EQ(125u, layer2->viewportHeight);
- EXPECT_EQ(128u, layer2->texture.width());
- EXPECT_EQ(128u, layer2->texture.height());
-
- // original allocation now only thing in pool
- EXPECT_EQ(1u, pool.getCount());
- EXPECT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- pool.putOrDelete(layer2);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, resizeWideColorGamut) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 64u, 64u, true);
-
- // resize in place
- ASSERT_EQ(layer, pool.resize(layer, 60u, 55u));
- EXPECT_EQ(60u, layer->viewportWidth);
- EXPECT_EQ(55u, layer->viewportHeight);
- EXPECT_EQ(64u, layer->texture.width());
- EXPECT_EQ(64u, layer->texture.height());
-
- EXPECT_TRUE(layer->wideColorGamut);
- EXPECT_EQ(64u * 64u * 8u, layer->getSizeInBytes());
-
- // resized to use different object in pool
- auto layer2 = pool.get(renderThread.renderState(), 128u, 128u, true);
- pool.putOrDelete(layer2);
- ASSERT_EQ(1u, pool.getCount());
-
- // add a non-wide gamut layer
- auto layer3 = pool.get(renderThread.renderState(), 128u, 128u);
- pool.putOrDelete(layer3);
- ASSERT_EQ(2u, pool.getCount());
-
- ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u));
- EXPECT_EQ(120u, layer2->viewportWidth);
- EXPECT_EQ(125u, layer2->viewportHeight);
- EXPECT_EQ(128u, layer2->texture.width());
- EXPECT_EQ(128u, layer2->texture.height());
-
- EXPECT_TRUE(layer2->wideColorGamut);
- EXPECT_EQ(128u * 128u * 8u, layer2->getSizeInBytes());
-
- pool.putOrDelete(layer2);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, putAndDestroy) {
- OffscreenBufferPool pool;
- // layer too big to return to the pool
- // Note: this relies on the fact that the pool won't reject based on max texture size
- auto hugeLayer = pool.get(renderThread.renderState(), pool.getMaxSize() / 64, 64);
- EXPECT_GT(hugeLayer->getSizeInBytes(), pool.getMaxSize());
- pool.putOrDelete(hugeLayer);
- EXPECT_EQ(0u, pool.getCount()); // failed to put (so was destroyed instead)
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, clear) {
- EXPECT_EQ(0, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
- OffscreenBufferPool pool;
-
- // Create many buffers, with several at each size
- std::vector<OffscreenBuffer*> buffers;
- for (int size = 32; size <= 128; size += 32) {
- for (int i = 0; i < 10; i++) {
- buffers.push_back(pool.get(renderThread.renderState(), size, size));
- }
- }
- EXPECT_EQ(0u, pool.getCount()) << "Expect nothing inside";
- for (auto& buffer : buffers) pool.putOrDelete(buffer);
- EXPECT_EQ(40u, pool.getCount()) << "Expect all items added";
- EXPECT_EQ(40, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
- pool.clear();
- EXPECT_EQ(0u, pool.getCount()) << "Expect all items cleared";
-
- EXPECT_EQ(0, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
-}
diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
deleted file mode 100644
index 8a9e34f..0000000
--- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp
+++ /dev/null
@@ -1,847 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include <DeferredLayerUpdater.h>
-#include <RecordedOp.h>
-#include <RecordingCanvas.h>
-#include <hwui/Paint.h>
-#include <minikin/Layout.h>
-#include <tests/common/TestUtils.h>
-#include <utils/Color.h>
-
-#include <SkGradientShader.h>
-#include <SkImagePriv.h>
-#include <SkShader.h>
-
-namespace android {
-namespace uirenderer {
-
-static void playbackOps(const DisplayList& displayList,
- std::function<void(const RecordedOp&)> opReceiver) {
- for (auto& chunk : displayList.getChunks()) {
- for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
- RecordedOp* op = displayList.getOps()[opIndex];
- opReceiver(*op);
- }
- }
-}
-
-static void validateSingleOp(std::unique_ptr<DisplayList>& dl,
- std::function<void(const RecordedOp& op)> opValidator) {
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- opValidator(*(dl->getOps()[0]));
-}
-
-// The RecordingCanvas is only ever used by the OpenGL RenderPipeline and never when Skia is in use.
-// Thus, even though many of these test are not directly dependent on the current RenderPipeline, we
-// set them all to be OPENGL_PIPELINE_TESTs in case the underlying code in RecordingCanvas ever
-// changes to require the use of the OPENGL_PIPELINE. Currently the textureLayer test is the only
-// test that requires being an OPENGL_PIPELINE_TEST.
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyPlayback) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.restore();
- });
- playbackOps(*dl, [](const RecordedOp& op) { ADD_FAILURE(); });
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, clipRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(0, 0, 100, 100, SkClipOp::kIntersect);
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawRect(50, 50, 100, 100, SkPaint());
- canvas.restore();
- });
-
- ASSERT_EQ(2u, dl->getOps().size()) << "Must be exactly two ops";
- EXPECT_CLIP_RECT(Rect(100, 100), dl->getOps()[0]->localClip);
- EXPECT_CLIP_RECT(Rect(100, 100), dl->getOps()[1]->localClip);
- EXPECT_EQ(dl->getOps()[0]->localClip, dl->getOps()[1]->localClip)
- << "Clip should be serialized once";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyClipRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(0, 0, 100, 100, SkClipOp::kIntersect);
- canvas.clipRect(100, 100, 200, 200, SkClipOp::kIntersect);
- canvas.drawRect(0, 0, 50, 50, SkPaint()); // rejected at record time
- canvas.restore();
- });
- ASSERT_EQ(0u, dl->getOps().size()) << "Must be zero ops. Rect should be rejected.";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyPaintRejection) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint emptyPaint;
- emptyPaint.setColor(Color::Transparent);
-
- float points[] = {0, 0, 200, 200};
- canvas.drawPoints(points, 4, emptyPaint);
- canvas.drawLines(points, 4, emptyPaint);
- canvas.drawRect(0, 0, 200, 200, emptyPaint);
- canvas.drawRegion(SkRegion(SkIRect::MakeWH(200, 200)), emptyPaint);
- canvas.drawRoundRect(0, 0, 200, 200, 10, 10, emptyPaint);
- canvas.drawCircle(100, 100, 100, emptyPaint);
- canvas.drawOval(0, 0, 200, 200, emptyPaint);
- canvas.drawArc(0, 0, 200, 200, 0, 360, true, emptyPaint);
- SkPath path;
- path.addRect(0, 0, 200, 200);
- canvas.drawPath(path, emptyPaint);
- });
- EXPECT_EQ(0u, dl->getOps().size()) << "Op should be rejected";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawArc) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawArc(0, 0, 200, 200, 0, 180, true, SkPaint());
- canvas.drawArc(0, 0, 100, 100, 0, 360, true, SkPaint());
- });
-
- auto&& ops = dl->getOps();
- ASSERT_EQ(2u, ops.size()) << "Must be exactly two ops";
- EXPECT_EQ(RecordedOpId::ArcOp, ops[0]->opId);
- EXPECT_EQ(Rect(200, 200), ops[0]->unmappedBounds);
-
- EXPECT_EQ(RecordedOpId::OvalOp, ops[1]->opId) << "Circular arcs should be converted to ovals";
- EXPECT_EQ(Rect(100, 100), ops[1]->unmappedBounds);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawLines) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setStrokeWidth(
- 20); // doesn't affect recorded bounds - would be resolved at bake time
- float points[] = {0, 0, 20, 10, 30, 40, 90}; // NB: only 1 valid line
- canvas.drawLines(&points[0], 7, paint);
- });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = dl->getOps()[0];
- ASSERT_EQ(RecordedOpId::LinesOp, op->opId);
- EXPECT_EQ(4, ((LinesOp*)op)->floatCount)
- << "float count must be rounded down to closest multiple of 4";
- EXPECT_EQ(Rect(20, 10), op->unmappedBounds)
- << "unmapped bounds must be size of line, and not outset for stroke width";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 200, [](RecordingCanvas& canvas) { canvas.drawRect(10, 20, 90, 180, SkPaint()); });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = *(dl->getOps()[0]);
- ASSERT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_EQ(Rect(10, 20, 90, 180), op.unmappedBounds);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRoundRect) {
- // Round case - stays rounded
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.drawRoundRect(0, 0, 100, 100, 10, 10, SkPaint());
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- ASSERT_EQ(RecordedOpId::RoundRectOp, dl->getOps()[0]->opId);
-
- // Non-rounded case - turned into drawRect
- dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.drawRoundRect(0, 0, 100, 100, 0, -1, SkPaint());
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- ASSERT_EQ(RecordedOpId::RectOp, dl->getOps()[0]->opId)
- << "Non-rounded rects should be converted";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- EXPECT_TRUE(op.unmappedBounds.contains(25, 15, 50, 25))
- << "Op expected to be 25+ pixels wide, 10+ pixels tall";
- });
- ASSERT_EQ(1, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs_strikeThruAndUnderline) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 2; j++) {
- uint32_t flags = paint.getFlags();
- if (i != 0) {
- flags |= SkPaint::kUnderlineText_ReserveFlag;
- } else {
- flags &= ~SkPaint::kUnderlineText_ReserveFlag;
- }
- if (j != 0) {
- flags |= SkPaint::kStrikeThruText_ReserveFlag;
- } else {
- flags &= ~SkPaint::kStrikeThruText_ReserveFlag;
- }
- paint.setFlags(flags);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- }
- }
- });
-
- auto ops = dl->getOps();
- ASSERT_EQ(8u, ops.size());
-
- int index = 0;
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId); // no underline or strikethrough
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // strikethrough only
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // underline only
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // underline
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // strikethrough
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs_forceAlignLeft) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- paint.setTextAlign(SkPaint::kLeft_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- paint.setTextAlign(SkPaint::kCenter_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- paint.setTextAlign(SkPaint::kRight_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- });
-
- int count = 0;
- float lastX = FLT_MAX;
- playbackOps(*dl, [&count, &lastX](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(SkPaint::kLeft_Align, op.paint->getTextAlign())
- << "recorded drawText commands must force kLeft_Align on their paint";
-
- // verify TestUtils alignment offsetting (TODO: move asserts to Canvas base class)
- EXPECT_GT(lastX, ((const TextOp&)op).x)
- << "x coordinate should reduce across each of the draw commands, from alignment";
- lastX = ((const TextOp&)op).x;
- });
- ASSERT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawColor) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawColor(Color::Black, SkBlendMode::kSrcOver);
- });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = *(dl->getOps()[0]);
- EXPECT_EQ(RecordedOpId::ColorOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.unmappedBounds.isEmpty()) << "Expect undefined recorded bounds";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, backgroundAndImage) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(25, 25));
- SkPaint paint;
- paint.setColor(SK_ColorBLUE);
-
- canvas.save(SaveFlags::MatrixClip);
- {
- // a background!
- canvas.save(SaveFlags::MatrixClip);
- canvas.drawRect(0, 0, 100, 200, paint);
- canvas.restore();
- }
- {
- // an image!
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(25, 25);
- canvas.scale(2, 2);
- canvas.drawBitmap(*bitmap, 0, 0, nullptr);
- canvas.restore();
- }
- canvas.restore();
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count == 0) {
- ASSERT_EQ(RecordedOpId::RectOp, op.opId);
- ASSERT_NE(nullptr, op.paint);
- EXPECT_EQ(SK_ColorBLUE, op.paint->getColor());
- EXPECT_EQ(Rect(100, 200), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
-
- Matrix4 expectedMatrix;
- expectedMatrix.loadIdentity();
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- } else {
- ASSERT_EQ(RecordedOpId::BitmapOp, op.opId);
- EXPECT_EQ(nullptr, op.paint);
- EXPECT_EQ(Rect(25, 25), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
-
- Matrix4 expectedMatrix;
- expectedMatrix.loadTranslate(25, 25, 0);
- expectedMatrix.scale(2, 2, 1);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- count++;
- });
- ASSERT_EQ(2, count);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(RecordingCanvas, textureLayer) {
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200,
- [&layerUpdater](RecordingCanvas& canvas) { canvas.drawLayer(layerUpdater.get()); });
-
- validateSingleOp(dl, [](const RecordedOp& op) {
- ASSERT_EQ(RecordedOpId::TextureLayerOp, op.opId);
- ASSERT_TRUE(op.localMatrix.isIdentity()) << "Op must not apply matrix at record time.";
- });
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_simple) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- Matrix4 expectedMatrix;
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(180, 160), op.localClip);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- expectedMatrix.loadTranslate(-10, -20, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rounding) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10.25f, 10.75f, 89.25f, 89.75f, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(20, 20, 80, 80, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- Matrix4 expectedMatrix;
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 10, 90, 90), op.unmappedBounds) << "Expect bounds rounded out";
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- expectedMatrix.loadTranslate(-10, -10, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix) << "Expect rounded offset";
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_missingRestore) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 200, 200, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- // Note: restore omitted, shouldn't result in unmatched save
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 2) {
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- }
- });
- EXPECT_EQ(3, count) << "Missing a restore shouldn't result in an unmatched saveLayer";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_simpleUnclipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginUnclippedLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndUnclippedLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_addClipFlag) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(10, 20, 190, 180, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 0) {
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId)
- << "Clip + unclipped saveLayer should result in a clipped layer";
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_viewportCrop) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // shouldn't matter, since saveLayer will clip to its bounds
- canvas.clipRect(-1000, -1000, 1000, 1000, SkClipOp::kReplace_deprecated);
-
- canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- Matrix4 expectedMatrix;
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(100, 100), op.localClip) // Recorded clip rect should be
- // intersection of viewport and saveLayer bounds, in layer space;
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds);
- expectedMatrix.loadTranslate(-100, -100, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rotateUnclipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(100, 100);
- canvas.rotate(45);
- canvas.translate(-50, -50);
-
- canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restore();
-
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(100, 100), op.localClip);
- EXPECT_EQ(Rect(100, 100), op.unmappedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), op.localMatrix)
- << "Recorded op shouldn't see any canvas transform before the saveLayer";
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rotateClipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(100, 100);
- canvas.rotate(45);
- canvas.translate(-200, -200);
-
- // area of saveLayer will be clipped to parent viewport, so we ask for 400x400...
- canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
-
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- Matrix4 expectedMatrix;
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
-
- // ...and get about 58.6, 58.6, 341.4 341.4, because the bounds are clipped by
- // the parent 200x200 viewport, but prior to rotation
- ASSERT_NE(nullptr, op.localClip);
- ASSERT_EQ(ClipMode::Rectangle, op.localClip->mode);
- // NOTE: this check relies on saveLayer altering the clip post-viewport init. This
- // causes the clip to be recorded by contained draw commands, though it's not necessary
- // since the same clip will be computed at draw time. If such a change is made, this
- // check could be done at record time by querying the clip, or the clip could be altered
- // slightly so that it is serialized.
- EXPECT_EQ(Rect(59, 59, 341, 341), op.localClip->rect);
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds);
- expectedMatrix.loadIdentity();
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rejectBegin) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(0, -20); // avoid identity case
- // empty clip rect should force layer + contents to be rejected
- canvas.clipRect(0, -20, 200, -20, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(0, 0, 200, 200, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- canvas.restore();
- });
-
- ASSERT_EQ(0u, dl->getOps().size()) << "Begin/Rect/End should all be rejected.";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRenderNode_rejection) {
- auto child =
- TestUtils::createNode(50, 50, 150, 150, [](RenderProperties& props, Canvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&child](RecordingCanvas& canvas) {
- canvas.clipRect(0, 0, 0, 0, SkClipOp::kIntersect); // empty clip, reject node
- canvas.drawRenderNode(child.get()); // shouldn't crash when rejecting node...
- });
- ASSERT_TRUE(dl->isEmpty());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRenderNode_projection) {
- sp<RenderNode> background =
- TestUtils::createNode(50, 50, 150, 150, [](RenderProperties& props, Canvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- {
- background->mutateStagingProperties().setProjectionReceiver(false);
-
- // NO RECEIVER PRESENT
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&background](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.drawRenderNode(background.get());
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
- EXPECT_EQ(-1, dl->projectionReceiveIndex)
- << "no projection receiver should have been observed";
- }
- {
- background->mutateStagingProperties().setProjectionReceiver(true);
-
- // RECEIVER PRESENT
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&background](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.drawRenderNode(background.get());
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
-
- ASSERT_EQ(3u, dl->getOps().size()) << "Must be three ops";
- auto op = dl->getOps()[1];
- EXPECT_EQ(RecordedOpId::RenderNodeOp, op->opId);
- EXPECT_EQ(1, dl->projectionReceiveIndex) << "correct projection receiver not identified";
-
- // verify the behavior works even though projection receiver hasn't been sync'd yet
- EXPECT_TRUE(background->stagingProperties().isProjectionReceiver());
- EXPECT_FALSE(background->properties().isProjectionReceiver());
- }
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, firstClipWillReplace) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- // since no explicit clip set on canvas, this should be the one observed on op:
- canvas.clipRect(-100, -100, 300, 300, SkClipOp::kIntersect);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
-
- canvas.restore();
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op";
- // first clip must be preserved, even if it extends beyond canvas bounds
- EXPECT_CLIP_RECT(Rect(-100, -100, 300, 300), dl->getOps()[0]->localClip);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, replaceClipIntersectWithRoot) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(-10, -10, 110, 110, SkClipOp::kReplace_deprecated);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- canvas.restore();
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op";
- // first clip must be preserved, even if it extends beyond canvas bounds
- EXPECT_CLIP_RECT(Rect(-10, -10, 110, 110), dl->getOps()[0]->localClip);
- EXPECT_TRUE(dl->getOps()[0]->localClip->intersectWithRoot);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, insertReorderBarrier) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.insertReorderBarrier(false);
- });
-
- auto chunks = dl->getChunks();
- EXPECT_EQ(0u, chunks[0].beginOpIndex);
- EXPECT_EQ(1u, chunks[0].endOpIndex);
- EXPECT_FALSE(chunks[0].reorderChildren);
-
- EXPECT_EQ(1u, chunks[1].beginOpIndex);
- EXPECT_EQ(2u, chunks[1].endOpIndex);
- EXPECT_TRUE(chunks[1].reorderChildren);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, insertReorderBarrier_clip) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // first chunk: no recorded clip
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
-
- // second chunk: no recorded clip, since inorder region
- canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect);
- canvas.insertReorderBarrier(false);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
-
- // third chunk: recorded clip
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
-
- auto chunks = dl->getChunks();
- ASSERT_EQ(3u, chunks.size());
-
- EXPECT_TRUE(chunks[0].reorderChildren);
- EXPECT_EQ(nullptr, chunks[0].reorderClip);
-
- EXPECT_FALSE(chunks[1].reorderChildren);
- EXPECT_EQ(nullptr, chunks[1].reorderClip);
-
- EXPECT_TRUE(chunks[2].reorderChildren);
- ASSERT_NE(nullptr, chunks[2].reorderClip);
- EXPECT_EQ(Rect(200, 200), chunks[2].reorderClip->rect);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refPaint) {
- SkPaint paint;
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&paint](RecordingCanvas& canvas) {
- paint.setColor(SK_ColorBLUE);
- // first two should use same paint
- canvas.drawRect(0, 0, 200, 10, paint);
- SkPaint paintCopy(paint);
- canvas.drawRect(0, 10, 200, 20, paintCopy);
-
- // only here do we use different paint ptr
- paint.setColor(SK_ColorRED);
- canvas.drawRect(0, 20, 200, 30, paint);
- });
- auto ops = dl->getOps();
- ASSERT_EQ(3u, ops.size());
-
- // first two are the same
- EXPECT_NE(nullptr, ops[0]->paint);
- EXPECT_NE(&paint, ops[0]->paint);
- EXPECT_EQ(ops[0]->paint, ops[1]->paint);
-
- // last is different, but still copied / non-null
- EXPECT_NE(nullptr, ops[2]->paint);
- EXPECT_NE(ops[0]->paint, ops[2]->paint);
- EXPECT_NE(&paint, ops[2]->paint);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmap) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(100, 100));
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100,
- [&bitmap](RecordingCanvas& canvas) { canvas.drawBitmap(*bitmap, 0, 0, nullptr); });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmapInShader_bitmapShader) {
- sk_sp<Bitmap> bitmap = TestUtils::createBitmap(100, 100);
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100, [&bitmap](RecordingCanvas& canvas) {
- SkPaint paint;
- SkBitmap skBitmap;
- bitmap->getSkBitmap(&skBitmap);
- sk_sp<SkImage> image =
- SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode);
- sk_sp<SkShader> shader =
- image->makeShader(SkShader::TileMode::kClamp_TileMode,
- SkShader::TileMode::kClamp_TileMode, nullptr);
- paint.setShader(std::move(shader));
- canvas.drawRoundRect(0, 0, 100, 100, 20.0f, 20.0f, paint);
- });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmapInShader_composeShader) {
- sk_sp<Bitmap> bitmap = TestUtils::createBitmap(100, 100);
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100, [&bitmap](RecordingCanvas& canvas) {
- SkPaint paint;
- SkBitmap skBitmap;
- bitmap->getSkBitmap(&skBitmap);
- sk_sp<SkImage> image =
- SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode);
- sk_sp<SkShader> shader1 =
- image->makeShader(SkShader::TileMode::kClamp_TileMode,
- SkShader::TileMode::kClamp_TileMode, nullptr);
-
- SkPoint center;
- center.set(50, 50);
- SkColor colors[2];
- colors[0] = Color::Black;
- colors[1] = Color::White;
- sk_sp<SkShader> shader2 = SkGradientShader::MakeRadial(
- center, 50, colors, nullptr, 2, SkShader::TileMode::kRepeat_TileMode);
-
- sk_sp<SkShader> composeShader = SkShader::MakeComposeShader(
- std::move(shader1), std::move(shader2), SkBlendMode::kMultiply);
- paint.setShader(std::move(composeShader));
- canvas.drawRoundRect(0, 0, 100, 100, 20.0f, 20.0f, paint);
- });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawText) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- Paint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "HELLO", paint, 25, 25);
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- EXPECT_TRUE(op.unmappedBounds.getHeight() >= 10);
- EXPECT_TRUE(op.unmappedBounds.getWidth() >= 25);
- });
- ASSERT_EQ(1, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawTextInHighContrast) {
- Properties::enableHighContrastText = true;
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- Paint paint;
- paint.setColor(SK_ColorWHITE);
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "HELLO", paint, 25, 25);
- });
- Properties::enableHighContrastText = false;
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- if (count++ == 0) {
- EXPECT_EQ(SK_ColorBLACK, op.paint->getColor());
- EXPECT_EQ(SkPaint::kStrokeAndFill_Style, op.paint->getStyle());
- } else {
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- EXPECT_EQ(SkPaint::kFill_Style, op.paint->getStyle());
- }
-
- });
- ASSERT_EQ(2, count);
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/SkiaCanvasTests.cpp b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
index 1d7dc3d..2e4de0b 100644
--- a/libs/hwui/tests/unit/SkiaCanvasTests.cpp
+++ b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
@@ -26,41 +26,6 @@
using namespace android;
using namespace android::uirenderer;
-/**
- * Verify that we get the same culling bounds for text for (1) drawing glyphs
- * directly to a Canvas or (2) going through a SkPicture as an intermediate step.
- */
-OPENGL_PIPELINE_TEST(SkiaCanvasProxy, drawGlyphsViaPicture) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // setup test variables
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- static const char* text = "testing text bounds";
-
- // draw text directly into Recording canvas
- TestUtils::drawUtf8ToCanvas(&canvas, text, paint, 25, 25);
-
- // record the same text draw into a SkPicture and replay it into a Recording canvas
- SkPictureRecorder recorder;
- SkCanvas* skCanvas = recorder.beginRecording(200, 200, NULL, 0);
- std::unique_ptr<Canvas> pictCanvas(Canvas::create_canvas(skCanvas));
- TestUtils::drawUtf8ToCanvas(pictCanvas.get(), text, paint, 25, 25);
- sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
-
- canvas.asSkCanvas()->drawPicture(picture);
- });
-
- // verify that the text bounds and matrices match
- ASSERT_EQ(2U, dl->getOps().size());
- auto directOp = dl->getOps()[0];
- auto pictureOp = dl->getOps()[1];
- ASSERT_EQ(RecordedOpId::TextOp, directOp->opId);
- EXPECT_EQ(directOp->opId, pictureOp->opId);
- EXPECT_EQ(directOp->unmappedBounds, pictureOp->unmappedBounds);
- EXPECT_EQ(directOp->localMatrix, pictureOp->localMatrix);
-}
-
TEST(SkiaCanvas, drawShadowLayer) {
auto surface = SkSurface::MakeRasterN32Premul(10, 10);
SkiaCanvas canvas(surface->getCanvas());
diff --git a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp b/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp
deleted file mode 100644
index 92d05e4..0000000
--- a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include "GammaFontRenderer.h"
-#include "TextDropShadowCache.h"
-#include "tests/common/TestUtils.h"
-#include "utils/Blur.h"
-
-#include <SkPaint.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(TextDropShadowCache, addRemove) {
- SkPaint paint;
- paint.setTextSize(20);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
- GammaFontRenderer gammaFontRenderer;
- FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer();
- fontRenderer.setFont(&paint, SkMatrix::I());
- TextDropShadowCache cache(MB(5));
- cache.setFontRenderer(fontRenderer);
-
- std::vector<glyph_t> glyphs;
- std::vector<float> positions;
- float totalAdvance;
- uirenderer::Rect bounds;
- TestUtils::layoutTextUnscaled(paint, "This is a test", &glyphs, &positions, &totalAdvance,
- &bounds);
- EXPECT_TRUE(bounds.contains(5, -10, 100, 0)) << "Expect input to be nontrivially sized";
-
- ShadowTexture* texture = cache.get(&paint, glyphs.data(), glyphs.size(), 10, positions.data());
-
- ASSERT_TRUE(texture);
- ASSERT_FALSE(texture->cleanup);
- ASSERT_EQ((uint32_t)texture->objectSize(), cache.getSize());
- ASSERT_TRUE(cache.getSize());
- cache.clear();
- ASSERT_EQ(cache.getSize(), 0u);
-}
diff --git a/libs/hwui/tests/unit/TextureCacheTests.cpp b/libs/hwui/tests/unit/TextureCacheTests.cpp
deleted file mode 100644
index ab740dd..0000000
--- a/libs/hwui/tests/unit/TextureCacheTests.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "Extensions.h"
-#include "TextureCache.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(TextureCache, clear) {
- TextureCache cache;
- ASSERT_EQ(cache.getSize(), 0u);
- // it is not 0, because FontRenderer allocates one texture
- int initialCount = GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture);
- SkBitmap skBitmap;
- SkImageInfo info = SkImageInfo::Make(100, 100, kN32_SkColorType, kPremul_SkAlphaType);
- skBitmap.setInfo(info);
- sk_sp<Bitmap> hwBitmap(renderThread.allocateHardwareBitmap(skBitmap));
- cache.get(hwBitmap.get());
- ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount + 1);
- cache.clear();
- ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount);
-}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index f0d9ca3..8b8fb9d 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -4817,7 +4817,10 @@
filterTypes.add(AudioDeviceInfo.TYPE_TELEPHONY);
if (status != AudioManager.SUCCESS) {
// fail and populate microphones with unknown characteristics by device information.
- Log.e(TAG, "getMicrophones failed:" + status);
+ if (status != AudioManager.ERROR_INVALID_OPERATION) {
+ Log.e(TAG, "getMicrophones failed:" + status);
+ }
+ Log.i(TAG, "fallback on device info");
addMicrophonesFromAudioDeviceInfo(microphones, filterTypes);
return microphones;
}
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 8a36f91..7dfdb20 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -43,6 +43,8 @@
/** @hide */
public static final int PLAYER_PIID_INVALID = -1;
/** @hide */
+ public static final int PLAYER_PIID_UNASSIGNED = 0;
+ /** @hide */
public static final int PLAYER_UPID_INVALID = -1;
// information about the implementation
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 6b35dd4..54800ae 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -1627,7 +1627,10 @@
ArrayList<MicrophoneInfo> activeMicrophones = new ArrayList<>();
int status = native_get_active_microphones(activeMicrophones);
if (status != AudioManager.SUCCESS) {
- Log.e(TAG, "getActiveMicrophones failed:" + status);
+ if (status != AudioManager.ERROR_INVALID_OPERATION) {
+ Log.e(TAG, "getActiveMicrophones failed:" + status);
+ }
+ Log.i(TAG, "getActiveMicrophones failed, fallback on routed device info");
}
AudioManager.setPortIdForMicrophones(activeMicrophones);
diff --git a/media/java/android/media/BufferingParams.java b/media/java/android/media/BufferingParams.java
index 521e897..aaae5e7b 100644
--- a/media/java/android/media/BufferingParams.java
+++ b/media/java/android/media/BufferingParams.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -63,6 +64,7 @@
* <p>Users should use {@link Builder} to change {@link BufferingParams}.
* @hide
*/
+@TestApi
public final class BufferingParams implements Parcelable {
private static final int BUFFERING_NO_MARK = -1;
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index c29300d..2cb58d0 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -909,7 +909,8 @@
if (mMime.toLowerCase().startsWith("audio/")) {
mAudioCaps = AudioCapabilities.create(info, this);
mAudioCaps.getDefaultFormat(mDefaultFormat);
- } else if (mMime.toLowerCase().startsWith("video/")) {
+ } else if (mMime.toLowerCase().startsWith("video/")
+ || mMime.equalsIgnoreCase(MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC)) {
mVideoCaps = VideoCapabilities.create(info, this);
}
if (encoder) {
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index f9a1f8b..392a1eb 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.app.ActivityThread;
import android.content.ContentProvider;
import android.content.ContentResolver;
@@ -1680,6 +1681,7 @@
* @hide
*/
@NonNull
+ @TestApi
public native BufferingParams getBufferingParams();
/**
@@ -1696,6 +1698,7 @@
* @throws IllegalArgumentException if params is invalid or not supported.
* @hide
*/
+ @TestApi
public native void setBufferingParams(@NonNull BufferingParams params);
/**
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 82d64f3..b47b4cd 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -1433,7 +1433,10 @@
ArrayList<MicrophoneInfo> activeMicrophones = new ArrayList<>();
int status = native_getActiveMicrophones(activeMicrophones);
if (status != AudioManager.SUCCESS) {
- Log.e(TAG, "getActiveMicrophones failed:" + status);
+ if (status != AudioManager.ERROR_INVALID_OPERATION) {
+ Log.e(TAG, "getActiveMicrophones failed:" + status);
+ }
+ Log.i(TAG, "getActiveMicrophones failed, fallback on routed device info");
}
AudioManager.setPortIdForMicrophones(activeMicrophones);
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index 80049ba5..7c6367e 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -31,6 +31,7 @@
import android.os.ServiceManager;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
@@ -58,20 +59,29 @@
protected float mRightVolume = 1.0f;
protected float mAuxEffectSendLevel = 0.0f;
- // for AppOps
- private IAppOpsService mAppOps; // may be null
- private IAppOpsCallback mAppOpsCallback;
- private boolean mHasAppOpsPlayAudio = true; // sync'd on mLock
+ // NEVER call into AudioService (see getService()) with mLock held: PlayerBase can run in
+ // the same process as AudioService, which can synchronously call back into this class,
+ // causing deadlocks between the two
private final Object mLock = new Object();
+ // for AppOps
+ private @Nullable IAppOpsService mAppOps;
+ private IAppOpsCallback mAppOpsCallback;
+ @GuardedBy("mLock")
+ private boolean mHasAppOpsPlayAudio = true;
+
private final int mImplType;
// uniquely identifies the Player Interface throughout the system (P I Id)
- private int mPlayerIId;
+ private int mPlayerIId = AudioPlaybackConfiguration.PLAYER_PIID_UNASSIGNED;
- private int mState; // sync'd on mLock
- private int mStartDelayMs = 0; // sync'd on mLock
- private float mPanMultiplierL = 1.0f; // sync'd on mLock
- private float mPanMultiplierR = 1.0f; // sync'd on mLock
+ @GuardedBy("mLock")
+ private int mState;
+ @GuardedBy("mLock")
+ private int mStartDelayMs = 0;
+ @GuardedBy("mLock")
+ private float mPanMultiplierL = 1.0f;
+ @GuardedBy("mLock")
+ private float mPanMultiplierR = 1.0f;
/**
* Constructor. Must be given audio attributes, as they are required for AppOps.
@@ -134,16 +144,24 @@
}
}
+ private void updateState(int state) {
+ final int piid;
+ synchronized (mLock) {
+ mState = state;
+ piid = mPlayerIId;
+ }
+ try {
+ getService().playerEvent(piid, state);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error talking to audio service, "
+ + AudioPlaybackConfiguration.toLogFriendlyPlayerState(state)
+ + " state will not be tracked for piid=" + piid, e);
+ }
+ }
+
void baseStart() {
if (DEBUG) { Log.v(TAG, "baseStart() piid=" + mPlayerIId); }
- try {
- synchronized (mLock) {
- mState = AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
- getService().playerEvent(mPlayerIId, mState);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error talking to audio service, STARTED state will not be tracked", e);
- }
+ updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED);
synchronized (mLock) {
if (isRestricted_sync()) {
playerSetVolume(true/*muting*/,0, 0);
@@ -165,26 +183,12 @@
void basePause() {
if (DEBUG) { Log.v(TAG, "basePause() piid=" + mPlayerIId); }
- try {
- synchronized (mLock) {
- mState = AudioPlaybackConfiguration.PLAYER_STATE_PAUSED;
- getService().playerEvent(mPlayerIId, mState);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error talking to audio service, PAUSED state will not be tracked", e);
- }
+ updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED);
}
void baseStop() {
if (DEBUG) { Log.v(TAG, "baseStop() piid=" + mPlayerIId); }
- try {
- synchronized (mLock) {
- mState = AudioPlaybackConfiguration.PLAYER_STATE_STOPPED;
- getService().playerEvent(mPlayerIId, mState);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error talking to audio service, STOPPED state will not be tracked", e);
- }
+ updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED);
}
void baseSetPan(float pan) {
@@ -228,12 +232,16 @@
*/
void baseRelease() {
if (DEBUG) { Log.v(TAG, "baseRelease() piid=" + mPlayerIId + " state=" + mState); }
+ boolean releasePlayer = false;
+ synchronized (mLock) {
+ if (mState != AudioPlaybackConfiguration.PLAYER_STATE_RELEASED) {
+ releasePlayer = true;
+ mState = AudioPlaybackConfiguration.PLAYER_STATE_RELEASED;
+ }
+ }
try {
- synchronized (mLock) {
- if (mState != AudioPlaybackConfiguration.PLAYER_STATE_RELEASED) {
- getService().releasePlayer(mPlayerIId);
- mState = AudioPlaybackConfiguration.PLAYER_STATE_RELEASED;
- }
+ if (releasePlayer) {
+ getService().releasePlayer(mPlayerIId);
}
} catch (RemoteException e) {
Log.e(TAG, "Error talking to audio service, the player will still be tracked", e);
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index fbc1438..f358103 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -354,7 +354,10 @@
* @return {@code true} if the remote user is trusted and its package name matches with the UID.
* {@code false} otherwise.
*/
- public boolean isTrustedForMediaControl(RemoteUserInfo userInfo) {
+ public boolean isTrustedForMediaControl(@NonNull RemoteUserInfo userInfo) {
+ if (userInfo == null) {
+ throw new IllegalArgumentException("userInfo may not be null");
+ }
if (userInfo.getPackageName() == null) {
return false;
}
diff --git a/native/webview/plat_support/draw_gl_functor.cpp b/native/webview/plat_support/draw_gl_functor.cpp
index d54f558..7cb49da 100644
--- a/native/webview/plat_support/draw_gl_functor.cpp
+++ b/native/webview/plat_support/draw_gl_functor.cpp
@@ -21,7 +21,6 @@
#include "draw_gl.h"
-#include <Properties.h>
#include <errno.h>
#include <jni.h>
#include <private/hwui/DrawGlInfo.h>
@@ -54,13 +53,7 @@
}
AwDrawGLInfo aw_info;
- // TODO(boliu): Remove property check once OpenGL fallback is removed.
- auto render_pipeline_type =
- android::uirenderer::Properties::getRenderPipelineType();
- aw_info.version = (render_pipeline_type ==
- android::uirenderer::RenderPipelineType::OpenGL)
- ? 2
- : kAwDrawGLInfoVersion;
+ aw_info.version = kAwDrawGLInfoVersion;
switch (what) {
case DrawGlInfo::kModeDraw: {
aw_info.mode = AwDrawGLInfo::kModeDraw;
diff --git a/packages/BackupRestoreConfirmation/res/values-de/strings.xml b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
index 55940c8..fbfe78b 100644
--- a/packages/BackupRestoreConfirmation/res/values-de/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="backup_confirm_title" msgid="827563724209303345">"Vollständige Sicherung"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"Vollständige Wiederherstellung"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"Es wurde eine vollständige Sicherung sämtlicher Daten auf einen verbundenen Desktop-Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Sicherung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen."</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Es wurde eine vollständige Sicherung sämtlicher Daten auf einen verbundenen Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Sicherung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Meine Daten sichern"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nicht sichern"</string>
<string name="restore_confirm_text" msgid="7499866728030461776">"Es wurde eine vollständige Wiederherstellung aller Daten von einem verbundenen Desktop-Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Wiederherstellung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen. Dadurch werden alle derzeit auf dem Gerät befindlichen Daten ersetzt!"</string>
diff --git a/packages/InputDevices/res/values-af/strings.xml b/packages/InputDevices/res/values-af/strings.xml
index badeb6d..5cc5f9f 100644
--- a/packages/InputDevices/res/values-af/strings.xml
+++ b/packages/InputDevices/res/values-af/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letties"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persies"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Aserbeidjaans"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Pools"</string>
</resources>
diff --git a/packages/InputDevices/res/values-am/strings.xml b/packages/InputDevices/res/values-am/strings.xml
index 2375bd4..2a61d86 100644
--- a/packages/InputDevices/res/values-am/strings.xml
+++ b/packages/InputDevices/res/values-am/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ላትቪያኛ"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ፋርስኛ"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"አዘርባይጃንኛ"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ፖላንድኛ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ar/strings.xml b/packages/InputDevices/res/values-ar/strings.xml
index 0263a68..bc23b7a 100644
--- a/packages/InputDevices/res/values-ar/strings.xml
+++ b/packages/InputDevices/res/values-ar/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"اللاتفية"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"الفارسية"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"الأذربيجانية"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"البولندية"</string>
</resources>
diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml
index 078eedd..e8d2b1b 100644
--- a/packages/InputDevices/res/values-as/strings.xml
+++ b/packages/InputDevices/res/values-as/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"লাটভিয়ান"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ফাৰ্চী"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"আজাৰবাইজানী"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"পোলিশ্ব"</string>
</resources>
diff --git a/packages/InputDevices/res/values-az/strings.xml b/packages/InputDevices/res/values-az/strings.xml
index e0286ee..6b3e28a 100644
--- a/packages/InputDevices/res/values-az/strings.xml
+++ b/packages/InputDevices/res/values-az/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latış"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Fars Dili"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azəri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polyak"</string>
</resources>
diff --git a/packages/InputDevices/res/values-b+sr+Latn/strings.xml b/packages/InputDevices/res/values-b+sr+Latn/strings.xml
index bc9330d..47240ab 100644
--- a/packages/InputDevices/res/values-b+sr+Latn/strings.xml
+++ b/packages/InputDevices/res/values-b+sr+Latn/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"letonski"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"persijska"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azerbejdžanska"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"poljski"</string>
</resources>
diff --git a/packages/InputDevices/res/values-be/strings.xml b/packages/InputDevices/res/values-be/strings.xml
index cfe078e..29de73d 100644
--- a/packages/InputDevices/res/values-be/strings.xml
+++ b/packages/InputDevices/res/values-be/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латышская"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Персідская"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайджанская"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Польская"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml
index a520a80..b54b1ad 100644
--- a/packages/InputDevices/res/values-bg/strings.xml
+++ b/packages/InputDevices/res/values-bg/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"латвийски"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"персийски"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербайджански"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Полски"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bn/strings.xml b/packages/InputDevices/res/values-bn/strings.xml
index a61e6ce..b59a68c 100644
--- a/packages/InputDevices/res/values-bn/strings.xml
+++ b/packages/InputDevices/res/values-bn/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"লাটভিও"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ফার্সী"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"আজারবাইজানি"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"পোলিশ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-bs/strings.xml b/packages/InputDevices/res/values-bs/strings.xml
index c16b266..b073138 100644
--- a/packages/InputDevices/res/values-bs/strings.xml
+++ b/packages/InputDevices/res/values-bs/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"latvijski"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"perzijski"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azerbejdžanski"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"poljski"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ca/strings.xml b/packages/InputDevices/res/values-ca/strings.xml
index fe8e809..f660de8 100644
--- a/packages/InputDevices/res/values-ca/strings.xml
+++ b/packages/InputDevices/res/values-ca/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letó"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Àzeri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonès"</string>
</resources>
diff --git a/packages/InputDevices/res/values-cs/strings.xml b/packages/InputDevices/res/values-cs/strings.xml
index a571f94..e4f2545 100644
--- a/packages/InputDevices/res/values-cs/strings.xml
+++ b/packages/InputDevices/res/values-cs/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lotyšská klávesnice"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"perština"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ázerbájdžánština"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"polština"</string>
</resources>
diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml
index 1943d35..bdcc93c 100644
--- a/packages/InputDevices/res/values-da/strings.xml
+++ b/packages/InputDevices/res/values-da/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lettisk"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persisk"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Aserbajdsjansk"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polsk"</string>
</resources>
diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml
index 418a3f0..7d408a4 100644
--- a/packages/InputDevices/res/values-de/strings.xml
+++ b/packages/InputDevices/res/values-de/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lettisch"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persisch"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Aserbaidschanisch"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polnisch"</string>
</resources>
diff --git a/packages/InputDevices/res/values-el/strings.xml b/packages/InputDevices/res/values-el/strings.xml
index 460d0f8..05de3b7 100644
--- a/packages/InputDevices/res/values-el/strings.xml
+++ b/packages/InputDevices/res/values-el/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Λετονικά"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Περσικά"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Αζερμπαϊτζανικά"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Πολωνικά"</string>
</resources>
diff --git a/packages/InputDevices/res/values-en-rAU/strings.xml b/packages/InputDevices/res/values-en-rAU/strings.xml
index 8f37882..2166d57 100644
--- a/packages/InputDevices/res/values-en-rAU/strings.xml
+++ b/packages/InputDevices/res/values-en-rAU/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-en-rCA/strings.xml b/packages/InputDevices/res/values-en-rCA/strings.xml
index 8f37882..2166d57 100644
--- a/packages/InputDevices/res/values-en-rCA/strings.xml
+++ b/packages/InputDevices/res/values-en-rCA/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-en-rGB/strings.xml b/packages/InputDevices/res/values-en-rGB/strings.xml
index 8f37882..2166d57 100644
--- a/packages/InputDevices/res/values-en-rGB/strings.xml
+++ b/packages/InputDevices/res/values-en-rGB/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-en-rIN/strings.xml b/packages/InputDevices/res/values-en-rIN/strings.xml
index 8f37882..2166d57 100644
--- a/packages/InputDevices/res/values-en-rIN/strings.xml
+++ b/packages/InputDevices/res/values-en-rIN/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-en-rXC/strings.xml b/packages/InputDevices/res/values-en-rXC/strings.xml
index bc1b234..4bbc17e 100644
--- a/packages/InputDevices/res/values-en-rXC/strings.xml
+++ b/packages/InputDevices/res/values-en-rXC/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml
index e6c12a7..504ed17 100644
--- a/packages/InputDevices/res/values-es-rUS/strings.xml
+++ b/packages/InputDevices/res/values-es-rUS/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letón"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerí"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polaco"</string>
</resources>
diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml
index 7f779c0..a17f058 100644
--- a/packages/InputDevices/res/values-es/strings.xml
+++ b/packages/InputDevices/res/values-es/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letón"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerí"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polaco"</string>
</resources>
diff --git a/packages/InputDevices/res/values-et/strings.xml b/packages/InputDevices/res/values-et/strings.xml
index a5d8cf9..8f550ff 100644
--- a/packages/InputDevices/res/values-et/strings.xml
+++ b/packages/InputDevices/res/values-et/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"läti keel"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"pärsia"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"aserbaidžaani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Poola"</string>
</resources>
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 8d62b34..ad9fc74 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letoniera"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Pertsiera"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijanera"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Poloniarra"</string>
</resources>
diff --git a/packages/InputDevices/res/values-fa/strings.xml b/packages/InputDevices/res/values-fa/strings.xml
index 6effa27..683c6dc 100644
--- a/packages/InputDevices/res/values-fa/strings.xml
+++ b/packages/InputDevices/res/values-fa/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"لتونیایی"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"فارسی"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"آذربایجانی"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"لهستانی"</string>
</resources>
diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml
index 9530df6..a25ba35 100644
--- a/packages/InputDevices/res/values-fi/strings.xml
+++ b/packages/InputDevices/res/values-fi/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"latvialainen"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"persia"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azeri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"puola"</string>
</resources>
diff --git a/packages/InputDevices/res/values-fr-rCA/strings.xml b/packages/InputDevices/res/values-fr-rCA/strings.xml
index afb61fd..f6f16cf 100644
--- a/packages/InputDevices/res/values-fr-rCA/strings.xml
+++ b/packages/InputDevices/res/values-fr-rCA/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letton"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persan"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaïdjanais"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonais"</string>
</resources>
diff --git a/packages/InputDevices/res/values-fr/strings.xml b/packages/InputDevices/res/values-fr/strings.xml
index fadc6a2..a08084f 100644
--- a/packages/InputDevices/res/values-fr/strings.xml
+++ b/packages/InputDevices/res/values-fr/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letton"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persan"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azéri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonais"</string>
</resources>
diff --git a/packages/InputDevices/res/values-gl/strings.xml b/packages/InputDevices/res/values-gl/strings.xml
index de7adf1..6e9184b 100644
--- a/packages/InputDevices/res/values-gl/strings.xml
+++ b/packages/InputDevices/res/values-gl/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letón"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Acerbaixano"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polaco"</string>
</resources>
diff --git a/packages/InputDevices/res/values-gu/strings.xml b/packages/InputDevices/res/values-gu/strings.xml
index 915f1b6..894d4e4 100644
--- a/packages/InputDevices/res/values-gu/strings.xml
+++ b/packages/InputDevices/res/values-gu/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"લાતવિયન"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"પર્શિયન"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"અઝરબૈજાની"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"પોલિશ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml
index 0abcf87..713f3f4 100644
--- a/packages/InputDevices/res/values-hi/strings.xml
+++ b/packages/InputDevices/res/values-hi/strings.xml
@@ -19,12 +19,12 @@
<string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"स्विस जर्मन"</string>
<string name="keyboard_layout_belgian" msgid="2011984572838651558">"बेल्जियाई"</string>
<string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"बुल्गारियाई"</string>
- <string name="keyboard_layout_italian" msgid="6497079660449781213">"इतालवी"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"इटैलियन"</string>
<string name="keyboard_layout_danish" msgid="8036432066627127851">"डैनिश"</string>
<string name="keyboard_layout_norwegian" msgid="9090097917011040937">"नार्वेजियाई"</string>
<string name="keyboard_layout_swedish" msgid="732959109088479351">"स्वीडिश"</string>
<string name="keyboard_layout_finnish" msgid="5585659438924315466">"फ़िनिश"</string>
- <string name="keyboard_layout_croatian" msgid="4172229471079281138">"क्रोएशियाई"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"क्रोएशियन"</string>
<string name="keyboard_layout_czech" msgid="1349256901452975343">"चेक"</string>
<string name="keyboard_layout_estonian" msgid="8775830985185665274">"एस्टोनियाई"</string>
<string name="keyboard_layout_hungarian" msgid="4154963661406035109">"हंगेरियाई"</string>
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"लातवियाई"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"फ़ारसी"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"अज़रबैजानी"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"पोलिश"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hr/strings.xml b/packages/InputDevices/res/values-hr/strings.xml
index 7b27449b..9889d18 100644
--- a/packages/InputDevices/res/values-hr/strings.xml
+++ b/packages/InputDevices/res/values-hr/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"latvijska"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"perzijski"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azerbajdžanski"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"poljski"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hu/strings.xml b/packages/InputDevices/res/values-hu/strings.xml
index 20a0a4f..39d00d4 100644
--- a/packages/InputDevices/res/values-hu/strings.xml
+++ b/packages/InputDevices/res/values-hu/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"lett"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"perzsa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azeri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"lengyel"</string>
</resources>
diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml
index e2c485c..c7523e3 100644
--- a/packages/InputDevices/res/values-hy/strings.xml
+++ b/packages/InputDevices/res/values-hy/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"լատիշերեն"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"պարսկերեն"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ադրբեջաներեն"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"լեհերեն"</string>
</resources>
diff --git a/packages/InputDevices/res/values-in/strings.xml b/packages/InputDevices/res/values-in/strings.xml
index 5e45207..59a4f1e 100644
--- a/packages/InputDevices/res/values-in/strings.xml
+++ b/packages/InputDevices/res/values-in/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvi"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persia"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijan"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polandia"</string>
</resources>
diff --git a/packages/InputDevices/res/values-is/strings.xml b/packages/InputDevices/res/values-is/strings.xml
index 25eeea3..722d495 100644
--- a/packages/InputDevices/res/values-is/strings.xml
+++ b/packages/InputDevices/res/values-is/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lettneska"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persneska"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"aserska"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Pólska"</string>
</resources>
diff --git a/packages/InputDevices/res/values-it/strings.xml b/packages/InputDevices/res/values-it/strings.xml
index 4380d48..4f8b8c5 100644
--- a/packages/InputDevices/res/values-it/strings.xml
+++ b/packages/InputDevices/res/values-it/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lettone"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persiano"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azero"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polacco"</string>
</resources>
diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml
index 27f1611..58bf3d7 100644
--- a/packages/InputDevices/res/values-iw/strings.xml
+++ b/packages/InputDevices/res/values-iw/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"לטבית"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"פרסית"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"אזרית"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"פולנית"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ja/strings.xml b/packages/InputDevices/res/values-ja/strings.xml
index c0c6915..45e0ed2 100644
--- a/packages/InputDevices/res/values-ja/strings.xml
+++ b/packages/InputDevices/res/values-ja/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ラトビア語"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ペルシャ語"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"アゼルバイジャン語"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ポーランド語"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ka/strings.xml b/packages/InputDevices/res/values-ka/strings.xml
index 471d808..45f8525 100644
--- a/packages/InputDevices/res/values-ka/strings.xml
+++ b/packages/InputDevices/res/values-ka/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ლატვიური"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"სპარსული"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"აზერბაიჯანული"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"პოლონური"</string>
</resources>
diff --git a/packages/InputDevices/res/values-kk/strings.xml b/packages/InputDevices/res/values-kk/strings.xml
index 4688ebc..147731a 100644
--- a/packages/InputDevices/res/values-kk/strings.xml
+++ b/packages/InputDevices/res/values-kk/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латыш"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Парсы"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"әзiрбайжан"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Поляк"</string>
</resources>
diff --git a/packages/InputDevices/res/values-km/strings.xml b/packages/InputDevices/res/values-km/strings.xml
index fca3737..7efe36b 100644
--- a/packages/InputDevices/res/values-km/strings.xml
+++ b/packages/InputDevices/res/values-km/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ឡាតវីយ៉ា"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ពីស៊ាន"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"អាហ្សឺបៃហ្សង់"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ប៉ូឡូញ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-kn/strings.xml b/packages/InputDevices/res/values-kn/strings.xml
index 8f2b51a..28bc2e1 100644
--- a/packages/InputDevices/res/values-kn/strings.xml
+++ b/packages/InputDevices/res/values-kn/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ಲ್ಯಾಟ್ವಿಯನ್"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ಪರ್ಶಿಯನ್"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ಅಜೆರ್ಬೈಜಾನಿ"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ಪೋಲಿಶ್"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ko/strings.xml b/packages/InputDevices/res/values-ko/strings.xml
index f712332..fd20385 100644
--- a/packages/InputDevices/res/values-ko/strings.xml
+++ b/packages/InputDevices/res/values-ko/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"라트비아어"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"페르시아어"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"아제르바이잔어"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"폴란드어"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ky/strings.xml b/packages/InputDevices/res/values-ky/strings.xml
index 5b3e986..225579f 100644
--- a/packages/InputDevices/res/values-ky/strings.xml
+++ b/packages/InputDevices/res/values-ky/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латвияча"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Фарсиче"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайжанча"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Полякча"</string>
</resources>
diff --git a/packages/InputDevices/res/values-lo/strings.xml b/packages/InputDevices/res/values-lo/strings.xml
index e64d83d..5c75a6d 100644
--- a/packages/InputDevices/res/values-lo/strings.xml
+++ b/packages/InputDevices/res/values-lo/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ລັດວຽນ"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ເປີຊຽນ"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ອາເຊີໄບຈານີ"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ໂພລິຊ"</string>
</resources>
diff --git a/packages/InputDevices/res/values-lt/strings.xml b/packages/InputDevices/res/values-lt/strings.xml
index a92ddaf..9c81127 100644
--- a/packages/InputDevices/res/values-lt/strings.xml
+++ b/packages/InputDevices/res/values-lt/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvių k."</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persų"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaidžaniečių"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Lenkų"</string>
</resources>
diff --git a/packages/InputDevices/res/values-lv/strings.xml b/packages/InputDevices/res/values-lv/strings.xml
index 881adad..0656f66 100644
--- a/packages/InputDevices/res/values-lv/strings.xml
+++ b/packages/InputDevices/res/values-lv/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latviešu"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persiešu"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaidžāņu"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Poļu valoda"</string>
</resources>
diff --git a/packages/InputDevices/res/values-mk/strings.xml b/packages/InputDevices/res/values-mk/strings.xml
index 49d3d42..44069a2 100644
--- a/packages/InputDevices/res/values-mk/strings.xml
+++ b/packages/InputDevices/res/values-mk/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"латвиски"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"персиски"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербејџански"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"полски"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ml/strings.xml b/packages/InputDevices/res/values-ml/strings.xml
index d346d9f..dca8389 100644
--- a/packages/InputDevices/res/values-ml/strings.xml
+++ b/packages/InputDevices/res/values-ml/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ലാറ്റ്വിയന്"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"പേര്ഷ്യന്"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"അസര്ബൈജാനി"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"പോളിഷ്"</string>
</resources>
diff --git a/packages/InputDevices/res/values-mn/strings.xml b/packages/InputDevices/res/values-mn/strings.xml
index e244722..d1fa814 100644
--- a/packages/InputDevices/res/values-mn/strings.xml
+++ b/packages/InputDevices/res/values-mn/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латви"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Перс"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайжан"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Польш"</string>
</resources>
diff --git a/packages/InputDevices/res/values-mr/strings.xml b/packages/InputDevices/res/values-mr/strings.xml
index 7189197..e8b35f5 100644
--- a/packages/InputDevices/res/values-mr/strings.xml
+++ b/packages/InputDevices/res/values-mr/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"लाट्वियन"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"पर्शियन"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"अझरबैजानी"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"पोलिश"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ms/strings.xml b/packages/InputDevices/res/values-ms/strings.xml
index 4deafa3..63f6797 100644
--- a/packages/InputDevices/res/values-ms/strings.xml
+++ b/packages/InputDevices/res/values-ms/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Bahasa Latvia"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Bahasa Parsi"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Bahasa Azerbaijan"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Bahasa Poland"</string>
</resources>
diff --git a/packages/InputDevices/res/values-my/strings.xml b/packages/InputDevices/res/values-my/strings.xml
index b97b6f1..968cb53 100644
--- a/packages/InputDevices/res/values-my/strings.xml
+++ b/packages/InputDevices/res/values-my/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"လာတ်ဗီယံ"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ပါရှန်"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"အဇာဘိုင်ဂျန်"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ပိုလန်"</string>
</resources>
diff --git a/packages/InputDevices/res/values-nb/strings.xml b/packages/InputDevices/res/values-nb/strings.xml
index 328effa..d7fa28d 100644
--- a/packages/InputDevices/res/values-nb/strings.xml
+++ b/packages/InputDevices/res/values-nb/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvisk"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persisk"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Aserbajdsjansk"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polsk"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ne/strings.xml b/packages/InputDevices/res/values-ne/strings.xml
index d33cd32..e7e58bb 100644
--- a/packages/InputDevices/res/values-ne/strings.xml
+++ b/packages/InputDevices/res/values-ne/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"लातभियन"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"फारसी"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"अजरबैजानी"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"पोलिस"</string>
</resources>
diff --git a/packages/InputDevices/res/values-nl/strings.xml b/packages/InputDevices/res/values-nl/strings.xml
index 45a3e52..ca1e040 100644
--- a/packages/InputDevices/res/values-nl/strings.xml
+++ b/packages/InputDevices/res/values-nl/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lets"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Perzisch"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbeidzjaans"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Pools"</string>
</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index cf69acc..8525c88 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ଲାଟିଭିଆନ୍"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ପାର୍ସିଆନ୍"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ଆଜେର୍ବୈଜାନି"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ପଲିଶ୍"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pa/strings.xml b/packages/InputDevices/res/values-pa/strings.xml
index f707730..1a977f4 100644
--- a/packages/InputDevices/res/values-pa/strings.xml
+++ b/packages/InputDevices/res/values-pa/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ਲਾਤਵੀਅਨ"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"ਫ਼ਾਰਸੀ"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ਅਜ਼ੇਰਬੈਜਾਨੀ"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"ਪੋਲਿਸ਼"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pl/strings.xml b/packages/InputDevices/res/values-pl/strings.xml
index 0d4a65b..831e4b4 100644
--- a/packages/InputDevices/res/values-pl/strings.xml
+++ b/packages/InputDevices/res/values-pl/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"łotewski"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Perski"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerski"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"polski"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pt-rBR/strings.xml b/packages/InputDevices/res/values-pt-rBR/strings.xml
index 9c01cf0..235114c 100644
--- a/packages/InputDevices/res/values-pt-rBR/strings.xml
+++ b/packages/InputDevices/res/values-pt-rBR/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letão"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijano"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonês"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pt-rPT/strings.xml b/packages/InputDevices/res/values-pt-rPT/strings.xml
index ddc6262..e47cf15 100644
--- a/packages/InputDevices/res/values-pt-rPT/strings.xml
+++ b/packages/InputDevices/res/values-pt-rPT/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letão"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azeri"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polaco"</string>
</resources>
diff --git a/packages/InputDevices/res/values-pt/strings.xml b/packages/InputDevices/res/values-pt/strings.xml
index 9c01cf0..235114c 100644
--- a/packages/InputDevices/res/values-pt/strings.xml
+++ b/packages/InputDevices/res/values-pt/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letão"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persa"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijano"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonês"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml
index 64edffa..6f1fc49 100644
--- a/packages/InputDevices/res/values-ro/strings.xml
+++ b/packages/InputDevices/res/values-ro/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letonă"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persană"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azeră"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Poloneză"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ru/strings.xml b/packages/InputDevices/res/values-ru/strings.xml
index 6e147eb..207f5f9 100644
--- a/packages/InputDevices/res/values-ru/strings.xml
+++ b/packages/InputDevices/res/values-ru/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"латышский"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Персидский"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайджанский"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Польский"</string>
</resources>
diff --git a/packages/InputDevices/res/values-si/strings.xml b/packages/InputDevices/res/values-si/strings.xml
index eda2d97..168ead6 100644
--- a/packages/InputDevices/res/values-si/strings.xml
+++ b/packages/InputDevices/res/values-si/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ලැට්වියානු"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"පර්සියානු"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"අසර්බයිජාන"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"පෝලන්ත"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sk/strings.xml b/packages/InputDevices/res/values-sk/strings.xml
index 101ffff..cc169f4 100644
--- a/packages/InputDevices/res/values-sk/strings.xml
+++ b/packages/InputDevices/res/values-sk/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Lotyština"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Perzština"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbajdžančina"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Poľština"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sl/strings.xml b/packages/InputDevices/res/values-sl/strings.xml
index 4242291..9a7241d 100644
--- a/packages/InputDevices/res/values-sl/strings.xml
+++ b/packages/InputDevices/res/values-sl/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"latvijščina"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"perzijščina"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azerbajdžanščina"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"poljščina"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sq/strings.xml b/packages/InputDevices/res/values-sq/strings.xml
index 5dcfc54..7c0ddc1 100644
--- a/packages/InputDevices/res/values-sq/strings.xml
+++ b/packages/InputDevices/res/values-sq/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"letonisht"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persisht"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbajxhanisht"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polonisht"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sr/strings.xml b/packages/InputDevices/res/values-sr/strings.xml
index abb796f..3d155d1 100644
--- a/packages/InputDevices/res/values-sr/strings.xml
+++ b/packages/InputDevices/res/values-sr/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"летонски"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"персијска"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербејџанска"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"пољски"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml
index 2961425..dc17c97 100644
--- a/packages/InputDevices/res/values-sv/strings.xml
+++ b/packages/InputDevices/res/values-sv/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"lettiska"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"persiska"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"azerbajdzjanska"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polska"</string>
</resources>
diff --git a/packages/InputDevices/res/values-sw/strings.xml b/packages/InputDevices/res/values-sw/strings.xml
index 4366204..ba5ef6a 100644
--- a/packages/InputDevices/res/values-sw/strings.xml
+++ b/packages/InputDevices/res/values-sw/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Kilatvia"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Kiajemi"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Kiazabaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Kipolandi"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml
index a4d07ac..b614a50 100644
--- a/packages/InputDevices/res/values-ta/strings.xml
+++ b/packages/InputDevices/res/values-ta/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"லத்வியன்"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"பெர்சியன்"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"அஜர்பைஜானி"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"போலிஷ்"</string>
</resources>
diff --git a/packages/InputDevices/res/values-te/strings.xml b/packages/InputDevices/res/values-te/strings.xml
index f7cce96..02405b9 100644
--- a/packages/InputDevices/res/values-te/strings.xml
+++ b/packages/InputDevices/res/values-te/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"లాత్వియన్"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"పర్షియన్"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"అజర్బైజాన్"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"పోలిష్"</string>
</resources>
diff --git a/packages/InputDevices/res/values-th/strings.xml b/packages/InputDevices/res/values-th/strings.xml
index 65085dc..917d896 100644
--- a/packages/InputDevices/res/values-th/strings.xml
+++ b/packages/InputDevices/res/values-th/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"ลัตเวีย"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"เปอร์เซีย"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"อาเซอร์ไบจาน"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"โปแลนด์"</string>
</resources>
diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml
index c9fc26d..4cfe77e 100644
--- a/packages/InputDevices/res/values-tl/strings.xml
+++ b/packages/InputDevices/res/values-tl/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polish"</string>
</resources>
diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml
index 98e6b51..b1841e2 100644
--- a/packages/InputDevices/res/values-tr/strings.xml
+++ b/packages/InputDevices/res/values-tr/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letonca"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Farsça"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerice"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Lehçe"</string>
</resources>
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
index c49ee9e..531a2c9 100644
--- a/packages/InputDevices/res/values-uk/strings.xml
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латвійська"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Перська"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербайджанська"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Польська"</string>
</resources>
diff --git a/packages/InputDevices/res/values-ur/strings.xml b/packages/InputDevices/res/values-ur/strings.xml
index ab95bd5..c6f5b03 100644
--- a/packages/InputDevices/res/values-ur/strings.xml
+++ b/packages/InputDevices/res/values-ur/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"لاتویائی"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"فارسی"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"آزربائیجانی"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"پولش"</string>
</resources>
diff --git a/packages/InputDevices/res/values-uz/strings.xml b/packages/InputDevices/res/values-uz/strings.xml
index d6f7b2b..441c2c2 100644
--- a/packages/InputDevices/res/values-uz/strings.xml
+++ b/packages/InputDevices/res/values-uz/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latish"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Fors"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Ozarbayjon"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Polyak"</string>
</resources>
diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml
index e92d8fc6..5eb4dc3 100644
--- a/packages/InputDevices/res/values-vi/strings.xml
+++ b/packages/InputDevices/res/values-vi/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Tiếng Latvia"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Tiếng Ba Tư"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Tiếng Azerbaijan"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Tiếng Ba Lan"</string>
</resources>
diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml
index 61c6bc9..1ff381b 100644
--- a/packages/InputDevices/res/values-zh-rCN/strings.xml
+++ b/packages/InputDevices/res/values-zh-rCN/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"拉脱维亚语"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"波斯语"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"阿塞拜疆语"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"波兰语"</string>
</resources>
diff --git a/packages/InputDevices/res/values-zh-rHK/strings.xml b/packages/InputDevices/res/values-zh-rHK/strings.xml
index bf0e2b7..aeb85f1 100644
--- a/packages/InputDevices/res/values-zh-rHK/strings.xml
+++ b/packages/InputDevices/res/values-zh-rHK/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"拉脫維亞文"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"波斯文"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"亞塞拜疆文"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"波蘭文"</string>
</resources>
diff --git a/packages/InputDevices/res/values-zh-rTW/strings.xml b/packages/InputDevices/res/values-zh-rTW/strings.xml
index 785cc3d..2d97fbc 100644
--- a/packages/InputDevices/res/values-zh-rTW/strings.xml
+++ b/packages/InputDevices/res/values-zh-rTW/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"拉脫維亞文"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"波斯文"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"亞塞拜然文"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"波蘭文"</string>
</resources>
diff --git a/packages/InputDevices/res/values-zu/strings.xml b/packages/InputDevices/res/values-zu/strings.xml
index 1643f01..9e957ac 100644
--- a/packages/InputDevices/res/values-zu/strings.xml
+++ b/packages/InputDevices/res/values-zu/strings.xml
@@ -43,4 +43,5 @@
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Isi-Latvian"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Isi-Persian"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Isi-Azebhayijani"</string>
+ <string name="keyboard_layout_polish" msgid="1121588624094925325">"Isi-Polish"</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-bs/strings.xml b/packages/PrintSpooler/res/values-bs/strings.xml
index 2e9bfa3..e7f6d13 100644
--- a/packages/PrintSpooler/res/values-bs/strings.xml
+++ b/packages/PrintSpooler/res/values-bs/strings.xml
@@ -42,7 +42,7 @@
<string name="page_description_template" msgid="6831239682256197161">"Strana <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> od <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="summary_template" msgid="8899734908625669193">"Rezime, primjeraka <xliff:g id="COPIES">%1$s</xliff:g>, veličina papira <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"Regulator za proširivanje"</string>
- <string name="collapse_handle" msgid="6886637989442507451">"Regulator za skupljanje"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"Regulator za sužavanje"</string>
<string name="print_button" msgid="645164566271246268">"Štampaj"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"Sačuvaj u PDF"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"Opcije za štampanje su proširene"</string>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
index 361e420..98687b4 100644
--- a/packages/PrintSpooler/res/values-ca/strings.xml
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -54,7 +54,7 @@
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"S\'ha amagat el quadre de cerca"</string>
<string name="print_add_printer" msgid="1088656468360653455">"Afegeix una impressora"</string>
<string name="print_select_printer" msgid="7388760939873368698">"Selecciona una impressora"</string>
- <string name="print_forget_printer" msgid="5035287497291910766">"Esborra la impressora"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"Oblida la impressora"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="other">S\'han trobat <xliff:g id="COUNT_1">%1$s</xliff:g> impressores</item>
<item quantity="one">S\'ha trobat <xliff:g id="COUNT_0">%1$s</xliff:g> impressora</item>
diff --git a/packages/PrintSpooler/res/values-my/strings.xml b/packages/PrintSpooler/res/values-my/strings.xml
index 7c7b03e6..1c7dbd7 100644
--- a/packages/PrintSpooler/res/values-my/strings.xml
+++ b/packages/PrintSpooler/res/values-my/strings.xml
@@ -86,7 +86,7 @@
<string name="cancel" msgid="4373674107267141885">"မလုပ်တော့"</string>
<string name="restart" msgid="2472034227037808749">"အစက ပြန်စရန်"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"စာထုတ်စက်နဲ့ ဆက်သွယ်ထားမှု မရှိပါ"</string>
- <string name="reason_unknown" msgid="5507940196503246139">"အကြောင်းအရာ မသိရှိ"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"မသိပါ"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g>ကိုသုံးမလား။"</string>
<string name="print_service_security_warning_summary" msgid="1427434625361692006">"သင်၏ စာရွက်စာတမ်းများသည် ပရင်တာထံသို့ သွားစဉ် ဆာဗာ တစ်ခု သို့မဟုတ် ပိုများပြီး ဖြတ်ကျော်နိုင်ရသည်။"</string>
<string-array name="color_mode_labels">
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 56a242a..c756fdb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -204,16 +204,16 @@
@ColorInt
public static int getColorAccent(Context context) {
- return getColorAttr(context, android.R.attr.colorAccent);
+ return getColorAttrDefaultColor(context, android.R.attr.colorAccent);
}
@ColorInt
public static int getColorError(Context context) {
- return getColorAttr(context, android.R.attr.colorError);
+ return getColorAttrDefaultColor(context, android.R.attr.colorError);
}
@ColorInt
- public static int getDefaultColor(Context context, int resId) {
+ public static int getColorStateListDefaultColor(Context context, int resId) {
final ColorStateList list =
context.getResources().getColorStateList(resId, context.getTheme());
@@ -241,13 +241,24 @@
}
@ColorInt
- public static int getColorAttr(Context context, int attr) {
+ public static int getColorAttrDefaultColor(Context context, int attr) {
TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
@ColorInt int colorAccent = ta.getColor(0, 0);
ta.recycle();
return colorAccent;
}
+ public static ColorStateList getColorAttr(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ ColorStateList stateList = null;
+ try {
+ stateList = ta.getColorStateList(0);
+ } finally {
+ ta.recycle();
+ }
+ return stateList;
+ }
+
public static int getThemeAttr(Context context, int attr) {
TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
int theme = ta.getResourceId(0, 0);
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index e2f279a9..ec524c3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -103,7 +103,8 @@
for (int i = 0; i < N; i++) {
mColors[2 * i] = levels.getInt(i, 0);
if (colors.getType(i) == TypedValue.TYPE_ATTRIBUTE) {
- mColors[2 * i + 1] = Utils.getColorAttr(context, colors.getThemeAttributeId(i, 0));
+ mColors[2 * i + 1] = Utils.getColorAttrDefaultColor(context,
+ colors.getThemeAttributeId(i, 0));
} else {
mColors[2 * i + 1] = colors.getColor(i, 0);
}
@@ -145,14 +146,16 @@
mWarningTextPaint.setColor(mColors[1]);
}
- mChargeColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color);
+ mChargeColor = Utils.getColorStateListDefaultColor(mContext, R.color.meter_consumed_color);
mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color));
+ mBoltPaint.setColor(Utils.getColorStateListDefaultColor(mContext,
+ R.color.batterymeter_bolt_color));
mBoltPoints = loadPoints(res, R.array.batterymeter_bolt_points);
mPlusPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPlusPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_plus_color));
+ mPlusPaint.setColor(Utils.getColorStateListDefaultColor(mContext,
+ R.color.batterymeter_plus_color));
mPlusPoints = loadPoints(res, R.array.batterymeter_plus_points);
mIntrinsicWidth = context.getResources().getDimensionPixelSize(R.dimen.battery_width);
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
index 3c5ac8d..11c9f7f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
@@ -117,7 +117,8 @@
R.fraction.bt_battery_button_height_fraction, 1, 1);
mAspectRatio = resources.getFraction(R.fraction.bt_battery_ratio_fraction, 1, 1);
- final int tintColor = Utils.getColorAttr(context, android.R.attr.colorControlNormal);
+ final int tintColor = Utils.getColorAttrDefaultColor(context,
+ android.R.attr.colorControlNormal);
setColorFilter(new PorterDuffColorFilter(tintColor, PorterDuff.Mode.SRC_IN));
setBatteryLevel(batteryLevel);
mFrameColor = frameColor;
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
index 846e30d..a6b5755 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
@@ -132,13 +132,17 @@
public SignalDrawable(Context context) {
mDarkModeBackgroundColor =
- Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_background);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.dark_mode_icon_color_dual_tone_background);
mDarkModeFillColor =
- Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_fill);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.dark_mode_icon_color_dual_tone_fill);
mLightModeBackgroundColor =
- Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_background);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.light_mode_icon_color_dual_tone_background);
mLightModeFillColor =
- Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_fill);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.light_mode_icon_color_dual_tone_fill);
mIntrinsicSize = context.getResources().getDimensionPixelSize(R.dimen.signal_icon_size);
mHandler = new Handler();
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
index c4ca339..113256f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
@@ -41,6 +41,7 @@
private static final String TAG = "UserManagerHelper";
private final Context mContext;
private final UserManager mUserManager;
+ private final ActivityManager mActivityManager;
private OnUsersUpdateListener mUpdateListener;
private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
@Override
@@ -52,6 +53,7 @@
public UserManagerHelper(Context context) {
mContext = context;
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
}
/**
@@ -72,30 +74,64 @@
}
/**
- * Gets {@link UserInfo} for the current user.
+ * Gets UserInfo for the foreground user.
*
- * @return {@link UserInfo} for the current user.
+ * Concept of foreground user is relevant for the multi-user deployment. Foreground user
+ * corresponds to the currently "logged in" user.
+ *
+ * @return {@link UserInfo} for the foreground user.
*/
- public UserInfo getCurrentUserInfo() {
- return mUserManager.getUserInfo(UserHandle.myUserId());
+ public UserInfo getForegroundUserInfo() {
+ return mUserManager.getUserInfo(getForegroundUserId());
}
/**
- * Gets all the other users on the system that are not the current user.
- *
- * @return List of {@code UserInfo} for each user that is not the current user.
+ * @return Id of the foreground user.
*/
- public List<UserInfo> getAllUsersExcludesCurrentUser() {
- List<UserInfo> others = getAllUsers();
+ public int getForegroundUserId() {
+ return mActivityManager.getCurrentUser();
+ }
- for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (userInfo.id == UserHandle.myUserId()) {
- // Remove current user from the list.
- iterator.remove();
- }
- }
- return others;
+ /**
+ * Gets UserInfo for the user running the caller process.
+ *
+ * Differentiation between foreground user and current process user is relevant for multi-user
+ * deployments.
+ *
+ * Some multi-user aware components (like SystemUI) might run as a singleton - one component
+ * for all users. Current process user is then always the same for that component, even when
+ * the foreground user changes.
+ *
+ * @return {@link UserInfo} for the user running the current process.
+ */
+ public UserInfo getCurrentProcessUserInfo() {
+ return mUserManager.getUserInfo(getCurrentProcessUserId());
+ }
+
+ /**
+ * @return Id for the user running the current process.
+ */
+ public int getCurrentProcessUserId() {
+ return UserHandle.myUserId();
+ }
+
+ /**
+ * Gets all the other users on the system that are not the user running the current process.
+ *
+ * @return List of {@code UserInfo} for each user that is not the user running the process.
+ */
+ public List<UserInfo> getAllUsersExcludesCurrentProcessUser() {
+ return getAllUsersExceptUser(getCurrentProcessUserId());
+ }
+
+ /**
+ * Gets all the existing users on the system that are not the currently running as the
+ * foreground user.
+ *
+ * @return List of {@code UserInfo} for each user that is not the foreground user.
+ */
+ public List<UserInfo> getAllUsersExcludesForegroundUser() {
+ return getAllUsersExceptUser(getForegroundUserId());
}
/**
@@ -104,12 +140,22 @@
* @return List of {@code UserInfo} for each user that is not the system user.
*/
public List<UserInfo> getAllUsersExcludesSystemUser() {
+ return getAllUsersExceptUser(UserHandle.USER_SYSTEM);
+ }
+
+ /**
+ * Get all the users except the one with userId passed in.
+ *
+ * @param userId of the user not to be returned.
+ * @return All users other than user with userId.
+ */
+ public List<UserInfo> getAllUsersExceptUser(int userId) {
List<UserInfo> others = getAllUsers();
for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
UserInfo userInfo = iterator.next();
- if (userIsSystemUser(userInfo)) {
- // Remove system user from the list.
+ if (userInfo.id == userId) {
+ // Remove user with userId from the list.
iterator.remove();
}
}
@@ -146,78 +192,115 @@
}
/**
- * Checks whether passed in user is the user that's currently logged in.
+ * Checks whether passed in user is the foreground user.
*
* @param userInfo User to check.
- * @return {@code true} if current user, {@code false} otherwise.
+ * @return {@code true} if foreground user, {@code false} otherwise.
*/
- public boolean userIsCurrentUser(UserInfo userInfo) {
- return getCurrentUserInfo().id == userInfo.id;
+ public boolean userIsForegroundUser(UserInfo userInfo) {
+ return getForegroundUserId() == userInfo.id;
}
- // Current user information accessors
+ /**
+ * Checks whether passed in user is the user that's running the current process.
+ *
+ * @param userInfo User to check.
+ * @return {@code true} if user running the process, {@code false} otherwise.
+ */
+ public boolean userIsRunningCurrentProcess(UserInfo userInfo) {
+ return getCurrentProcessUserId() == userInfo.id;
+ }
+
+ // Foreground user information accessors.
/**
- * Checks if the current user is a demo user.
+ * Checks if the foreground user is a guest user.
*/
- public boolean isDemoUser() {
+ public boolean foregroundUserIsGuestUser() {
+ return getForegroundUserInfo().isGuest();
+ }
+
+ /**
+ * Return whether the foreground user has a restriction.
+ *
+ * @param restriction Restriction to check. Should be a UserManager.* restriction.
+ * @return Whether that restriction exists for the foreground user.
+ */
+ public boolean foregroundUserHasUserRestriction(String restriction) {
+ return mUserManager.hasUserRestriction(restriction, getForegroundUserInfo().getUserHandle());
+ }
+
+ /**
+ * Checks if the foreground user can add new users.
+ */
+ public boolean foregroundUserCanAddUsers() {
+ return !foregroundUserHasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ }
+
+ // Current process user information accessors
+
+ /**
+ * Checks if the calling app is running in a demo user.
+ */
+ public boolean currentProcessRunningAsDemoUser() {
return mUserManager.isDemoUser();
}
/**
- * Checks if the current user is a guest user.
+ * Checks if the calling app is running as a guest user.
*/
- public boolean isGuestUser() {
+ public boolean currentProcessRunningAsGuestUser() {
return mUserManager.isGuestUser();
}
/**
- * Checks if the current user is the system user (User 0).
+ * Checks whether this process is running under the system user.
*/
- public boolean isSystemUser() {
+ public boolean currentProcessRunningAsSystemUser() {
return mUserManager.isSystemUser();
}
- // Current user restriction accessors
+ // Current process user restriction accessors
/**
- * Return whether the current user has a restriction.
+ * Return whether the user running the current process has a restriction.
*
* @param restriction Restriction to check. Should be a UserManager.* restriction.
- * @return Whether that restriction exists for the current user.
+ * @return Whether that restriction exists for the user running the process.
*/
- public boolean hasUserRestriction(String restriction) {
+ public boolean currentProcessHasUserRestriction(String restriction) {
return mUserManager.hasUserRestriction(restriction);
}
/**
- * Checks if the current user can add new users.
+ * Checks if the user running the current process can add new users.
*/
- public boolean canAddUsers() {
- return !hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ public boolean currentProcessCanAddUsers() {
+ return !currentProcessHasUserRestriction(UserManager.DISALLOW_ADD_USER);
}
/**
- * Checks if the current user can remove users.
+ * Checks if the user running the current process can remove users.
*/
- public boolean canRemoveUsers() {
- return !hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
+ public boolean currentProcessCanRemoveUsers() {
+ return !currentProcessHasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
}
/**
- * Checks if the current user is allowed to switch to another user.
+ * Checks if the user running the current process is allowed to switch to another user.
*/
- public boolean canSwitchUsers() {
- return !hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ public boolean currentProcessCanSwitchUsers() {
+ return !currentProcessHasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
}
/**
- * Checks if the current user can modify accounts. Demo and Guest users cannot modify accounts
- * even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+ * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
+ * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
*/
- public boolean canModifyAccounts() {
- return !hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS) && !isDemoUser()
- && !isGuestUser();
+ public boolean currentProcessCanModifyAccounts() {
+ return !currentProcessHasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
+ && !currentProcessRunningAsDemoUser()
+ && !currentProcessRunningAsGuestUser();
}
// User actions
@@ -242,8 +325,8 @@
/**
* Tries to remove the user that's passed in. System user cannot be removed.
- * If the user to be removed is current user, it switches to the system user first, and then
- * removes the user.
+ * If the user to be removed is user currently running the process,
+ * it switches to the system user first, and then removes the user.
*
* @param userInfo User to be removed
* @return {@code true} if user is successfully removed, {@code false} otherwise.
@@ -254,7 +337,7 @@
return false;
}
- if (userInfo.id == getCurrentUserInfo().id) {
+ if (userInfo.id == getCurrentProcessUserId()) {
switchToUserId(UserHandle.USER_SYSTEM);
}
@@ -267,7 +350,7 @@
* @param userInfo User to switch to.
*/
public void switchToUser(UserInfo userInfo) {
- if (userInfo.id == getCurrentUserInfo().id) {
+ if (userInfo.id == getForegroundUserId()) {
return;
}
@@ -276,15 +359,6 @@
return;
}
- if (UserManager.isGuestUserEphemeral()) {
- // If switching from guest, we want to bring up the guest exit dialog instead of
- // switching
- UserInfo currUserInfo = getCurrentUserInfo();
- if (currUserInfo != null && currUserInfo.isGuest()) {
- return;
- }
- }
-
switchToUserId(userInfo.id);
}
@@ -348,6 +422,9 @@
filter.addAction(Intent.ACTION_USER_REMOVED);
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_USER_STOPPED);
+ filter.addAction(Intent.ACTION_USER_UNLOCKED);
mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null);
}
@@ -366,9 +443,7 @@
private void switchToUserId(int id) {
try {
- final ActivityManager am = (ActivityManager)
- mContext.getSystemService(Context.ACTIVITY_SERVICE);
- am.switchUser(id);
+ mActivityManager.switchUser(id);
} catch (Exception e) {
Log.e(TAG, "Couldn't switch user.", e);
}
@@ -389,4 +464,3 @@
void onUsersUpdate();
}
}
-
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index 26f3683..f172947 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -183,7 +183,7 @@
Drawable drawable = mIconInjector.getIcon(level);
if (!mForSavedNetworks && drawable != null) {
- drawable.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
+ drawable.setTintList(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
setIcon(drawable);
} else {
safeSetDefaultIcon();
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
index 3f1fcbb..15f7770 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
@@ -58,7 +58,7 @@
private UserManagerHelper.OnUsersUpdateListener mTestListener;
private UserManagerHelper mHelper;
- private UserInfo mCurrentUser;
+ private UserInfo mCurrentProcessUser;
private UserInfo mSystemUser;
@Before
@@ -70,13 +70,13 @@
.thenReturn(InstrumentationRegistry.getTargetContext().getResources());
mHelper = new UserManagerHelper(mContext);
- mCurrentUser = createUserInfoForId(UserHandle.myUserId());
+ mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
- when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentUser);
+ when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentProcessUser);
}
@Test
- public void testUserIsSystemUser() {
+ public void userIsSystemUser() {
UserInfo testInfo = new UserInfo();
testInfo.id = UserHandle.USER_SYSTEM;
@@ -87,33 +87,7 @@
}
@Test
- public void testGetAllUsersExcludesCurrentUser() {
- int currentUser = UserHandle.myUserId();
-
- UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
- UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
- UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
-
- List<UserInfo> testUsers = new ArrayList<>();
- testUsers.add(otherUser1);
- testUsers.add(otherUser2);
- testUsers.add(mCurrentUser);
- testUsers.add(otherUser3);
-
- when(mUserManager.getUsers(true)).thenReturn(testUsers);
-
- // Should return 3 users that don't have currentUser id.
- assertThat(mHelper.getAllUsersExcludesCurrentUser().size()).isEqualTo(3);
- // Should not contain current user.
- assertThat(mHelper.getAllUsersExcludesCurrentUser()).doesNotContain(mCurrentUser);
- // Should contain non-current users.
- assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser1);
- assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser2);
- assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser3);
- }
-
- @Test
- public void testGetAllUsersExcludesSystemUser() {
+ public void getAllUsersExcludesSystemUser() {
UserInfo otherUser1 = createUserInfoForId(10);
UserInfo otherUser2 = createUserInfoForId(11);
UserInfo otherUser3 = createUserInfoForId(12);
@@ -127,17 +101,41 @@
when(mUserManager.getUsers(true)).thenReturn(testUsers);
// Should return 3 users that don't have SYSTEM USER id.
- assertThat(mHelper.getAllUsersExcludesSystemUser().size()).isEqualTo(3);
- // Should not contain system user.
- assertThat(mHelper.getAllUsersExcludesSystemUser()).doesNotContain(mSystemUser);
- // Should contain non-system users.
- assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser1);
- assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser2);
- assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser3);
+ assertThat(mHelper.getAllUsersExcludesSystemUser()).hasSize(3);
+ assertThat(mHelper.getAllUsersExcludesSystemUser())
+ .containsExactly(otherUser1, otherUser2, otherUser3);
}
@Test
- public void testGetAllUsers() {
+ public void getAllUsersExceptUser() {
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 = createUserInfoForId(10);
+ UserInfo user3 = createUserInfoForId(12);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(user1);
+ testUsers.add(user2);
+ testUsers.add(user3);
+
+ when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
+
+ // Should return all 3 users.
+ assertThat(mHelper.getAllUsersExceptUser(9).size()).isEqualTo(3);
+
+ // Should return only user 12.
+ assertThat(mHelper.getAllUsersExceptUser(10).size()).isEqualTo(1);
+ assertThat(mHelper.getAllUsersExceptUser(10)).contains(user3);
+
+ when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
+
+ // Should drop user 12.
+ assertThat(mHelper.getAllUsersExceptUser(12).size()).isEqualTo(2);
+ assertThat(mHelper.getAllUsersExceptUser(12)).contains(user1);
+ assertThat(mHelper.getAllUsersExceptUser(12)).contains(user2);
+ }
+
+ @Test
+ public void getAllUsers() {
int currentUser = UserHandle.myUserId();
UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
@@ -147,21 +145,18 @@
List<UserInfo> testUsers = new ArrayList<>();
testUsers.add(otherUser1);
testUsers.add(otherUser2);
- testUsers.add(mCurrentUser);
+ testUsers.add(mCurrentProcessUser);
testUsers.add(otherUser3);
when(mUserManager.getUsers(true)).thenReturn(testUsers);
- // Should return 3 users that don't have currentUser id.
assertThat(mHelper.getAllUsers().size()).isEqualTo(4);
- assertThat(mHelper.getAllUsers()).contains(mCurrentUser);
- assertThat(mHelper.getAllUsers()).contains(otherUser1);
- assertThat(mHelper.getAllUsers()).contains(otherUser2);
- assertThat(mHelper.getAllUsers()).contains(otherUser3);
+ assertThat(mHelper.getAllUsers())
+ .containsExactly(mCurrentProcessUser, otherUser1, otherUser2, otherUser3);
}
@Test
- public void testUserCanBeRemoved() {
+ public void userCanBeRemoved() {
UserInfo testInfo = new UserInfo();
// System user cannot be removed.
@@ -173,71 +168,59 @@
}
@Test
- public void testUserIsCurrentUser() {
- UserInfo testInfo = new UserInfo();
-
- // System user cannot be removed.
- testInfo.id = UserHandle.myUserId();
- assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue();
-
- testInfo.id = UserHandle.myUserId() + 2;
- assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse();
- }
-
- @Test
- public void testCanAddUsers() {
+ public void currentProcessCanAddUsers() {
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
- assertThat(mHelper.canAddUsers()).isTrue();
+ assertThat(mHelper.currentProcessCanAddUsers()).isTrue();
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
- assertThat(mHelper.canAddUsers()).isFalse();
+ assertThat(mHelper.currentProcessCanAddUsers()).isFalse();
}
@Test
- public void testCanRemoveUsers() {
+ public void currentProcessCanRemoveUsers() {
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
- assertThat(mHelper.canRemoveUsers()).isTrue();
+ assertThat(mHelper.currentProcessCanRemoveUsers()).isTrue();
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
- assertThat(mHelper.canRemoveUsers()).isFalse();
+ assertThat(mHelper.currentProcessCanRemoveUsers()).isFalse();
}
@Test
- public void testCanSwitchUsers() {
+ public void currentProcessCanSwitchUsers() {
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
- assertThat(mHelper.canSwitchUsers()).isTrue();
+ assertThat(mHelper.currentProcessCanSwitchUsers()).isTrue();
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
- assertThat(mHelper.canSwitchUsers()).isFalse();
+ assertThat(mHelper.currentProcessCanSwitchUsers()).isFalse();
}
@Test
- public void testGuestCannotModifyAccounts() {
- assertThat(mHelper.canModifyAccounts()).isTrue();
+ public void currentProcessRunningAsGuestCannotModifyAccounts() {
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
when(mUserManager.isGuestUser()).thenReturn(true);
- assertThat(mHelper.canModifyAccounts()).isFalse();
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
}
@Test
- public void testDemoUserCannotModifyAccounts() {
- assertThat(mHelper.canModifyAccounts()).isTrue();
+ public void currentProcessRunningAsDemoUserCannotModifyAccounts() {
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
when(mUserManager.isDemoUser()).thenReturn(true);
- assertThat(mHelper.canModifyAccounts()).isFalse();
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
}
@Test
- public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
- assertThat(mHelper.canModifyAccounts()).isTrue();
+ public void currentProcessWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
.thenReturn(true);
- assertThat(mHelper.canModifyAccounts()).isFalse();
+ assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
}
@Test
- public void testCreateNewUser() {
+ public void createNewUser() {
// Verify createUser on UserManager gets called.
mHelper.createNewUser("Test User");
verify(mUserManager).createUser("Test User", 0);
@@ -252,52 +235,36 @@
}
@Test
- public void testRemoveUser() {
+ public void removeUser() {
// Cannot remove system user.
assertThat(mHelper.removeUser(mSystemUser)).isFalse();
// Removing non-current, non-system user, simply calls removeUser.
- UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
+ UserInfo userToRemove = createUserInfoForId(mCurrentProcessUser.id + 2);
+
mHelper.removeUser(userToRemove);
- verify(mUserManager).removeUser(mCurrentUser.id + 2);
+ verify(mUserManager).removeUser(mCurrentProcessUser.id + 2);
}
@Test
- public void testSwitchToUser() {
- // Switching to current user doesn't do anything.
- mHelper.switchToUser(mCurrentUser);
- verify(mActivityManager, never()).switchUser(mCurrentUser.id);
-
- // Switching to Guest calls createGuest.
- UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST);
- mHelper.switchToUser(guestInfo);
- verify(mUserManager).createGuest(mContext, "Test Guest");
-
- // Switching to non-current, non-guest user, simply calls switchUser.
- UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0);
- mHelper.switchToUser(userToSwitchTo);
- verify(mActivityManager).switchUser(mCurrentUser.id + 5);
- }
-
- @Test
- public void testSwitchToGuest() {
+ public void switchToGuest() {
mHelper.switchToGuest("Test Guest");
verify(mUserManager).createGuest(mContext, "Test Guest");
- UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST);
+ UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST);
when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
mHelper.switchToGuest("Test Guest");
- verify(mActivityManager).switchUser(mCurrentUser.id + 2);
+ verify(mActivityManager).switchUser(21);
}
@Test
- public void testGetUserIcon() {
- mHelper.getUserIcon(mCurrentUser);
- verify(mUserManager).getUserIcon(mCurrentUser.id);
+ public void getUserIcon() {
+ mHelper.getUserIcon(mCurrentProcessUser);
+ verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
}
@Test
- public void testScaleUserIcon() {
+ public void scaleUserIcon() {
Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
@@ -305,14 +272,14 @@
}
@Test
- public void testSetUserName() {
- UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3);
+ public void setUserName() {
+ UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
mHelper.setUserName(testInfo, "New Test Name");
- verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name");
+ verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, "New Test Name");
}
@Test
- public void testRegisterUserChangeReceiver() {
+ public void registerUserChangeReceiver() {
mHelper.registerOnUsersUpdateListener(mTestListener);
ArgumentCaptor<BroadcastReceiver> receiverCaptor =
@@ -335,10 +302,14 @@
// Verify the presence of each intent in the filter.
// Verify the exact number of filters. Every time a new intent is added, this test should
// get updated.
- assertThat(filterCaptor.getValue().countActions()).isEqualTo(3);
+ assertThat(filterCaptor.getValue().countActions()).isEqualTo(6);
assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue();
+
// Verify that calling the receiver calls the listener.
receiverCaptor.getValue().onReceive(mContext, new Intent());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java
index b4ed3de..7c7957c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java
@@ -39,34 +39,34 @@
}
@Test
- public void testParseInputMethodsAndSubtypesString_EmptyString() {
+ public void parseInputMethodsAndSubtypesString_EmptyString() {
assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("")).isEmpty();
assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(null)).isEmpty();
}
@Test
- public void testParseInputMethodsAndSubtypesString_SingleImeNoSubtype() {
+ public void parseInputMethodsAndSubtypesString_SingleImeNoSubtype() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0");
assertThat(r).containsExactly("ime0", EMPTY_STRING_SET);
}
@Test
- public void testParseInputMethodsAndSubtypesString_MultipleImesNoSubtype() {
+ public void parseInputMethodsAndSubtypesString_MultipleImesNoSubtype() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0:ime1");
assertThat(r).containsExactly("ime0", EMPTY_STRING_SET, "ime1", EMPTY_STRING_SET);
}
@Test
- public void testParseInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ public void parseInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0;subtype0");
assertThat(r).containsExactly("ime0", asHashSet("subtype0"));
}
@Test
- public void testParseInputMethodsAndSubtypesString_SingleImeDuplicateSameSubtypes() {
+ public void parseInputMethodsAndSubtypesString_SingleImeDuplicateSameSubtypes() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
"ime0;subtype0;subtype0");
@@ -74,7 +74,7 @@
}
@Test
- public void testParseInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ public void parseInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
"ime0;subtype0;subtype1");
@@ -82,7 +82,7 @@
}
@Test
- public void testParseInputMethodsAndSubtypesString_MultiplePairsOfImeSubtype() {
+ public void parseInputMethodsAndSubtypesString_MultiplePairsOfImeSubtype() {
assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
"ime0;subtype0:ime1;subtype1"))
.containsExactly("ime0", asHashSet("subtype0"), "ime1", asHashSet("subtype1"));
@@ -98,7 +98,7 @@
}
@Test
- public void testParseInputMethodsAndSubtypesString_MixedImeSubtypePairsAndImeNoSubtype() {
+ public void parseInputMethodsAndSubtypesString_MixedImeSubtypePairsAndImeNoSubtype() {
HashMap<String, HashSet<String>> r =
InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
"ime0;subtype0;subtype1:ime1;subtype1;subtype2:ime2");
@@ -108,13 +108,13 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_EmptyInput() {
+ public void buildInputMethodsAndSubtypesString_EmptyInput() {
HashMap<String, HashSet<String>> map = new HashMap<>();
assertThat(map).isEmpty();
}
@Test
- public void testBuildInputMethodsAndSubtypesString_SingleIme() {
+ public void buildInputMethodsAndSubtypesString_SingleIme() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", new HashSet<>());
String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
@@ -122,7 +122,7 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ public void buildInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", asHashSet("subtype0"));
String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
@@ -130,7 +130,7 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ public void buildInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", asHashSet("subtype0", "subtype1"));
String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
@@ -142,7 +142,7 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_MultipleImesNoSubtypes() {
+ public void buildInputMethodsAndSubtypesString_MultipleImesNoSubtypes() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", EMPTY_STRING_SET);
map.put("ime1", EMPTY_STRING_SET);
@@ -155,7 +155,7 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_MultipleImesWithAndWithoutSubtypes() {
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithAndWithoutSubtypes() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", asHashSet("subtype0", "subtype1"));
map.put("ime1", EMPTY_STRING_SET);
@@ -169,7 +169,7 @@
}
@Test
- public void testBuildInputMethodsAndSubtypesString_MultipleImesWithSubtypes() {
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithSubtypes() {
HashMap<String, HashSet<String>> map = new HashMap<>();
map.put("ime0", asHashSet("subtype0", "subtype1"));
map.put("ime1", asHashSet("subtype2", "subtype3"));
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
new file mode 100644
index 0000000..4a8ef1e
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.testutils.shadow;
+
+import android.app.ActivityManager;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadow.api.Shadow;
+
+@Implements(ActivityManager.class)
+public class ShadowActivityManager {
+ private static int sCurrentUserId = 0;
+ private int mUserSwitchedTo = -1;
+
+ @Resetter
+ public void reset() {
+ sCurrentUserId = 0;
+ mUserSwitchedTo = 0;
+ }
+
+ @Implementation
+ public static int getCurrentUser() {
+ return sCurrentUserId;
+ }
+
+ @Implementation
+ public boolean switchUser(int userId) {
+ mUserSwitchedTo = userId;
+ return true;
+ }
+
+ public boolean getSwitchUserCalled() {
+ return mUserSwitchedTo != -1;
+ }
+
+ public int getUserSwitchedTo() {
+ return mUserSwitchedTo;
+ }
+
+ public static void setCurrentUser(int userId) {
+ sCurrentUserId = userId;
+ }
+
+ public static ShadowActivityManager getShadow() {
+ return (ShadowActivityManager) Shadow.extract(
+ RuntimeEnvironment.application.getSystemService(ActivityManager.class));
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java
new file mode 100644
index 0000000..f2ea3a4
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.settingslib.testutils.shadow.ShadowActivityManager;
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+@Config(shadows = { ShadowActivityManager.class, UserManagerHelperRoboTest.ShadowUserHandle.class})
+public class UserManagerHelperRoboTest {
+ @Mock
+ private Context mContext;
+ @Mock
+ private UserManager mUserManager;
+
+ private UserManagerHelper mHelper;
+
+ @Before
+ public void setUpMocksAndUserManagerHelper() {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(
+ RuntimeEnvironment.application.getSystemService(ActivityManager.class));
+ mHelper = new UserManagerHelper(mContext);
+ }
+
+ @After
+ public void tearDown() {
+ ShadowActivityManager.getShadow().reset();
+ }
+
+ @Test
+ public void getForegroundUserId() {
+ ShadowActivityManager.setCurrentUser(15);
+ assertThat(mHelper.getForegroundUserId()).isEqualTo(15);
+ }
+
+ @Test
+ public void getForegroundUserInfo() {
+ ShadowActivityManager.setCurrentUser(17);
+ when(mUserManager.getUserInfo(ShadowActivityManager.getCurrentUser()))
+ .thenReturn(createUserInfoForId(ShadowActivityManager.getCurrentUser()));
+ assertThat(mHelper.getForegroundUserInfo().id).isEqualTo(17);
+ }
+
+ @Test
+ public void getCurrentProcessUserId() {
+ ShadowUserHandle.setUid(11);
+ assertThat(mHelper.getCurrentProcessUserId()).isEqualTo(11);
+ }
+
+ @Test
+ public void getCurrentProcessUserInfo() {
+ ShadowUserHandle.setUid(12);
+ when(mUserManager.getUserInfo(UserHandle.myUserId()))
+ .thenReturn(createUserInfoForId(UserHandle.myUserId()));
+ assertThat(mHelper.getCurrentProcessUserInfo().id).isEqualTo(12);
+ }
+
+ @Test
+ public void getAllUsersExcludesCurrentProcessUser() {
+ ShadowUserHandle.setUid(12);
+ UserInfo currentProcessUser = createUserInfoForId(12);
+
+ UserInfo otherUser1 = createUserInfoForId(13);
+ UserInfo otherUser2 = createUserInfoForId(11);
+ UserInfo otherUser3 = createUserInfoForId(14);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(otherUser1);
+ testUsers.add(otherUser2);
+ testUsers.add(currentProcessUser);
+ testUsers.add(otherUser3);
+
+ when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+ // Should return 3 users that don't have currentProcessUser id.
+ assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()).hasSize(3);
+ assertThat(mHelper.getAllUsersExcludesCurrentProcessUser())
+ .containsExactly(otherUser1, otherUser2, otherUser3);
+ }
+
+ @Test
+ public void getAllUsersExcludesForegroundUser() {
+ ShadowActivityManager.setCurrentUser(17);
+ UserInfo foregroundUser = createUserInfoForId(17);
+
+ UserInfo otherUser1 = createUserInfoForId(11);
+ UserInfo otherUser2 = createUserInfoForId(18);
+ UserInfo otherUser3 = createUserInfoForId(16);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(otherUser1);
+ testUsers.add(otherUser2);
+ testUsers.add(foregroundUser);
+ testUsers.add(otherUser3);
+
+ when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+ // Should return 3 users that don't have foregroundUser id.
+ assertThat(mHelper.getAllUsersExcludesForegroundUser()).hasSize(3);
+ assertThat(mHelper.getAllUsersExcludesForegroundUser())
+ .containsExactly(otherUser1, otherUser2, otherUser3);
+ }
+
+ @Test
+ public void userIsForegroundUser() {
+ ShadowActivityManager.setCurrentUser(10);
+ assertThat(mHelper.userIsForegroundUser(createUserInfoForId(10))).isTrue();
+ assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isFalse();
+
+ ShadowActivityManager.setCurrentUser(11);
+ assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isTrue();
+ }
+
+ @Test
+ public void userIsRunningCurrentProcess() {
+ ShadowUserHandle.setUid(10);
+ assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(10))).isTrue();
+ assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isFalse();
+
+ ShadowUserHandle.setUid(11);
+ assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isTrue();
+ }
+
+ @Test
+ public void removingCurrentProcessUserSwitchesToSystemUser() {
+ // Set currentProcess user to be user 10.
+ ShadowUserHandle.setUid(10);
+
+ // Removing a currentProcess user, calls "switch" to system user
+ mHelper.removeUser(createUserInfoForId(10));
+ assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue();
+ assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(0);
+
+ verify(mUserManager).removeUser(10);
+ }
+
+ @Test
+ public void switchToUser() {
+ ShadowActivityManager.setCurrentUser(20);
+
+ // Switching to foreground user doesn't do anything.
+ mHelper.switchToUser(createUserInfoForId(20));
+ assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isFalse();
+
+ // Switching to Guest calls createGuest.
+ UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST);
+ mHelper.switchToUser(guestInfo);
+ verify(mUserManager).createGuest(mContext, "Test Guest");
+
+ // Switching to non-current, non-guest user, simply calls switchUser.
+ UserInfo userToSwitchTo = new UserInfo(22, "Test User", 0);
+ mHelper.switchToUser(userToSwitchTo);
+ assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue();
+ assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(22);
+ }
+
+ private UserInfo createUserInfoForId(int id) {
+ UserInfo userInfo = new UserInfo();
+ userInfo.id = id;
+ return userInfo;
+ }
+
+ @Implements(UserHandle.class)
+ public static class ShadowUserHandle {
+ private static int sUid = 0; // SYSTEM by default
+
+ public static void setUid(int uid) {
+ sUid = uid;
+ }
+
+ @Implementation
+ public static int myUserId() {
+ return sUid;
+ }
+
+ @Resetter
+ public static void reset() {
+ sUid = 0;
+ }
+ }
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index a6d6250..022e306 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -2935,7 +2935,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 162;
+ private static final int SETTINGS_VERSION = 163;
private final int mUserId;
@@ -3709,6 +3709,21 @@
currentVersion = 162;
}
+ if (currentVersion == 162) {
+ // Version 162: Add a gesture for silencing phones
+ final SettingsState settings = getGlobalSettingsLocked();
+ final Setting currentSetting = settings.getSettingLocked(
+ Global.SHOW_ZEN_UPGRADE_NOTIFICATION);
+ if (!currentSetting.isNull()
+ && TextUtils.equals("0", currentSetting.getValue())) {
+ settings.insertSettingLocked(
+ Global.SHOW_ZEN_UPGRADE_NOTIFICATION, "1",
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ currentVersion = 163;
+ }
+
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml b/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
similarity index 97%
rename from packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml
rename to packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
index 85896e8..5add2a8 100644
--- a/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml
+++ b/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
@@ -15,8 +15,8 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="21dp"
- android:height="22dp"
+ android:width="32dp"
+ android:height="32dp"
android:viewportWidth="21"
android:viewportHeight="22">
diff --git a/packages/SimAppDialog/res/drawable/placeholder.xml b/packages/SimAppDialog/res/drawable/placeholder.xml
deleted file mode 100644
index 53eee74..0000000
--- a/packages/SimAppDialog/res/drawable/placeholder.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2018 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.
--->
-<!-- TODO(b/72511181): replace when illustration is finished -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="270dp"
- android:height="270dp"
- android:viewportHeight="270.0"
- android:viewportWidth="270.0">
- <path android:fillColor="#E8EAED"
- android:pathData="M183.54,265H84.88c-7.63,0 -13.81,-6.18 -13.81,-13.81V18.81C71.07,11.18 77.25,5 84.88,5h98.66c7.63,0 13.81,6.18 13.81,13.81v232.38C197.35,258.82 191.17,265 183.54,265z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M183.54,6.63c6.72,0 12.18,5.46 12.18,12.18v232.38c0,6.72 -5.46,12.18 -12.18,12.18H84.88c-6.72,0 -12.18,-5.46 -12.18,-12.18V18.81c0,-6.72 5.46,-12.18 12.18,-12.18H183.54M183.54,5H84.88c-7.63,0 -13.81,6.18 -13.81,13.81v232.38c0,7.63 6.18,13.81 13.81,13.81h98.66c7.63,0 13.81,-6.18 13.81,-13.81V18.81C197.35,11.18 191.17,5 183.54,5L183.54,5z"/>
- <path android:fillColor="#FFFFFF"
- android:pathData="M186.34,243.74H82.08c-2.41,0 -4.36,-1.95 -4.36,-4.36V30.61c0,-2.41 1.95,-4.36 4.36,-4.36h104.26c2.41,0 4.36,1.95 4.36,4.36v208.78C190.7,241.79 188.75,243.74 186.34,243.74z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M156.07,254.78h-43.72c-0.65,0 -1.18,-0.53 -1.18,-1.18v-0.08c0,-0.65 0.53,-1.18 1.18,-1.18h43.72c0.65,0 1.18,0.53 1.18,1.18v0.08C157.25,254.25 156.72,254.78 156.07,254.78z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M156.07,17.67h-43.72c-0.65,0 -1.18,-0.53 -1.18,-1.18V16.4c0,-0.65 0.53,-1.18 1.18,-1.18l43.72,0c0.65,0 1.18,0.53 1.18,1.18v0.08C157.25,17.14 156.72,17.67 156.07,17.67z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M197.85,84.16h-0.5V67.51h0.5c0.6,0 1.08,0.48 1.08,1.08v14.5C198.93,83.68 198.45,84.16 197.85,84.16z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M197.41,136.45h-0.06v-32.87h0.06c0.84,0 1.52,0.68 1.52,1.52v29.84C198.93,135.77 198.25,136.45 197.41,136.45z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M119.3,74.73l2.71,2.71c6.74,-6.74 17.67,-6.74 24.4,0l2.71,-2.71C140.89,66.49 127.54,66.49 119.3,74.73zM130.15,85.57l4.07,4.07l4.07,-4.07C136.04,83.33 132.39,83.33 130.15,85.57zM124.72,80.15l2.71,2.71c3.74,-3.74 9.82,-3.74 13.56,0l2.71,-2.71C138.46,74.91 129.96,74.91 124.72,80.15z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M143.7,179h-1.36v-2.71h-2.71V179h-10.85v-2.71h-2.71V179h-1.36c-1.5,0 -2.7,1.21 -2.7,2.71l-0.01,18.98c0,1.5 1.21,2.71 2.71,2.71h18.98c1.5,0 2.71,-1.21 2.71,-2.71v-18.98C146.41,180.22 145.2,179 143.7,179zM143.7,200.7h-18.98v-14.91h18.98V200.7zM127.43,188.49h6.78v6.78h-6.78V188.49z"/>
- <path android:fillColor="#BDC1C6"
- android:pathData="M146.41,144.49v-18.98c0,-1.5 -1.21,-2.71 -2.71,-2.71h-18.98c-1.5,0 -2.71,1.21 -2.71,2.71v18.98c0,1.5 1.21,2.71 2.71,2.71h18.98C145.2,147.2 146.41,145.99 146.41,144.49zM129.47,137.03l3.39,4.07l4.75,-6.11l6.1,8.13h-18.98L129.47,137.03z"/>
-</vector>
diff --git a/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml b/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
index 0462a93..5bcce4d 100644
--- a/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
+++ b/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
@@ -20,7 +20,7 @@
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:icon="@drawable/ic_signal_cellular_alt_rounded_24px"
+ android:icon="@drawable/ic_signal_cellular_alt_rounded"
app:suwHeaderText="@string/install_carrier_app_title"
app:suwFooter="@layout/install_carrier_app_footer">
@@ -37,21 +37,6 @@
android:text="@string/install_carrier_app_description_default"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
-
- <com.android.setupwizardlib.view.FillContentLayout
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1">
-
- <!-- TODO(b/72511181): final illo and content description update -->
- <ImageView
- android:src="@drawable/placeholder"
- style="@style/SuwContentIllustration"
- android:contentDescription="@null"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
- </com.android.setupwizardlib.view.FillContentLayout>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
diff --git a/packages/SimAppDialog/res/values/strings.xml b/packages/SimAppDialog/res/values/strings.xml
index 0c3930d..87941cb 100644
--- a/packages/SimAppDialog/res/values/strings.xml
+++ b/packages/SimAppDialog/res/values/strings.xml
@@ -15,22 +15,21 @@
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- TODO character limits -->
- <!-- The name of this application -->
+ <!-- The name of this application [CHAR LIMIT=NONE] -->
<string name="app_name">Sim App Dialog</string>
<!-- Install Carrier App Activity -->
- <!-- Title of screen asking user to download the carrier app to match the inserted SIM card -->
+ <!-- Title of screen asking user to download the carrier app to match the inserted SIM card [CHAR LIMIT=30] -->
<string name="install_carrier_app_title">Activate mobile service</string>
- <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we know the name of the carrier-->
+ <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we know the name of the carrier [CHAR LIMIT=90] -->
<string name="install_carrier_app_description">To get your new SIM working properly, you\'ll
need to install the <xliff:g name="carrier_name" example="Project Fi">%1$s</xliff:g> app
</string>
- <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we don't know the name of the carrier-->
+ <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we don't know the name of the carrier [CHAR LIMIT=100] -->
<string name="install_carrier_app_description_default">To get your new SIM working properly,
you\'ll need to install the carrier app
</string>
- <!-- Name of the button used to defer downloading the carrier app -->
+ <!-- Name of the button used to defer downloading the carrier app [CHAR LIMIT=25]-->
<string name="install_carrier_app_defer_action">Not now</string>
- <!-- Name of the button for downloading the carrier app -->
+ <!-- Name of the button for downloading the carrier app [CHAR LIMIT=25] -->
<string name="install_carrier_app_download_action">Download app</string>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index d6fab4c..285b89f 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -206,7 +206,7 @@
<uses-permission android:name="android.permission.WATCH_APPOPS" />
<!-- to read and change hvac values in a car -->
- <uses-permission android:name="android.car.permission.ADJUST_CAR_CLIMATE" />
+ <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
<application
android:name=".SystemUIApplication"
diff --git a/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml b/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml
new file mode 100644
index 0000000..05db3a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml
@@ -0,0 +1,19 @@
+<!--
+ Copyright (C) 2018 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="?android:attr/colorAccent" />
+ <corners android:radius="8dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
index c03f25c..dcb8aaf2 100644
--- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml
+++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
@@ -20,8 +20,9 @@
android:layout_height="20dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="14dp"
+ android:layout_marginEnd="@dimen/notification_side_paddings"
android:layout_below="@id/quick_status_bar_system_icons"
- android:paddingEnd="@dimen/signal_cluster_battery_padding" >
+ android:paddingEnd="@dimen/status_bar_padding_end" >
<com.android.systemui.statusbar.phone.StatusIconContainer
android:id="@+id/statusIcons"
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
index 388b633..7b9cd2a 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -20,15 +20,16 @@
android:id="@+id/quick_status_bar_system_icons"
android:layout_width="match_parent"
android:layout_height="@*android:dimen/quick_qs_offset_height"
+ android:layout_marginRight="@dimen/notification_side_paddings"
+ android:layout_marginLeft="@dimen/notification_side_paddings"
android:layout_alignParentEnd="true"
android:clipChildren="false"
android:clipToPadding="false"
android:gravity="center"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
+ android:paddingStart="@dimen/status_bar_padding_start"
+ android:paddingEnd="@dimen/status_bar_padding_end"
android:orientation="horizontal">
-
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/recents_onboarding.xml b/packages/SystemUI/res/layout/recents_onboarding.xml
index 12f278a..6764eee 100644
--- a/packages/SystemUI/res/layout/recents_onboarding.xml
+++ b/packages/SystemUI/res/layout/recents_onboarding.xml
@@ -14,32 +14,48 @@
limitations under the License.
-->
-<FrameLayout
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="48dp"
- android:layout_width="match_parent"
- android:background="@android:color/black"
- android:layout_gravity="center">
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="?android:attr/listDivider"
- android:gravity="top"/>
- <TextView
- android:id="@+id/onboarding_text"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:paddingBottom="13dp"
+ android:orientation="vertical">
+
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:textColor="@android:color/white"
- android:textSize="16sp"
- android:drawableBottom="@drawable/ic_chevron_up"/>
- <ImageView
- android:id="@+id/dismiss"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:padding="12dp"
- android:layout_marginEnd="6dp"
- android:src="@drawable/ic_close_white"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:layout_gravity="center_vertical|end"/>
-</FrameLayout>
\ No newline at end of file
+ android:layout_height="40dp"
+ android:paddingStart="24dp"
+ android:paddingEnd="4dp"
+ android:background="@drawable/recents_onboarding_toast_rounded_background"
+ android:layout_gravity="center_horizontal"
+ android:elevation="2dp"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/onboarding_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textColor="@android:color/white"
+ android:textSize="16sp"/>
+ <ImageView
+ android:id="@+id/dismiss"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:layout_gravity="center_vertical"
+ android:padding="10dp"
+ android:layout_marginStart="2dp"
+ android:layout_marginEnd="2dp"
+ android:alpha="0.7"
+ android:src="@drawable/ic_close_white"
+ android:background="?android:attr/selectableItemBackgroundBorderless"/>
+ </LinearLayout>
+
+ <View
+ android:id="@+id/arrow"
+ android:elevation="2dp"
+ android:layout_width="10dp"
+ android:layout_height="8dp"
+ android:layout_marginTop="-2dp"
+ android:layout_gravity="center_horizontal"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index f0138a6..df46fab 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -45,7 +45,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/status_bar_padding_start"
- android:paddingEnd="8dp"
+ android:paddingEnd="@dimen/status_bar_padding_end"
android:orientation="horizontal"
>
<ViewStub
diff --git a/packages/SystemUI/res/values-sw372dp/dimens.xml b/packages/SystemUI/res/values-sw372dp/dimens.xml
index 3a7442a..717f18f 100644
--- a/packages/SystemUI/res/values-sw372dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw372dp/dimens.xml
@@ -18,5 +18,5 @@
<resources>
<dimen name="nav_content_padding">8dp</dimen>
<dimen name="rounded_corner_content_padding">8dp</dimen>
- <dimen name="qs_header_tile_margin_horizontal">5dp</dimen>
+ <dimen name="qs_header_tile_margin_horizontal">13dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/attrs_car.xml b/packages/SystemUI/res/values/attrs_car.xml
index 335ae44..99d2425 100644
--- a/packages/SystemUI/res/values/attrs_car.xml
+++ b/packages/SystemUI/res/values/attrs_car.xml
@@ -29,6 +29,8 @@
<attr name="categories" format="string"/>
<!-- package names that will be added as extras to the fired intents -->
<attr name="packages" format="string" />
+ <!-- componentName names that will be used for detecting selected state -->
+ <attr name="componentNames" format="string" />
<!-- Alpha value to used when in selected state. Defaults 1f -->
<attr name="selectedAlpha" format="float" />
<!-- Alpha value to used when in un-selected state. Defaults 0.7f -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 9009531..b99e35b 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -185,6 +185,9 @@
<!-- the padding on the start of the statusbar -->
<dimen name="status_bar_padding_start">6dp</dimen>
+ <!-- the padding on the end of the statusbar -->
+ <dimen name="status_bar_padding_end">8dp</dimen>
+
<!-- the radius of the overflow dot in the status bar -->
<dimen name="overflow_dot_radius">1dp</dimen>
@@ -845,6 +848,9 @@
<!-- The size of the drag hint text. -->
<dimen name="recents_drag_hint_text_size">14sp</dimen>
+ <!-- The size of corner radius of the arrow in the onboarding toast. -->
+ <dimen name="recents_onboarding_toast_arrow_corner_radius">2dp</dimen>
+
<!-- The min alpha to apply to a task affiliation group color. -->
<item name="recents_task_affiliation_color_min_alpha_percentage" format="float" type="dimen">0.6</item>
@@ -930,6 +936,11 @@
<dimen name="smart_reply_button_font_size">14sp</dimen>
<dimen name="smart_reply_button_line_spacing_extra">6sp</dimen> <!-- Total line height 20sp. -->
+ <!-- A reasonable upper bound for the height of the smart reply button. The measuring code
+ needs to start with a guess for the maximum size. Currently two-line smart reply buttons
+ add about 88dp of height to the notifications. -->
+ <dimen name="smart_reply_button_max_height">100dp</dimen>
+
<!-- Fingerprint Dialog values -->
<dimen name="fingerprint_dialog_fp_icon_size">64dp</dimen>
<dimen name="fingerprint_dialog_animation_translation_offset">350dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c1e1873..29f1335 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -405,7 +405,10 @@
<string name="accessibility_cell_data_on">Mobile Data On</string>
<!-- Content description of the cell data being disabled. [CHAR LIMIT=NONE] -->
- <string name="cell_data_off">Mobile data off</string>
+ <string name="cell_data_off_content_description">Mobile data off</string>
+
+ <!-- Content description of the cell data being disabled but shortened. [CHAR LIMIT=20] -->
+ <string name="cell_data_off">Off</string>
<!-- Content description of the bluetooth tethering icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_bluetooth_tether">Bluetooth tethering.</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
index 36d8423..b2b140e 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
@@ -60,6 +60,12 @@
}
};
+ private final View mView;
+
+ public WindowCallbacksCompat(View view) {
+ mView = view;
+ }
+
public void onWindowSizeIsChanging(Rect newBounds, boolean fullscreen, Rect systemInsets,
Rect stableInsets) { }
@@ -72,12 +78,20 @@
return false;
}
- public void onRequestDraw(boolean reportNextDraw) { }
+ public void onRequestDraw(boolean reportNextDraw) {
+ if (reportNextDraw) {
+ reportDrawFinish();
+ }
+ }
public void onPostDraw(Canvas canvas) { }
- public final boolean addToView(View view) {
- ViewRootImpl root = view.getViewRootImpl();
+ public void reportDrawFinish() {
+ mView.getViewRootImpl().reportDrawFinish();
+ }
+
+ public boolean attach() {
+ ViewRootImpl root = mView.getViewRootImpl();
if (root != null) {
root.addWindowCallbacks(mWindowCallbacks);
root.requestInvalidateRootRenderNode();
@@ -86,8 +100,8 @@
return false;
}
- public final void removeFromView(View view) {
- ViewRootImpl root = view.getViewRootImpl();
+ public void detach() {
+ ViewRootImpl root = mView.getViewRootImpl();
if (root != null) {
root.removeWindowCallbacks(mWindowCallbacks);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 9a26b35..5a6ff41 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -102,7 +102,7 @@
super.onFinishInflate();
mTitle = findViewById(R.id.title);
mRow = findViewById(R.id.row);
- mTextColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
+ mTextColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
mIconSize = (int) mContext.getResources().getDimension(R.dimen.widget_icon_size);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 1bab36b..c826aaa 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1850,6 +1850,7 @@
final TelephonyManager tele = TelephonyManager.from(mContext);
ArrayList<Integer> changedSubscriptionIds = new ArrayList<>();
HashSet<Integer> activeSubIds = new HashSet<>();
+ HashSet<Integer> activeSlotIds = new HashSet<>();
for (SubscriptionInfo info : activeSubscriptionInfos) {
int subId = info.getSubscriptionId();
@@ -1878,11 +1879,15 @@
}
activeSubIds.add(subId);
+ activeSlotIds.add(slotId);
}
for (SimData data : mSimDatas.values()) {
- if (!activeSubIds.contains(data.subId) && data.simState != State.ABSENT) {
+ if (!activeSubIds.contains(data.subId)
+ && !activeSlotIds.contains(data.slotId)
+ && data.simState != State.ABSENT) {
// for the inactive subscriptions, reset state to ABSENT
+ if (DEBUG_SIM_STATES) Log.d(TAG, "reset state to ABSENT for subId:" + data.subId);
data.simState = State.ABSENT;
changedSubscriptionIds.add(data.subId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 0683514..84bb7fe 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -164,8 +164,8 @@
if (mUseWallpaperTextColors) {
updateColors(
- Utils.getColorAttr(mContext, R.attr.wallpaperTextColor),
- Utils.getColorAttr(mContext, R.attr.wallpaperTextColorSecondary));
+ Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor),
+ Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColorSecondary));
} else {
updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor);
}
@@ -180,10 +180,13 @@
Utils.getThemeAttr(context, R.attr.darkIconTheme));
Context dualToneLightTheme = new ContextThemeWrapper(context,
Utils.getThemeAttr(context, R.attr.lightIconTheme));
- mDarkModeBackgroundColor = Utils.getColorAttr(dualToneDarkTheme, R.attr.backgroundColor);
- mDarkModeFillColor = Utils.getColorAttr(dualToneDarkTheme, R.attr.fillColor);
- mLightModeBackgroundColor = Utils.getColorAttr(dualToneLightTheme, R.attr.backgroundColor);
- mLightModeFillColor = Utils.getColorAttr(dualToneLightTheme, R.attr.fillColor);
+ mDarkModeBackgroundColor = Utils.getColorAttrDefaultColor(dualToneDarkTheme,
+ R.attr.backgroundColor);
+ mDarkModeFillColor = Utils.getColorAttrDefaultColor(dualToneDarkTheme,
+ R.attr.fillColor);
+ mLightModeBackgroundColor = Utils.getColorAttrDefaultColor(dualToneLightTheme,
+ R.attr.backgroundColor);
+ mLightModeFillColor = Utils.getColorAttrDefaultColor(dualToneLightTheme, R.attr.fillColor);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java b/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
index fb2eb4c..97d7999 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
@@ -61,7 +61,7 @@
: R.drawable.rounded_bg_bottom).mutate(),
};
}
- layers[1].setTint(Utils.getColorAttr(context, android.R.attr.colorPrimary));
+ layers[1].setTintList(Utils.getColorAttr(context, android.R.attr.colorPrimary));
return layers;
}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index e54b083..7042d22 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -214,7 +214,11 @@
}
private boolean shouldDrawCutout() {
- return mContext.getResources().getBoolean(
+ return shouldDrawCutout(mContext);
+ }
+
+ static boolean shouldDrawCutout(Context context) {
+ return context.getResources().getBoolean(
com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout);
}
@@ -393,7 +397,7 @@
mBoundingRect.setEmpty();
mBoundingPath.reset();
int newVisible;
- if (hasCutout()) {
+ if (shouldDrawCutout(getContext()) && hasCutout()) {
mBounds.set(mInfo.displayCutout.getBounds());
localBounds(mBoundingRect);
updateBoundingPath();
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
index 9c411d6..ad6dfa4 100644
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
@@ -95,7 +95,7 @@
private void setupPaint() {
mPaint = new Paint();
- mPaint.setColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor));
+ mPaint.setColor(Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor));
}
public void setPaintColor(int color) {
@@ -179,4 +179,4 @@
private float getPathGone(long now) {
return (float) (now - mAnimationStartTime) / (WirelessChargingAnimation.DURATION);
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
index c238e54..a81043e 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
@@ -134,8 +134,11 @@
}
private void handleShowDialog(SomeArgs args) {
- if (DEBUG) Log.d(TAG, "handleShowDialog");
- if (mDialogShowing) {
+ if (DEBUG) Log.d(TAG, "handleShowDialog, isAnimatingAway: "
+ + mDialogView.isAnimatingAway());
+ if (mDialogView.isAnimatingAway()) {
+ mDialogView.forceRemove();
+ } else if (mDialogShowing) {
Log.w(TAG, "Dialog already showing");
return;
}
@@ -168,7 +171,7 @@
}
private void handleHideDialog(boolean userCanceled) {
- if (DEBUG) Log.d(TAG, "handleHideDialog");
+ if (DEBUG) Log.d(TAG, "handleHideDialog, userCanceled: " + userCanceled);
if (!mDialogShowing) {
// This can happen if there's a race and we get called from both
// onAuthenticated and onError, etc.
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
index d1d6609..8013a9e 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
@@ -19,7 +19,6 @@
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricPrompt;
@@ -76,9 +75,29 @@
private Bundle mBundle;
private final LinearLayout mDialog;
private int mLastState;
+ private boolean mAnimatingAway;
+ private boolean mWasForceRemoved;
private final float mDisplayWidth;
+ private final Runnable mShowAnimationRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mLayout.animate()
+ .alpha(1f)
+ .setDuration(ANIMATION_DURATION_SHOW)
+ .setInterpolator(mLinearOutSlowIn)
+ .withLayer()
+ .start();
+ mDialog.animate()
+ .translationY(0)
+ .setDuration(ANIMATION_DURATION_SHOW)
+ .setInterpolator(mLinearOutSlowIn)
+ .withLayer()
+ .start();
+ }
+ };
+
public FingerprintDialogView(Context context, Handler handler) {
super(context);
mHandler = handler;
@@ -192,26 +211,20 @@
positive.setVisibility(View.GONE);
}
- // Dim the background and slide the dialog up
- mDialog.setTranslationY(mAnimationTranslationOffset);
- mLayout.setAlpha(0f);
- postOnAnimation(new Runnable() {
- @Override
- public void run() {
- mLayout.animate()
- .alpha(1f)
- .setDuration(ANIMATION_DURATION_SHOW)
- .setInterpolator(mLinearOutSlowIn)
- .withLayer()
- .start();
- mDialog.animate()
- .translationY(0)
- .setDuration(ANIMATION_DURATION_SHOW)
- .setInterpolator(mLinearOutSlowIn)
- .withLayer()
- .start();
- }
- });
+ if (!mWasForceRemoved) {
+ // Dim the background and slide the dialog up
+ mDialog.setTranslationY(mAnimationTranslationOffset);
+ mLayout.setAlpha(0f);
+ postOnAnimation(mShowAnimationRunnable);
+ } else {
+ // Show the dialog immediately
+ mLayout.animate().cancel();
+ mDialog.animate().cancel();
+ mDialog.setAlpha(1.0f);
+ mDialog.setTranslationY(0);
+ mLayout.setAlpha(1.0f);
+ }
+ mWasForceRemoved = false;
}
private void setDismissesDialog(View v) {
@@ -224,10 +237,13 @@
}
public void startDismiss() {
+ mAnimatingAway = true;
+
final Runnable endActionRunnable = new Runnable() {
@Override
public void run() {
mWindowManager.removeView(FingerprintDialogView.this);
+ mAnimatingAway = false;
}
};
@@ -251,6 +267,23 @@
});
}
+ /**
+ * Force remove the window, cancelling any animation that's happening. This should only be
+ * called if we want to quickly show the dialog again (e.g. on rotation). Calling this method
+ * will cause the dialog to show without an animation the next time it's attached.
+ */
+ public void forceRemove() {
+ mLayout.animate().cancel();
+ mDialog.animate().cancel();
+ mWindowManager.removeView(FingerprintDialogView.this);
+ mAnimatingAway = false;
+ mWasForceRemoved = true;
+ }
+
+ public boolean isAnimatingAway() {
+ return mAnimatingAway;
+ }
+
public void setBundle(Bundle bundle) {
mBundle = bundle;
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index a1adfa6..1489c21 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -106,7 +106,8 @@
d.setContentView(R.layout.shutdown_dialog);
d.setCancelable(false);
- int color = Utils.getColorAttr(mContext, com.android.systemui.R.attr.wallpaperTextColor);
+ int color = Utils.getColorAttrDefaultColor(mContext,
+ com.android.systemui.R.attr.wallpaperTextColor);
boolean onKeyguard = mContext.getSystemService(
KeyguardManager.class).isKeyguardLocked();
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 426f714..5993c39 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -145,6 +145,8 @@
private static final String DELAYED_LOCK_PROFILE_ACTION =
"com.android.internal.policy.impl.PhoneWindowManager.DELAYED_LOCK";
+ private static final String SYSTEMUI_PERMISSION = "com.android.systemui.permission.SELF";
+
// used for handler messages
private static final int SHOW = 1;
private static final int HIDE = 2;
@@ -357,7 +359,12 @@
// ActivityManagerService) will not reconstruct the keyguard if it is already showing.
synchronized (KeyguardViewMediator.this) {
resetKeyguardDonePendingLocked();
- resetStateLocked();
+ if (mLockPatternUtils.isLockScreenDisabled(userId)) {
+ // If we switching to a user that has keyguard disabled, dismiss keyguard.
+ dismiss(null /* callback */, null /* message */);
+ } else {
+ resetStateLocked();
+ }
adjustStatusBarLocked();
}
}
@@ -688,11 +695,15 @@
mShowKeyguardWakeLock.setReferenceCounted(false);
IntentFilter filter = new IntentFilter();
- filter.addAction(DELAYED_KEYGUARD_ACTION);
- filter.addAction(DELAYED_LOCK_PROFILE_ACTION);
filter.addAction(Intent.ACTION_SHUTDOWN);
mContext.registerReceiver(mBroadcastReceiver, filter);
+ final IntentFilter delayedActionFilter = new IntentFilter();
+ delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION);
+ delayedActionFilter.addAction(DELAYED_LOCK_PROFILE_ACTION);
+ mContext.registerReceiver(mDelayedLockBroadcastReceiver, delayedActionFilter,
+ SYSTEMUI_PERMISSION, null /* scheduler */);
+
mKeyguardDisplayManager = new KeyguardDisplayManager(mContext, mViewMediatorCallback);
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
@@ -1460,7 +1471,10 @@
}
}
- private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ /**
+ * This broadcast receiver should be registered with the SystemUI permission.
+ */
+ private final BroadcastReceiver mDelayedLockBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (DELAYED_KEYGUARD_ACTION.equals(intent.getAction())) {
@@ -1482,7 +1496,14 @@
}
}
}
- } else if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) {
+ }
+ }
+ };
+
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) {
synchronized (KeyguardViewMediator.this){
mShuttingDown = true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 40ce69b..2763f4c 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -242,7 +242,7 @@
// remaining estimate is disabled
if (mEstimate == null || mBucket < 0
|| mEstimate.estimateMillis < mSevereWarningThreshold) {
- nb.setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ nb.setColor(Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError));
}
nb.addAction(0,
mContext.getString(R.string.battery_saver_start_action),
@@ -337,7 +337,8 @@
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setContentIntent(pendingBroadcast(ACTION_CLICKED_TEMP_WARNING))
.setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_TEMP_WARNING))
- .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ .setColor(Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorError));
SystemUI.overrideNotificationAppName(mContext, nb, false);
final Notification n = nb.build();
mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL);
@@ -387,7 +388,8 @@
.setContentIntent(pendingBroadcast(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING))
.setDeleteIntent(
pendingBroadcast(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING))
- .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ .setColor(Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorError));
SystemUI.overrideNotificationAppName(mContext, nb, false);
final Notification n = nb.build();
mNoMan.notifyAsUser(
diff --git a/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java b/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
index 047e0d1..9b5f23b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
@@ -45,8 +45,10 @@
public DataUsageGraph(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = context.getResources();
- mTrackColor = Utils.getDefaultColor(context, R.color.data_usage_graph_track);
- mWarningColor = Utils.getDefaultColor(context, R.color.data_usage_graph_warning);
+ mTrackColor = Utils.getColorStateListDefaultColor(context,
+ R.color.data_usage_graph_track);
+ mWarningColor = Utils.getColorStateListDefaultColor(context,
+ R.color.data_usage_graph_warning);
mUsageColor = Utils.getColorAccent(context);
mOverlimitColor = Utils.getColorError(context);
mMarkerWidth = res.getDimensionPixelSize(R.dimen.data_usage_graph_marker_width);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index cf549fa..3ff0fe6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -96,7 +96,7 @@
public QSFooterImpl(Context context, AttributeSet attrs) {
super(context, attrs);
- mColorForeground = Utils.getColorAttr(context, android.R.attr.colorForeground);
+ mColorForeground = Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground);
}
@Override
@@ -354,7 +354,7 @@
!(picture instanceof UserIconDrawable)) {
picture = picture.getConstantState().newDrawable(mContext.getResources()).mutate();
picture.setColorFilter(
- Utils.getColorAttr(mContext, android.R.attr.colorForeground),
+ Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorForeground),
Mode.SRC_IN);
}
mMultiUserAvatar.setImageDrawable(picture);
@@ -383,7 +383,7 @@
if (TextUtils.equals(mInfo.typeContentDescription,
mContext.getString(R.string.data_connection_no_internet))
|| TextUtils.equals(mInfo.typeContentDescription,
- mContext.getString(R.string.cell_data_off))) {
+ mContext.getString(R.string.cell_data_off_content_description))) {
contentDescription.append(mInfo.typeContentDescription);
}
mMobileSignal.setContentDescription(contentDescription);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index e2af90d..0615e2e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -162,7 +162,8 @@
updateResources();
Rect tintArea = new Rect(0, 0, 0, 0);
- int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
+ int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+ android.R.attr.colorForeground);
float intensity = getColorIntensity(colorForeground);
int fillColor = fillColorForIntensity(intensity, getContext());
@@ -213,9 +214,9 @@
private int fillColorForIntensity(float intensity, Context context) {
if (intensity == 0) {
- return context.getColor(R.color.light_mode_icon_color_dual_tone_fill);
+ return context.getColor(R.color.light_mode_icon_color_single_tone);
}
- return context.getColor(R.color.dark_mode_icon_color_dual_tone_fill);
+ return context.getColor(R.color.dark_mode_icon_color_single_tone);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
index 31c455d..40f174f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
@@ -40,7 +40,8 @@
super.onFinishInflate();
// Set the light/dark theming on the header status UI to match the current theme.
- int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
+ int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+ android.R.attr.colorForeground);
float intensity = colorForeground == Color.WHITE ? 0f : 1f;
Rect tintArea = new Rect(0, 0, 0, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 4aa83d0..bec4bab 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -101,7 +101,7 @@
mToolbar.getMenu().add(Menu.NONE, MENU_RESET, 0,
mContext.getString(com.android.internal.R.string.reset));
mToolbar.setTitle(R.string.qs_edit);
- int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent);
+ int accentColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent);
mToolbar.setTitleTextColor(accentColor);
mToolbar.getNavigationIcon().setTint(accentColor);
mToolbar.getOverflowIcon().setTint(accentColor);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index cc60f87..ebfa6af 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -94,10 +94,10 @@
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
- mColorActive = Utils.getColorAttr(context, android.R.attr.colorAccent);
+ mColorActive = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent);
mColorDisabled = Utils.getDisabled(context,
- Utils.getColorAttr(context, android.R.attr.textColorTertiary));
- mColorInactive = Utils.getColorAttr(context, android.R.attr.textColorSecondary);
+ Utils.getColorAttrDefaultColor(context, android.R.attr.textColorTertiary));
+ mColorInactive = Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
setPadding(0, 0, 0, 0);
setClipChildren(false);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 834feb7..6bc3bee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -387,11 +387,11 @@
switch (state) {
case Tile.STATE_UNAVAILABLE:
return Utils.getDisabled(context,
- Utils.getColorAttr(context, android.R.attr.textColorSecondary));
+ Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary));
case Tile.STATE_INACTIVE:
- return Utils.getColorAttr(context, android.R.attr.textColorSecondary);
+ return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
case Tile.STATE_ACTIVE:
- return Utils.getColorAttr(context, android.R.attr.colorPrimary);
+ return Utils.getColorAttrDefaultColor(context, android.R.attr.colorPrimary);
default:
Log.e("QSTile", "Invalid state " + state);
return 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 2abe9d9..d6182c4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -108,20 +108,21 @@
}
if (mDataController.isMobileDataEnabled()) {
if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
- mActivityStarter.postQSRunnableDismissingKeyguard(this::showDisableDialog);
+ mActivityStarter.postQSRunnableDismissingKeyguard(this::maybeShowDisableDialog);
} else {
- if (Prefs.getBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA, false)) {
- mDataController.setMobileDataEnabled(false);
- } else {
- mUiHandler.post(this::showDisableDialog);
- }
+ mUiHandler.post(this::maybeShowDisableDialog);
}
} else {
mDataController.setMobileDataEnabled(true);
}
}
- private void showDisableDialog() {
+ private void maybeShowDisableDialog() {
+ if (Prefs.getBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA, false)) {
+ // Directly turn off mobile data if the user has seen the dialog before.
+ mDataController.setMobileDataEnabled(false);
+ return;
+ }
mHost.collapsePanels();
String carrierName = mController.getMobileDataNetworkName();
if (TextUtils.isEmpty(carrierName)) {
@@ -194,7 +195,18 @@
state.state = Tile.STATE_INACTIVE;
state.secondaryLabel = r.getString(R.string.cell_data_off);
}
- state.contentDescription = state.label + ", " + state.secondaryLabel;
+
+
+ // TODO(b/77881974): Instead of switching out the description via a string check for
+ // we need to have two strings provided by the MobileIconGroup.
+ final CharSequence contentDescriptionSuffix;
+ if (state.state == Tile.STATE_INACTIVE) {
+ contentDescriptionSuffix = r.getString(R.string.cell_data_off_content_description);
+ } else {
+ contentDescriptionSuffix = state.secondaryLabel;
+ }
+
+ state.contentDescription = state.label + ", " + contentDescriptionSuffix;
}
private CharSequence getMobileDataDescription(CallbackInfo cb) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
index 7224ae6..b52e215 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
@@ -91,7 +91,7 @@
formatBytes(info.usageLevel));
bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit,
formatBytes(info.limitLevel));
- usageColor = Utils.getDefaultColor(mContext, android.R.attr.colorError);
+ usageColor = Utils.getColorStateListDefaultColor(mContext, android.R.attr.colorError);
}
if (usageColor == 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index f7cbee6..4616d1e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -143,26 +143,41 @@
public void showDetail(boolean show) {
int zenDuration = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ZEN_DURATION, 0);
- switch (zenDuration) {
- case Settings.Global.ZEN_DURATION_PROMPT:
- mUiHandler.post(() -> {
- Dialog mDialog = new EnableZenModeDialog(mContext).createDialog();
- mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- SystemUIDialog.setShowForAllUsers(mDialog, true);
- SystemUIDialog.registerDismissListener(mDialog);
- SystemUIDialog.setWindowOnTop(mDialog);
- mUiHandler.post(() -> mDialog.show());
- mHost.collapsePanels();
- });
- break;
- case Settings.Global.ZEN_DURATION_FOREVER:
- mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
- break;
- default:
- Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
- ActivityManager.getCurrentUser(), true).id;
- mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
- conditionId, TAG);
+ boolean showOnboarding = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0;
+ if (showOnboarding) {
+ // don't show on-boarding again or notification ever
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
+ // turn on DND
+ mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
+ // show on-boarding screen
+ Intent intent = new Intent(Settings.ZEN_MODE_ONBOARDING);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(intent, 0);
+ } else {
+ switch (zenDuration) {
+ case Settings.Global.ZEN_DURATION_PROMPT:
+ mUiHandler.post(() -> {
+ Dialog mDialog = new EnableZenModeDialog(mContext).createDialog();
+ mDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
+ SystemUIDialog.setShowForAllUsers(mDialog, true);
+ SystemUIDialog.registerDismissListener(mDialog);
+ SystemUIDialog.setWindowOnTop(mDialog);
+ mUiHandler.post(() -> mDialog.show());
+ mHost.collapsePanels();
+ });
+ break;
+ case Settings.Global.ZEN_DURATION_FOREVER:
+ mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
+ break;
+ default:
+ Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
+ ActivityManager.getCurrentUser(), true).id;
+ mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+ conditionId, TAG);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 30e9afd8..0d8aed4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -24,15 +24,16 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.CornerPathEffect;
+import android.graphics.Paint;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.RippleDrawable;
+import android.graphics.drawable.ShapeDrawable;
import android.os.Build;
import android.os.SystemProperties;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
+import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -76,17 +77,13 @@
private final View mLayout;
private final TextView mTextView;
private final ImageView mDismissView;
- private final ColorDrawable mBackgroundDrawable;
- private final int mDarkBackgroundColor;
- private final int mLightBackgroundColor;
- private final int mDarkContentColor;
- private final int mLightContentColor;
- private final RippleDrawable mDarkRipple;
- private final RippleDrawable mLightRipple;
+ private final View mArrowView;
+ private final int mOnboardingToastColor;
+ private final int mOnboardingToastArrowRadius;
+ private int mNavBarHeight;
private boolean mTaskListenerRegistered;
private boolean mLayoutAttachedToWindow;
- private boolean mBackgroundIsLight;
private int mLastTaskId;
private boolean mHasDismissed;
private int mNumAppsLaunchedSinceDismiss;
@@ -159,24 +156,30 @@
mLayout = LayoutInflater.from(mContext).inflate(R.layout.recents_onboarding, null);
mTextView = mLayout.findViewById(R.id.onboarding_text);
mDismissView = mLayout.findViewById(R.id.dismiss);
- mDarkBackgroundColor = res.getColor(android.R.color.background_dark);
- mLightBackgroundColor = res.getColor(android.R.color.background_light);
- mDarkContentColor = res.getColor(R.color.primary_text_default_material_light);
- mLightContentColor = res.getColor(R.color.primary_text_default_material_dark);
- mDarkRipple = new RippleDrawable(res.getColorStateList(R.color.ripple_material_light),
- null, null);
- mLightRipple = new RippleDrawable(res.getColorStateList(R.color.ripple_material_dark),
- null, null);
- mBackgroundDrawable = new ColorDrawable(mDarkBackgroundColor);
+ mArrowView = mLayout.findViewById(R.id.arrow);
+
+ TypedValue typedValue = new TypedValue();
+ context.getTheme().resolveAttribute(android.R.attr.colorAccent, typedValue, true);
+ mOnboardingToastColor = res.getColor(typedValue.resourceId);
+ mOnboardingToastArrowRadius = res.getDimensionPixelSize(
+ R.dimen.recents_onboarding_toast_arrow_corner_radius);
mLayout.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
- mLayout.setBackground(mBackgroundDrawable);
mDismissView.setOnClickListener(v -> {
hide(true);
mHasDismissed = true;
mNumAppsLaunchedSinceDismiss = 0;
});
+ ViewGroup.LayoutParams arrowLp = mArrowView.getLayoutParams();
+ ShapeDrawable arrowDrawable = new ShapeDrawable(TriangleShape.create(
+ arrowLp.width, arrowLp.height, false));
+ Paint arrowPaint = arrowDrawable.getPaint();
+ arrowPaint.setColor(mOnboardingToastColor);
+ // The corner path effect won't be reflected in the shadow, but shouldn't be noticeable.
+ arrowPaint.setPathEffect(new CornerPathEffect(mOnboardingToastArrowRadius));
+ mArrowView.setBackground(arrowDrawable);
+
if (RESET_PREFS_FOR_DEBUG) {
Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_RECENTS_ONBOARDING, false);
Prefs.putInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, 0);
@@ -234,6 +237,7 @@
int orientation = mContext.getResources().getConfiguration().orientation;
if (!mLayoutAttachedToWindow && orientation == Configuration.ORIENTATION_PORTRAIT) {
mLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+
mWindowManager.addView(mLayout, getWindowLayoutParams());
int layoutHeight = mLayout.getHeight();
if (layoutHeight == 0) {
@@ -281,29 +285,18 @@
}
}
- public void setContentDarkIntensity(float contentDarkIntensity) {
- boolean backgroundIsLight = contentDarkIntensity > 0.5f;
- if (backgroundIsLight != mBackgroundIsLight) {
- mBackgroundIsLight = backgroundIsLight;
- mBackgroundDrawable.setColor(mBackgroundIsLight
- ? mLightBackgroundColor : mDarkBackgroundColor);
- int contentColor = mBackgroundIsLight ? mDarkContentColor : mLightContentColor;
- mTextView.setTextColor(contentColor);
- mTextView.getCompoundDrawables()[3].setColorFilter(contentColor,
- PorterDuff.Mode.SRC_IN);
- mDismissView.setColorFilter(contentColor);
- mDismissView.setBackground(mBackgroundIsLight ? mDarkRipple : mLightRipple);
- }
+ public void setNavBarHeight(int navBarHeight) {
+ mNavBarHeight = navBarHeight;
}
private WindowManager.LayoutParams getWindowLayoutParams() {
- int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ int flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
+ 0, -mNavBarHeight / 2,
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
flags,
PixelFormat.TRANSLUCENT);
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
new file mode 100644
index 0000000..de85c0f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018 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.recents;
+
+import android.graphics.Outline;
+import android.graphics.Path;
+import android.graphics.drawable.shapes.PathShape;
+import android.support.annotation.NonNull;
+
+/**
+ * Wrapper around {@link android.graphics.drawable.shapes.PathShape}
+ * that creates a shape with a triangular path (pointing up or down).
+ */
+public class TriangleShape extends PathShape {
+ private Path mTriangularPath;
+
+ public TriangleShape(Path path, float stdWidth, float stdHeight) {
+ super(path, stdWidth, stdHeight);
+ mTriangularPath = path;
+ }
+
+ public static TriangleShape create(float width, float height, boolean isPointingUp) {
+ Path triangularPath = new Path();
+ if (isPointingUp) {
+ triangularPath.moveTo(0, height);
+ triangularPath.lineTo(width, height);
+ triangularPath.lineTo(width / 2, 0);
+ triangularPath.close();
+ } else {
+ triangularPath.moveTo(0, 0);
+ triangularPath.lineTo(width / 2, height);
+ triangularPath.lineTo(width, 0);
+ triangularPath.close();
+ }
+ return new TriangleShape(triangularPath, width, height);
+ }
+
+ @Override
+ public void getOutline(@NonNull Outline outline) {
+ outline.setConvexPath(mTriangularPath);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index e3ed1aa..0f64ea3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -198,7 +198,7 @@
}
public void reevaluateStyles() {
- int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
+ int textColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
boolean usingDarkText = Color.luminance(textColor) < 0.5f;
mEmptyView.setTextColor(textColor);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 4256cd6..8030bde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -80,6 +80,7 @@
private RemoteInputView mHeadsUpRemoteInput;
private SmartReplyConstants mSmartReplyConstants;
+ private SmartReplyView mExpandedSmartReplyView;
private SmartReplyLogger mSmartReplyLogger;
private NotificationViewWrapper mContractedWrapper;
@@ -184,7 +185,11 @@
}
int maxChildHeight = 0;
if (mExpandedChild != null) {
- int size = Math.min(maxSize, mNotificationMaxHeight);
+ int notificationMaxHeight = mNotificationMaxHeight;
+ if (mExpandedSmartReplyView != null) {
+ notificationMaxHeight += mExpandedSmartReplyView.getHeightUpperLimit();
+ }
+ int size = Math.min(maxSize, notificationMaxHeight);
ViewGroup.LayoutParams layoutParams = mExpandedChild.getLayoutParams();
boolean useExactly = false;
if (layoutParams.height >= 0) {
@@ -1348,10 +1353,10 @@
private void applySmartReplyView(RemoteInput remoteInput, PendingIntent pendingIntent,
NotificationData.Entry entry) {
if (mExpandedChild != null) {
- SmartReplyView view =
+ mExpandedSmartReplyView =
applySmartReplyView(mExpandedChild, remoteInput, pendingIntent, entry);
- if (view != null && remoteInput != null && remoteInput.getChoices() != null
- && remoteInput.getChoices().length > 0) {
+ if (mExpandedSmartReplyView != null && remoteInput != null
+ && remoteInput.getChoices() != null && remoteInput.getChoices().length > 0) {
mSmartReplyLogger.smartRepliesAdded(entry, remoteInput.getChoices().length);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 81dd9e8..6a1740c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -308,7 +308,7 @@
minimize.setOnClickListener(mOnStopOrMinimizeNotifications);
if (mIsNonblockable) {
- keep.setText(R.string.notification_done);
+ keep.setText(android.R.string.ok);
block.setVisibility(GONE);
minimize.setVisibility(GONE);
} else if (mIsForeground) {
@@ -523,7 +523,7 @@
} else {
// For notifications with more than one channel, update notification enabled
// state. If the importance was lowered, we disable notifications.
- mINotificationManager.setNotificationsEnabledForPackage(
+ mINotificationManager.setNotificationsEnabledWithImportanceLockForPackage(
mPackageName, mAppUid, mNewImportance >= mCurrentImportance);
}
} catch (RemoteException e) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
index 7285db6..46f8863 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
@@ -4,6 +4,7 @@
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -37,6 +38,7 @@
private AlphaOptimizedImageButton mIcon;
private AlphaOptimizedImageButton mMoreIcon;
private boolean mSelected = false;
+ private String[] mComponentNames;
/** App categories that are to be used with this widget */
private String[] mFacetCategories;
/** App packages that are allowed to be used with this widget */
@@ -75,6 +77,8 @@
String longPressIntentString = typedArray.getString(R.styleable.CarFacetButton_longIntent);
String categoryString = typedArray.getString(R.styleable.CarFacetButton_categories);
String packageString = typedArray.getString(R.styleable.CarFacetButton_packages);
+ String componentNameString =
+ typedArray.getString(R.styleable.CarFacetButton_componentNames);
try {
final Intent intent = Intent.parseUri(intentString, Intent.URI_INTENT_SCHEME);
intent.putExtra(EXTRA_FACET_ID, Integer.toString(getId()));
@@ -87,17 +91,20 @@
mFacetCategories = categoryString.split(FACET_FILTER_DELIMITER);
intent.putExtra(EXTRA_FACET_CATEGORIES, mFacetCategories);
}
+ if (componentNameString != null) {
+ mComponentNames = componentNameString.split(FACET_FILTER_DELIMITER);
+ }
setOnClickListener(v -> {
intent.putExtra(EXTRA_FACET_LAUNCH_PICKER, mSelected);
- mContext.startActivity(intent);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
});
if (longPressIntentString != null) {
final Intent longPressIntent = Intent.parseUri(longPressIntentString,
Intent.URI_INTENT_SCHEME);
setOnLongClickListener(v -> {
- mContext.startActivity(longPressIntent);
+ mContext.startActivityAsUser(longPressIntent, UserHandle.CURRENT);
return true;
});
}
@@ -148,6 +155,13 @@
return mFacetPackages;
}
+ public String[] getComponentName() {
+ if (mComponentNames == null) {
+ return new String[0];
+ }
+ return mComponentNames;
+ }
+
/**
* Updates the alpha of the icons to "selected" and shows the "More icon"
* @param selected true if the view must be selected, false otherwise
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
index b7d501e..2d30ce1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
@@ -1,10 +1,12 @@
package com.android.systemui.statusbar.car;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.util.Log;
import java.util.HashMap;
import java.util.List;
@@ -19,6 +21,7 @@
protected HashMap<String, CarFacetButton> mButtonsByCategory = new HashMap<>();
protected HashMap<String, CarFacetButton> mButtonsByPackage = new HashMap<>();
+ protected HashMap<String, CarFacetButton> mButtonsByComponentName = new HashMap<>();
protected CarFacetButton mSelectedFacetButton;
protected Context mContext;
@@ -34,28 +37,32 @@
*/
public void addFacetButton(CarFacetButton facetButton) {
String[] categories = facetButton.getCategories();
- for (int j = 0; j < categories.length; j++) {
- String category = categories[j];
- mButtonsByCategory.put(category, facetButton);
+ for (int i = 0; i < categories.length; i++) {
+ mButtonsByCategory.put(categories[i], facetButton);
}
String[] facetPackages = facetButton.getFacetPackages();
- for (int j = 0; j < facetPackages.length; j++) {
- String facetPackage = facetPackages[j];
- mButtonsByPackage.put(facetPackage, facetButton);
+ for (int i = 0; i < facetPackages.length; i++) {
+ mButtonsByPackage.put(facetPackages[i], facetButton);
+ }
+ String[] componentNames = facetButton.getComponentName();
+ for (int i = 0; i < componentNames.length; i++) {
+ mButtonsByComponentName.put(componentNames[i], facetButton);
}
}
public void removeAll() {
mButtonsByCategory.clear();
mButtonsByPackage.clear();
+ mButtonsByComponentName.clear();
mSelectedFacetButton = null;
}
/**
* This will unselect the currently selected CarFacetButton and determine which one should be
* selected next. It does this by reading the properties on the CarFacetButton and seeing if
- * they are a match with the supplied taskino.
+ * they are a match with the supplied taskInfo.
+ * Order of selection detection ComponentName, PackageName, Category
* @param taskInfo of the currently running application
*/
public void taskChanged(ActivityManager.RunningTaskInfo taskInfo) {
@@ -69,7 +76,10 @@
if (mSelectedFacetButton != null) {
mSelectedFacetButton.setSelected(false);
}
- CarFacetButton facetButton = mButtonsByPackage.get(packageName);
+ CarFacetButton facetButton = findFacetButtongByComponentName(taskInfo.topActivity);
+ if (facetButton == null) {
+ facetButton = mButtonsByPackage.get(packageName);
+ }
if (facetButton != null) {
facetButton.setSelected(true);
mSelectedFacetButton = facetButton;
@@ -83,6 +93,12 @@
}
}
+ private CarFacetButton findFacetButtongByComponentName(ComponentName componentName) {
+ CarFacetButton button = mButtonsByComponentName.get(componentName.flattenToShortString());
+ return (button != null) ? button :
+ mButtonsByComponentName.get(componentName.flattenToString());
+ }
+
protected String getPackageCategory(String packageName) {
PackageManager pm = mContext.getPackageManager();
Set<String> supportedCategories = mButtonsByCategory.keySet();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
index ec243fe..084c136 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
+import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;
@@ -64,10 +65,10 @@
setOnClickListener(v -> {
try {
if (mBroadcastIntent) {
- mContext.sendBroadcast(intent);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
return;
}
- mContext.startActivity(intent);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
} catch (Exception e) {
Log.e(TAG, "Failed to launch intent", e);
}
@@ -82,7 +83,7 @@
final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
setOnLongClickListener(v -> {
try {
- mContext.startActivity(intent);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
} catch (Exception e) {
Log.e(TAG, "Failed to launch intent", e);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index fb525f7..5a02d18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -37,19 +37,20 @@
private final UserGridRecyclerView mUserGridView;
private final ProgressBar mSwitchingUsers;
private final int mShortAnimDuration;
+ private final StatusBar mStatusBar;
private boolean mShowing;
public FullscreenUserSwitcher(StatusBar statusBar, ViewStub containerStub, Context context) {
+ mStatusBar = statusBar;
mParent = containerStub.inflate();
mContainer = mParent.findViewById(R.id.container);
mUserGridView = mContainer.findViewById(R.id.user_grid);
- mUserGridView.setStatusBar(statusBar);
GridLayoutManager layoutManager = new GridLayoutManager(context,
context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col));
mUserGridView.setLayoutManager(layoutManager);
mUserGridView.buildAdapter();
- mUserGridView.setUserSelectionListener(record -> toggleSwitchInProgress(true));
+ mUserGridView.setUserSelectionListener(this::onUserSelected);
mShortAnimDuration = mContainer.getResources()
.getInteger(android.R.integer.config_shortAnimTime);
@@ -57,8 +58,35 @@
mSwitchingUsers = mParent.findViewById(R.id.switching_users);
}
+ public void show() {
+ if (mShowing) {
+ return;
+ }
+ mShowing = true;
+ mParent.setVisibility(View.VISIBLE);
+ }
+
+ public void hide() {
+ mShowing = false;
+ toggleSwitchInProgress(false);
+ mParent.setVisibility(View.GONE);
+ }
+
public void onUserSwitched(int newUserId) {
- mUserGridView.onUserSwitched(newUserId);
+ mParent.post(this::showOfflineAuthUi);
+ }
+
+ private void onUserSelected(UserGridRecyclerView.UserRecord record) {
+ if (record.mIsForeground) {
+ showOfflineAuthUi();
+ return;
+ }
+ toggleSwitchInProgress(true);
+ }
+
+ private void showOfflineAuthUi() {
+ mStatusBar.executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
+ true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
}
private void toggleSwitchInProgress(boolean inProgress) {
@@ -91,18 +119,4 @@
}
});
}
-
- public void show() {
- if (mShowing) {
- return;
- }
- mShowing = true;
- mParent.setVisibility(View.VISIBLE);
- }
-
- public void hide() {
- mShowing = false;
- toggleSwitchInProgress(false);
- mParent.setVisibility(View.GONE);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index e09a360..5ad08ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -38,8 +38,6 @@
import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.R;
-import com.android.systemui.qs.car.CarQSFragment;
-import com.android.systemui.statusbar.phone.StatusBar;
import java.util.ArrayList;
import java.util.List;
@@ -50,8 +48,6 @@
*/
public class UserGridRecyclerView extends RecyclerView implements
UserManagerHelper.OnUsersUpdateListener {
-
- private StatusBar mStatusBar;
private UserSelectionListener mUserSelectionListener;
private UserAdapter mAdapter;
private UserManagerHelper mUserManagerHelper;
@@ -92,29 +88,22 @@
super.setAdapter(mAdapter);
}
- public void setStatusBar(@Nullable StatusBar statusBar) {
- mStatusBar = statusBar;
- }
-
private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
List<UserRecord> userRecords = new ArrayList<>();
for (UserInfo userInfo : userInfoList) {
- boolean isCurrent = false;
- if (ActivityManager.getCurrentUser() == userInfo.id) {
- isCurrent = true;
- }
+ boolean isForeground = mUserManagerHelper.getForegroundUserId() == userInfo.id;
UserRecord record = new UserRecord(userInfo, false /* isGuest */,
- false /* isAddUser */, isCurrent);
+ false /* isAddUser */, isForeground);
userRecords.add(record);
}
- // Add guest user record if the current user is not a guest
- if (!mUserManagerHelper.isGuestUser()) {
+ // Add guest user record if the foreground user is not a guest
+ if (!mUserManagerHelper.foregroundUserIsGuestUser()) {
userRecords.add(addGuestUserRecord());
}
- // Add add user record if the current user can add users
- if (mUserManagerHelper.canAddUsers()) {
+ // Add add user record if the foreground user can add users
+ if (mUserManagerHelper.foregroundUserCanAddUsers()) {
userRecords.add(addUserRecord());
}
@@ -128,7 +117,7 @@
UserInfo userInfo = new UserInfo();
userInfo.name = mContext.getString(R.string.car_guest);
return new UserRecord(userInfo, true /* isGuest */,
- false /* isAddUser */, false /* isCurrent */);
+ false /* isAddUser */, false /* isForeground */);
}
/**
@@ -138,26 +127,13 @@
UserInfo userInfo = new UserInfo();
userInfo.name = mContext.getString(R.string.car_add_user);
return new UserRecord(userInfo, false /* isGuest */,
- true /* isAddUser */, false /* isCurrent */);
- }
-
- public void onUserSwitched(int newUserId) {
- // Bring up security view after user switch is completed.
- post(this::showOfflineAuthUi);
+ true /* isAddUser */, false /* isForeground */);
}
public void setUserSelectionListener(UserSelectionListener userSelectionListener) {
mUserSelectionListener = userSelectionListener;
}
- void showOfflineAuthUi() {
- // TODO: Show keyguard UI in-place.
- if (mStatusBar != null) {
- mStatusBar.executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
- true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
- }
- }
-
@Override
public void onUsersUpdate() {
mAdapter.clearUsers();
@@ -332,21 +308,21 @@
/**
* Object wrapper class for the userInfo. Use it to distinguish if a profile is a
- * guest profile, add user profile, or a current user.
+ * guest profile, add user profile, or the foreground user.
*/
public static final class UserRecord {
public final UserInfo mInfo;
public final boolean mIsGuest;
public final boolean mIsAddUser;
- public final boolean mIsCurrent;
+ public final boolean mIsForeground;
public UserRecord(UserInfo userInfo, boolean isGuest, boolean isAddUser,
- boolean isCurrent) {
+ boolean isForeground) {
mInfo = userInfo;
mIsGuest = isGuest;
mIsAddUser = isAddUser;
- mIsCurrent = isCurrent;
+ mIsForeground = isForeground;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index 5ec822d..235ff2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -166,7 +166,7 @@
mSemiTransparent = context.getColor(
com.android.internal.R.color.system_bar_background_semi_transparent);
mTransparent = context.getColor(R.color.system_bar_background_transparent);
- mWarning = Utils.getColorAttr(context, android.R.attr.colorError);
+ mWarning = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError);
}
mGradient = context.getDrawable(gradientResourceId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index b817809..dc3a752 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -437,9 +437,10 @@
}
public void onThemeChanged() {
- @ColorInt int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
- @ColorInt int iconColor = Utils.getDefaultColor(mContext, Color.luminance(textColor) < 0.5 ?
- R.color.dark_mode_icon_color_single_tone :
+ @ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext,
+ R.attr.wallpaperTextColor);
+ @ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext,
+ Color.luminance(textColor) < 0.5 ? R.color.dark_mode_icon_color_single_tone :
R.color.light_mode_icon_color_single_tone);
float intensity = textColor == Color.WHITE ? 0 : 1;
mCarrierLabel.setTextColor(iconColor);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 9894235..91cf8f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -25,6 +25,7 @@
import android.view.Display.Mode;
import android.view.Gravity;
import android.view.LayoutInflater;
+import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
@@ -80,6 +81,7 @@
private static final String WEIGHT_CENTERED_SUFFIX = "WC";
private final List<NavBarButtonProvider> mPlugins = new ArrayList<>();
+ private final Display mDisplay;
protected LayoutInflater mLayoutInflater;
protected LayoutInflater mLandscapeInflater;
@@ -99,9 +101,9 @@
public NavigationBarInflaterView(Context context, AttributeSet attrs) {
super(context, attrs);
createInflaters();
- Display display = ((WindowManager)
+ mDisplay = ((WindowManager)
context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- Mode displayMode = display.getMode();
+ Mode displayMode = mDisplay.getMode();
isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight();
}
@@ -173,6 +175,17 @@
}
}
+ public void updateButtonDispatchersCurrentView() {
+ if (mButtonDispatchers != null) {
+ final int rotation = mDisplay.getRotation();
+ final View view = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180
+ ? mRot0 : mRot90;
+ for (int i = 0; i < mButtonDispatchers.size(); i++) {
+ mButtonDispatchers.valueAt(i).setCurrentView(view);
+ }
+ }
+ }
+
public void setAlternativeOrder(boolean alternativeOrder) {
if (alternativeOrder != mAlternativeOrder) {
mAlternativeOrder = alternativeOrder;
@@ -239,6 +252,8 @@
inflateButtons(end, mRot0.findViewById(R.id.ends_group), isRot0Landscape, false);
inflateButtons(end, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, false);
+
+ updateButtonDispatchersCurrentView();
}
private void addGravitySpacer(LinearLayout layout) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index db2139d..74ad9c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -750,8 +750,8 @@
final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme);
Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
- final int lightColor = Utils.getColorAttr(lightContext, R.attr.singleToneColor);
- final int darkColor = Utils.getColorAttr(darkContext, R.attr.singleToneColor);
+ final int lightColor = Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor);
+ final int darkColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
// Use the supplied style to set the icon's rotation parameters
Context rotateContext = new ContextThemeWrapper(ctx, style);
@@ -812,9 +812,6 @@
if (mGestureHelper != null) {
mGestureHelper.onDarkIntensityChange(intensity);
}
- if (mRecentsOnboarding != null) {
- mRecentsOnboarding.setContentDarkIntensity(intensity);
- }
}
@Override
@@ -831,6 +828,7 @@
updateButtonLocationOnScreen(getHomeButton(), mHomeButtonBounds);
updateButtonLocationOnScreen(getRecentsButton(), mRecentsButtonBounds);
mGestureHelper.onLayout(changed, left, top, right, bottom);
+ mRecentsOnboarding.setNavBarHeight(getMeasuredHeight());
}
private void updateButtonLocationOnScreen(ButtonDispatcher button, Rect buttonBounds) {
@@ -873,9 +871,7 @@
mCurrentView = mRotatedViews[rot];
mCurrentView.setVisibility(View.VISIBLE);
mNavigationInflaterView.setAlternativeOrder(rot == Surface.ROTATION_90);
- for (int i = 0; i < mButtonDispatchers.size(); i++) {
- mButtonDispatchers.valueAt(i).setCurrentView(mCurrentView);
- }
+ mNavigationInflaterView.updateButtonDispatchersCurrentView();
updateLayoutTransitionsEnabled();
mCurrentRotation = rot;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 4b2bc45..a3da807 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1193,12 +1193,10 @@
public void manageNotifications() {
Intent intent = new Intent(Settings.ACTION_ALL_APPS_NOTIFICATION_SETTINGS);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent, true, true);
+ startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
}
public void clearAllNotifications() {
-
// animate-swipe all dismissable notifications, then animate the shade closed
int numChildren = mStackScroller.getChildCount();
@@ -1838,6 +1836,11 @@
return new StatusBar.H();
}
+ private void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade,
+ int flags) {
+ startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, flags);
+ }
+
@Override
public void startActivity(Intent intent, boolean dismissShade) {
startActivityDismissingKeyguard(intent, false, dismissShade);
@@ -1851,7 +1854,7 @@
@Override
public void startActivity(Intent intent, boolean dismissShade, Callback callback) {
startActivityDismissingKeyguard(intent, false, dismissShade,
- false /* disallowEnterPictureInPictureWhileLaunching */, callback);
+ false /* disallowEnterPictureInPictureWhileLaunching */, callback, 0);
}
public void setQsExpanded(boolean expanded) {
@@ -2874,14 +2877,20 @@
}
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
- boolean dismissShade) {
+ boolean dismissShade, int flags) {
startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade,
- false /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */);
+ false /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */,
+ flags);
+ }
+
+ public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
+ boolean dismissShade) {
+ startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, 0);
}
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
- final Callback callback) {
+ final Callback callback, int flags) {
if (onlyProvisioned && !isDeviceProvisioned()) return;
final boolean afterKeyguardGone = PreviewInflater.wouldLaunchResolverActivity(
@@ -2890,6 +2899,7 @@
mAssistManager.hideAssist();
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(flags);
int result = ActivityManager.START_CANCELED;
ActivityOptions options = new ActivityOptions(getActivityOptions(
null /* remoteAnimation */));
@@ -4575,7 +4585,7 @@
if (!mStatusBarKeyguardViewManager.isShowing()) {
startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT,
false /* onlyProvisioned */, true /* dismissShade */,
- true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */);
+ true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0);
} else {
if (!mDeviceInteractive) {
// Avoid flickering of the scrim when we instant launch the camera and the bouncer
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
index 028da86..aa60ec5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
@@ -83,7 +83,7 @@
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setColor(Utils.getColorAttr(context, R.attr.wallpaperTextColor));
+ mPaint.setColor(Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor));
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mThickness);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 4c79ee3..6d2f5ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -25,6 +25,7 @@
import com.android.systemui.R;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.SmartReplyLogger;
+import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import java.text.BreakIterator;
@@ -48,6 +49,12 @@
private final SmartReplyConstants mConstants;
private final KeyguardDismissUtil mKeyguardDismissUtil;
+ /**
+ * The upper bound for the height of this view in pixels. Notifications are automatically
+ * recreated on density or font size changes so caching this should be fine.
+ */
+ private final int mHeightUpperLimit;
+
/** Spacing to be applied between views. */
private final int mSpacing;
@@ -69,6 +76,9 @@
mConstants = Dependency.get(SmartReplyConstants.class);
mKeyguardDismissUtil = Dependency.get(KeyguardDismissUtil.class);
+ mHeightUpperLimit = NotificationUtils.getFontScaledHeight(mContext,
+ R.dimen.smart_reply_button_max_height);
+
int spacing = 0;
int singleLineButtonPaddingHorizontal = 0;
int doubleLineButtonPaddingHorizontal = 0;
@@ -98,10 +108,19 @@
mSingleToDoubleLineButtonWidthIncrease =
2 * (doubleLineButtonPaddingHorizontal - singleLineButtonPaddingHorizontal);
+
mBreakIterator = BreakIterator.getLineInstance();
reallocateCandidateButtonQueueForSqueezing();
}
+ /**
+ * Returns an upper bound for the height of this view in pixels. This method is intended to be
+ * invoked before onMeasure, so it doesn't do any analysis on the contents of the buttons.
+ */
+ public int getHeightUpperLimit() {
+ return mHeightUpperLimit;
+ }
+
private void reallocateCandidateButtonQueueForSqueezing() {
// Instead of clearing the priority queue, we re-allocate so that it would fit all buttons
// exactly. This avoids (1) wasting memory because PriorityQueue never shrinks and
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 7e6fe02..bd76820 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -208,7 +208,7 @@
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
- R.string.cell_data_off,
+ R.string.cell_data_off_content_description,
0,
false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 302f097..13fabfd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -677,7 +677,8 @@
Drawable icon = UserIcons.getDefaultUserIcon(
context.getResources(), item.resolveId(), /* light= */ false);
if (item.isGuest) {
- icon.setColorFilter(Utils.getColorAttr(context, android.R.attr.colorForeground),
+ icon.setColorFilter(Utils.getColorAttrDefaultColor(context,
+ android.R.attr.colorForeground),
Mode.SRC_IN);
}
return icon;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index bc5a848..31a831a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -3881,7 +3881,7 @@
mUsingLightTheme = lightTheme;
Context context = new ContextThemeWrapper(mContext,
lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI);
- final int textColor = Utils.getColorAttr(context, R.attr.wallpaperTextColor);
+ final int textColor = Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor);
mFooterView.setTextColor(textColor);
mEmptyShadeView.setTextColor(textColor);
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index 639e49b..5a4478f 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -58,7 +58,7 @@
private static final String TUNER_VERSION = "sysui_tuner_version";
- private static final int CURRENT_TUNER_VERSION = 3;
+ private static final int CURRENT_TUNER_VERSION = 2;
private final Observer mObserver = new Observer();
// Map of Uris we listen on to their settings keys.
@@ -119,10 +119,6 @@
if (oldVersion < 2) {
setTunerEnabled(mContext, false);
}
- if (oldVersion < 3) {
- // Delay this so that we can wait for everything to be registered first.
- new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(() -> clearAll(), 5000);
- }
setValue(TUNER_VERSION, newVersion);
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java
index 2c85bb6..ca55e1f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Events.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java
@@ -52,26 +52,28 @@
public static final int EVENT_MUTE_CHANGED = 15; // (stream|int) (muted|bool)
public static final int EVENT_TOUCH_LEVEL_DONE = 16; // (stream|int) (level|bool)
public static final int EVENT_ZEN_CONFIG_CHANGED = 17; // (allow/disallow|string)
+ public static final int EVENT_RINGER_TOGGLE = 18; // (ringer_mode)
private static final String[] EVENT_TAGS = {
- "show_dialog",
- "dismiss_dialog",
- "active_stream_changed",
- "expand",
- "key",
- "collection_started",
- "collection_stopped",
- "icon_click",
- "settings_click",
- "touch_level_changed",
- "level_changed",
- "internal_ringer_mode_changed",
- "external_ringer_mode_changed",
- "zen_mode_changed",
- "suppressor_changed",
- "mute_changed",
- "touch_level_done",
- "zen_mode_config_changed",
+ "show_dialog",
+ "dismiss_dialog",
+ "active_stream_changed",
+ "expand",
+ "key",
+ "collection_started",
+ "collection_stopped",
+ "icon_click",
+ "settings_click",
+ "touch_level_changed",
+ "level_changed",
+ "internal_ringer_mode_changed",
+ "external_ringer_mode_changed",
+ "zen_mode_changed",
+ "suppressor_changed",
+ "mute_changed",
+ "touch_level_done",
+ "zen_mode_config_changed",
+ "ringer_toggle"
};
public static final int DISMISS_REASON_UNKNOWN = 0;
@@ -112,6 +114,7 @@
public static Callback sCallback;
public static void writeEvent(Context context, int tag, Object... list) {
+ MetricsLogger logger = new MetricsLogger();
final long time = System.currentTimeMillis();
final StringBuilder sb = new StringBuilder("writeEvent ").append(EVENT_TAGS[tag]);
if (list != null && list.length > 0) {
@@ -139,7 +142,7 @@
break;
case EVENT_ICON_CLICK:
MetricsLogger.action(context, MetricsEvent.ACTION_VOLUME_ICON,
- (Integer) list[1]);
+ (Integer) list[0]);
sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ')
.append(iconStateToString((Integer) list[1]));
break;
@@ -155,10 +158,16 @@
break;
case EVENT_KEY:
MetricsLogger.action(context, MetricsEvent.ACTION_VOLUME_KEY,
- (Integer) list[1]);
+ (Integer) list[0]);
sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ')
.append(list[1]);
break;
+ case EVENT_RINGER_TOGGLE:
+ logger.action(MetricsEvent.ACTION_VOLUME_RINGER_TOGGLE, (Integer) list[0]);
+ break;
+ case EVENT_SETTINGS_CLICK:
+ logger.action(MetricsEvent.ACTION_VOLUME_SETTINGS);
+ break;
case EVENT_EXTERNAL_RINGER_MODE_CHANGED:
MetricsLogger.action(context, MetricsEvent.ACTION_RINGER_MODE,
(Integer) list[0]);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 9036a8a..00874e3 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -415,6 +415,7 @@
mSettingsView.setVisibility(
mDeviceProvisionedController.isDeviceProvisioned() ? VISIBLE : GONE);
mSettingsIcon.setOnClickListener(v -> {
+ Events.writeEvent(mContext, Events.EVENT_SETTINGS_CLICK);
Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
dismissH(DISMISS_REASON_SETTINGS_CLICKED);
@@ -424,8 +425,6 @@
public void initRingerH() {
mRingerIcon.setOnClickListener(v -> {
- Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, AudioManager.STREAM_RING,
- mRingerIcon.getTag());
Prefs.putBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true);
final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
if (ss == null) {
@@ -449,6 +448,7 @@
mController.setStreamVolume(AudioManager.STREAM_RING, 1);
}
}
+ Events.writeEvent(mContext, Events.EVENT_RINGER_TOGGLE, newRingerMode);
updateRingerH();
provideTouchFeedbackH(newRingerMode);
mController.setRingerMode(newRingerMode, false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index 3cbe274..b0530c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -421,6 +421,66 @@
}
@Test
+ public void testHandleCloseControls_setsNotificationsDisabledForMultipleChannelNotifications()
+ throws Exception {
+ mNotificationChannel.setImportance(IMPORTANCE_LOW);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+ 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+ null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ false /* isNonblockable */);
+
+ mNotificationInfo.findViewById(R.id.block).performClick();
+ waitForUndoButton();
+ mNotificationInfo.handleCloseControls(true, false);
+
+ mTestableLooper.processAllMessages();
+ verify(mMockINotificationManager, times(1))
+ .setNotificationsEnabledWithImportanceLockForPackage(
+ anyString(), eq(TEST_UID), eq(false));
+ }
+
+
+ @Test
+ public void testHandleCloseControls_keepsNotificationsEnabledForMultipleChannelNotifications()
+ throws Exception {
+ mNotificationChannel.setImportance(IMPORTANCE_LOW);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+ 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+ null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ false /* isNonblockable */);
+
+ mNotificationInfo.findViewById(R.id.block).performClick();
+ waitForUndoButton();
+ mNotificationInfo.handleCloseControls(true, false);
+
+ mTestableLooper.processAllMessages();
+ verify(mMockINotificationManager, times(1))
+ .setNotificationsEnabledWithImportanceLockForPackage(
+ anyString(), eq(TEST_UID), eq(false));
+ }
+
+ @Test
+ public void testCloseControls_blockingHelperSavesImportanceForMultipleChannelNotifications()
+ throws Exception {
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+ 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+ null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ false /* isNonblockable */, true /* isForBlockingHelper */,
+ true /* isUserSentimentNegative */);
+
+ mNotificationInfo.findViewById(R.id.keep).performClick();
+
+ verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
+ mTestableLooper.processAllMessages();
+ verify(mMockINotificationManager, times(1))
+ .setNotificationsEnabledWithImportanceLockForPackage(
+ anyString(), eq(TEST_UID), eq(true));
+ }
+
+ @Test
public void testCloseControls_blockingHelperDismissedIfShown() throws Exception {
mNotificationInfo.bindNotification(
mMockPackageManager,
diff --git a/packages/VpnDialogs/res/values-cs/strings.xml b/packages/VpnDialogs/res/values-cs/strings.xml
index 47d950f..5cc809c 100644
--- a/packages/VpnDialogs/res/values-cs/strings.xml
+++ b/packages/VpnDialogs/res/values-cs/strings.xml
@@ -25,8 +25,8 @@
<string name="data_received" msgid="4062776929376067820">"Přijato:"</string>
<string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bajtů / <xliff:g id="NUMBER_1">%2$s</xliff:g> paketů"</string>
<string name="always_on_disconnected_title" msgid="1906740176262776166">"Nelze se připojit k trvalé VPN"</string>
- <string name="always_on_disconnected_message" msgid="555634519845992917">"Aplikace <xliff:g id="VPN_APP_0">%1$s</xliff:g> je nastavena k trvalému připojení, ale nyní se nemůže připojit. Než se telefon bude moci připojit pomocí aplikace <xliff:g id="VPN_APP_1">%1$s</xliff:g>, použije veřejnou síť."</string>
- <string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"Aplikace <xliff:g id="VPN_APP">%1$s</xliff:g> je nastavena k trvalému připojení, ale nyní se nemůže připojit. Než se budete moci připojit pomocí VPN, zůstanete offline."</string>
+ <string name="always_on_disconnected_message" msgid="555634519845992917">"Aplikace <xliff:g id="VPN_APP_0">%1$s</xliff:g> je nastavena k trvalému připojení, ale teď se nemůže připojit. Než se telefon bude moci připojit pomocí aplikace <xliff:g id="VPN_APP_1">%1$s</xliff:g>, použije veřejnou síť."</string>
+ <string name="always_on_disconnected_message_lockdown" msgid="4232225539869452120">"Aplikace <xliff:g id="VPN_APP">%1$s</xliff:g> je nastavena k trvalému připojení, ale teď se nemůže připojit. Než se budete moci připojit pomocí VPN, zůstanete offline."</string>
<string name="always_on_disconnected_message_separator" msgid="3310614409322581371">" "</string>
<string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"Změnit nastavení VPN"</string>
<string name="configure" msgid="4905518375574791375">"Konfigurovat"</string>
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 007f62f..455d6c4 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5636,6 +5636,29 @@
// OS: P
NOTIFICATION_SMART_REPLY_COUNT = 1384;
+ // Volume dialog > ringer toggle
+ // OS: P
+ ACTION_VOLUME_RINGER_TOGGLE = 1385;
+
+ // Volume dialog > settings button
+ // OS: P
+ ACTION_VOLUME_SETTINGS = 1386;
+
+ // ACTION: Settings > Anomaly receiver > Anomaly ignored, don't show up in battery settings
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ANOMALY_IGNORED = 1387;
+
+ // ACTION: Settings > Battery settings > Battery tip > Open battery saver page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_BATTERY_SAVER_PAGE = 1388;
+
+ // FIELD: the version code of an app
+ // CATEGORY: SETTINGS
+ // OS: P
+ FIELD_APP_VERSION_CODE = 1389;
+
// ---- End P Constants, all P constants go above this line ----
// First Q constant in master goes here:
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
index a2de8e7..fbec5cb 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
@@ -64,8 +64,7 @@
try {
File restoreData = prepareRestoreData(mInfo, mInFD);
- // TODO: version ?
- invokeAgentForAdbRestore(mAgent, mInfo, restoreData, 0);
+ invokeAgentForAdbRestore(mAgent, mInfo, restoreData);
} catch (IOException e) {
e.printStackTrace();
}
@@ -83,8 +82,8 @@
return sortedDataName;
}
- private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData,
- int versionCode) throws IOException {
+ private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData)
+ throws IOException {
String pkg = info.packageName;
File newStateName = new File(mDataDir, pkg + ".new");
try {
@@ -95,9 +94,9 @@
if (DEBUG) {
Slog.i(TAG, "Starting restore of package " + pkg + " for version code "
- + versionCode);
+ + info.version);
}
- agent.doRestore(backupData, versionCode, newState, mToken,
+ agent.doRestore(backupData, info.version, newState, mToken,
mBackupManagerService.getBackupManagerBinder());
} catch (IOException e) {
Slog.e(TAG, "Exception opening file. " + e);
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index dc28cd1..e4ce62d 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -27,6 +27,7 @@
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.util.Slog;
@@ -240,12 +241,13 @@
PackageManager.GET_SIGNING_CERTIFICATES);
homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName());
homeVersion = homeInfo.getLongVersionCode();
- Signature[][] signingHistory = homeInfo.signingCertificateHistory;
- if (signingHistory == null || signingHistory.length == 0) {
- Slog.e(TAG, "Home app has no signing history");
+ SigningInfo signingInfo = homeInfo.signingInfo;
+ if (signingInfo == null) {
+ Slog.e(TAG, "Home app has no signing information");
} else {
// retrieve the newest sigs to back up
- Signature[] homeInfoSignatures = signingHistory[signingHistory.length - 1];
+ // TODO (b/73988180) use entire signing history in case of rollbacks
+ Signature[] homeInfoSignatures = signingInfo.getApkContentsSigners();
homeSigHashes = BackupUtils.hashSignatureArray(homeInfoSignatures);
}
} catch (NameNotFoundException e) {
@@ -334,8 +336,8 @@
}
}
- Signature[][] signingHistory = info.signingCertificateHistory;
- if (signingHistory == null || signingHistory.length == 0) {
+ SigningInfo signingInfo = info.signingInfo;
+ if (signingInfo == null) {
Slog.w(TAG, "Not backing up package " + packName
+ " since it appears to have no signatures.");
continue;
@@ -358,7 +360,7 @@
outputBufferStream.writeInt(info.versionCode);
}
// retrieve the newest sigs to back up
- Signature[] infoSignatures = signingHistory[signingHistory.length - 1];
+ Signature[] infoSignatures = signingInfo.getApkContentsSigners();
writeSignatureHashArray(outputBufferStream,
BackupUtils.hashSignatureArray(infoSignatures));
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index ac605b1..90baea0 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -528,7 +528,7 @@
// we're otherwise fine. Just drop it and go on to the next as usual.
mStatus = BackupTransport.TRANSPORT_OK;
BackupObserverUtils
- .sendBackupOnPackageResult(mObserver, mCurrentPackage.packageName,
+ .sendBackupOnPackageResult(mObserver, request.packageName,
BackupManager.ERROR_PACKAGE_NOT_FOUND);
} else {
// Transport-level failure means we reenqueue everything
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index 77163d3..0c99b44 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -99,6 +99,7 @@
private FullBackupObbConnection mObbConnection = null;
private ParcelFileDescriptor[] mPipes = null;
private byte[] mWidgetData = null;
+ private long mAppVersion;
private long mBytes;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
@@ -476,6 +477,9 @@
if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
info);
+ // readAppManifestAndReturnSignatures() will have extracted the version from
+ // the manifest, so we save it to use in key-value restore later.
+ mAppVersion = info.version;
PackageManagerInternal pmi = LocalServices.getService(
PackageManagerInternal.class);
RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
@@ -667,6 +671,8 @@
Slog.d(TAG, "Restoring key-value file for " + pkg
+ " : " + info.path);
}
+ // Set the version saved from manifest entry.
+ info.version = mAppVersion;
KeyValueAdbRestoreEngine restoreEngine =
new KeyValueAdbRestoreEngine(
mBackupManagerService,
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 5518374..c39cceb 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -27,6 +27,7 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.os.Process;
import android.util.Slog;
@@ -203,15 +204,16 @@
return false;
}
- Signature[][] deviceHistorySigs = target.signingCertificateHistory;
- if (ArrayUtils.isEmpty(deviceHistorySigs)) {
- Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
+ SigningInfo signingInfo = target.signingInfo;
+ if (signingInfo == null) {
+ Slog.w(TAG, "signingInfo is empty, app was either unsigned or the flag" +
" PackageManager#GET_SIGNING_CERTIFICATES was not specified");
return false;
}
if (DEBUG) {
- Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceHistorySigs);
+ Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device="
+ + signingInfo.getApkContentsSigners());
}
final int nStored = storedSigs.length;
@@ -225,8 +227,8 @@
} else {
// the app couldn't have rotated keys, since it was signed with multiple sigs - do
// a check to see if we find a match for all stored sigs
- // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
- Signature[] deviceSigs = deviceHistorySigs[0];
+ // since app hasn't rotated key, we only need to check with its current signers
+ Signature[] deviceSigs = signingInfo.getApkContentsSigners();
int nDevice = deviceSigs.length;
// ensure that each stored sig matches an on-device sig
diff --git a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
index 994d5a9..a3d5601 100644
--- a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
@@ -22,6 +22,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.util.Slog;
@@ -106,12 +107,13 @@
printer.println(withApk ? "1" : "0");
// write the signature block
- Signature[][] signingHistory = pkg.signingCertificateHistory;
- if (signingHistory == null) {
+ SigningInfo signingInfo = pkg.signingInfo;
+ if (signingInfo == null) {
printer.println("0");
} else {
// retrieve the newest sigs to write
- Signature[] signatures = signingHistory[signingHistory.length - 1];
+ // TODO (b/73988180) use entire signing history in case of rollbacks
+ Signature[] signatures = signingInfo.getApkContentsSigners();
printer.println(Integer.toString(signatures.length));
for (Signature sig : signatures) {
printer.println(sig.toCharsString());
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 8ce4e64..6f4ae15 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -88,6 +88,7 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.LocalLog;
+import com.android.internal.util.StatLogger;
import com.android.server.AppStateTracker.Listener;
import java.io.ByteArrayOutputStream;
diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java
index cec4f1a..23c5779 100644
--- a/services/core/java/com/android/server/AppStateTracker.java
+++ b/services/core/java/com/android/server/AppStateTracker.java
@@ -55,6 +55,7 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage;
import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages;
diff --git a/services/core/java/com/android/server/StatLogger.java b/services/core/java/com/android/server/StatLogger.java
deleted file mode 100644
index d85810d..0000000
--- a/services/core/java/com/android/server/StatLogger.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2018 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;
-
-import android.os.SystemClock;
-import android.util.Slog;
-import android.util.proto.ProtoOutputStream;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.StatLoggerProto.Event;
-
-import java.io.PrintWriter;
-
-/**
- * Simple class to keep track of the number of times certain events happened and their durations for
- * benchmarking.
- *
- * TODO Update shortcut service to switch to it.
- *
- * @hide
- */
-public class StatLogger {
- private static final String TAG = "StatLogger";
-
- private final Object mLock = new Object();
-
- private final int SIZE;
-
- @GuardedBy("mLock")
- private final int[] mCountStats;
-
- @GuardedBy("mLock")
- private final long[] mDurationStats;
-
- private final String[] mLabels;
-
- public StatLogger(String[] eventLabels) {
- SIZE = eventLabels.length;
- mCountStats = new int[SIZE];
- mDurationStats = new long[SIZE];
- mLabels = eventLabels;
- }
-
- /**
- * Return the current time in the internal time unit.
- * Call it before an event happens, and
- * give it back to the {@link #logDurationStat(int, long)}} after the event.
- */
- public long getTime() {
- return SystemClock.elapsedRealtimeNanos() / 1000;
- }
-
- /**
- * @see {@link #getTime()}
- */
- public void logDurationStat(int eventId, long start) {
- synchronized (mLock) {
- if (eventId >= 0 && eventId < SIZE) {
- mCountStats[eventId]++;
- mDurationStats[eventId] += (getTime() - start);
- } else {
- Slog.wtf(TAG, "Invalid event ID: " + eventId);
- }
- }
- }
-
- @Deprecated
- public void dump(PrintWriter pw, String prefix) {
- dump(new IndentingPrintWriter(pw, " ").setIndent(prefix));
- }
-
- public void dump(IndentingPrintWriter pw) {
- synchronized (mLock) {
- pw.println("Stats:");
- pw.increaseIndent();
- for (int i = 0; i < SIZE; i++) {
- final int count = mCountStats[i];
- final double durationMs = mDurationStats[i] / 1000.0;
- pw.println(String.format("%s: count=%d, total=%.1fms, avg=%.3fms",
- mLabels[i], count, durationMs,
- (count == 0 ? 0 : ((double) durationMs) / count)));
- }
- pw.decreaseIndent();
- }
- }
-
- public void dumpProto(ProtoOutputStream proto, long fieldId) {
- synchronized (mLock) {
- final long outer = proto.start(fieldId);
-
- for (int i = 0; i < mLabels.length; i++) {
- final long inner = proto.start(StatLoggerProto.EVENTS);
-
- proto.write(Event.EVENT_ID, i);
- proto.write(Event.LABEL, mLabels[i]);
- proto.write(Event.COUNT, mCountStats[i]);
- proto.write(Event.TOTAL_DURATION_MICROS, mDurationStats[i]);
-
- proto.end(inner);
- }
-
- proto.end(outer);
- }
- }
-}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 5497e62..0c4e390 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2902,6 +2902,7 @@
private boolean mBlacklistDisabled;
private String mExemptionsStr;
private List<String> mExemptions = Collections.emptyList();
+ private int mLogSampleRate = -1;
@HiddenApiEnforcementPolicy private int mPolicyPreP = HIDDEN_API_ENFORCEMENT_DEFAULT;
@HiddenApiEnforcementPolicy private int mPolicyP = HIDDEN_API_ENFORCEMENT_DEFAULT;
@@ -2916,6 +2917,10 @@
false,
this);
mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE),
+ false,
+ this);
+ mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS),
false,
this);
@@ -2942,6 +2947,15 @@
}
zygoteProcess.setApiBlacklistExemptions(mExemptions);
}
+ int logSampleRate = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE, -1);
+ if (logSampleRate < 0 || logSampleRate > 0x10000) {
+ logSampleRate = -1;
+ }
+ if (logSampleRate != -1 && logSampleRate != mLogSampleRate) {
+ mLogSampleRate = logSampleRate;
+ zygoteProcess.setHiddenApiAccessLogSampleRate(mLogSampleRate);
+ }
mPolicyPreP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS);
mPolicyP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_P_APPS);
}
@@ -7558,7 +7572,7 @@
// target APIs higher than O MR1. Since access to the serial
// is now behind a permission we push down the value.
final String buildSerial = (appInfo.targetSandboxVersion < 2
- && appInfo.targetSdkVersion <= Build.VERSION_CODES.O_MR1)
+ && appInfo.targetSdkVersion < Build.VERSION_CODES.P)
? sTheRealBuildSerial : Build.UNKNOWN;
// Check if this is a secondary process that should be incorporated into some
@@ -16916,6 +16930,11 @@
pw.println("ms");
}
mUidObservers.finishBroadcast();
+
+ pw.println();
+ pw.println(" ServiceManager statistics:");
+ ServiceManager.sStatLogger.dump(pw, " ");
+ pw.println();
}
}
pw.println(" mForceBackgroundCheck=" + mForceBackgroundCheck);
@@ -26541,7 +26560,7 @@
record.waitingForNetwork = false;
final long totalTime = SystemClock.uptimeMillis() - startTime;
if (totalTime >= mWaitForNetworkTimeoutMs || DEBUG_NETWORK) {
- Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
+ Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: "
+ totalTime + ". Uid: " + callingUid + " procStateSeq: "
+ procStateSeq + " UidRec: " + record
+ " validateUidRec: " + mValidateUids.get(callingUid));
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 767deb9..f32717a 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -779,11 +779,13 @@
* @param task The new parent {@link TaskRecord}.
*/
void setTask(TaskRecord task) {
- setTask(task, false /*reparenting*/);
+ setTask(task /* task */, false /* reparenting */);
}
/**
* This method should only be called by {@link TaskRecord#removeActivity(ActivityRecord)}.
+ * @param task The new parent task.
+ * @param reparenting Whether we're in the middle of reparenting.
*/
void setTask(TaskRecord task, boolean reparenting) {
// Do nothing if the {@link TaskRecord} is the same as the current {@link getTask}.
@@ -791,12 +793,19 @@
return;
}
- final ActivityStack stack = getStack();
+ final ActivityStack oldStack = getStack();
+ final ActivityStack newStack = task != null ? task.getStack() : null;
- // If the new {@link TaskRecord} is from a different {@link ActivityStack}, remove this
- // {@link ActivityRecord} from its current {@link ActivityStack}.
- if (!reparenting && stack != null && (task == null || stack != task.getStack())) {
- stack.onActivityRemovedFromStack(this);
+ // Inform old stack (if present) of activity removal and new stack (if set) of activity
+ // addition.
+ if (oldStack != newStack) {
+ if (!reparenting && oldStack != null) {
+ oldStack.onActivityRemovedFromStack(this);
+ }
+
+ if (newStack != null) {
+ newStack.onActivityAddedToStack(this);
+ }
}
this.task = task;
@@ -1073,8 +1082,15 @@
// Must reparent first in window manager
mWindowContainerController.reparent(newTask.getWindowContainerController(), position);
+ // Reparenting prevents informing the parent stack of activity removal in the case that
+ // the new stack has the same parent. we must manually signal here if this is not the case.
+ final ActivityStack prevStack = prevTask.getStack();
+
+ if (prevStack != newTask.getStack()) {
+ prevStack.onActivityRemovedFromStack(this);
+ }
// Remove the activity from the old task and add it to the new task.
- prevTask.removeActivity(this, true /*reparenting*/);
+ prevTask.removeActivity(this, true /* reparenting */);
newTask.addActivityAtIndex(position, this);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 6d4ac8f..eb482c1 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -489,13 +489,13 @@
*/
void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
if (record == mResumedActivity && state != RESUMED) {
- clearResumedActivity(reason + " - onActivityStateChanged");
+ setResumedActivity(null, reason + " - onActivityStateChanged");
}
if (state == RESUMED) {
if (DEBUG_STACK) Slog.v(TAG_STACK, "set resumed activity to:" + record + " reason:"
+ reason);
- mResumedActivity = record;
+ setResumedActivity(record, reason + " - onActivityStateChanged");
mService.setResumedActivityUncheckLocked(record, reason);
mStackSupervisor.mRecentTasks.add(record.getTask());
}
@@ -2309,14 +2309,14 @@
return mResumedActivity;
}
- /**
- * Clears reference to currently resumed activity.
- */
- private void clearResumedActivity(String reason) {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "clearResumedActivity: " + mResumedActivity + " reason:"
- + reason);
+ private void setResumedActivity(ActivityRecord r, String reason) {
+ if (mResumedActivity == r) {
+ return;
+ }
- mResumedActivity = null;
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "setResumedActivity stack:" + this + " + from: "
+ + mResumedActivity + " to:" + r + " reason:" + reason);
+ mResumedActivity = r;
}
@GuardedBy("mService")
@@ -4022,14 +4022,20 @@
* an activity moves away from the stack.
*/
void onActivityRemovedFromStack(ActivityRecord r) {
- if (mResumedActivity == r) {
- clearResumedActivity("onActivityRemovedFromStack");
+ removeTimeoutsForActivityLocked(r);
+
+ if (mResumedActivity != null && mResumedActivity == r) {
+ setResumedActivity(null, "onActivityRemovedFromStack");
}
- if (mPausingActivity == r) {
+ if (mPausingActivity != null && mPausingActivity == r) {
mPausingActivity = null;
}
+ }
- removeTimeoutsForActivityLocked(r);
+ void onActivityAddedToStack(ActivityRecord r) {
+ if(r.getState() == RESUMED) {
+ setResumedActivity(r, "onActivityAddedToStack");
+ }
}
/**
@@ -4747,30 +4753,32 @@
mTmpBounds.clear();
mTmpInsetBounds.clear();
- for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
- final TaskRecord task = mTaskHistory.get(i);
- if (task.isResizeable()) {
- if (inFreeformWindowingMode()) {
- // TODO: Can be removed now since each freeform task is in its own stack.
- // For freeform stack we don't adjust the size of the tasks to match that
- // of the stack, but we do try to make sure the tasks are still contained
- // with the bounds of the stack.
- mTmpRect2.set(task.getOverrideBounds());
- fitWithinBounds(mTmpRect2, bounds);
- task.updateOverrideConfiguration(mTmpRect2);
- } else {
- task.updateOverrideConfiguration(taskBounds, insetBounds);
+ synchronized (mWindowManager.getWindowManagerLock()) {
+ for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
+ final TaskRecord task = mTaskHistory.get(i);
+ if (task.isResizeable()) {
+ if (inFreeformWindowingMode()) {
+ // TODO: Can be removed now since each freeform task is in its own stack.
+ // For freeform stack we don't adjust the size of the tasks to match that
+ // of the stack, but we do try to make sure the tasks are still contained
+ // with the bounds of the stack.
+ mTmpRect2.set(task.getOverrideBounds());
+ fitWithinBounds(mTmpRect2, bounds);
+ task.updateOverrideConfiguration(mTmpRect2);
+ } else {
+ task.updateOverrideConfiguration(taskBounds, insetBounds);
+ }
+ }
+
+ mTmpBounds.put(task.taskId, task.getOverrideBounds());
+ if (tempTaskInsetBounds != null) {
+ mTmpInsetBounds.put(task.taskId, tempTaskInsetBounds);
}
}
- mTmpBounds.put(task.taskId, task.getOverrideBounds());
- if (tempTaskInsetBounds != null) {
- mTmpInsetBounds.put(task.taskId, tempTaskInsetBounds);
- }
+ mWindowContainerController.resize(bounds, mTmpBounds, mTmpInsetBounds);
+ setBounds(bounds);
}
-
- mWindowContainerController.resize(bounds, mTmpBounds, mTmpInsetBounds);
- setBounds(bounds);
}
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
index 6ca8a92..5b6b508 100644
--- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -234,8 +234,9 @@
private Intent createSuspendedAppInterceptIntent(String suspendedPackage,
String suspendingPackage, String dialogMessage, int userId) {
final Intent interceptIntent = new Intent(mServiceContext, SuspendedAppActivity.class)
- .putExtra(Intent.EXTRA_PACKAGE_NAME, suspendedPackage)
+ .putExtra(SuspendedAppActivity.EXTRA_SUSPENDED_PACKAGE, suspendedPackage)
.putExtra(SuspendedAppActivity.EXTRA_DIALOG_MESSAGE, dialogMessage)
+ .putExtra(SuspendedAppActivity.EXTRA_SUSPENDING_PACKAGE, suspendingPackage)
.putExtra(Intent.EXTRA_USER_ID, userId)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 737105d..0e418ad 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -927,7 +927,26 @@
if (stack != null && !stack.isInStackLocked(this)) {
throw new IllegalStateException("Task must be added as a Stack child first.");
}
+ final ActivityStack oldStack = mStack;
mStack = stack;
+
+ // If the new {@link TaskRecord} is from a different {@link ActivityStack}, remove this
+ // {@link ActivityRecord} from its current {@link ActivityStack}.
+
+ if (oldStack != mStack) {
+ for (int i = getChildCount() - 1; i >= 0; --i) {
+ final ActivityRecord activity = getChildAt(i);
+
+ if (oldStack != null) {
+ oldStack.onActivityRemovedFromStack(activity);
+ }
+
+ if (mStack != null) {
+ stack.onActivityAddedToStack(activity);
+ }
+ }
+ }
+
onParentChanged();
}
@@ -1232,6 +1251,7 @@
index = Math.min(size, index);
mActivities.add(index, r);
+
updateEffectiveIntent();
if (r.isPersistable()) {
mService.notifyTaskPersisterLocked(this, false);
@@ -1257,7 +1277,7 @@
* @return true if this was the last activity in the task.
*/
boolean removeActivity(ActivityRecord r) {
- return removeActivity(r, false /*reparenting*/);
+ return removeActivity(r, false /* reparenting */);
}
boolean removeActivity(ActivityRecord r, boolean reparenting) {
@@ -1266,7 +1286,7 @@
"Activity=" + r + " does not belong to task=" + this);
}
- r.setTask(null /*task*/, reparenting);
+ r.setTask(null /* task */, reparenting /* reparenting */);
if (mActivities.remove(r) && r.fullscreen) {
// Was previously in list.
diff --git a/services/core/java/com/android/server/backup/BackupUtils.java b/services/core/java/com/android/server/backup/BackupUtils.java
index d817534..96c5621 100644
--- a/services/core/java/com/android/server/backup/BackupUtils.java
+++ b/services/core/java/com/android/server/backup/BackupUtils.java
@@ -20,6 +20,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.util.Slog;
import com.android.internal.util.ArrayUtils;
@@ -55,16 +56,16 @@
return false;
}
- Signature[][] deviceHistorySigs = target.signingCertificateHistory;
- if (ArrayUtils.isEmpty(deviceHistorySigs)) {
- Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
+ SigningInfo signingInfo = target.signingInfo;
+ if (signingInfo == null) {
+ Slog.w(TAG, "signingInfo is empty, app was either unsigned or the flag" +
" PackageManager#GET_SIGNING_CERTIFICATES was not specified");
return false;
}
if (DEBUG) {
Slog.v(TAG, "signaturesMatch(): stored=" + storedSigHashes
- + " device=" + deviceHistorySigs);
+ + " device=" + signingInfo.getApkContentsSigners());
}
final int nStored = storedSigHashes.size();
@@ -78,8 +79,9 @@
} else {
// the app couldn't have rotated keys, since it was signed with multiple sigs - do
// a check to see if we find a match for all stored sigs
- // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
- ArrayList<byte[]> deviceHashes = hashSignatureArray(deviceHistorySigs[0]);
+ // since app hasn't rotated key, we only need to check with current signers
+ ArrayList<byte[]> deviceHashes =
+ hashSignatureArray(signingInfo.getApkContentsSigners());
int nDevice = deviceHashes.size();
// ensure that each stored sig matches an on-device sig
for (int i = 0; i < nStored; i++) {
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 4e95bdf..4a1beb1 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -230,10 +230,11 @@
}
List<ActivityManager.RunningTaskInfo> runningTasks = mActivityManager.getTasks(1);
if (!runningTasks.isEmpty()) {
- if (runningTasks.get(0).topActivity.getPackageName()
- != mCurrentClient.getOwnerString()) {
+ final String topPackage = runningTasks.get(0).topActivity.getPackageName();
+ if (!topPackage.contentEquals(mCurrentClient.getOwnerString())) {
mCurrentClient.stop(false /* initiatedByClient */);
- Slog.e(TAG, "Stopping background authentication");
+ Slog.e(TAG, "Stopping background authentication, top: " + topPackage
+ + " currentClient: " + mCurrentClient.getOwnerString());
}
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 8e77373..a85960a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -80,6 +80,9 @@
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
+import static android.telephony.CarrierConfigManager.KEY_DATA_LIMIT_NOTIFICATION_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_DATA_RAPID_NOTIFICATION_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_NOTIFICATION_BOOL;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static com.android.internal.util.ArrayUtils.appendInt;
@@ -217,6 +220,7 @@
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
@@ -545,6 +549,19 @@
// TODO: migrate notifications to SystemUI
+
+ interface Stats {
+ int UPDATE_NETWORK_ENABLED = 0;
+ int IS_UID_NETWORKING_BLOCKED = 1;
+
+ int COUNT = IS_UID_NETWORKING_BLOCKED + 1;
+ }
+
+ public final StatLogger mStatLogger = new StatLogger(new String[] {
+ "updateNetworkEnabledNL()",
+ "isUidNetworkingBlocked()",
+ });
+
public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
INetworkManagementService networkManagement) {
this(context, activityManager, networkManagement, AppGlobals.getPackageManager(),
@@ -1093,8 +1110,10 @@
final long now = mClock.millis();
for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
+ final int subId = findRelevantSubId(policy.template);
+
// ignore policies that aren't relevant to user
- if (!isTemplateRelevant(policy.template)) continue;
+ if (subId == INVALID_SUBSCRIPTION_ID) continue;
if (!policy.hasCycle()) continue;
final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
@@ -1103,28 +1122,43 @@
final long cycleEnd = cycle.second.toInstant().toEpochMilli();
final long totalBytes = getTotalBytes(policy.template, cycleStart, cycleEnd);
- // Notify when data usage is over warning/limit
- if (policy.isOverLimit(totalBytes)) {
- final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart;
- if (snoozedThisCycle) {
- enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null);
- } else {
- enqueueNotification(policy, TYPE_LIMIT, totalBytes, null);
- notifyOverLimitNL(policy.template);
+ // Carrier might want to manage notifications themselves
+ final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
+ final boolean notifyWarning = getBooleanDefeatingNullable(config,
+ KEY_DATA_WARNING_NOTIFICATION_BOOL, true);
+ final boolean notifyLimit = getBooleanDefeatingNullable(config,
+ KEY_DATA_LIMIT_NOTIFICATION_BOOL, true);
+ final boolean notifyRapid = getBooleanDefeatingNullable(config,
+ KEY_DATA_RAPID_NOTIFICATION_BOOL, true);
+
+ // Notify when data usage is over warning
+ if (notifyWarning) {
+ if (policy.isOverWarning(totalBytes) && !policy.isOverLimit(totalBytes)) {
+ final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart;
+ if (!snoozedThisCycle) {
+ enqueueNotification(policy, TYPE_WARNING, totalBytes, null);
+ }
}
+ }
- } else {
- notifyUnderLimitNL(policy.template);
-
- final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart;
- if (policy.isOverWarning(totalBytes) && !snoozedThisCycle) {
- enqueueNotification(policy, TYPE_WARNING, totalBytes, null);
+ // Notify when data usage is over limit
+ if (notifyLimit) {
+ if (policy.isOverLimit(totalBytes)) {
+ final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart;
+ if (snoozedThisCycle) {
+ enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null);
+ } else {
+ enqueueNotification(policy, TYPE_LIMIT, totalBytes, null);
+ notifyOverLimitNL(policy.template);
+ }
+ } else {
+ notifyUnderLimitNL(policy.template);
}
}
// Warn if average usage over last 4 days is on track to blow pretty
// far past the plan limits.
- if (policy.limitBytes != LIMIT_DISABLED) {
+ if (notifyRapid && policy.limitBytes != LIMIT_DISABLED) {
final long recentDuration = TimeUnit.DAYS.toMillis(4);
final long recentStart = now - recentDuration;
final long recentEnd = now;
@@ -1201,27 +1235,26 @@
* current device state, such as when
* {@link TelephonyManager#getSubscriberId()} matches. This is regardless of
* data connection status.
+ *
+ * @return relevant subId, or {@link #INVALID_SUBSCRIPTION_ID} when no
+ * matching subId found.
*/
- private boolean isTemplateRelevant(NetworkTemplate template) {
- if (template.isMatchRuleMobile()) {
- final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
- final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class);
+ private int findRelevantSubId(NetworkTemplate template) {
+ final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
+ final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class);
- // Mobile template is relevant when any active subscriber matches
- final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList());
- for (int subId : subIds) {
- final String subscriberId = tele.getSubscriberId(subId);
- final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
- TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true,
- true);
- if (template.matches(probeIdent)) {
- return true;
- }
+ // Mobile template is relevant when any active subscriber matches
+ final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList());
+ for (int subId : subIds) {
+ final String subscriberId = tele.getSubscriberId(subId);
+ final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
+ TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true,
+ true);
+ if (template.matches(probeIdent)) {
+ return subId;
}
- return false;
- } else {
- return true;
}
+ return INVALID_SUBSCRIPTION_ID;
}
/**
@@ -1572,6 +1605,8 @@
// TODO: reset any policy-disabled networks when any policy is removed
// completely, which is currently rare case.
+ final long startTime = mStatLogger.getTime();
+
for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
// shortcut when policy has no limit
@@ -1593,6 +1628,8 @@
setNetworkTemplateEnabled(policy.template, networkEnabled);
}
+
+ mStatLogger.logDurationStat(Stats.UPDATE_NETWORK_ENABLED, startTime);
}
/**
@@ -3086,9 +3123,11 @@
// We can only override when carrier told us about plans
synchronized (mNetworkPoliciesSecondLock) {
- if (ArrayUtils.isEmpty(mSubscriptionPlans.get(subId))) {
+ final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId);
+ if (plan == null
+ || plan.getDataLimitBehavior() == SubscriptionPlan.LIMIT_BEHAVIOR_UNKNOWN) {
throw new IllegalStateException(
- "Must provide SubscriptionPlan information before overriding");
+ "Must provide valid SubscriptionPlan to enable overriding");
}
}
@@ -3280,6 +3319,9 @@
}
fout.decreaseIndent();
+ fout.println();
+ mStatLogger.dump(fout);
+
mLogger.dumpLogs(fout);
}
}
@@ -4639,8 +4681,14 @@
@Override
public boolean isUidNetworkingBlocked(int uid, boolean isNetworkMetered) {
+ final long startTime = mStatLogger.getTime();
+
mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
- return isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+ final boolean ret = isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+
+ mStatLogger.logDurationStat(Stats.IS_UID_NETWORKING_BLOCKED, startTime);
+
+ return ret;
}
private boolean isUidNetworkingBlockedInternal(int uid, boolean isNetworkMetered) {
@@ -4715,11 +4763,17 @@
*/
@Override
public boolean isUidNetworkingBlocked(int uid, String ifname) {
+ final long startTime = mStatLogger.getTime();
+
final boolean isNetworkMetered;
synchronized (mNetworkPoliciesSecondLock) {
isNetworkMetered = mMeteredIfaces.contains(ifname);
}
- return isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+ final boolean ret = isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+
+ mStatLogger.logDurationStat(Stats.IS_UID_NETWORKING_BLOCKED, startTime);
+
+ return ret;
}
@Override
@@ -4831,7 +4885,21 @@
@GuardedBy("mNetworkPoliciesSecondLock")
private SubscriptionPlan getPrimarySubscriptionPlanLocked(int subId) {
final SubscriptionPlan[] plans = mSubscriptionPlans.get(subId);
- return ArrayUtils.isEmpty(plans) ? null : plans[0];
+ if (!ArrayUtils.isEmpty(plans)) {
+ for (SubscriptionPlan plan : plans) {
+ if (plan.getCycleRule().isRecurring()) {
+ // Recurring plans will always have an active cycle
+ return plan;
+ } else {
+ // Non-recurring plans need manual test for active cycle
+ final Range<ZonedDateTime> cycle = plan.cycleIterator().next();
+ if (cycle.contains(ZonedDateTime.now(mClock))) {
+ return plan;
+ }
+ }
+ }
+ }
+ return null;
}
/**
@@ -4878,6 +4946,11 @@
return (val != null) ? val : new NetworkState[0];
}
+ private static boolean getBooleanDefeatingNullable(@Nullable PersistableBundle bundle,
+ String key, boolean defaultValue) {
+ return (bundle != null) ? bundle.getBoolean(key, defaultValue) : defaultValue;
+ }
+
private class NotificationId {
private final String mTag;
private final int mId;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 7254acf..55f51c2 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1872,7 +1872,7 @@
};
int newSuppressedVisualEffects = incomingPolicy.suppressedVisualEffects;
- if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+ if (targetSdkVersion < Build.VERSION_CODES.P) {
// unset higher order bits introduced in P, maintain the user's higher order bits
for (int i = 0; i < effectsIntroducedInP.length ; i++) {
newSuppressedVisualEffects &= ~effectsIntroducedInP[i];
@@ -1883,7 +1883,6 @@
if ((newSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_OFF) != 0) {
newSuppressedVisualEffects |= SUPPRESSED_EFFECT_LIGHTS;
newSuppressedVisualEffects |= SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
- newSuppressedVisualEffects |= SUPPRESSED_EFFECT_AMBIENT;
}
if ((newSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_ON) != 0) {
newSuppressedVisualEffects |= SUPPRESSED_EFFECT_PEEK;
@@ -2131,6 +2130,26 @@
}
/**
+ * Updates the enabled state for notifications for the given package (and uid).
+ * Additionally, this method marks the app importance as locked by the user, which means
+ * that notifications from the app will <b>not</b> be considered for showing a
+ * blocking helper.
+ *
+ * @param pkg package that owns the notifications to update
+ * @param uid uid of the app providing notifications
+ * @param enabled whether notifications should be enabled for the app
+ *
+ * @see #setNotificationsEnabledForPackage(String, int, boolean)
+ */
+ @Override
+ public void setNotificationsEnabledWithImportanceLockForPackage(
+ String pkg, int uid, boolean enabled) {
+ setNotificationsEnabledForPackage(pkg, uid, enabled);
+
+ mRankingHelper.setAppImportanceLocked(pkg, uid);
+ }
+
+ /**
* Use this when you just want to know if notifications are OK for this package.
*/
@Override
@@ -3229,7 +3248,7 @@
0, UserHandle.getUserId(MY_UID));
Policy currPolicy = mZenModeHelper.getNotificationPolicy();
- if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+ if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.P) {
int priorityCategories = policy.priorityCategories;
// ignore alarm and media values from new policy
priorityCategories &= ~Policy.PRIORITY_CATEGORY_ALARMS;
@@ -3616,6 +3635,8 @@
System.currentTimeMillis());
summaryRecord = new NotificationRecord(getContext(), summarySbn,
notificationRecord.getChannel());
+ summaryRecord.setIsAppImportanceLocked(
+ notificationRecord.getIsAppImportanceLocked());
summaries.put(pkg, summarySbn.getKey());
}
}
@@ -4012,6 +4033,7 @@
pkg, opPkg, id, tag, notificationUid, callingPid, notification,
user, null, System.currentTimeMillis());
final NotificationRecord r = new NotificationRecord(getContext(), n, channel);
+ r.setIsAppImportanceLocked(mRankingHelper.getIsAppImportanceLocked(pkg, callingUid));
if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0
&& (channel.getUserLockedFields() & NotificationChannel.USER_LOCKED_IMPORTANCE) == 0
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 9bd3e52..9745be3 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -151,11 +151,14 @@
private boolean mIsInterruptive;
private int mNumberOfSmartRepliesAdded;
private boolean mHasSeenSmartReplies;
+ /**
+ * Whether this notification (and its channels) should be considered user locked. Used in
+ * conjunction with user sentiment calculation.
+ */
+ private boolean mIsAppImportanceLocked;
- @VisibleForTesting
public NotificationRecord(Context context, StatusBarNotification sbn,
- NotificationChannel channel)
- {
+ NotificationChannel channel) {
this.sbn = sbn;
mOriginalFlags = sbn.getNotification().flags;
mRankingTimeMs = calculateRankingTimeMs(0L);
@@ -503,6 +506,7 @@
pw.println(prefix + "mImportance="
+ NotificationListenerService.Ranking.importanceToString(mImportance));
pw.println(prefix + "mImportanceExplanation=" + mImportanceExplanation);
+ pw.println(prefix + "mIsAppImportanceLocked=" + mIsAppImportanceLocked);
pw.println(prefix + "mIntercept=" + mIntercept);
pw.println(prefix + "mHidden==" + mHidden);
pw.println(prefix + "mGlobalSortKey=" + mGlobalSortKey);
@@ -564,11 +568,11 @@
public final String toString() {
return String.format(
"NotificationRecord(0x%08x: pkg=%s user=%s id=%d tag=%s importance=%d key=%s" +
- ": %s)",
+ "appImportanceLocked=%s: %s)",
System.identityHashCode(this),
this.sbn.getPackageName(), this.sbn.getUser(), this.sbn.getId(),
this.sbn.getTag(), this.mImportance, this.sbn.getKey(),
- this.sbn.getNotification());
+ mIsAppImportanceLocked, this.sbn.getNotification());
}
public void addAdjustment(Adjustment adjustment) {
@@ -600,7 +604,8 @@
if (signals.containsKey(Adjustment.KEY_USER_SENTIMENT)) {
// Only allow user sentiment update from assistant if user hasn't already
// expressed a preference for this channel
- if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
+ if (!mIsAppImportanceLocked
+ && (getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
setUserSentiment(adjustment.getSignals().getInt(
Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEUTRAL));
}
@@ -609,6 +614,11 @@
}
}
+ public void setIsAppImportanceLocked(boolean isAppImportanceLocked) {
+ mIsAppImportanceLocked = isAppImportanceLocked;
+ calculateUserSentiment();
+ }
+
public void setContactAffinity(float contactAffinity) {
mContactAffinity = contactAffinity;
if (mImportance < IMPORTANCE_DEFAULT &&
@@ -870,6 +880,13 @@
return mChannel;
}
+ /**
+ * @see RankingHelper#getIsAppImportanceLocked(String, int)
+ */
+ public boolean getIsAppImportanceLocked() {
+ return mIsAppImportanceLocked;
+ }
+
protected void updateNotificationChannel(NotificationChannel channel) {
if (channel != null) {
mChannel = channel;
@@ -927,7 +944,8 @@
}
private void calculateUserSentiment() {
- if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) != 0) {
+ if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) != 0
+ || mIsAppImportanceLocked) {
mUserSentiment = USER_SENTIMENT_POSITIVE;
}
}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 43d393a..c2ec79b 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -24,6 +24,7 @@
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -36,7 +37,6 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ParceledListSlice;
import android.content.pm.Signature;
-import android.content.res.Resources;
import android.metrics.LogMaker;
import android.os.Build;
import android.os.UserHandle;
@@ -89,11 +89,25 @@
private static final String ATT_VISIBILITY = "visibility";
private static final String ATT_IMPORTANCE = "importance";
private static final String ATT_SHOW_BADGE = "show_badge";
+ private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
private static final boolean DEFAULT_SHOW_BADGE = true;
+ /**
+ * Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
+ * fields.
+ */
+ private static final int DEFAULT_LOCKED_APP_FIELDS = 0;
+
+ /**
+ * All user-lockable fields for a given application.
+ */
+ @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
+ public @interface LockableAppFields {
+ int USER_LOCKED_IMPORTANCE = 0x00000001;
+ }
private final NotificationSignalExtractor[] mSignalExtractors;
private final NotificationComparator mPreliminaryComparator;
@@ -218,6 +232,8 @@
parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
r.showBadge = XmlUtils.readBooleanAttribute(
parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
+ r.lockedAppFields = XmlUtils.readIntAttribute(parser,
+ ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS);
final int innerDepth = parser.getDepth();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -388,10 +404,14 @@
if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
continue;
}
- final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE
- || r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY
- || r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0
- || r.groups.size() > 0;
+ final boolean hasNonDefaultSettings =
+ r.importance != DEFAULT_IMPORTANCE
+ || r.priority != DEFAULT_PRIORITY
+ || r.visibility != DEFAULT_VISIBILITY
+ || r.showBadge != DEFAULT_SHOW_BADGE
+ || r.lockedAppFields != DEFAULT_LOCKED_APP_FIELDS
+ || r.channels.size() > 0
+ || r.groups.size() > 0;
if (hasNonDefaultSettings) {
out.startTag(null, TAG_PACKAGE);
out.attribute(null, ATT_NAME, r.pkg);
@@ -405,6 +425,8 @@
out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
}
out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
+ out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
+ Integer.toString(r.lockedAppFields));
if (!forBackup) {
out.attribute(null, ATT_UID, Integer.toString(r.uid));
@@ -511,6 +533,17 @@
return getOrCreateRecord(packageName, uid).importance;
}
+
+ /**
+ * Returns whether the importance of the corresponding notification is user-locked and shouldn't
+ * be adjusted by an assistant (via means of a blocking helper, for example). For the channel
+ * locking field, see {@link NotificationChannel#USER_LOCKED_IMPORTANCE}.
+ */
+ public boolean getIsAppImportanceLocked(String packageName, int uid) {
+ int userLockedFields = getOrCreateRecord(packageName, uid).lockedAppFields;
+ return (userLockedFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0;
+ }
+
@Override
public boolean canShowBadge(String packageName, int uid) {
return getOrCreateRecord(packageName, uid).showBadge;
@@ -996,6 +1029,21 @@
enabled ? DEFAULT_IMPORTANCE : IMPORTANCE_NONE);
}
+ /**
+ * Sets whether any notifications from the app, represented by the given {@code pkgName} and
+ * {@code uid}, have their importance locked by the user. Locked notifications don't get
+ * considered for sentiment adjustments (and thus never show a blocking helper).
+ */
+ public void setAppImportanceLocked(String packageName, int uid) {
+ Record record = getOrCreateRecord(packageName, uid);
+ if ((record.lockedAppFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0) {
+ return;
+ }
+
+ record.lockedAppFields = record.lockedAppFields | LockableAppFields.USER_LOCKED_IMPORTANCE;
+ updateConfig();
+ }
+
@VisibleForTesting
void lockFieldsForUpdate(NotificationChannel original, NotificationChannel update) {
if (original.canBypassDnd() != update.canBypassDnd()) {
@@ -1413,6 +1461,7 @@
int priority = DEFAULT_PRIORITY;
int visibility = DEFAULT_VISIBILITY;
boolean showBadge = DEFAULT_SHOW_BADGE;
+ int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
Map<String, NotificationChannelGroup> groups = new ConcurrentHashMap<>();
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index bfce33d..f51f369 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -9722,7 +9722,7 @@
if (expectedCertDigests.length > 1) {
// For apps targeting O MR1 we require explicit enumeration of all certs.
- final String[] libCertDigests = (targetSdk > Build.VERSION_CODES.O)
+ final String[] libCertDigests = (targetSdk >= Build.VERSION_CODES.O_MR1)
? PackageUtils.computeSignaturesSha256Digests(
libPkg.mSigningDetails.signatures)
: PackageUtils.computeSignaturesSha256Digests(
diff --git a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
index eeaa333..8c7871f 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
@@ -21,6 +21,7 @@
import android.content.pm.PackageManagerInternal;
import android.content.pm.ShortcutInfo;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -164,12 +165,13 @@
ShortcutService s, String packageName, @UserIdInt int packageUserId) {
final PackageInfo pi = s.getPackageInfoWithSignatures(packageName, packageUserId);
// retrieve the newest sigs
- Signature[][] signingHistory = pi.signingCertificateHistory;
- if (signingHistory == null || signingHistory.length == 0) {
+ SigningInfo signingInfo = pi.signingInfo;
+ if (signingInfo == null) {
Slog.e(TAG, "Can't get signatures: package=" + packageName);
return null;
}
- Signature[] signatures = signingHistory[signingHistory.length - 1];
+ // TODO (b/73988180) use entire signing history in case of rollbacks
+ Signature[] signatures = signingInfo.getApkContentsSigners();
final ShortcutPackageInfo ret = new ShortcutPackageInfo(pi.getLongVersionCode(),
pi.lastUpdateTime, BackupUtils.hashSignatureArray(signatures), /* shadow=*/ false);
@@ -192,13 +194,14 @@
return;
}
// retrieve the newest sigs
- Signature[][] signingHistory = pi.signingCertificateHistory;
- if (signingHistory == null || signingHistory.length == 0) {
+ SigningInfo signingInfo = pi.signingInfo;
+ if (signingInfo == null) {
Slog.w(TAG, "Not refreshing signature for " + pkg.getPackageName()
- + " since it appears to have no signature history.");
+ + " since it appears to have no signing info.");
return;
}
- Signature[] signatures = signingHistory[signingHistory.length - 1];
+ // TODO (b/73988180) use entire signing history in case of rollbacks
+ Signature[] signatures = signingInfo.getApkContentsSigners();
mSigHashes = BackupUtils.hashSignatureArray(signatures);
}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 15b4617..599e5a5 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -48,7 +48,6 @@
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
-import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
@@ -100,7 +99,7 @@
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
-import com.android.server.StatLogger;
+import com.android.internal.util.StatLogger;
import com.android.server.SystemService;
import com.android.server.pm.ShortcutUser.PackageWithUser;
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 1f95868..b8431b1 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -16,7 +16,7 @@
package com.android.server.wm;
-import static com.android.server.wm.AlphaAnimationSpecProto.DURATION;
+import static com.android.server.wm.AlphaAnimationSpecProto.DURATION_MS;
import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
import static com.android.server.wm.AlphaAnimationSpecProto.TO;
import static com.android.server.wm.AnimationSpecProto.ALPHA;
@@ -35,6 +35,7 @@
*/
class Dimmer {
private static final String TAG = "WindowManager";
+ // This is in milliseconds.
private static final int DEFAULT_DIM_ANIM_DURATION = 200;
private class DimAnimatable implements SurfaceAnimator.Animatable {
@@ -370,7 +371,7 @@
final long token = proto.start(ALPHA);
proto.write(FROM, mFromAlpha);
proto.write(TO, mToAlpha);
- proto.write(DURATION, mDuration);
+ proto.write(DURATION_MS, mDuration);
proto.end(token);
}
}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index d71f67f..4003d5a 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -45,7 +45,6 @@
import android.util.Slog;
import android.view.Display;
import android.view.DisplayCutout;
-import android.view.DisplayCutout.ParcelableWrapper;
import android.view.IWindow;
import android.view.IWindowId;
import android.view.IWindowSession;
@@ -195,7 +194,7 @@
InputChannel outInputChannel) {
return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
- null /* cutout */, outInputChannel);
+ new DisplayCutout.ParcelableWrapper() /* cutout */, outInputChannel);
}
@Override
@@ -219,7 +218,7 @@
int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
- new ParcelableWrapper() /* cutout */, null /* outInputChannel */);
+ new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */);
}
@Override
@@ -234,16 +233,16 @@
@Override
public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
- int requestedWidth, int requestedHeight, int viewFlags,
- int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
- Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
- DisplayCutout.ParcelableWrapper cutout,
- MergedConfiguration mergedConfiguration, Surface outSurface) {
+ int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
+ Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
+ Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
+ DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
+ Surface outSurface) {
if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
+ Binder.getCallingPid());
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
int res = mService.relayoutWindow(this, window, seq, attrs,
- requestedWidth, requestedHeight, viewFlags, flags,
+ requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
outStableInsets, outsets, outBackdropFrame, cutout,
mergedConfiguration, outSurface);
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index b895cf2..67d2be8 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -215,8 +215,8 @@
currentOrientation);
window.setOuter(snapshotSurface);
try {
- session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, tmpFrame,
- tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect,
+ session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, -1,
+ tmpFrame, tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect,
tmpCutout, tmpMergedConfiguration, surface);
} catch (RemoteException e) {
// Local call.
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index b6ee713..ae9e8026 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -828,6 +828,14 @@
}
}
+ if (inSplitScreenSecondaryWindowingMode()) {
+ // When the stack is resized due to entering split screen secondary, offset the
+ // windows to compensate for the new stack position.
+ forAllWindows(w -> {
+ w.mWinAnimator.setOffsetPositionForStackResize(true);
+ }, true);
+ }
+
updateDisplayInfo(bounds);
updateSurfaceBounds();
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 768fa5e..407312a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1835,10 +1835,9 @@
}
}
- public int relayoutWindow(Session session, IWindow client, int seq,
- LayoutParams attrs, int requestedWidth,
- int requestedHeight, int viewVisibility, int flags,
- Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
+ public int relayoutWindow(Session session, IWindow client, int seq, LayoutParams attrs,
+ int requestedWidth, int requestedHeight, int viewVisibility, int flags,
+ long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Rect outVisibleInsets, Rect outStableInsets, Rect outOutsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
Surface outSurface) {
@@ -1865,6 +1864,7 @@
win.setRequestedSize(requestedWidth, requestedHeight);
}
+ win.setFrameNumber(frameNumber);
int attrChanges = 0;
int flagChanges = 0;
if (attrs != null) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index d10f005..6920e40 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -112,7 +112,7 @@
import static com.android.server.wm.IdentifierProto.TITLE;
import static com.android.server.wm.IdentifierProto.USER_ID;
import static com.android.server.wm.AnimationSpecProto.MOVE;
-import static com.android.server.wm.MoveAnimationSpecProto.DURATION;
+import static com.android.server.wm.MoveAnimationSpecProto.DURATION_MS;
import static com.android.server.wm.MoveAnimationSpecProto.FROM;
import static com.android.server.wm.MoveAnimationSpecProto.TO;
import static com.android.server.wm.WindowStateProto.ANIMATING_EXIT;
@@ -636,6 +636,11 @@
private PowerManagerWrapper mPowerManagerWrapper;
/**
+ * A frame number in which changes requested in this layout will be rendered.
+ */
+ private long mFrameNumber = -1;
+
+ /**
* Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
* of z-order and 1 otherwise.
*/
@@ -4101,11 +4106,10 @@
mDestroying = true;
final boolean hasSurface = mWinAnimator.hasSurface();
- if (hasSurface) {
- // Use pendingTransaction here so hide is done the same transaction as the other
- // animations when exiting
- mWinAnimator.hide(getPendingTransaction(), "onExitAnimationDone");
- }
+
+ // Use pendingTransaction here so hide is done the same transaction as the other
+ // animations when exiting
+ mWinAnimator.hide(getPendingTransaction(), "onExitAnimationDone");
// If we have an app token, we ask it to destroy the surface for us, so that it can take
// care to ensure the activity has actually stopped and the surface is not still in use.
@@ -4655,7 +4659,7 @@
mLastSurfaceInsets.set(mAttrs.surfaceInsets);
t.deferTransactionUntil(mSurfaceControl,
mWinAnimator.mSurfaceController.mSurfaceControl.getHandle(),
- mAttrs.frameNumber);
+ getFrameNumber());
}
}
}
@@ -4771,6 +4775,14 @@
return mService.mInputMethodTarget == this;
}
+ long getFrameNumber() {
+ return mFrameNumber;
+ }
+
+ void setFrameNumber(long frameNumber) {
+ mFrameNumber = frameNumber;
+ }
+
private final class MoveAnimationSpec implements AnimationSpec {
private final long mDuration;
@@ -4813,7 +4825,7 @@
final long token = proto.start(MOVE);
mFrom.writeToProto(proto, FROM);
mTo.writeToProto(proto, TO);
- proto.write(DURATION, mDuration);
+ proto.write(DURATION_MS, mDuration);
proto.end(token);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index e92d460..195274a 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -67,7 +67,6 @@
import com.android.server.policy.WindowManagerPolicy;
-import java.io.FileDescriptor;
import java.io.PrintWriter;
/**
@@ -217,6 +216,12 @@
int mXOffset = 0;
int mYOffset = 0;
+ /**
+ * A flag to determine if the WSA needs to offset its position to compensate for the stack's
+ * position update before the WSA surface has resized.
+ */
+ private boolean mOffsetPositionForStackResize;
+
private final Rect mTmpSize = new Rect();
private final SurfaceControl.Transaction mReparentTransaction = new SurfaceControl.Transaction();
@@ -230,6 +235,8 @@
// once per animation.
boolean mPipAnimationStarted = false;
+ private final Point mTmpPos = new Point();
+
WindowStateAnimator(final WindowState win) {
final WindowManagerService service = win.mService;
@@ -301,6 +308,12 @@
if (!mLastHidden) {
//dump();
mLastHidden = true;
+
+ // We may have a preserved surface which we no longer need. If there was a quick
+ // VISIBLE, GONE, VISIBLE, GONE sequence, the surface may never draw, so we don't mark
+ // it to be destroyed in prepareSurfaceLocked.
+ markPreservedSurfaceForDestroy();
+
if (mSurfaceController != null) {
mSurfaceController.hide(transaction, reason);
}
@@ -498,6 +511,8 @@
mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
attrs.getTitle().toString(), width, height, format, flags, this,
windowType, ownerUid);
+
+ setOffsetPositionForStackResize(false);
mSurfaceFormat = format;
w.setHasSurface(true);
@@ -859,7 +874,8 @@
// However, this would be unsafe, as the client may be in the middle
// of producing a frame at the old size, having just completed layout
// to find the surface size changed underneath it.
- if (!w.mRelayoutCalled || w.mInRelayout) {
+ final boolean relayout = !w.mRelayoutCalled || w.mInRelayout;
+ if (relayout) {
mSurfaceResized = mSurfaceController.setSizeInTransaction(
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
} else {
@@ -996,7 +1012,38 @@
mPipAnimationStarted = false;
if (!w.mSeamlesslyRotated) {
- mSurfaceController.setPositionInTransaction(mXOffset, mYOffset, recoveringMemory);
+ // Used to offset the WSA when stack position changes before a resize.
+ int xOffset = mXOffset;
+ int yOffset = mYOffset;
+ if (mOffsetPositionForStackResize) {
+ if (relayout) {
+ // Once a relayout is called, reset the offset back to 0 and defer
+ // setting it until a new frame with the updated size. This ensures that
+ // the WS position is reset (so the stack position is shown) at the same
+ // time that the buffer size changes.
+ setOffsetPositionForStackResize(false);
+ mSurfaceController.deferTransactionUntil(mSurfaceController.getHandle(),
+ mWin.getFrameNumber());
+ } else {
+ final TaskStack stack = mWin.getStack();
+ mTmpPos.x = 0;
+ mTmpPos.y = 0;
+ if (stack != null) {
+ stack.getRelativePosition(mTmpPos);
+ }
+
+ xOffset = -mTmpPos.x;
+ yOffset = -mTmpPos.y;
+
+ // Crop also needs to be extended so the bottom isn't cut off when the WSA
+ // position is moved.
+ if (clipRect != null) {
+ clipRect.right += mTmpPos.x;
+ clipRect.bottom += mTmpPos.y;
+ }
+ }
+ }
+ mSurfaceController.setPositionInTransaction(xOffset, yOffset, recoveringMemory);
}
}
@@ -1499,4 +1546,8 @@
int getLayer() {
return mLastLayer;
}
+
+ void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) {
+ mOffsetPositionForStackResize = offsetPositionForStackResize;
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 5cebbd8..9e72216 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -220,7 +220,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
import com.android.server.LockGuard;
-import com.android.server.StatLogger;
+import com.android.internal.util.StatLogger;
import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemService;
import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index 644ab03..5e90b3f 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -468,9 +468,6 @@
verify(agentMock.agent).onQuotaExceeded(anyLong(), anyLong());
}
- // TODO: Giving NPE at PerformBackupTask:524 because mCurrentPackage is null (PackageManager
- // rightfully threw NameNotFoundException). Remove @Ignore when fixed.
- @Ignore
@Test
public void testRunTask_whenAgentUnknown() throws Exception {
// Not calling setUpAgent()
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index cecc94b..b4dc941 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -1714,6 +1714,8 @@
}
private void expectNetworkState(boolean roaming) throws Exception {
+ when(mCarrierConfigManager.getConfigForSubId(eq(TEST_SUB_ID)))
+ .thenReturn(CarrierConfigManager.getDefaultConfig());
when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] {
new NetworkState(buildNetworkInfo(),
buildLinkProperties(TEST_IFACE),
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index c78fcd3..4b8dcc1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -103,7 +103,42 @@
assertEquals(mStack.getResumedActivity(), r);
r.setState(PAUSING, "testResumedActivity");
assertEquals(mStack.getResumedActivity(), null);
+ }
+ @Test
+ public void testResumedActivityFromTaskReparenting() {
+ final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
+ // Ensure moving task between two stacks updates resumed activity
+ r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
+ assertEquals(mStack.getResumedActivity(), r);
+
+ final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ mTask.reparent(destStack, true /* toTop */, TaskRecord.REPARENT_KEEP_STACK_AT_FRONT,
+ false /* animate */, true /* deferResume*/,
+ "testResumedActivityFromTaskReparenting");
+
+ assertEquals(mStack.getResumedActivity(), null);
+ assertEquals(destStack.getResumedActivity(), r);
+ }
+
+ @Test
+ public void testResumedActivityFromActivityReparenting() {
+ final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
+ // Ensure moving task between two stacks updates resumed activity
+ r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
+ assertEquals(mStack.getResumedActivity(), r);
+
+ final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TaskRecord destTask = new TaskBuilder(mSupervisor).setStack(destStack).build();
+
+ mTask.removeActivity(r);
+ destTask.addActivityToTop(r);
+
+ assertEquals(mStack.getResumedActivity(), null);
+ assertEquals(destStack.getResumedActivity(), r);
}
@Test
@@ -543,5 +578,4 @@
assertEquals(expected, mStack.shouldSleepActivities());
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
index d37db20..4f18be7 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
@@ -26,7 +26,9 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
@@ -395,7 +397,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
@@ -409,7 +417,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
@@ -425,7 +439,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
@@ -440,7 +454,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
@@ -453,7 +467,7 @@
public void signaturesMatch_disallowsUnsignedApps_bothSignaturesNull_returnsFalse()
throws Exception {
PackageInfo packageInfo = new PackageInfo();
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
@@ -467,7 +481,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
@@ -484,9 +498,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
@@ -503,9 +521,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
@@ -522,9 +544,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {signature1Copy, signature2Copy}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {signature1Copy, signature2Copy},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
@@ -541,9 +567,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
@@ -560,7 +590,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
@@ -579,7 +615,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ new Signature[] {SIGNATURE_1, SIGNATURE_2},
+ new int[] {0, 0}));
packageInfo.applicationInfo = new ApplicationInfo();
// we know signature1Copy is in history, and we want to assume it has
@@ -601,7 +643,13 @@
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ new Signature[] {SIGNATURE_1, SIGNATURE_2},
+ new int[] {0, 0}));
packageInfo.applicationInfo = new ApplicationInfo();
// we know signature1Copy is in history, but we want to assume it does not have
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
index 5f052ce..2830a74 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
@@ -41,7 +41,9 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.os.Bundle;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
@@ -371,7 +373,13 @@
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
PackageManagerStub.sPackageInfo = packageInfo;
RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
@@ -402,7 +410,13 @@
ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
packageInfo.applicationInfo.backupAgentName = "backup.agent";
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
PackageManagerStub.sPackageInfo = packageInfo;
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
@@ -434,7 +448,13 @@
ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
PackageManagerStub.sPackageInfo = packageInfo;
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
@@ -469,7 +489,13 @@
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.versionCode = 2;
PackageManagerStub.sPackageInfo = packageInfo;
@@ -507,7 +533,13 @@
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.versionCode = 1;
PackageManagerStub.sPackageInfo = packageInfo;
@@ -541,7 +573,13 @@
packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
packageInfo.applicationInfo.backupAgentName = null;
- packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {FAKE_SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.versionCode = 1;
PackageManagerStub.sPackageInfo = packageInfo;
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index ee83b62..998ffa0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -58,11 +58,13 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
@@ -102,6 +104,8 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -1039,8 +1043,13 @@
pi.versionCode = version;
pi.applicationInfo.setVersionCode(version);
pi.signatures = null;
- pi.signingCertificateHistory = new Signature[][] {genSignatures(signatures)};
-
+ pi.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ genSignatures(signatures),
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
return pi;
}
@@ -1128,7 +1137,7 @@
if (getSignatures) {
ret.signatures = null;
- ret.signingCertificateHistory = pi.signingCertificateHistory;
+ ret.signingInfo = pi.signingInfo;
}
return ret;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
index cd7feea..203b2ca 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
@@ -76,13 +76,13 @@
mMyPackage, mMyUserId, /*signature*/ false);
assertEquals(mMyPackage, pi.packageName);
assertNull(pi.signatures);
- assertNull(pi.signingCertificateHistory);
+ assertNull(pi.signingInfo);
pi = mShortcutService.getPackageInfo(
mMyPackage, mMyUserId, /*signature*/ true);
assertEquals(mMyPackage, pi.packageName);
assertNull(pi.signatures);
- assertNotNull(pi.signingCertificateHistory);
+ assertNotNull(pi.signingInfo);
pi = mShortcutService.getPackageInfo(
"no.such.package", mMyUserId, /*signature*/ true);
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
index c5cd0a3..b8922eb 100644
--- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -32,6 +32,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.os.BaseBundle;
import android.os.Bundle;
import android.os.Handler;
@@ -68,6 +69,7 @@
@LargeTest
public class SuspendPackagesTest {
private static final String TAG = SuspendPackagesTest.class.getSimpleName();
+ private static final String TEST_APP_LABEL = "Suspend Test App";
private static final String TEST_APP_PACKAGE_NAME = SuspendTestReceiver.PACKAGE_NAME;
private static final String[] PACKAGES_TO_SUSPEND = new String[]{TEST_APP_PACKAGE_NAME};
@@ -446,23 +448,24 @@
turnScreenOn();
mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED,
ACTION_REPORT_TEST_ACTIVITY_STARTED);
- final String testMessage = "This is a test message";
+ final String testMessage = "This is a test message to report suspension of %1$s";
suspendTestPackage(null, null, testMessage);
startTestAppActivity();
assertNull("No broadcast was expected from app", mAppCommsReceiver.pollForIntent(2));
- assertNotNull("Given dialog message not shown",
- mUiDevice.wait(Until.findObject(By.text(testMessage)), 5000));
- final String buttonText = "More details";
+ assertNotNull("Given dialog message not shown", mUiDevice.wait(
+ Until.findObject(By.text(String.format(testMessage, TEST_APP_LABEL))), 5000));
+ final String buttonText = mContext.getResources().getString(Resources.getSystem()
+ .getIdentifier("app_suspended_more_details", "string", "android"));
final UiObject2 moreDetailsButton = mUiDevice.findObject(
By.clickable(true).text(buttonText));
- assertNotNull("\"More Details\" button not shown", moreDetailsButton);
+ assertNotNull(buttonText + " button not shown", moreDetailsButton);
moreDetailsButton.click();
final Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
- assertEquals("\"More Details\" activity start not reported",
+ assertEquals(buttonText + " activity start not reported",
ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED, intentFromApp.getAction());
final String receivedPackageName = intentFromApp.getStringExtra(
EXTRA_RECEIVED_PACKAGE_NAME);
- assertEquals("Wrong package name received by \"More Details\" activity",
+ assertEquals("Wrong package name received by " + buttonText + " activity",
TEST_APP_PACKAGE_NAME, receivedPackageName);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
index 1ac7cb8..caa1d02 100644
--- a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
@@ -27,8 +27,10 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
import android.content.pm.PackageParser.Package;
import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
import android.test.MoreAsserts;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
@@ -94,7 +96,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = BackupUtils.signaturesMatch(null, packageInfo,
@@ -108,7 +116,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -125,7 +139,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -142,7 +156,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -158,7 +172,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = null;
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = BackupUtils.signaturesMatch(null, packageInfo,
@@ -172,7 +186,7 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[0][0];
+ packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -186,9 +200,13 @@
public void signaturesMatch_equalSignatures_returnsTrue() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -205,9 +223,13 @@
public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -223,7 +245,13 @@
public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1, SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -240,9 +268,13 @@
public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {
- {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
- };
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -260,7 +292,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(SIGNATURE_HASH_1,
@@ -279,7 +317,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
// we know SIGNATURE_1 is in history, and we want to assume it has
@@ -301,7 +345,13 @@
throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test";
- packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+ packageInfo.signingInfo = new SigningInfo(
+ new PackageParser.SigningDetails(
+ new Signature[] {SIGNATURE_1, SIGNATURE_2},
+ PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+ null,
+ null,
+ null));
packageInfo.applicationInfo = new ApplicationInfo();
// we know SIGNATURE_1 is in history, but we want to assume it does not have
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
index ce6a27a..61058e6 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
@@ -17,7 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.servicestests.apps.suspendtestapp">
- <application>
+ <application android:label="Suspend Test App">
<activity android:name=".SuspendTestActivity"
android:exported="true" />
<receiver android:name=".SuspendTestReceiver"
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 124cb42..14f84b1 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -2558,8 +2558,8 @@
int expected = SUPPRESSED_EFFECT_BADGE
| SUPPRESSED_EFFECT_SCREEN_ON | SUPPRESSED_EFFECT_SCREEN_OFF
- | SUPPRESSED_EFFECT_PEEK | SUPPRESSED_EFFECT_AMBIENT
- | SUPPRESSED_EFFECT_LIGHTS | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
+ | SUPPRESSED_EFFECT_PEEK | SUPPRESSED_EFFECT_LIGHTS
+ | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
int actual = mService.calculateSuppressedVisualEffects(appPolicy, userPolicy, O_MR1);
assertEquals(expected, actual);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index a566327..6303184 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -554,6 +554,34 @@
}
@Test
+ public void testUserSentiment_appImportanceUpdatesSentiment() throws Exception {
+ StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ assertEquals(USER_SENTIMENT_NEUTRAL, record.getUserSentiment());
+
+ record.setIsAppImportanceLocked(true);
+ assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
+ }
+
+ @Test
+ public void testUserSentiment_appImportanceBlocksNegativeSentimentUpdate() throws Exception {
+ StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ record.setIsAppImportanceLocked(true);
+
+ Bundle signals = new Bundle();
+ signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE);
+ record.addAdjustment(new Adjustment(pkg, record.getKey(), signals, null, sbn.getUserId()));
+ record.applyAdjustments();
+
+ assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
+ }
+
+ @Test
public void testUserSentiment_userLocked() throws Exception {
channel.lockFields(USER_LOCKED_IMPORTANCE);
StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
@@ -571,4 +599,18 @@
assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
}
+
+ @Test
+ public void testAppImportance_returnsCorrectly() throws Exception {
+ StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.setIsAppImportanceLocked(true);
+ assertEquals(true, record.getIsAppImportanceLocked());
+
+ record.setIsAppImportanceLocked(false);
+ assertEquals(false, record.getIsAppImportanceLocked());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 54ed1e6..78aa965 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -371,6 +371,7 @@
mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
mHelper.setShowBadge(PKG, UID, true);
+ mHelper.setAppImportanceLocked(PKG, UID);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
@@ -379,6 +380,7 @@
loadStreamXml(baos, false);
assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
compareChannels(channel2,
mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
@@ -805,6 +807,7 @@
assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
mHelper.getPackageVisibility(PKG, UID));
+ assertFalse(mHelper.getIsAppImportanceLocked(PKG, UID));
NotificationChannel defaultChannel = mHelper.getNotificationChannel(
PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -814,6 +817,7 @@
defaultChannel.setBypassDnd(true);
defaultChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ mHelper.setAppImportanceLocked(PKG, UID);
mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
// ensure app level fields are changed
@@ -821,6 +825,7 @@
assertEquals(Notification.PRIORITY_MAX, mHelper.getPackagePriority(PKG, UID));
assertEquals(Notification.VISIBILITY_SECRET, mHelper.getPackageVisibility(PKG, UID));
assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG, UID));
+ assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
}
@Test
diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
index 74d8e12..3b08505 100644
--- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
@@ -461,7 +461,7 @@
long token = dump.start(idName, id);
dump.write("connected_to_adb", UsbDebuggingManagerProto.CONNECTED_TO_ADB, mThread != null);
- writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEVIED,
+ writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEIVED,
mFingerprints);
try {
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 1160943..cd524a5 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -926,25 +926,24 @@
Slog.w(TAG, mPuuid + ": Dropped operation as too many operations were "
+ "run in last 24 hours");
}
- return;
- }
+ } else {
+ mNumOps.addOp(currentTime);
- mNumOps.addOp(currentTime);
+ // Find a free opID
+ int opId = mNumTotalOpsPerformed;
+ do {
+ mNumTotalOpsPerformed++;
+ } while (mRunningOpIds.contains(opId));
- // Find a free opID
- int opId = mNumTotalOpsPerformed;
- do {
- mNumTotalOpsPerformed++;
- } while (mRunningOpIds.contains(opId));
+ // Run OP
+ try {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId);
- // Run OP
- try {
- if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId);
-
- op.run(opId, mService);
- mRunningOpIds.add(opId);
- } catch (Exception e) {
- Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e);
+ op.run(opId, mService);
+ mRunningOpIds.add(opId);
+ } catch (Exception e) {
+ Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e);
+ }
}
// Unbind from service if no operations are left (i.e. if the operation failed)
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index aa76eab..e244131 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1684,6 +1684,14 @@
"data_warning_threshold_bytes_long";
/**
+ * Controls if the device should automatically notify the user as they reach
+ * their cellular data warning. When set to {@code false} the carrier is
+ * expected to have implemented their own notification mechanism.
+ */
+ public static final String KEY_DATA_WARNING_NOTIFICATION_BOOL =
+ "data_warning_notification_bool";
+
+ /**
* Controls the cellular data limit.
* <p>
* If the user uses more than this amount of data in their billing cycle, as defined by
@@ -1698,6 +1706,22 @@
"data_limit_threshold_bytes_long";
/**
+ * Controls if the device should automatically notify the user as they reach
+ * their cellular data limit. When set to {@code false} the carrier is
+ * expected to have implemented their own notification mechanism.
+ */
+ public static final String KEY_DATA_LIMIT_NOTIFICATION_BOOL =
+ "data_limit_notification_bool";
+
+ /**
+ * Controls if the device should automatically notify the user when rapid
+ * cellular data usage is observed. When set to {@code false} the carrier is
+ * expected to have implemented their own notification mechanism.
+ */
+ public static final String KEY_DATA_RAPID_NOTIFICATION_BOOL =
+ "data_rapid_notification_bool";
+
+ /**
* Offset to be reduced from rsrp threshold while calculating signal strength level.
* @hide
*/
@@ -2165,7 +2189,10 @@
sDefaults.putInt(KEY_MONTHLY_DATA_CYCLE_DAY_INT, DATA_CYCLE_USE_PLATFORM_DEFAULT);
sDefaults.putLong(KEY_DATA_WARNING_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT);
+ sDefaults.putBoolean(KEY_DATA_WARNING_NOTIFICATION_BOOL, true);
sDefaults.putLong(KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT);
+ sDefaults.putBoolean(KEY_DATA_LIMIT_NOTIFICATION_BOOL, true);
+ sDefaults.putBoolean(KEY_DATA_RAPID_NOTIFICATION_BOOL, true);
// Rat families: {GPRS, EDGE}, {EVDO, EVDO_A, EVDO_B}, {UMTS, HSPA, HSDPA, HSUPA, HSPAP},
// {LTE, LTE_CA}
diff --git a/telephony/java/android/telephony/NetworkScan.java b/telephony/java/android/telephony/NetworkScan.java
index 073c313..7c7d7a0 100644
--- a/telephony/java/android/telephony/NetworkScan.java
+++ b/telephony/java/android/telephony/NetworkScan.java
@@ -120,7 +120,10 @@
}
}
- /** @deprecated Use {@link #stopScan()} */
+ /**
+ * @deprecated Use {@link #stopScan()}
+ * @removed
+ */
@Deprecated
public void stop() throws RemoteException {
try {
diff --git a/telephony/java/android/telephony/SubscriptionPlan.java b/telephony/java/android/telephony/SubscriptionPlan.java
index ef2a364..e8bbe42 100644
--- a/telephony/java/android/telephony/SubscriptionPlan.java
+++ b/telephony/java/android/telephony/SubscriptionPlan.java
@@ -254,6 +254,9 @@
* @param period The period after which the plan automatically recurs.
*/
public static Builder createRecurring(ZonedDateTime start, Period period) {
+ if (period.isZero() || period.isNegative()) {
+ throw new IllegalArgumentException("Period " + period + " must be positive");
+ }
return new Builder(start, null, period);
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 3b9006c..09b527c 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -2968,7 +2968,7 @@
IPhoneSubInfo info = getSubscriberInfo();
if (info == null)
return null;
- return info.getGroupIdLevel1(mContext.getOpPackageName());
+ return info.getGroupIdLevel1ForSubscriber(getSubId(), mContext.getOpPackageName());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
@@ -5550,6 +5550,7 @@
* @deprecated
* Use {@link
* #requestNetworkScan(NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}
+ * @removed
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java
index 602c796..9e3302b 100644
--- a/telephony/java/android/telephony/mbms/DownloadRequest.java
+++ b/telephony/java/android/telephony/mbms/DownloadRequest.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Parcel;
@@ -184,6 +185,7 @@
* @hide
*/
@SystemApi
+ @TestApi
public Builder setServiceId(String serviceId) {
fileServiceId = serviceId;
return this;
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
index 0ed0820..93964f3 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -68,11 +68,6 @@
String getSubscriberIdForSubscriber(int subId, String callingPackage);
/**
- * Retrieves the Group Identifier Level1 for GSM phones.
- */
- String getGroupIdLevel1(String callingPackage);
-
- /**
* Retrieves the Group Identifier Level1 for GSM phones of a subId.
*/
String getGroupIdLevel1ForSubscriber(int subId, String callingPackage);
diff --git a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
index 9174014..ae3914e 100644
--- a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
+++ b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
@@ -102,7 +102,7 @@
Thread t = new Thread(() -> {
try {
WindowManagerGlobal.getWindowSession().relayout(window,
- window.mSeq, mLayoutParams, -1, -1, View.VISIBLE, 0, mTmpRect,
+ window.mSeq, mLayoutParams, -1, -1, View.VISIBLE, 0, -1, mTmpRect,
mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect,
new DisplayCutout.ParcelableWrapper(), new MergedConfiguration(),
new Surface());
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index e6d94e6..7a33de0 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -178,6 +178,7 @@
"libgmock",
],
defaults: ["aapt2_defaults"],
+ data: ["integration-tests/CompileTest/**/*"],
}
// ==========================================================
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 1db6335..6fe8610 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -100,10 +100,20 @@
std::string& filename = parts[parts.size() - 1];
StringPiece name = filename;
StringPiece extension;
- size_t dot_pos = filename.find('.');
- if (dot_pos != std::string::npos) {
- extension = name.substr(dot_pos + 1, filename.size() - (dot_pos + 1));
- name = name.substr(0, dot_pos);
+
+ const std::string kNinePng = ".9.png";
+ if (filename.size() > kNinePng.size()
+ && std::equal(kNinePng.rbegin(), kNinePng.rend(), filename.rbegin())) {
+ // Split on .9.png if this extension is present at the end of the file path
+ name = name.substr(0, filename.size() - kNinePng.size());
+ extension = "9.png";
+ } else {
+ // Split on the last period occurrence
+ size_t dot_pos = filename.rfind('.');
+ if (dot_pos != std::string::npos) {
+ extension = name.substr(dot_pos + 1, filename.size() - (dot_pos + 1));
+ name = name.substr(0, dot_pos);
+ }
}
return ResourcePathData{Source(path), dir_str.to_string(), name.to_string(),
@@ -799,12 +809,13 @@
// We use a different extension (not necessary anymore, but avoids altering the existing
// build system logic).
path_data.extension = "arsc";
+
} else if (const ResourceType* type = ParseResourceType(path_data.resource_dir)) {
if (*type != ResourceType::kRaw) {
if (path_data.extension == "xml") {
compile_func = &CompileXml;
- } else if ((!options.no_png_crunch && path_data.extension == "png") ||
- path_data.extension == "9.png") {
+ } else if ((!options.no_png_crunch && path_data.extension == "png")
+ || path_data.extension == "9.png") {
compile_func = &CompilePng;
}
}
@@ -815,6 +826,17 @@
continue;
}
+ // Treat periods as a reserved character that should not be present in a file name
+ // Legacy support for AAPT which did not reserve periods
+ if (compile_func != &CompileFile && !options.legacy_mode
+ && std::count(path_data.name.begin(), path_data.name.end(), '.') != 0) {
+ error = true;
+ context.GetDiagnostics()->Error(DiagMessage() << "resource file '" << path_data.source.path
+ << "' name cannot contain '.' other than for"
+ << "specifying the extension");
+ continue;
+ }
+
// Compile the file.
const std::string out_path = BuildIntermediateContainerFilename(path_data);
error |= !compile_func(&context, options, path_data, archive_writer.get(), out_path);
diff --git a/tools/aapt2/cmd/Compile.h b/tools/aapt2/cmd/Compile.h
new file mode 100644
index 0000000..d95cf1c
--- /dev/null
+++ b/tools/aapt2/cmd/Compile.h
@@ -0,0 +1,14 @@
+#ifndef AAPT2_COMPILE_H
+#define AAPT2_COMPILE_H
+
+#include "androidfw/StringPiece.h"
+
+#include "Diagnostics.h"
+
+namespace aapt {
+
+ int Compile(const std::vector<android::StringPiece>& args, IDiagnostics* diagnostics);
+
+}// namespace aapt
+
+#endif //AAPT2_COMPILE_H
diff --git a/tools/aapt2/cmd/Compile_test.cpp b/tools/aapt2/cmd/Compile_test.cpp
new file mode 100644
index 0000000..212f2cf
--- /dev/null
+++ b/tools/aapt2/cmd/Compile_test.cpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Compile.h"
+
+#include "android-base/file.h"
+#include "io/StringStream.h"
+#include "java/AnnotationProcessor.h"
+#include "test/Test.h"
+
+namespace aapt {
+
+int TestCompile(std::string path, std::string outDir, bool legacy, StdErrDiagnostics& diag) {
+ std::vector<android::StringPiece> args;
+ args.push_back(path);
+ args.push_back("-o");
+ args.push_back(outDir);
+ args.push_back("-v");
+ if (legacy) {
+ args.push_back("--legacy");
+ }
+ return aapt::Compile(args, &diag);
+}
+
+TEST(CompilerTest, MultiplePeriods) {
+ StdErrDiagnostics diag;
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ const std::string kResDir = android::base::Dirname(android::base::GetExecutablePath())
+ + "/integration-tests/CompileTest/res";
+
+ // Resource files without periods in the file name should not throw errors
+ const std::string path0 = kResDir + "/values/values.xml";
+ const std::string path0_out = kResDir + "/values_values.arsc.flat";
+
+ remove(path0_out.c_str());
+ ASSERT_EQ(TestCompile(path0, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(remove(path0_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path0, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path0_out.c_str()), 0);
+
+ const std::string path1 = kResDir + "/drawable/image.png";
+ const std::string path1_out = kResDir + "/drawable_image.png.flat";
+ remove(path1_out.c_str());
+ ASSERT_EQ(TestCompile(path1, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(remove(path1_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path1, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path1_out.c_str()), 0);
+
+ const std::string path2 = kResDir + "/drawable/image.9.png";
+ const std::string path2_out = kResDir + "/drawable_image.9.png.flat";
+ remove(path2_out.c_str());
+ ASSERT_EQ(TestCompile(path2, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(remove(path2_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path2, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path2_out.c_str()), 0);
+
+ // Resource files with periods in the file name should fail on non-legacy compilations
+ const std::string path3 = kResDir + "/values/values.all.xml";
+ const std::string path3_out = kResDir + "/values_values.all.arsc.flat";
+ remove(path3_out.c_str());
+ ASSERT_NE(TestCompile(path3, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(remove(path3_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path3, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path3_out.c_str()), 0);
+
+ const std::string path4 = kResDir + "/drawable/image.small.png";
+ const std::string path4_out = (kResDir + std::string("/drawable_image.small.png.flat")).c_str();
+ remove(path4_out.c_str());
+ ASSERT_NE(TestCompile(path4, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(remove(path4_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path4, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path4_out.c_str()), 0);
+
+ const std::string path5 = kResDir + "/drawable/image.small.9.png";
+ const std::string path5_out = (kResDir + std::string("/drawable_image.small.9.png.flat")).c_str();
+ remove(path5_out.c_str());
+ ASSERT_NE(TestCompile(path5, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(remove(path5_out.c_str()), 0);
+ ASSERT_EQ(TestCompile(path5, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(remove(path5_out.c_str()), 0);
+}
+
+}
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/CompileTest/res/drawable/image.9.png b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.9.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.9.png
Binary files differ
diff --git a/tools/aapt2/integration-tests/CompileTest/res/drawable/image.png b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.png
Binary files differ
diff --git a/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.9.png b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.9.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.9.png
Binary files differ
diff --git a/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.png b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/drawable/image.small.png
Binary files differ
diff --git a/tools/aapt2/integration-tests/CompileTest/res/values/values.all.xml b/tools/aapt2/integration-tests/CompileTest/res/values/values.all.xml
new file mode 100644
index 0000000..62ab652
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/values/values.all.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+</resources>
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/CompileTest/res/values/values.xml b/tools/aapt2/integration-tests/CompileTest/res/values/values.xml
new file mode 100644
index 0000000..62ab652
--- /dev/null
+++ b/tools/aapt2/integration-tests/CompileTest/res/values/values.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+</resources>
\ No newline at end of file
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 26248e5..70a47cf 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -50,6 +50,18 @@
return "\033[%sm" % (";".join(codes))
+def ident(raw):
+ """Strips superficial signature changes, giving us a strong key that
+ can be used to identify members across API levels."""
+ raw = raw.replace(" deprecated ", " ")
+ raw = raw.replace(" synchronized ", " ")
+ raw = raw.replace(" final ", " ")
+ raw = re.sub("<.+?>", "", raw)
+ if " throws " in raw:
+ raw = raw[:raw.index(" throws ")]
+ return raw
+
+
class Field():
def __init__(self, clazz, line, raw, blame):
self.clazz = clazz
@@ -69,8 +81,7 @@
self.value = raw[3].strip(';"')
else:
self.value = None
-
- self.ident = self.raw.replace(" deprecated ", " ")
+ self.ident = ident(self.raw)
def __hash__(self):
return hash(self.raw)
@@ -105,15 +116,7 @@
for r in raw[2:]:
if r == "throws": target = self.throws
else: target.append(r)
-
- # identity for compat purposes
- ident = self.raw
- ident = ident.replace(" deprecated ", " ")
- ident = ident.replace(" synchronized ", " ")
- ident = re.sub("<.+?>", "", ident)
- if " throws " in ident:
- ident = ident[:ident.index(" throws ")]
- self.ident = ident
+ self.ident = ident(self.raw)
def __hash__(self):
return hash(self.raw)
@@ -1469,6 +1472,40 @@
return failures
+def show_deprecations_at_birth(cur, prev):
+ """Show API deprecations at birth."""
+ global failures
+
+ # Remove all existing things so we're left with new
+ for prev_clazz in prev.values():
+ cur_clazz = cur[prev_clazz.fullname]
+
+ sigs = { i.ident: i for i in prev_clazz.ctors }
+ cur_clazz.ctors = [ i for i in cur_clazz.ctors if i.ident not in sigs ]
+ sigs = { i.ident: i for i in prev_clazz.methods }
+ cur_clazz.methods = [ i for i in cur_clazz.methods if i.ident not in sigs ]
+ sigs = { i.ident: i for i in prev_clazz.fields }
+ cur_clazz.fields = [ i for i in cur_clazz.fields if i.ident not in sigs ]
+
+ # Forget about class entirely when nothing new
+ if len(cur_clazz.ctors) == 0 and len(cur_clazz.methods) == 0 and len(cur_clazz.fields) == 0:
+ del cur[prev_clazz.fullname]
+
+ for clazz in cur.values():
+ if " deprecated " in clazz.raw and not clazz.fullname in prev:
+ error(clazz, None, None, "Found API deprecation at birth")
+
+ for i in clazz.ctors + clazz.methods + clazz.fields:
+ if " deprecated " in i.raw:
+ error(clazz, i, None, "Found API deprecation at birth")
+
+ print "%s Deprecated at birth %s\n" % ((format(fg=WHITE, bg=BLUE, bold=True),
+ format(reset=True)))
+ for f in sorted(failures):
+ print failures[f]
+ print
+
+
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Enforces common Android public API design \
patterns. It ignores lint messages from a previous API level, if provided.")
@@ -1481,6 +1518,8 @@
help="Allow references to Google")
parser.add_argument("--show-noticed", action='store_const', const=True,
help="Show API changes noticed")
+ parser.add_argument("--show-deprecations-at-birth", action='store_const', const=True,
+ help="Show API deprecations at birth")
args = vars(parser.parse_args())
if args['no_color']:
@@ -1492,6 +1531,14 @@
current_file = args['current.txt']
previous_file = args['previous.txt']
+ if args['show_deprecations_at_birth']:
+ with current_file as f:
+ cur = _parse_stream(f)
+ with previous_file as f:
+ prev = _parse_stream(f)
+ show_deprecations_at_birth(cur, prev)
+ sys.exit()
+
with current_file as f:
cur_fail, cur_noticed = examine_stream(f)
if not previous_file is None: